1. イントロダクション
Accelerometer、
LinearAccelerationSensor
および GravitySensor
APIは、デバイスによって定義される加速度が
デバイスのX, Y, Z軸へローカル座標系において
加えられる情報を提供するためにGeneric Sensor API [GENERIC-SENSOR]インターフェースを拡張します。
2. 例
let sensor= new Accelerometer(); 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);
let sensor= new GravitySensor({ frequency: 5 , referenceFrame: "screen" }); sensor. onreading= () => { if ( sensor. y>= 9.8 ) { console. log( "ウェブページが地面に垂直です。" ); } } sensor. start();
const shakeThreshold= 25 ; let sensor= new LinearAccelerationSensor({ frequency: 60 }); sensor. addEventListener( 'reading' , () => { if ( sensor. x> shakeThreshold) { console. log( "シェイクを検出しました。" ); } }); sensor. start();
3. ユースケースと要件
ユースケースおよび要件は、Motion Sensors Explainerおよび Sensor use casesドキュメントに記載されています。
4. セキュリティとプライバシーに関する考慮事項
センサー読み取り値は、加速度センサーのような慣性センサーにより提供され、 攻撃者によって様々なセキュリティ脅威に悪用される可能性があります。たとえばキーロギング、 位置追跡、 フィンガープリンティングやユーザー特定などが挙げられます。
たとえばセキュリティコミュニティが公開した研究論文[KEYSTROKEDEFENSE]によると、 周波数を制限することで攻撃のリスクを完全に排除できない一方、 正当な理由でセンサーを利用するウェブアプリケーションの有用性に大きく影響する場合があります。
[TOUCHSIGNATURES] および[ACCESSORY]の研究論文では、 慣性センサー利用時に視覚的なインジケーターを表示したり、センサー読み取り値へのアクセスに明示的なユーザー同意を求める実装が提案されています。 これらの緩和策は、Generic Sensor API [GENERIC-SENSOR]で定義された一般的な緩和策を補完します。
この仕様は、加速度センサー計測値量子化アルゴリズム (最新読み取り値から値を取得操作から呼び出される)を定義しており、 センサーキャリブレーションのフィンガープリンティング[SENSORID]および 高精度のセンサー読み取り値に依拠した攻撃への対策としています。量子化アルゴリズムの詳細はW3C Privacy Interest Groupの推奨に従います。
5. パーミッションポリシー統合
この仕様は、ポリシー管理機能として"accelerometer"を利用しており、
これは[DEVICE-ORIENTATION]で定義されています。
6. モデル
6.1. 加速度センサー
加速度センサーの センサータイプには、次の関連データがあります:
- 拡張センサーインターフェース
- センサー許可名
- センサー機能名
- 許可取り消しアルゴリズム
-
汎用センサー許可取り消しアルゴリズムを "
accelerometer"で呼び出します。 - デフォルトセンサー
-
デバイスのメイン加速度センサー。
- 仮想センサータイプ
最新読み取り値は、 加速度センサーの センサータイプに対し "x", "y", "z" をキーとする3つのエントリーを含み、それぞれの 値には デバイスの対応軸の加速度が含まれます。
加速度は、デバイスの速度が 時間に対して変化する割合です。 単位はメートル毎秒毎秒(m/s2)[SI]です。
加速度の測定における基準フレームは慣性系でなければならず、例えばデバイスが自由落下している場合、各軸において0 (m/s2) の加速度値を示します。
加速度の符号は、 ローカル座標系における右手系規則に従います(下図参照)。
6.2. 直線加速度センサー
直線加速度センサー センサータイプには、次の関連データがあります:
- 拡張センサーインターフェース
- センサー許可名
- センサー機能名
- 許可取り消しアルゴリズム
-
汎用センサー許可取り消しアルゴリズムを "
accelerometer"で呼び出します。 - 仮想センサータイプ
最新読み取り値は、Sensor
の
直線加速度センサーの
センサータイプに対して
"x", "y", "z"の3つエントリーを含み、
それぞれの値には
対応軸の直線加速度が含まれます。
直線加速度は、 センサーを搭載したデバイスに加えられた加速度から 重力成分を除いたものです。
注: 重力と直線加速度の関係については Motion Sensors Explainer § gravity-and-linear-accelerationで説明されています。
6.3. 重力センサー
重力センサー センサータイプには、次の関連データがあります:
- 拡張センサーインターフェース
- センサー許可名
- センサー機能名
- 許可取り消しアルゴリズム
-
汎用センサー許可取り消しアルゴリズムを "
accelerometer"で呼び出します。 - 仮想センサータイプ
-
"
gravity"
最新読み取り値は、Sensor
の
重力センサー
センサータイプに対して
"x", "y", "z" をキーとする3つエントリーを含み、
それぞれの値には
対応軸にかかる重力による加速度が含まれます。
重力は、 デバイスの加速度成分のうち、近傍の質量への速度増加を防ぐ成分です。 デバイスが長時間自由落下している場合は重力値を正しく計算できない場合があります。
注: 重力と直線加速度の関係についてはMotion Sensors Explainer § gravity-and-linear-accelerationで説明されています。
6.4. 参照フレーム
ローカル座標系は、
加速度センサー、
直線加速度センサー、
重力センサー
の読み取り値の参照フレームを表します。これはデバイス座標系、
またはスクリーン座標系のいずれかです。
デバイス座標系は、 デバイスに固定された三次元直交座標系(x, y, z)として定義されます。 ディスプレイ付きデバイスの場合、デバイス座標系の原点はデバイスディスプレイの中心です。デバイスが初期状態で保持されている場合、 Y軸はディスプレイ上端、X軸は右、Z軸はX軸とY軸の外積でディスプレイ面から外側(ユーザー側)に向きます。 デバイス座標系は、 dom screenの向きによらず不変です(下図参照)。
スクリーン座標系は、 dom screen に結びつけられた三次元直交座標系(x, y, z)として定義されます。 スクリーン座標系の原点は dom screenの中心にあります。Y軸は常にdom screen上端方向、X軸は右方向、Z軸はX軸とY軸の外積でスクリーン面外側(ユーザー側)を指します(下図参照)。
デバイス座標系とスクリーン座標系の主な違いは、 スクリーン座標系は常に dom screenの向きに追従する点です。 すなわち現在の向きタイプが変わるとX軸とY軸も入れ替わります。 一方デバイス座標系は デバイスに対して常に不変です。
7. API
7.1. 加速度センサーインターフェース
[SecureContext ,Exposed =Window ]interface :Accelerometer Sensor {constructor (optional AccelerometerSensorOptions = {});options readonly attribute double ?;x readonly attribute double ?;y readonly attribute double ?; };z enum {AccelerometerLocalCoordinateSystem ,"device" };"screen" dictionary :AccelerometerSensorOptions SensorOptions {AccelerometerLocalCoordinateSystem = "device"; };referenceFrame
加速度センサーでサポートされるセンサーオプションは "frequency" と "referenceFrame" です。
7.1.1. Accelerometer.x
x
属性は、Accelerometer
インターフェースの値であり、最新読み取り値から値を取得をthisと"x"を引数にして呼び出した結果を返します。x軸方向の加速度を表します。
7.1.2. Accelerometer.y
y
属性は、Accelerometer
インターフェースの値であり、最新読み取り値から値を取得をthisと"y"を引数にして呼び出した結果を返します。y軸方向の加速度を表します。
7.1.3. Accelerometer.z
z
属性は、Accelerometer
インターフェースの値であり、最新読み取り値から値を取得をthisと"z"を引数にして呼び出した結果を返します。z軸方向の加速度を表します。
7.2. 直線加速度センサーインターフェース
[SecureContext ,Exposed =Window ]interface :LinearAccelerationSensor Accelerometer {constructor (optional AccelerometerSensorOptions = {}); };options
直線加速度センサーでサポートされるセンサーオプションは "frequency" と "referenceFrame" です。
7.2.1. LinearAccelerationSensor.x
x
属性は、LinearAccelerationSensor
インターフェースの値であり、最新読み取り値から値を取得をthisと"x"を引数にして呼び出した結果を返します。x軸方向の直線加速度を表します。
7.2.2. LinearAccelerationSensor.y
y
属性は、LinearAccelerationSensor
インターフェースの値であり、最新読み取り値から値を取得をthisと"y"を引数にして呼び出した結果を返します。y軸方向の直線加速度を表します。
7.2.3. LinearAccelerationSensor.z
z
属性は、LinearAccelerationSensor
インターフェースの値であり、最新読み取り値から値を取得をthisと"z"を引数にして呼び出した結果を返します。z軸方向の直線加速度を表します。
7.3. 重力センサーインターフェース
[SecureContext ,Exposed =Window ]interface :GravitySensor Accelerometer {constructor (optional AccelerometerSensorOptions = {}); };options
重力センサーでサポートされるセンサーオプションは "frequency" と "referenceFrame" です。
7.3.1. GravitySensor.x
x
属性は、GravitySensor
インターフェースの値であり、最新読み取り値から値を取得をthisと"x"を引数にして呼び出した結果を返します。x軸方向の加速度のうち重力による成分を表します。
7.3.2. GravitySensor.y
y
属性は、GravitySensor
インターフェースの値であり、最新読み取り値から値を取得をthisと"y"を引数にして呼び出した結果を返します。y軸方向の加速度のうち重力による成分を表します。
7.3.3. GravitySensor.z
z
属性は、GravitySensor
インターフェースの値であり、最新読み取り値から値を取得をthisと"z"を引数にして呼び出した結果を返します。z軸方向の加速度のうち重力による成分を表します。
8. 抽象オペレーション
8.1. 加速度センサーオブジェクトの構築
- input
-
object:
加速度センサー、直線加速度センサーまたは重力センサーオブジェクトoptions:
AccelerometerSensorOptionsオブジェクト
-
allowedに、センサーポリシー管理機能のチェックをobjectのセンサータイプで呼び出した結果を代入する。
-
もしallowedがfalseなら:
-
SecurityError
DOMExceptionをスローする。
-
-
センサーオブジェクトの初期化を objectとoptionsで呼び出す。
-
もしoptions.
referenceFrameが "screen" なら:
8.2. 加速度センサー計測値量子化アルゴリズム
加速度センサーのセンサータイプは、 以下の読み取り値量子化アルゴリズムを定義します:
-
quantizedReadingをreadingとする。
-
もしquantizedReading["x"]がnullでなければ、quantizedReading["x"]を最も近い0.1 m/s2に設定する。
-
もしquantizedReading["y"]がnullでなければ、quantizedReading["y"]を最も近い0.1 m/s2に設定する。
-
もしquantizedReading["z"]がnullでなければ、quantizedReading["z"]を最も近い0.1 m/s2に設定する。
-
quantizedReadingを返す。
9. 自動化
このセクションは Generic Sensor API § 9 Automation を拡張し、Accelerometer 固有の仮想センサメタデータを提供します。本仕様で使用されるいくつかの 仮想センサータイプ は [DEVICE-ORIENTATION] で定義されています。
9.1. 加速度センサー自動化
accelerometer virtual sensor type と、その per-type virtual sensor metadata の対応するエントリは、Device Orientation and Motion § automation で定義されています。
9.2. 直線加速度センサー自動化
linear-acceleration virtual sensor type と、その per-type virtual sensor metadata の対応するエントリは、Device Orientation and Motion § automation で定義されています。
9.3. 重力自動化
per-type virtual sensor metadata の map には、次の エントリ が含まれていなければなりません:
- key
-
"
gravity" - value
-
virtual sensor metadata で、reading parsing algorithm が parse xyz reading であるもの。
10. 謝辞
Generic Sensor API に関する作業について Tobie Langel に感謝します。
センサーキャリブレーションのフィンガープリンティング緩和提案と議論について、W3C Privacy Interest Group および Paul Jensen に感謝します。