1. 소개
자력계는 Generic Sensor API [GENERIC-SENSOR]를 확장하여, 장치의 기본 자력계 센서가 감지하는 자기장 정보를 제공합니다. 자력계 센서는 세 개의 물리 축(x, y, z)에서 자기장을 μT(마이크로 테슬라) 단위로 측정합니다.
이 명세서에서는 두 가지 신규 인터페이스를 정의합니다:
-
Magnetometer는 보정된 자기장 값을 제공합니다. -
UncalibratedMagnetometer는 비보정 자기장 값을 제공합니다.
자기장은 전류, 자성 물질, 또는 지구의 자전과 내부 용융 철의 움직임 등으로 인해 발생하는 자기적 영향에 의해 자력계 센서에 자기력을 가하는 필드입니다.
하드 아이언 왜곡은 자화된 철 등 자기장을 생성하는 물체에 의해 발생합니다.
소프트 아이언 왜곡은 니켈, 철 같은 금속에 의해 자기장이 연장되거나 왜곡되는 현상입니다.
보정된 자기장은 자기장에 하드 아이언 왜곡 및 소프트 아이언 왜곡 보정이 적용된 값입니다.
비보정 자기장은 자기장 중 하드 아이언 왜곡은 보정하지 않고, 소프트 아이언 왜곡은 보정한 값으로, 자력계 근처에 자화된 물체가 이동할 때 발생하는 자기장의 변화를 보고합니다.
2. 예시
let sensor= new Magnetometer(); sensor. start(); sensor. onreading= () => { console. log( "Magnetic field along the X-axis " + sensor. x); console. log( "Magnetic field along the Y-axis " + sensor. y); console. log( "Magnetic field along the Z-axis " + sensor. z); }; sensor. onerror= event=> console. log( event. error. name, event. error. message);
3. 보안 및 개인정보 고려사항
자력계는 자기장 정보를 제공하고, 이론적으로는 사용자의 위치가 노출될 수 있습니다. 예를 들어, 특정 장소의 자화된 표면이나, 건물에서 발생하는 지속적인 자기장 변화와 위치 간의 매핑이 공격 벡터가 될 수 있습니다. 지구 자기장의 세기가 지역마다 다르기 때문에, 또 다른 공격 방식은 사용자의 위치 노출이나 검증일 수 있습니다. 예를 들어, 최종 사용자가 VPN을 통해 연결된 경우, 지리적 IP 정보에 해당하는 자기장과 실제 위치에서 측정한 자기장 값을 비교해, 사용자가 VPN을 사용 중인지 확인할 수도 있습니다. 또한 자기장 세기와 CPU 실행 등 다른 요소와의 상관관계를 통한 부채널(side-channel) 유출 위험도 있으니, 구현자는 특정 경우 애플리케이션 정보, 다른 탭 방문 웹사이트 정보 등이 유출될 수 있음을 인지해야 합니다. [MAGSPY]
비보정 자력계 측정값은 주변의 자화된 물체(예: 악세서리)에 영향을 받을 수 있으므로, 키 입력 감시 등으로 활용될 수 있습니다.
이러한 위협에 대응하기 위해, 사용자 에이전트는 다음 대응 전략 중 하나 이상을 사용해야 합니다:
-
센서 측정값의 정확도 감소
이러한 대응책은 Generic Sensor API 일반적 대응 [GENERIC-SENSOR]을 보완합니다.
4. 권한 정책 연동
이 명세서는 정책 제어 기능을 사용하며,
[DEVICE-ORIENTATION]에
"magnetometer"로
정의되어 있습니다.
5. 모델
자력계 센서 유형은 다음의 데이터를 가집니다:
- 확장 센서 인터페이스
- 센서 권한 이름
- 센서 기능 이름
- 권한 해제 알고리즘
-
일반 센서 권한 해제 알고리즘을 "
magnetometer"로 호출함. - 가상 센서 유형
최신
측정값 (Sensor)
의 센서
유형이 자력계일 경우:
비보정 자력계 센서 유형은 다음의 데이터를 가집니다:
- 확장 센서 인터페이스
- 센서 권한 이름
- 센서 기능 이름
- 권한 해제 알고리즘
-
일반 센서 권한 해제 알고리즘을 "
magnetometer"로 호출함. - 가상 센서 유형
-
"
uncalibrated-magnetometer"
최신
측정값 (Sensor)
의 센서
유형이 비보정 자력계일 경우:
자기장 값의 부호는 로컬 좌표계에서 오른손 법칙을 따라야 합니다(아래 그림 참조).
5.1. 참고 기준
로컬 좌표계는
Magnetometer
및 UncalibratedMagnetometer
측정값의 기준 프레임입니다.
이는 장치 좌표계 또는 스크린 좌표계일 수 있습니다.
6. API
6.1. Magnetometer 인터페이스
[SecureContext ,Exposed =Window ]interface :Magnetometer Sensor {constructor (optional MagnetometerSensorOptions = {});sensorOptions readonly attribute double ?;x readonly attribute double ?;y readonly attribute double ?; };z enum {MagnetometerLocalCoordinateSystem ,"device" };"screen" dictionary :MagnetometerSensorOptions SensorOptions {MagnetometerLocalCoordinateSystem = "device"; };referenceFrame
Magnetometer에서 지원하는 옵션은 "frequency" 와 "referenceFrame"입니다.
6.1.1. Magnetometer.x
x
속성은 Magnetometer
인터페이스에서 X축 방향의 자기장을 나타냅니다.
즉, 이 속성은 get value from latest reading을 this와 "x" 인수로
호출한 결과를 반환합니다.
6.1.2. Magnetometer.y
y
속성은 Magnetometer
인터페이스에서 Y축 방향의 자기장을 나타냅니다.
즉, 이 속성은 get value from latest reading을 this와 "y"
인수로 호출한 결과를 반환합니다.
6.1.3. Magnetometer.z
z
속성은 Magnetometer
인터페이스에서 Z축 방향의 자기장을 나타냅니다.
즉, 이 속성은 get value from latest reading을 this와 "z"
인수로 호출한 결과를 반환합니다.
6.2. UncalibratedMagnetometer 인터페이스
[SecureContext ,Exposed =Window ]interface :UncalibratedMagnetometer Sensor {constructor (optional MagnetometerSensorOptions = {});sensorOptions readonly attribute double ?;x readonly attribute double ?;y readonly attribute double ?;z readonly attribute double ?;xBias readonly attribute double ?;yBias readonly attribute double ?; };zBias
new UncalibratedMagnetometer(sensorOptions)
생성자 단계는 자력계 객체 생성 추상 연산을
this 및
sensorOptions와 함께 호출하는 것이다.
UncalibratedMagnetometer에서 지원하는 옵션은 "frequency" 와 "referenceFrame"입니다.
6.2.1. UncalibratedMagnetometer.x
x
속성은 UncalibratedMagnetometer
인터페이스에서 X축 방향의 비보정 자기장을 나타냅니다.
즉, 이 속성은 get value from latest reading을 this와 "x"
인수로 호출한 결과를 반환합니다.
6.2.2. UncalibratedMagnetometer.y
y
속성은 UncalibratedMagnetometer
인터페이스에서 Y축 방향의 비보정 자기장을 나타냅니다.
즉, 이 속성은 get value from latest reading을 this와 "y"
인수로 호출한 결과를 반환합니다.
6.2.3. UncalibratedMagnetometer.z
z
속성은 UncalibratedMagnetometer
인터페이스에서 Z축 방향의 비보정 자기장을 나타냅니다.
즉, 이 속성은 get value from latest reading을 this와 "z"
인수로 호출한 결과를 반환합니다.
6.2.4. UncalibratedMagnetometer.xBias
xBias
속성은 UncalibratedMagnetometer
인터페이스에서 X축 방향의 하드
아이언 왜곡 보정값을 나타냅니다.
즉, 이 속성은 get value from latest reading을 this와
"xBias" 인수로 호출한 결과를 반환합니다.
6.2.5. UncalibratedMagnetometer.yBias
yBias
속성은 UncalibratedMagnetometer
인터페이스에서 Y축 방향의 하드
아이언 왜곡 보정값을 나타냅니다.
즉, 이 속성은 get value from latest reading을 this와
"yBias" 인수로 호출한 결과를 반환합니다.
6.2.6. UncalibratedMagnetometer.zBias
zBias
속성은 UncalibratedMagnetometer
인터페이스에서 Z축 방향의 하드
아이언 왜곡 보정값을 나타냅니다.
즉, 이 속성은 get value from latest reading을 this와
"zBias" 인수로 호출한 결과를 반환합니다.
7. 추상 연산
7.1. 자력계 객체 생성
- input
-
object,
Magnetometer또는UncalibratedMagnetometer객체options,
MagnetometerSensorOptions객체입니다.
-
allowed를 정책 제어 기능 확인에 object의 센서 유형으로 호출한 결과로 둔다.
-
allowed가 false이면:
-
센서 객체 초기화를 object와 options로 호출.
-
options.
referenceFrame이 "screen"이면:
8. 자동화
이 절에서는 Generic Sensor API § 9 Automation을 확장하여 Magnetometer에 특화된 가상 센서 메타데이터를 제공합니다.
8.1. 자력계 자동화
타입별 가상 센서 메타데이터 map 은 다음의 항목을 가져야 합니다:
- key
- value
-
가상 센서 메타데이터로, reading parsing algorithm이 parse XYZ reading이어야 합니다.
8.2. Uncalibrated Magnetometer 자동화
타입별 가상 센서 메타데이터 map 은 다음의 항목을 가져야 합니다:
- key
- value
-
가상 센서 메타데이터로, reading parsing algorithm은 uncalibrated magnetometer reading parsing algorithm이어야 합니다.
8.2.1. Uncalibrated Magnetometer 읽기 파싱 알고리즘
-
reading을 parse XYZ reading에 parameters를 인자로 호출한 결과로 둔다.
-
reading이 undefined이면,
-
undefined를 반환한다.
-
-
keys에 « "
xBias", "yBias", "zBias" » 값을 리스트로 담는다. -
각 key에 대하여 반복
-
value를 parse single-value number reading 에 parameters, key 인자로 호출한 결과로 둔다.
-
value가 undefined이면,
-
undefined를 반환한다.
-
-
-
reading[key]를 value[key]로 설정한다.
-
-
reading을 반환한다.
9. 자력계 센서의 제한사항
이 절은 비규범적입니다.
지구장의 방향과 세기는 특히 위도에 따라 위치에 따라 변합니다. 예를 들어, 적도 근처가 세기가 가장 약하고 극지방이 가장 강합니다. 하드 아이언 간섭(예: 센서 근처의 영구 자석, 예를 들면 휴대폰 스피커의 자석)도 측정 정확도에 영향을 미칩니다. 전자기기, 노트북, 배터리 등이 있으면 소프트 아이언 간섭에 영향을 줄 수 있습니다. 휴대전화의 비행기 탑승 모드(Flight Mode) 옵션은 전자기 간섭을 줄이는 데 도움이 될 수 있습니다.
위와 같은 공간적 변동 외에도, 자기장은 시간에 따른 변동(예: 태양풍, 자기 폭풍)으로 인해, 지구 외부의 자기장이 왜곡될 수 있습니다.
10. 사용 사례 및 요구사항
이 절은 비규범적입니다.
자력계는 다음과 같은 다양한 사용 사례에 활용될 수 있습니다:
-
센서 융합. 자력계의 흔한 활용 사례는 센서 융합을 통해 지구 기준으로 정지된 절대 방향 센서 [MOTION-SENSORS]를 생성하는 것이며, 또는 나침반 구현(위치별로 편각 보정된 나침반)이 대표적입니다. 나침반 방향 계산은 § 11 자력계를 활용한 나침반 방향 참고.
-
가상현실(VR)·증강현실(AR). 자력계는 VR 디바이스에서 마그네틱 버튼 입력 구현에 사용할 수 있습니다 [VRBUTTON]. VR/AR 헤드 트래킹 시스템에서는 자력계 데이터를 이용해 자이로스코프 보정 및 요(yaw) 축 정렬에 활용합니다.
-
제스처 인식. 막대·펜·반지 같은 자석을 사용해 3D 공간에서 제스처 인식을 할 수 있습니다 [MAGITACT]. 사용자가 기기 주변 3D 공간에서 자석을 움직이면, 자력계 센서가 자기장 변화 패턴을 감지해 다양한 인터랙션(줌, 페이지 넘김, 전화 응답/거절, 클릭 등)을 실행할 수 있습니다.
-
실내 내비게이션. 모바일 자력계 데이터를 이용해 건물 내부의 자기장을 검출할 수 있습니다 [MAGINDOORPOS]. 내부 자기장의 지역적 편차를 활용한 자기장 이상치로 실내 위치 추정이 가능합니다. 쇼핑몰, 공항 내 길찾기, 위치 기반 광고/지오펜싱 등 활용 사례가 있습니다.
-
금속 탐지. 자력계를 활용하면 주변 금속 유/무 탐지(예: 숨겨진 금속 검출 등)가 가능합니다.
11. 자력계를 활용한 나침반 방향
이 절은 비규범적입니다.
자기 북극에 정렬되는 나침반은 수세기 동안 위치 탐색에 활용되었습니다. 지구의 자전축은 지도 기준의 북극·남극(지리적 극)을 정의하며, 실제 자북극은 지리 극과 약 11.5도(약 1000마일) 차이가 있습니다. 편각(declination angle)을 보정하여 실제 북극 방향을 계산합니다.
기기가 항상 지표면에 수평인 경우,
지구 자기장의 X, Y축(x,
y만으로
방위를 계산할 수 있습니다.
지정위치(진북)로 방향을 측정하려면 해당 위치의 편각을 더하면 됩니다.
편각(magnetic declination) 또는 편각각(declination angle)은 자북과 실제북 사이의 수평면 각도로, 위치와 시간에 따라 달라집니다. 보통 자북이 진북 기준 동쪽이면 양수, 서쪽이면 음수로 나타냅니다. NOAA(미국해양대기청)에서 제공하는 자기 편각 계산기 등으로 실시간 값을 얻을 수 있습니다.
자북 계산식 예:
let sensor= new Magnetometer(); sensor. start(); let heading= Math. atan2( sensor. y, sensor. x) * ( 180 / Math. PI); console. log( 'Heading in degrees: ' + heading);
위도·경도 기준의 진북 계산식 예:
// 위도 경도 값 취득(생략) let latitude= 0 , longitude= 0 ; // 해당 위경도의 자기 편각 취득 fetch( 'https://www.ngdc.noaa.gov/geomag-web/calculators/calculateDeclination' + '?lat1=' + latitude+ '&lon1=' + longitude+ '&resultFormat=csv' ) . then( response=> response. text()). then( text=> { let declination= parseFloat( text. replace( /^#.*$/gm , '' ). trim(). split( ',' )[ 4 ]); // 편각 보정 적용 console. log( 'True heading in degrees: ' + ( heading+ declination)); });
참고: 기기가 수평이 아닌 경우, 개발자는 틸트(기울기) 보정 기술을 적용해야 하며, 이를 위해 3축 가속도계가 필요합니다. 가속도계와 자력계 융합을 통한 방향 센서 데이터가 이 경우 필수적으로 활용됩니다.
12. 감사의 글
Generic Sensor API에 기여한 Tobie Langel에게 감사드립니다.
13. 적합성
적합성 요구사항은 설명적 진술과 RFC 2119 용어의 조합으로 표현됩니다. 규범 부분에서 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY" 및 "OPTIONAL"은 RFC 2119에 따라 해석해야 합니다. 그러나 가독성을 위해 이 명세에서는 모두 대문자로 표기하지 않습니다.
명시적으로 비규범, 예시, 참고사항 등으로 표시된 부분을 제외하고, 모든 텍스트는 규범적입니다. [RFC2119]
적합한 user agent는 해당하는 모든 규정(요구 사항)을 준수해야 합니다.
이 명세의 IDL 조각은 Web IDL 명세에서 요구하는 바와 같이 해석해야 합니다. [WEBIDL]