磁力計

W3C 作業草案,

この文書の詳細
このバージョン:
https://www.w3.org/TR/2025/WD-magnetometer-20250212/
最新公開バージョン:
https://www.w3.org/TR/magnetometer/
エディタードラフト:
https://w3c.github.io/magnetometer/
以前のバージョン:
履歴:
https://www.w3.org/standards/history/magnetometer/
フィードバック:
public-device-apis@w3.org 件名 “[magnetometer] … メッセージトピック …” (アーカイブ)
磁力計イシューレポジトリ
編集者:
Anssi Kostiainen (Intel Corporation)
Rijubrata Bhaumik (Intel Corporation)
テストスイート:
GitHub 上の web-platform-tests

概要

本仕様は、X、Y、Z軸の磁場を測定するための具体的なセンサーインターフェースを定義します。

この文書の位置付け

このセクションは、公開時点でのこの文書の位置付けについて説明します。現在のW3C刊行物およびこの技術報告書の最新版は、W3C技術報告書一覧 https://www.w3.org/TR/で見つけることができます。

この文書は、Devices and Sensors Working Groupによって、勧告トラックを使用して作業草案として公開されました。この文書はW3Cの勧告となることを意図しています。

本文書に関するコメントは、public-device-apis@w3.org購読アーカイブ)までお送りください。 メール送信の際は、件名に“magnetometer”を含めてください。できれば “[magnetometer] …コメントの要約…” のように記載してください。 すべてのご意見を歓迎します。

作業草案としての公開は、W3Cおよびそのメンバーによる支持を意味するものではありません。この文書は草案であり、予告なく更新、置換、または廃止されることがあります。この文書を進行中の作業以外として引用するのは不適切です。

この文書は、W3C特許ポリシーのもとで活動するグループによって作成されました。 W3Cはグループの成果物に関連して開示された特許の 公開リスト を維持しており、そのページには特許開示の手順も記載されています。 特許の本質的クレームを含むと考えられる特許を実際に知っている個人は、W3C特許ポリシー第6節に従って情報を開示しなければなりません。

この文書は、2023年11月3日版W3Cプロセス文書に従って管理されています。

この仕様は開発者からのフィードバックや高価値ユースケースを求めています。ご意見はGitHubでお送りください。

本書は随時保守・更新されます。本書の一部は作業途中のものです。

1. はじめに

Magnetometerは、Generic Sensor API [GENERIC-SENSOR] を拡張して、デバイスの一次磁力計センサーによって検出された 磁場 に関する情報を提供します。 磁力計センサーは、μT(マイクロテスラ)単位でx, y, zの全ての物理軸の磁場を測定します。

本仕様は、2つの新しいインターフェースを定義します:

磁場とは、電流や磁性体によって発生する磁気効果や地球の回転、地球のコア内部での融解鉄の移動による複合効果によって生成される磁気力が磁力計センサーに及ぶ場を指します。

ハードアイアン歪みは、磁化鉄などの磁場を生じる物体によって発生します。

ソフトアイアン歪みは、ニッケルや鉄などの金属によって磁場が伸びたり歪んだりする現象です。

較正済み磁場は、ハードアイアン歪みおよびソフトアイアン歪み補正が施された磁場です。

非較正磁場は、ハードアイアン歪み補正なし、ソフトアイアン歪み補正ありの磁場であり、このため近くの磁化物体の移動による磁場の変動を報告します。

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. セキュリティとプライバシーに関する考慮事項

Magnetometerは磁場に関する情報を提供するため、理論的にはユーザーの位置情報を明らかにする可能性があります。たとえば、攻撃ベクトルには特定の場所に予め磁化された表面がある場合や、建物による一定の磁場の乱れと位置のマッピングなどが考えられます。地球の磁場の強度が一様でないため、別の攻撃ベクトルとしてユーザーの位置暴露や検証もあり得ます。たとえば、エンドユーザーがVPN接続している場合、Geo IP情報と関連付けられた磁場と実際の磁力計読み取り値を比較することで、ユーザーがVPNを使用しているかを判定できる場合があります。実装者は、磁場強度とCPU実行などの他の要素との相関によるサイドチャネル漏洩の潜在的リスクを認識してください。これにより、特定条件下では利用アプリケーションや他タブで閲覧中のウェブサイト等の情報が漏れる可能性があります。[MAGSPY]

