1. 소개
Magnetometer는 Generic Sensor API [GENERIC-SENSOR]를 확장하여, 장치의 주 자력계 센서가 감지한 자기장에 관한 정보를 제공한다. 자력계 센서는 세 물리 축(x, y, z) 전체의 자기장을 μT(마이크로 테슬라) 단위로 측정한다.
이 명세는 두 개의 새 인터페이스를 정의한다:
-
Magnetometer는 보정된 자기장 값을 보고하며, -
UncalibratedMagnetometer는 보정되지 않은 자기장 값을 보고한다.
자기장은 전류, 자기 물질 또는 행성의 자전과 지구 핵의 용융 철 운동이 결합되어 생기는 지구의 자기력에 의해 생성되는 자기 효과로 인해 자력계 센서에 자기력을 가하는 장이다.
Hard iron 왜곡은 자화된 철과 같이 자기장을 만들어 내는 물체에 의해 생성된다.
Soft iron 왜곡은 자기장을 늘리거나 왜곡하며, 니켈 및 철과 같은 금속에 의해 발생한다.
보정된 자기장은 자기장에 hard iron 왜곡 및 soft iron 왜곡 보정을 적용한 것이다.
보정되지 않은 자기장은 자기장에 hard iron 왜곡 보정은 적용하지 않고 soft iron 왜곡 보정은 적용한 것이며, 따라서 자력계 주변에서 움직이는 자화된 물체로 인해 생기는 자기장의 변화를 보고한다.
2. 예제
let sensor= new Magnetometer(); sensor. start(); sensor. onreading= () => { console. log( "X축 방향의 자기장 " + sensor. x); console. log( "Y축 방향의 자기장 " + sensor. y); console. log( "Z축 방향의 자기장 " + sensor. z); }; sensor. onerror= event=> console. log( event. error. name, event. error. message);
3. 보안 및 개인정보 보호 고려 사항
Magnetometer는 자기장에 관한 정보를 제공하며, 이론적으로는 사용자의 위치를 노출할 수 있다. 예를 들어 공격 벡터는 특정 위치의 사전 자화된 표면이 될 수도 있고, 건물로 인해 생긴 일정한 자기장 교란과 위치 사이의 매핑이 될 수도 있다. 지구 자기장의 세기가 균일하지 않기 때문에, 또 다른 공격 벡터는 사용자의 위치를 노출하거나 검증하는 것이 될 수 있다. 예를 들어 최종 사용자가 VPN을 통해 연결되어 있다면, 지리적 IP 정보와 관련된 자기장을 실제 위치의 자력계 판독값과 비교하여 사용자가 VPN을 사용 중인지 여부를 알 수 있다. 구현자는 자기장 세기와 CPU 실행 같은 다른 측면 사이의 상관관계를 통한 사이드 채널 누출의 잠재적 위험을 인식해야 한다. 특정 상황에서는 이러한 누출이 다른 탭에서 사용된 애플리케이션이나 방문한 웹사이트에 관한 정보를 잠재적으로 누출할 수 있다. [MAGSPY]
보정되지 않은 자력계 판독값은 보석과 같은 주변의 자화된 물체에 영향을 받을 수 있으며, 그로 인해 키 입력 모니터링에 사용될 수 있는 정보가 노출될 수 있다.
이러한 특정 위협을 완화하기 위해 사용자 에이전트는 다음 완화 전략 중 하나 또는 둘 모두를 사용해야 한다:
-
최대 샘플링 주파수 제한
-
센서 판독값의 정확도 낮추기
이러한 완화 전략은 Generic Sensor API [GENERIC-SENSOR]에 정의된 일반 완화책을 보완한다.
4. 권한 정책 통합
이 명세는 정책 제어 기능을 사용하며,
이 기능은 [DEVICE-ORIENTATION]에 정의된 문자열
"magnetometer"로
식별된다.
5. 모델
Magnetometer 센서 타입은 다음 관련 데이터를 가진다:
- 확장 센서 인터페이스
- 센서 권한 이름
- 센서 기능 이름
- 권한 취소 알고리즘
-
"
magnetometer"와 함께 일반 센서 권한 취소 알고리즘을 호출한다. - 가상 센서 타입
-
"
magnetometer"
latest reading은, 센서 타입이 Magnetometer인 Sensor에
대해
다음을 포함해야 한다:
Uncalibrated Magnetometer 센서 타입은 다음 관련 데이터를 가진다:
- 확장 센서 인터페이스
- 센서 권한 이름
- 센서 기능 이름
- 권한 취소 알고리즘
-
"
magnetometer"와 함께 일반 센서 권한 취소 알고리즘을 호출한다. - 가상 센서 타입
-
"
uncalibrated-magnetometer"
latest reading은, 센서 타입이 Uncalibrated Magnetometer인 Sensor에
대해
다음을 포함해야 한다:
-
key가 "x", "y", "z"이고 value가 3개의 서로 다른 축 주위의 보정되지 않은 자기장을 포함하는 세 개의 entry.
-
key가 "xBias", "yBias", "zBias"이고 value가 3개의 서로 다른 축 주위의 hard iron 왜곡 보정을 포함하는 세 개의 추가 entry.
자기장 값의 부호는 로컬 좌표계에서 오른손 규약을 따라야 한다(아래 그림 참조).
5.1. 참조 프레임
로컬 좌표계는 Magnetometer와
UncalibratedMagnetometer
reading의 참조 프레임을 나타낸다.
이는 장치 좌표계 또는 화면 좌표계 중 하나일 수 있다.
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축 주위의 자기장을 나타낸다.
다시 말해 이 속성은 this와 "x"를 인수로 하여
get value from latest reading을 호출한 결과를 반환한다.
6.1.2. Magnetometer.y
y
속성은 Magnetometer
인터페이스에서 Y축 주위의 자기장을 나타낸다.
다시 말해 이 속성은 this와 "y"를 인수로 하여
get value from latest reading을 호출한 결과를 반환한다.
6.1.3. Magnetometer.z
z
속성은 Magnetometer
인터페이스에서 Z축 주위의 자기장을 나타낸다.
다시 말해 이 속성은 this와 "z"를 인수로 하여
get value from latest reading을 호출한 결과를 반환한다.
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축 주위의 보정되지 않은 자기장을 나타낸다.
다시 말해 이 속성은 this와 "x"를 인수로 하여
get value from latest reading을 호출한 결과를 반환한다.
6.2.2. UncalibratedMagnetometer.y
y
속성은 UncalibratedMagnetometer
인터페이스에서 Y축 주위의 보정되지 않은 자기장을 나타낸다.
다시 말해 이 속성은 this와 "y"를 인수로 하여
get value from latest reading을 호출한 결과를 반환한다.
6.2.3. UncalibratedMagnetometer.z
z
속성은 UncalibratedMagnetometer
인터페이스에서 Z축 주위의 보정되지 않은 자기장을 나타낸다.
다시 말해 이 속성은 this와 "z"를 인수로 하여
get value from latest reading을 호출한 결과를 반환한다.
6.2.4. UncalibratedMagnetometer.xBias
xBias
속성은 UncalibratedMagnetometer
인터페이스에서 X축 주위의 hard
iron 왜곡 보정을 나타낸다.
다시 말해 이 속성은 this와 "xBias"를 인수로 하여
get value from latest reading을 호출한 결과를 반환한다.
6.2.5. UncalibratedMagnetometer.yBias
yBias
속성은 UncalibratedMagnetometer
인터페이스에서 Y축 주위의 hard
iron 왜곡 보정을 나타낸다.
다시 말해 이 속성은 this와 "yBias"를 인수로 하여
get value from latest reading을 호출한 결과를 반환한다.
6.2.6. UncalibratedMagnetometer.zBias
zBias
속성은 UncalibratedMagnetometer
인터페이스에서 Z축 주위의 hard
iron 왜곡 보정을 나타낸다.
다시 말해 이 속성은 this와 "zBias"를 인수로 하여
get value from latest reading을 호출한 결과를 반환한다.
7. 추상 연산
7.1. 자력계 객체 구성
- 입력
-
object,
Magnetometer또는UncalibratedMagnetometer객체options,
MagnetometerSensorOptions객체.
-
allowed를 object의 센서 타입으로 check sensor policy-controlled features를 호출한 결과로 둔다.
-
allowed가 false라면:
-
object와 options를 사용하여 initialize a sensor object를 호출한다.
-
options.
referenceFrame이 "screen"이라면:
8. 자동화
이 절은 Generic Sensor API § 9 Automation을 확장하여, Magnetometer에 특화된 가상 센서 메타데이터를 제공한다.
8.1. Magnetometer 자동화
타입별 가상 센서 메타데이터 map은 다음 entry를 가져야 한다:
- key
-
"
magnetometer" - value
-
가상 센서 메타데이터로서, 그 reading 파싱 알고리즘은 parse XYZ reading이다.
8.2. Uncalibrated Magnetometer 자동화
타입별 가상 센서 메타데이터 map은 다음 entry를 가져야 한다:
- key
- value
-
가상 센서 메타데이터로서, 그 reading 파싱 알고리즘은 uncalibrated magnetometer reading 파싱 알고리즘이다.
8.2.1. Uncalibrated Magnetometer reading 파싱 알고리즘
- 입력
-
parameters, JSON
Object - 출력
-
sensor reading 또는 undefined
-
reading을 parameters로 parse XYZ reading을 수행한 결과로 둔다.
-
reading이 undefined라면.
-
undefined를 반환한다.
-
-
keys를 « "
xBias", "yBias", "zBias" » list로 둔다. -
keys의 각 key에 대해 for each를 수행한다
-
value를 parameters와 key를 사용하여 parse single-value number reading을 호출한 결과로 둔다.
-
value가 undefined라면.
-
undefined를 반환한다.
-
-
-
reading[key]를 value[key]로 설정한다.
-
-
reading을 반환한다.
9. Magnetometer 센서의 한계
이 절은 비규범적이다.
지구 자기장의 방향과 크기는 위치, 특히 위도에 따라 변한다. 예를 들어 크기는 적도 부근에서 가장 낮고 극지방 부근에서 가장 높다. 센서 주변에 영구 자석(예: 휴대폰 스피커의 자석)이 존재한다는 의미의 일부 hard-iron 간섭도 판독값의 정확도에 영향을 준다. 전자 제품, 노트북, 배터리 등의 존재 역시 soft iron 간섭에 기여한다. 휴대전화의 비행기 모드 옵션은 전자기 간섭을 줄이는 데 도움이 될 수 있다.
위와 같은 자기장의 공간적 변화 외에도, 태양풍이나 자기 폭풍과 같은 시간 기반 변화도 지구의 자기권 또는 외부 자기장을 왜곡한다.
10. 사용 사례 및 요구사항
이 절은 비규범적이다.
자력계는 다양한 사용 사례에 사용할 수 있다. 예를 들면 다음과 같다:
-
센서 융합. 자력계의 일반적인 사용 사례는 센서 융합으로, 지구 평면에 대해 정지해 있는 Absolute Orientation Sensor [MOTION-SENSORS]를 생성하거나, 지리적 위치에 따른 편각 보정을 통해 진북을 가리키도록 하는, 기본적으로 앞의 센서와 같은 나침반을 생성하는 것이다. § 11 Magnetometer를 사용한 나침반 방위에 자세히 설명된 것처럼 나침반 방위를 계산한다.
-
가상 현실 및 증강 현실. 자력계는 VR 인클로저용 자기 버튼을 사용한 입력을 구현하는 데 사용할 수 있다 [VRBUTTON]. VR 및 AR용 헤드 마운트 추적 시스템은 자력계 데이터를 사용하여 자이로스코프 판독값 보정을 돕고 yaw 판독값을 자기 북쪽에 맞출 수 있다.
-
제스처 인식. 자석 막대, 펜 또는 반지 같은 물체를 사용하여 쓰기, 서명, 악기 연주와 같은 다양한 상호작용도 가능하게 할 수 있다 [MAGITACT]. 사용자는 자석을 사용하여 장치 주변의 3D 공간에서 거친 제스처를 수행한다. 자석의 움직임은 장치에 통합된 나침반 센서가 감지하는 자기장에 영향을 준다. 제스처의 시간적 패턴은 모바일 장치에 서로 다른 상호작용 명령을 보내기 위한 기반으로 사용할 수 있다. 확대/축소, 페이지 넘기기, 전화 수락/거절, 항목 클릭 등이 사용 사례의 일부이다.
-
실내 내비게이션. 내비게이션 시스템은 모바일 장치의 자력계 데이터 [MAGINDOORPOS]를 사용하여 건물 내부의 자기장을 감지할 수 있다. 충분한 국소 변동성이 있다면, 그 이상값을 자기 위치 추정에 활용할 수 있다. 실내 내비게이션의 사용 사례에는 예를 들어 근접 광고, 쇼핑몰이나 공항에서의 길 찾기, 지오펜싱 등이 있다.
-
금속 탐지. 자력계는 주변 금속의 존재를 감지하는 유틸리티 애플리케이션에서 사용할 수 있다. 예를 들어 물체 내부에 숨겨진 포함물을 찾는 데 사용할 수 있다.
11. Magnetometer를 사용한 나침반 방위
이 절은 비규범적이다.
나침반은 지구의 자극에 맞춰 정렬되는 도구로, 수 세기 동안 항해에 사용되어 왔다. 지구의 자전축은 우리가 지도 기준에 사용하는 지리적 북극과 남극을 정의한다. 지리적 극과 자기 극 사이에는 약 11.5도(약 1000마일)의 차이가 있다. 이러한 상황을 보정하기 위해 자기 방향에 편각을 적용한다.
장치가 항상 지표면에 대해 수평이라면, 지구 자기장의
x
및 y
성분만 사용하여 나침반 방위를 결정할 수 있다.
즉, 지표면과 평면을 이루는 방향을 사용하는 것이다.
지리적 북쪽(또는 진북) 방위를 결정하려면 적절한
편각을 더한다.
자기 편각 또는 편각은 수평면에서 자북과 진북 사이의 각도이며, 지표면의 위치에 따라 달라지고 시간이 지남에 따라 변한다. 관례상 편각은 자북이 진북의 동쪽에 있을 때 양수이고, 서쪽에 있을 때 음수이다. 자기 편각의 실시간 값은 예를 들어 National Oceanic and Atmospheric Administration(NOAA)이 제공하는 자기 편각 계산기를 사용하여 얻을 수 있다.
자북은 다음과 같이 계산한다:
let sensor= new Magnetometer(); sensor. start(); let heading= Math. atan2( sensor. y, sensor. x) * ( 180 / Math. PI); console. log( '방위(도): ' + 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( '진방위(도): ' + ( heading+ declination)); });
참고: 장치가 지표면에 대해 수평이 아니라면, 개발자는 다양한 기울기 보정 기법을 적용해야 하며, 이를 위해 3축 가속도계가 필요하다. 이 특정 사용 사례를 구현하려면 가속도계와 자력계 센서의 융합인 orientation sensor의 데이터가 필요하다.
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]
적합한 사용자 에이전트는 사용자 에이전트에 적용 가능한 이 명세의 모든 요구사항을 구현해야 한다.
이 명세의 IDL 조각은 Web IDL 명세에 설명된 대로 적합한 IDL 조각에 요구되는 방식으로 해석해야 한다. [WEBIDL]