非較正磁力計の読み取り値は近くの磁化されたオブジェクト(例:アクセサリー等)の影響を受けるため、キーストローク監視に利用されうる情報を露出する可能性もあります。

これらの特定脅威を緩和するため、ユーザーエージェントは以下のいずれかまたは両方の緩和策を用いるべきです:

これらの緩和策は、Generic Sensor API [GENERIC-SENSOR] で定義された一般的な緩和策を補完します。

4. パーミッションポリシー統合

本仕様は、ポリシー管理機能として "magnetometer" を利用します。これは[DEVICE-ORIENTATION]で定義されています。

5. モデル

磁力計 センサータイプには、次の関連データがあります:

拡張センサーインターフェース

Magnetometer

センサー許可名

"magnetometer"

センサー機能名

"magnetometer"

許可取り消しアルゴリズム

Generic Sensor許可取り消しアルゴリズムを "magnetometer" で呼び出します。

仮想センサータイプ

"magnetometer"

最新読み取り値は、Sensorセンサータイプ磁力計の場合、以下を含まなければなりません:

非較正磁力計 センサータイプには、次の関連データがあります:

拡張センサーインターフェース

UncalibratedMagnetometer

センサー許可名

"magnetometer"

センサー機能名

"magnetometer"

許可取り消しアルゴリズム

Generic Sensor許可取り消しアルゴリズムを "magnetometer" で呼び出します。

仮想センサータイプ

"uncalibrated-magnetometer"

最新読み取り値は、Sensorセンサータイプ非較正磁力計の場合、以下を含まなければなりません:

磁場の値の符号は、ローカル座標系における右手系規則に従うものとします(下図参照)。

Magnetometer coordinate system.

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 referenceFrame = "device";
};
new Magnetometer(sensorOptions) コンストラクターの処理手順は、磁力計オブジェクトの構築抽象オペレーションをthissensorOptionsで呼び出します。

Magnetometer でサポートされるセンサーオプションは "frequency" および "referenceFrame" です。

6.1.1. Magnetometer.x

x 属性は、Magnetometer インターフェースのX軸周りの磁場を示します。 すなわち、この属性は、最新読み取り値から値を取得thisと"x"を引数にして呼び出した結果を返します。

6.1.2. Magnetometer.y

y 属性は、Magnetometer インターフェースのY軸周りの磁場を示します。 すなわち、この属性は、最新読み取り値から値を取得thisと"y"を引数にして呼び出した結果を返します。

6.1.3. Magnetometer.z

z 属性は、Magnetometer インターフェースのZ軸周りの磁場を示します。 すなわち、この属性は、最新読み取り値から値を取得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) コンストラクターの処理手順は、磁力計オブジェクトの構築抽象オペレーションをthissensorOptionsで呼び出します。

UncalibratedMagnetometer でサポートされるセンサーオプションは "frequency" および "referenceFrame" です。

6.2.1. UncalibratedMagnetometer.x

x 属性は、UncalibratedMagnetometer インターフェースのX軸周りの非較正磁場を示します。 すなわち、この属性は、最新読み取り値から値を取得thisと"x"を引数にして呼び出した結果を返します。

6.2.2. UncalibratedMagnetometer.y

y 属性は、UncalibratedMagnetometer インターフェースのY軸周りの非較正磁場を示します。 すなわち、この属性は、最新読み取り値から値を取得thisと"y"を引数にして呼び出した結果を返します。

6.2.3. UncalibratedMagnetometer.z

z 属性は、UncalibratedMagnetometer インターフェースのZ軸周りの非較正磁場を示します。 すなわち、この属性は、最新読み取り値から値を取得thisと"z"を引数にして呼び出した結果を返します。

6.2.4. UncalibratedMagnetometer.xBias

xBias 属性は、UncalibratedMagnetometer インターフェースのX軸周りのハードアイアン歪み補正を示します。 すなわち、この属性は、最新読み取り値から値を取得thisと"xBias"を引数にして呼び出した結果を返します。

6.2.5. UncalibratedMagnetometer.yBias

yBias 属性は、UncalibratedMagnetometer インターフェースのY軸周りのハードアイアン歪み補正を示します。 すなわち、この属性は、最新読み取り値から値を取得thisと"yBias"を引数にして呼び出した結果を返します。

6.2.6. UncalibratedMagnetometer.zBias

zBias 属性は、UncalibratedMagnetometer インターフェースのZ軸周りのハードアイアン歪み補正を示します。 すなわち、この属性は、最新読み取り値から値を取得thisと"zBias"を引数にして呼び出した結果を返します。

7. 抽象オペレーション

7.1. 磁力計オブジェクトの構築

入力

objectMagnetometer またはUncalibratedMagnetometer オブジェクト

optionsMagnetometerSensorOptions オブジェクト。

  1. allowedobjectセンサータイプを 引数にしてセンサーポリシー管理機能のチェックを呼び出した 結果をセットする。

  2. もしallowedがfalseなら:

    1. SecurityError DOMExceptionをスローする。

  3. objectoptionsセンサーオブジェクトの初期化を呼び出す。

  4. もしoptions.referenceFrame が "screen" なら:

    1. objectローカル座標系スクリーン座標系に設定する。

  5. それ以外の場合、objectローカル座標系デバイス座標系に定義する。

8. 自動化

このセクションはGeneric Sensor API § 9 Automationを拡張し、Magnetometer固有の仮想センサメタデータを提供する。

8.1. 磁力計自動化

タイプごとの仮想センサメタデータマップ には次のエントリが含まれていなければならない:

key

"magnetometer"

value

仮想センサメタデータで、読み取りパースアルゴリズムparse XYZ readingであるもの。

8.2. 非較正磁力計自動化

タイプごとの仮想センサメタデータマップ には次のエントリが含まれていなければならない:

key

"uncalibrated-magnetometer"

value

仮想センサメタデータで、読み取りパースアルゴリズム非較正磁力計読み取り値パースアルゴリズムであるもの。

8.2.1. 非較正磁力計読み取り値パースアルゴリズム

入力

parameters、JSON Object

出力

センサー読み取り値またはundefined

  1. readingを、parse XYZ readingparametersを与えて得られる結果とする。

  2. もしreadingundefinedなら。

    1. undefinedを返す。

  3. keysをリスト« "xBias", "yBias", "zBias" »とする。

  4. keyについて:

    1. value単一値数値読み取りパースparameterskeyで呼び出した結果とする。

      1. もしvalueundefinedなら。

        1. undefinedを返す。

    2. Set reading[key] を value[key] に設定する。

  5. readingを返す。

9. 磁力計センサーの制限事項

このセクションは非規範的です

地球の磁場の向きや強さは場所によって変化し、特に緯度によって異なります。たとえば、強さは赤道付近で最も弱く、極付近で最も強くなります。 磁力計の近くに永久磁石(例:携帯電話のスピーカーなど)があると、ハードアイアン干渉が発生し、読み取り精度に影響します。 また、電子機器やノートパソコン、バッテリー等の存在もソフトアイアン干渉の要因となります。 携帯電話の機内モードを利用すると電磁干渉を低減できる場合があります。

上記の空間的な磁場変動に加えて、太陽風や磁気嵐などの時間的変動によって 地球の磁気圏や外部磁場が歪められることもあります。

10. ユースケースと要件

このセクションは非規範的です

磁力計はさまざまなユースケースで利用できます。たとえば:

データの粗さやサンプリング周波数への要件はユースケース次第で変わることがあります。たとえば、金属探知や磁気ボタン入力では粗いデータや低周波数で十分な場合が多いですが、ジェスチャ認識・屋内ナビゲーション・VR/ARではより高精度が必要です。センサーフュージョン用途では最適周波数もセンサの統合方法や他運動センサの特性によって変わります。

11. 磁力計を用いた方位測定

このセクションは非規範的です

コンパス(地磁気の極に合わせる機器)は、何世紀も航法で利用されてきました。 地球の自転軸が地理的な北極・南極を定義しますが、地理極と磁極は約11.5度(約1600km)ずれており、この補正に偏角を加えます。

デバイスが常に地面に水平な場合、地磁気のx およびy 成分からコンパス方位を計算できます。 真北(地理的な北)を得るには適切な偏角を加えます。

磁気偏角または偏角は、水平面上での磁北と真北のなす角で、地表の位置・時刻で変化します。 慣例的に磁北が真北より東なら正、西なら負となります。リアルタイム値はNOAAが提供するMagnetic declination calculator等で取得可能です。

磁北は次のように算出できます:

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]

適合ユーザーエージェントは、本仕様でユーザーエージェント向けに定められている全ての要件を実装しなければなりません。

本仕様のIDLコード片は、Web IDL仕様[WEBIDL]で要求されるとおりに解釈されなければなりません。

索引

この仕様で定義されている用語

他で定義された用語

参考文献

規範的参考文献

[ACCELEROMETER]
Anssi Kostiainen. Accelerometer. 2024年10月9日. CRD. URL: https://www.w3.org/TR/accelerometer/
[DEVICE-ORIENTATION]
Reilly Grant; Marcos Caceres. Device Orientation and Motion. 2025年2月12日. CRD. URL: https://www.w3.org/TR/orientation-event/
[ECMASCRIPT]
ECMAScript 言語仕様. URL: https://tc39.es/ecma262/multipage/
[GENERIC-SENSOR]
Rick Waldron. Generic Sensor API. 2024年2月22日. CRD. URL: https://www.w3.org/TR/generic-sensor/
[INFRA]
Anne van Kesteren; Domenic Denicola. Infra Standard. Living Standard. URL: https://infra.spec.whatwg.org/
[PERMISSIONS]
Marcos Caceres; Mike Taylor. Permissions. 2024年12月20日. WD. URL: https://www.w3.org/TR/permissions/
[PERMISSIONS-POLICY-1]
Ian Clelland. Permissions Policy. 2025年2月10日. WD. URL: https://www.w3.org/TR/permissions-policy-1/
[RFC2119]
S. Bradner. RFCにて要件レベルを示すためのキーワード. 1997年3月. Best Current Practice. URL: https://datatracker.ietf.org/doc/html/rfc2119
[WEBIDL]
Edgar Chen; Timothy Gu. Web IDL Standard. Living Standard. URL: https://webidl.spec.whatwg.org/

参考情報

[MAGINDOORPOS]
Janne Haverinen, Anssi Kemppainen. 周囲磁場に基づくグローバル屋内自己位置推定. Informational. URL: https://doi.org/10.1016%2Fj.robot.2009.07.018
[MAGITACT]
Hamed Ketabdar, Kamer Ali Yüksel, Mehran Roshandel. Magitact. Informational. URL: https://dl.acm.org/doi/10.1145/1719970.1720048
[MAGSPY]
Nikolay Matyunin, Yujue Wang, Tolga Arul, Kristian Kullmann, Jakub Szefer, Stefan Katzenbeisser. MagneticSpy: モバイルデバイス磁力計を用いたウェブ/アプリ指紋取得. Informational. URL: https://dl.acm.org/doi/abs/10.1145/3338498.3358650
[MOTION-SENSORS]
Kenneth Christiansen; Alexander Shalamov. モーションセンサー解説. 2017年8月30日. NOTE. URL: https://www.w3.org/TR/motion-sensors/
[VRBUTTON]
Boris Smus. Google Cardboard用磁気入力. Informational. URL: https://bugs.chromium.org/p/chromium/issues/detail?id=445926

IDL 索引

[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 referenceFrame = "device";
};

[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;
};