センサータイプ

このセクションでは、センサーの軸、ベースセンサー、複合センサー(アクティビティ、姿勢、未調整、操作)について説明します。

センサーの軸

多くのセンサーのセンサー イベント値は、デバイスに対して静的な相関関係を有する特定のフレームで表されます。

モバイル デバイスの軸

センサー API は、画面の自然な向きに対してのみ相関関係を有します(デバイスの画面の向きが変わっても軸は交換されません)。

モバイル デバイス向けのセンサー API の座標系

図 1. センサー API で使用する座標系(モバイル デバイスを基準とする)

自動車の軸

Android Automotive の実装では、軸は車両の本体フレームを基準として定義されます。車両の基準フレームの原点は、後方軸の中心になります。車両の基準フレームは、次のような向きになります。

  • X 軸は水平右方向で、車両の対称面に対して垂直です。
  • Y 軸は水平前方向です。
自動車デバイス向けのセンサー API の座標系

図 2. センサー API で使用する座標系(自動車のデバイスを基準とする)

車両の基準フレームは右手座標系です。つまり Z 軸は上方向になります。

基準フレームの Z 軸は重力方向になるため、X 軸と Y 軸は両方とも水平になります。そのため、Y 軸が前方軸を通らない場合もあります。

ベースセンサー

ベースセンサーのタイプには、ベースセンサーが表す物理センサーに基づいた名前が付けられます。これらのセンサーは、他のセンサーからデータを生成する複合センサーとは異なり、単一の物理センサーからデータを中継します。ベースセンサーのタイプの例を次に示します。

  • SENSOR_TYPE_ACCELEROMETER
  • SENSOR_TYPE_GYROSCOPE
  • SENSOR_TYPE_MAGNETOMETER

ただし、ベースセンサーは、基礎となる物理センサーと同一ではなく、混同しないようにする必要があります。補正(バイアス補正や温度補正など)が適用されるため、ベースセンサーのデータは物理センサーの未加工の出力ではありません

たとえば、ベースセンサーの特性は、以下のユースケースでは、基礎となる物理センサーの特性とは異なる可能性があります。

  • 1 deg/秒のバイアス範囲を有するとして評価されたジャイロスコープ チップ。
    • 工場での調整、温度補正とバイアス補正を適用すると、Android センサーの実際のバイアスは減少し、バイアスが 0.01 deg/秒より低くなることが保証されるポイントまで減少する可能性があります。
    • このような状況では、Android センサーのバイアスは、基礎となるセンサーのデータシートに 1 deg/秒と示されているものの、0.01 deg/秒未満であると判断できます。
  • 消費電力が 100 uW の気圧計。
    • 生成されたデータをチップから SoC に転送する必要があるため、Android の気圧計センサーからデータを収集する際の実際の消費電力は、かなり高くなる可能性があります(例: 1,000 uW)。
    • このような状況では、気圧計のチップリードで測定された消費電力が 100 uW であるものの、Android センサーの消費電力は 1,000 uW であると判断できます。
  • 調整を実施される側である場合に 100 uW を消費する磁力計は、調整を行う場合にはより多くの電力を消費します。
    • 調整ルーティンでは、ジャイロスコープの有効化に 5,000 uW の電力消費、なんらかのアルゴリズムの実行に追加の 900 uW のコストが必要になる場合があります。
    • このような状況では、Android センサー(磁力計)の最大消費電力は 6,000 uW です。
    • この場合、平均消費電力のほうが有用な測定値であり、これは HAL を介してセンサーの静的特性で報告される値です。

加速度計

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER) は非ウェイクアップ センサーを返します

加速度センサーは、3 つのセンサー軸に沿ってデバイスの加速度を報告します。測定された加速度には、物理的な加速度(速度の変化)と重力の両方が含まれます。測定値は、sensors_event_t.acceleration の x、y、z フィールドで報告されます。

すべての値は SI 単位(m/s^2)で表示され、3 つのセンサー軸に沿ってデバイスの加速度から重力を差し引いた値を測定します。

例:

  • 自由落下している状態の、(x、y、z)のノルムは 0 に近似した値であることが想定されます。
  • デバイスがテーブルの上に平らに置かれ、左側が右側に向けて押されている場合は、x 加速度の値は正になります。
  • デバイスがテーブルの上に平らに置かれている場合、z 軸方向の加速度の値は +9.81 alo です。これは、デバイスの加速度(0 m/s^2)から重力(-9.81 m/s^2)を差し引いた値に相当します。
  • デバイスがテーブルの上に平らに置かれ、空に向けて押された場合、加速度の値は +9.81 より大きくなります。これは、デバイスの加速度(+A m/s^2)から重力(-9.81 m/s^2)を差し引いた値に相当します。

測定値は、以下の項目を使用して調整されます。

  • 温度補正
  • オンライン バイアス調整
  • オンライン スケーリングの調整

バイアスとスケーリングの調整は、ストリーミング中の値の急増を回避するため、センサーが無効になっている間のみ更新する必要があります。

また、加速度計は、sensors_event_t.acceleration.status を通じて測定値に対して想定している精度も報告します。このフィールドに指定できる値の詳細については、SensorManagerSENSOR_STATUS_* 定数をご覧ください。

気温

レポートモード: 変化時

getDefaultSensor(SENSOR_TYPE_AMBIENT_TEMPERATURE) は非ウェイクアップ センサーを返します

このセンサーは、周囲(部屋)の温度を摂氏で測定します。

磁場センサー

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD) は非ウェイクアップ センサーを返します

SENSOR_TYPE_GEOMAGNETIC_FIELD == SENSOR_TYPE_MAGNETIC_FIELD

磁場センサー(磁力計とも呼ばれます)は、3 つのセンサー軸に沿って測定した、周囲の磁場を報告します。

測定値は sensors_event_t.magnetic の x、y、z フィールドで報告され、すべての値はマイクロテスラ(uT)単位で返されます。

また、磁力計は、sensors_event_t.magnetic.status を通じて測定値に対して想定している精度も報告します。このフィールドに指定できる値の詳細については、SensorManagerSENSOR_STATUS_* 定数をご覧ください。

測定値は、以下の項目を使用して調整されます。

  • 温度補正
  • 工場(またはオンライン)での軟鉄補正
  • オンラインでの鋼鉄補正

ジャイロスコープ

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_GYROSCOPE) は非ウェイクアップ センサーを返します

ジャイロスコープ センサーは、3 つのセンサー軸に沿ったデバイスの回転速度を報告します。

回転は反時計回り(右手の法則)で正の値に設定されます。つまり、原点に配置されたデバイスを x 軸、y 軸、または z 軸上の正の位置から見ているオブザーバーは、デバイスが反時計回りに回転しているように見える場合に正の回転を報告します。これは、正の回転の標準的な数学的定義であり、航空宇宙分野における回転の定義とは一致しないことに留意してください。

測定値は sensors_event_t.gyro の x、y、z フィールドで報告され、すべての値は 1 秒あたりのラジアン(rad/s)単位で表示されます。

測定値は、以下の項目を使用して調整されます。

  • 温度補正
  • 工場(またはオンライン)でのスケーリングの補正
  • オンライン バイアス調整(ブレを除去するため)

また、ジャイロスコープは、sensors_event_t.gyro.status を通じて測定値に対して想定している精度も報告します。このフィールドに指定できる値の詳細については、SensorManagerSENSOR_STATUS_* 定数をご覧ください。

ジャイロスコープは、磁力計と加速度計に基づいてエミュレートすることはできません。このため、ローカルでの整合性と応答性が低下します。通常のジャイロスコープ チップに基づいている必要があります。

心拍数

レポートモード: 変化時

getDefaultSensor(SENSOR_TYPE_HEART_RATE) は非ウェイクアップ センサーを返します

心拍数センサーは、デバイスに触れている人の現在の心拍数を報告します。

1 分あたりの現在の心拍数(BPM)は sensors_event_t.heart_rate.bpm で報告され、センサーのステータスは sensors_event_t.heart_rate.status で報告されます。このフィールドに指定できる値の詳細については、SensorManagerSENSOR_STATUS_* 定数をご覧ください。特に、デバイスが身体に装着されていないことが判明している場合を除き、最初のアクティベーションでは、最初のイベントのステータス フィールドを SENSOR_STATUS_UNRELIABLE に設定する必要があります。このセンサーは変更中のため、最後のイベント以降に heart_rate.bpm または heart_rate.status が変更された場合にのみイベントが生成されます。イベントは、すべての sampling_period よりも後に生成されます。

sensor_t.requiredPermission は常に SENSOR_PERMISSION_BODY_SENSORS です。

レポートモード: 変化時

getDefaultSensor(SENSOR_TYPE_LIGHT) は非ウェイクアップ センサーを返します

光センサーにより、SI ルクス単位で現在の照度が報告されます。

測定値は sensors_event_t.light で報告されます。

近接

レポートモード: 変化時

通常、ウェイクアップ センサーとして定義されます。

getDefaultSensor(SENSOR_TYPE_PROXIMITY) はウェイクアップ センサーを返します

近接センサーは、センサーから最も近い表示サーフェスまでの距離を報告します。

Android 4.4 までは、近接センサーは常にウェイクアップ センサーであり、近接距離内で変化を検出すると SoC をウェイクアップ状態に復帰させていました。Android 4.4 より後では、通話中の画面のオン / オフを切り替えるために使用されるものであることから、まずこのセンサーのウェイクアップ バージョンを実装することをおすすめします。

測定値は、sensors_event_t.distance でセンチメートル単位で報告されます。なお、一部の近接センサーは、「近い」または「遠い」のバイナリ測定値のみをサポートしています。この場合、センサーは sensor_t.maxRange の値を「遠く」の状態として、sensor_t.maxRange 未満の値を「近く」の状態として報告します。

圧力

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_PRESSURE) は非ウェイクアップ センサーを返します

気圧センサー(気圧計とも呼ばれます)は、ヘクトパスカル(hPa)単位で大気圧を報告します。

測定値は、以下の項目を使用して調整されます。

  • 温度補正
  • 工場でのバイアス調整
  • 工場でのスケーリングの調整

気圧計は多くの場合、標高の変化を推定することを目的として使用されます。絶対標高を推定するには、海面気圧(天候によって変化する)を基準として使用する必要があります。

相対湿度

レポートモード: 変化時

getDefaultSensor(SENSOR_TYPE_RELATIVE_HUMIDITY) は非ウェイクアップ センサーを返します

相対湿度センサーは、周囲の空気の相対湿度を測定し、値をパーセントで返します。

複合センサーのタイプ

複合センサーは、1 つまたは複数の物理センサーのデータを処理または融合してデータを生成します(ベースセンサー以外のセンサーは、複合センサーと呼ばれます)。複合センサーの例を次に示します。

  • 歩行検出機能大きなモーション。通常は加速度計をベースとしていますが、電力の消費と精度が許容範囲内であることを条件として他のセンサーをベースとすることもできます。
  • ゲームの回転ベクトル(加速度計とジャイロスコープに基づく)。
  • 未調整のジャイロスコープ。ジャイロスコープのベースセンサーに類似していますが、バイアス調整については、測定で補正するのではなく個別に報告されます。

ベースセンサーと同様に、複合センサーの特性は最終的なデータの特性に由来します。たとえば、ゲームの回転ベクトルの消費電力は、加速度計チップ、ジャイロスコープ チップ、データを処理するチップ、データを転送するバスの消費電力の合計と等しいことが想定されます。別の例として、ゲームの回転ベクトルのブレは、物理センサーの特性と同程度に、調整アルゴリズムの品質に大きく依存します。

次の表に、利用可能な複合センサーのタイプを示します。各複合センサーは 1 つまたは複数の物理センサーのデータを使用します。ユーザー エクスペリエンスの低下につながるため、結果の概算を目的として他の基礎となる物理センサーを選択しないでください。

センサーのタイプ カテゴリ 基礎となる物理センサー レポートモード

ゲームの回転ベクトル

姿勢

加速度計、ジャイロスコープ。磁力計を使用しない

連続

地磁気回転ベクトル 省電力センサー

姿勢

加速度計、磁力計。ジャイロスコープは使用しない

連続

視線を投げかけるジェスチャー 省電力センサー

操作

未定義

ワンショット

重力

姿勢

加速度計、ジャイロスコープ

連続

未調整のジャイロスコープ

未調整

ジャイロスコープ

連続

直線加速度

アクティビティ

加速度計、ジャイロスコープ(存在する場合)、または磁力計(ジャイロスコープが存在しない場合)

連続

未調整の磁場

未調整

磁力計

連続

画面の向き(非推奨)

姿勢

加速度計、磁力計、ジャイロスコープ(存在する場合)

連続

ピックアップ ジェスチャー 省電力センサー

操作

未定義

ワンショット

回転ベクトル

姿勢

加速度計、磁力計、ジャイロスコープ

連続

大きなモーション 省電力センサー

アクティビティ

加速度計(または省電力性能を有する他のセンサー)

ワンショット

歩数計 省電力センサー

アクティビティ

加速度計

変化時

歩行検出機能 省電力センサー

アクティビティ

加速度計

特別

チルト検出機能 省電力センサー

アクティビティ

加速度計

特別

ウェイクアップ ジェスチャー 省電力センサー

操作

未定義

ワンショット

省電力センサー = 省電力センサー

アクティビティ複合センサー

直線加速度

基礎となる物理センサー: 加速度計と(存在する場合は)ジャイロスコープ(ジャイロスコープが存在しない場合は磁力計)

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_LINEAR_ACCELERATION) は非ウェイクアップ センサーを返します

直線加速度センサーは、センサー フレーム内のデバイスの直線加速度を報告します(重力は対象に含まれません)。

出力は概念的には、加速度計の出力から重力センサーの出力を引いた値です。sensors_event_t.acceleration の x、y、z フィールドで m/s^2 単位で報告されます。

デバイスがモバイル以外の場合、すべての軸の読み取り値は 0 に近い値になります。

デバイスがジャイロスコープを備えている場合、直線加速度センサーは入力としてジャイロスコープと加速度計を使用する必要があります。

デバイスがジャイロスコープを備えていない場合、直線加速度センサーは入力として加速度計と磁力計を使用する必要があります。

大きなモーション

基礎となる物理センサー: 加速度計(または省電力性能を有する他のセンサー)

レポートモード: ワンショット

省電力

このセンサーのウェイクアップ バージョンのみを実装します。

getDefaultSensor(SENSOR_TYPE_SIGNIFICANT_MOTION) はウェイクアップ センサーを返します

大きなモーション(ユーザーの位置情報の変化につながる可能性がある動き)を検出した際に、大きなモーションの検出機能が起動します。

このような大きなモーションの例を次に示します。

  • 徒歩または自転車で移動している
  • 走行中の自動車、バス、または列車の座席に座っている

大きなモーションがトリガーされない状況の例を次に示します。

  • スマートフォンをポケットに入れたまま動かない
  • スマートフォンはテーブルに置かれており、付近の通行や洗濯機が原因で、テーブルが若干振動している

大まかに説明すると、大きなモーションの検出機能は位置情報の特定で消費される電力の低減を目的として使用します。ローカライゼーション アルゴリズムにより、デバイスが静的な状態であることが検出されると省電力モードに切り替わり、ユーザーの位置が変わるとデバイスが大きなモーションに基づいてスリープ状態から復帰するようになります。

このセンサーは、省電力性能を有している必要があります。その結果、消費電力を抑えられる一方で、検出漏れがいくらか発生する可能性もあります。このような動作が行われることにはいくつかの理由があります。

  • このセンサーの目標は、電力を節約することです。
  • ユーザーが動いていないときにイベントをトリガー(誤検出)すると、電力の観点からコストが増大するため、回避する必要があります。
  • ユーザーが動いたときにイベントをトリガーしないこと(検出漏れ)は、繰り返し発生しない限り許容可能です。ユーザーが 10 秒間歩いた場合、この 10 秒以内にイベントをトリガーしないことは許容できません。

各センサー イベントで sensors_event_t.data[0]1 が報告されます。

歩行検出機能

基礎となる物理センサー: 加速度計(+ 省電力性能を有する他のセンサー)

レポートモード: 特別(1 歩歩くごとに 1 つのイベント)

省電力

getDefaultSensor(SENSOR_TYPE_STEP_DETECTOR) は非ウェイクアップ センサーを返します

歩行検出機能は、ユーザーが 1 歩歩くたびにイベントを生成します。

イベント sensors_event_t.timestamp のタイムスタンプは、足が地面に接したタイミングに対応し、加速している場合は変動が大きくなります。

歩数計と比較して、歩行検出機能は低レイテンシ(2 秒未満)であることが必要です。歩行検出機能と歩数計はどちらも、ユーザーが歩いている、走っている、階段を歩いて昇っていることを検出します。ユーザーが自転車で移動している、運転している、または他の車両内にいる場合にはトリガーしないようにする必要があります。

このセンサーは、省電力性能を有している必要があります。つまり、ハードウェアで歩行を検出できない場合に、このセンサーが定義されないようにする必要があります。特に、歩行検出機能が有効にされており、加速度計が有効にされていない場合は歩行の動作のみによって割り込みをトリガーする(すべての加速度計の読み取り値を使用するわけではない)必要があります。

sampling_period_ns は、歩行検出機能に影響しません。

各センサー イベントで sensors_event_t.data[0]1 が報告されます。

歩数計

基礎となる物理センサー: 加速度計(+ 省電力性能を有する他のセンサー)

レポートモード: 変化時

省電力

getDefaultSensor(SENSOR_TYPE_STEP_COUNTER) は非ウェイクアップ センサーを返します

歩数計は、有効にされている間に最後に再起動した時点からユーザーが歩いた歩数を報告します。

測定値は sensors_event_t.step_counteruint64_t として報告され、システムの再起動時にのみゼロにリセットされます。

イベントのタイムスタンプは、イベントの最後の歩行が検出された時刻に設定されます。

歩行の時刻の意味については、歩行検出機能のセンサータイプをご覧ください。

歩行検出機能と比較して、歩数計のレイテンシは高くなる(最大 10 秒)場合があります。このレイテンシのおかげで、センサーの精度が向上しました。丸 1 日の測定後の歩数は、実際の歩数の 10% 以内の誤差にとどまります。歩行検出機能と歩数計はどちらも、ユーザーが歩いている、走っている、階段を歩いて昇っていることを検出します。ユーザーが自転車で移動している、運転している、または他の車両内にいる場合にはトリガーしないようにする必要があります。

ハードウェアは、内部の歩数がオーバーフローしないようにする必要があります。ハードウェアの内部カウンタの最小サイズは 16 ビットに設定する必要があります。差し迫ったオーバーフロー(最大で 2^16 歩あたり)では、ドライバがカウンタのメンテナンスを行えるように SoC を復帰させることができます。

操作で説明したように、このセンサーは動作していても、他のセンサー(特に使用頻度が高い加速度計)の妨げになることはありません。

特定のデバイスがこれらの操作モードをサポートできない場合は、このセンサータイプを HAL から報告しないようにする必要があります。つまり、HAL でこのセンサーを「エミュレート」することは許容できません。

このセンサーは、省電力性能を有している必要があります。つまり、ハードウェアで歩行を検出できない場合に、このセンサーが定義されないようにする必要があります。特に、歩数計が有効にされており、加速度計が有効にされていない場合は歩行の動作のみによって割り込みをトリガーする(加速度計のデータを使用しない)必要があります。

チルト検出機能

基礎となる物理センサー: 加速度計(+ 省電力性能を有する他のセンサー)

レポートモード: 特別

省電力

このセンサーのウェイクアップ バージョンのみを実装します。

getDefaultSensor(SENSOR_TYPE_TILT_DETECTOR) はウェイクアップ センサーを返します

チルト検出機能は、チルトイベントが検出されるたびにイベントを生成します。

チルトイベントは、2 秒間の平均の重力変化の方向が、有効化またはセンサーで生成された最後のイベントから 35 度以上回転している状態として定義されます。アルゴリズムは次のとおりです。

  • reference_estimated_gravity = 有効化後の最初の 1 秒間の加速度計の測定値の平均、または最後のチルトイベント生成時の推定重力測定値の平均。
  • current_estimated_gravity = 過去 2 秒間の加速度計の測定値の平均。
  • トリガーのタイミング: angle(reference_estimated_gravity, current_estimated_gravity) > 35 degrees

スマートフォンの向きを変えずに大きく加速した場合、チルトイベントはトリガーされません。たとえば、車の運転時、急なターンや急激な加速によって、チルトイベントがトリガーされる必要はありません。これは平均加速度の角度が 35 度を超えている場合についても同様です。通常、このセンサーの実装では加速度計のみを補助装置として使用します。電力消費量が大幅に増大しない他のセンサーを使用することもできます。これは省電力センサーであり、SoC を一時停止モードに移行できることが必要です。HAL では、このセンサーをエミュレートしないでください。各センサー イベントで sensors_event_t.data[0]1 が報告されます。

姿勢複合センサー

回転ベクトル

基礎となる物理センサー: 加速度計、磁力計、ジャイロスコープ

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_ROTATION_VECTOR) は非ウェイクアップ センサーを返します

回転ベクトル センサーは、East-North-Up 座標フレームに対する向きをデバイスの向きとして報告します。これは通常、加速度計、ジャイロスコープ、磁力計の読み取り値を統合することによって取得します。East-North-Up 座標系は、次の場合に直接正規直交基底として定義されます。

  • X は東を指し、地面に接している。
  • Y は北を指し、地面に接している。
  • Z は空を指し、地面に対して垂直である。

スマートフォンの向きは、East-North-Up 座標をスマートフォンの座標に合わせるために必要な回転によって表されます。つまり、ワールド フレーム(X、Y、Z)に回転を適用すると、それらがスマートフォンの座標(x、y、z)に揃えられます。

回転は、軸 rot_axis を中心として角度シータでスマートフォンを回転させて、基準(East-North-Up に整列)デバイスの向きから現在のデバイスの向きへの回転として表示できます。回転は、単位四元数の 4 つの単位を持たない x、y、z、w コンポーネントとしてエンコードされます。

  • sensors_event_t.data[0] = rot_axis.x*sin(theta/2)
  • sensors_event_t.data[1] = rot_axis.y*sin(theta/2)
  • sensors_event_t.data[2] = rot_axis.z*sin(theta/2)
  • sensors_event_t.data[3] = cos(theta/2)

ここで

  • rot_axis の x、y、z フィールドは、回転軸を表す、単位長ベクトルの East-North-Up 座標です
  • theta は回転角度です

四元数とは単位四元数であり、ノルム 1 であることが必要です。これを確認しないと、クライアントの動作が不安定になります。

さらに、このセンサーは推定方位精度を報告します。

sensors_event_t.data[4] = estimated_accuracy(ラジアン)

方位誤差は時間の estimated_accuracy の 95% 未満であることが必要です。このセンサーは、主要な画面の向きの変更入力としてジャイロスコープを使用する必要があります。

このセンサーは、加速度計と磁力計の入力値も使用して、ジャイロスコープのブレを補正します。加速度計と磁力計だけを使用して実装することはできません。

ゲームの回転ベクトル

基礎となる物理センサー: 加速度計とジャイロスコープ(磁力計なし)

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_GAME_ROTATION_VECTOR) は非ウェイクアップ センサーを返します

ゲームの回転ベクトル センサーは回転ベクトル センサーに類似していますが、地磁気を使用しません。したがって、Y 軸は北を指すのではなく、その他の基準を指します。その基準に対しては、Z 軸を中心としたジャイロスコープのブレと同規模のブレが生じることが許容されます。

sensors_event_t.data[0-3] の設定方法について詳しくは、回転ベクトル センサーをご覧ください。このセンサーは、推定方位精度を報告しません。sensors_event_t.data[4] は予約されているため、0 に設定する必要があります。

回転されたスマートフォンが現実世界で同じ向きに戻された場合には、同じゲームの回転ベクトルを報告するのが理想的です。

このセンサーはジャイロスコープと加速度計に基づいている必要があります。ジャイロスコープのバイアスを推定することにより、磁力計を間接的に入力として併用することはできません。

重力

基礎となる物理センサー: 加速度計と(存在する場合は)ジャイロスコープ(ジャイロスコープが存在しない場合は磁力計)

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_GRAVITY) は非ウェイクアップ センサーを返します

重力センサーは、デバイスの座標における重力の方向と大きさを報告します。

重力ベクトルのコンポーネントは、sensors_event_t.acceleration の x、y、z フィールドで m/s^2 単位で報告されます。

デバイスが静止しているときは、重力センサーの出力が加速度計の出力と同じであることが必要です。地球の重力加速度は約 9.8 m/s^2 です。

デバイスがジャイロスコープを備えている場合、重力センサーは入力としてジャイロスコープと加速度計を使用する必要があります。

デバイスがジャイロスコープを備えていない場合、重力センサーは入力として加速度計と磁力計を使用する必要があります。

地磁気回転ベクトル

基礎となる物理センサー: 加速度計と磁力計(ジャイロスコープなし)

レポートモード: 連続

省電力

getDefaultSensor(SENSOR_TYPE_GEOMAGNETIC_ROTATION_VECTOR) は非ウェイクアップ センサーを返します

地磁気回転ベクトルは回転ベクトル センサーに類似していますが、磁力計を使用し、ジャイロスコープは使用しません。

このセンサーは磁力計に基づいている必要があります。ジャイロスコープを使用して実装することはできません。また、このセンサーではジャイロスコープの入力を使用できません。

sensors_event_t.data[0-4] の設定方法について詳しくは、回転ベクトル センサーをご覧ください。

回転ベクトル センサーと同様に、方位誤差は時間の 95% の推定精度(sensors_event_t.data[4])よりも小さいことが必要です。

このセンサーは省電力性能を有している必要があるため、ハードウェアに実装する必要があります。

画面の向き(非推奨)

基礎となる物理センサー: 加速度計、磁力計、(存在する場合は)ジャイロスコープ

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_ORIENTATION) は非ウェイクアップ センサーを返します

注: これは、Android SDK でサポートが終了した古いセンサータイプです。より明確に定義された回転ベクトル センサーに置き換えられました。可能な限り、方向センサーの上に回転ベクトル センサーを配置してご使用ください。

方向センサーは、デバイスの姿勢を報告します。測定値は、sensors_event_t.orientation の x、y、z フィールドで度数で報告されます。

  • sensors_event_t.orientation.x: 方位角、磁北方向と Y 軸の間の、Z 軸を中心とした角度(0<=azimuth<360)。0=北、90=東、180=南、270=西。
  • sensors_event_t.orientation.y: X 軸を中心としたピッチ、回転(-180<=pitch<=180)。Z 軸が Y 軸方向に移動した場合は正の値になります。
  • sensors_event_t.orientation.z: Y 軸を中心としたロール、回転(-90<=roll<=90)。X 軸が Z 軸方向に移動した場合は正の値になります。

歴史的な理由により、ロール角度は時計回りに正の値である点に留意してください(数学的には、反時計回りに正の値であることが必要です)。

デバイスを基準とする向きの描画

図 3. デバイスに対する向き

この定義は、X 軸が飛行機の長辺(テールから機体の先頭まで)に沿って位置づけられる航空分野でのヨー、ピッチ、ロールとは異なります。

また、方向センサーは、sensors_event_t.orientation.status を通じて測定値に対して想定している精度も報告します。このフィールドに指定できる値の詳細については、SensorManagerSENSOR_STATUS_* 定数をご覧ください。

未調整のセンサー

未調整のセンサーはより多くの未加工の結果を提示し、バイアスが含まれることもありますが、調整によって適用される修正からの「ジャンプ」も少なくなります。一部のアプリは、これらの未調整の結果を、よりスムーズで信頼性の高いものとして優先的に扱う場合があります。たとえば、アプリが独自のセンサー フュージョンを実行しようとしている場合は、調整によって実際に結果に偏りが生じる可能性があります。

未調整の加速度計

基礎となる物理センサー: 加速度計

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_UNCALIBRATED) は非ウェイクアップ センサーを返します

未調整の加速度センサーは、バイアス補正なしで 3 つのセンサー軸に沿ったデバイスの加速度をバイアスの推定値とともに報告します(工場でのバイアスと温度補正は、未調整の測定に適用されます)。すべての値は SI 単位(m/s^2)で表示され、sensors_event_t.uncalibrated_accelerometer のフィールドで報告されます。

  • x_uncalib: X 軸方向の加速度(バイアス補正なし)
  • y_uncalib: Y 軸方向の加速度(バイアス補正なし)
  • z_uncalib: Z 軸方向の加速度(バイアス補正なし)
  • x_bias: X 軸方向の推定バイアス
  • y_bias: Y 軸方向の推定バイアス
  • z_bias: Z 軸方向の推定バイアス

未調整のジャイロスコープ

基礎となる物理センサー: ジャイロスコープ

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_UNCALIBRATED) は非ウェイクアップ センサーを返します

未調整のジャイロスコープは、バイアス補正を適用せずに、センサー軸を中心とする回転速度をバイアスの推定値とともに報告します。すべての値はラジアン/秒で表示され、sensors_event_t.uncalibrated_gyro のフィールドで報告されます。

  • x_uncalib: X 軸を中心とした角速度(ブレ補正なし)
  • y_uncalib: Y 軸を中心とした角速度(ブレ補正なし)
  • z_uncalib: Z 軸を中心とした角速度(ブレ補正なし)
  • x_bias: X 軸を中心とした推定ブレ
  • y_bias: Y 軸を中心とした推定ブレ
  • z_bias: Z 軸を中心とした推定ブレ

概念的には、未調整の測定値は、調整済みの測定値とバイアス推定値の合計(_uncalibrated = _calibrated + _bias)です。

x_biasy_biasz_bias の値は、バイアスの推定値が変化すると直ちにジャンプすることが想定され、残りの時間は安定していると考えられます。

使用する座標系の詳細については、ジャイロスコープ センサーの定義をご覧ください。

測定値には、工場での調整と温度補正を適用する必要があります。また、ジャイロスコープのブレ推定を実装して、x_biasy_biasz_bias で妥当な推定値を報告できるようにする必要があります。実装でブレを推定できない場合は、このセンサーを実装しないでください。

このセンサーが存在する場合は、対応するジャイロスコープ センサーも存在しており、両方のセンサーが同じ sensor_t.namesensor_t.vendor の値を共有している必要があります。

未調整の磁場

基礎となる物理センサー: 磁力計

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_MAGNETIC_FIELD_UNCALIBRATED) は非ウェイクアップ センサーを返します

未調整の磁場センサーは、周囲の磁場を、鋼鉄補正の推定値とともに報告します。すべての値はマイクロテスラ(uT)で表示され、sensors_event_t.uncalibrated_magnetic のフィールドで報告されます。

  • x_uncalib: X 軸方向の磁場(鋼鉄補正なし)
  • y_uncalib: Y 軸方向の地場(鋼鉄補正なし)
  • z_uncalib: Z 軸方向の磁場(鋼鉄補正なし)
  • x_bias: X 軸方向の推定鋼鉄バイアス
  • y_bias: Y 軸方向の推定鋼鉄バイアス
  • z_bias: Z 軸方向の推定鋼鉄バイアス

概念的には、未調整の測定値は、調整済みの測定値とバイアス推定値の合計(_uncalibrated = _calibrated + _bias)です。

未調整の磁力計により、上位レベルのアルゴリズムで不適格な鋼鉄推定を処理することができます。x_biasy_biasz_bias の値は、鋼鉄の推定値が変化すると直ちにジャンプすることが想定され、残りの時間は安定していると考えられます。

測定値には、軟鉄補正と温度補正を適用する必要があります。また、鋼鉄の推定を実装して、x_biasy_biasz_bias で妥当な推定値を報告できるようにする必要があります。実装でバイアスを推定できない場合は、このセンサーを実装しないでください。

このセンサーが存在する場合は、対応する磁場センサーも存在しており、両方のセンサーが同じ sensor_t.namesensor_t.vendor の値を共有している必要があります。

ヒンジ角度

レポートモード: 変化時

getDefaultSensor(SENSOR_TYPE_HINGE_ANGLE) はウェイクアップ センサーを返します

ヒンジ角度センサーは、デバイスの 2 つの主要な部分間の角度を度数で測定します。このセンサータイプで測定されるヒンジの動きによって、ディスプレイを展開、表示するなど、ユーザーがデバイスを操作する方法が変更されることが予想されます。

操作複合センサー

一部のセンサーは、主にユーザーの操作の検出に使用されます。それらのセンサーの実装方法については定義しませんが、省電力性能を有している必要があり、ユーザー エクスペリエンスの観点からデバイス品質を確認することはデバイス メーカーの責務です。

ウェイクアップ ジェスチャー

基礎となる物理センサー: 未定義(省電力性能を有しているもの)

レポートモード: ワンショット

省電力

このセンサーのウェイクアップ バージョンのみを実装します。

getDefaultSensor(SENSOR_TYPE_WAKE_GESTURE) はウェイクアップ センサーを返します

ウェイクアップ ジェスチャーを検出するセンサーは、デバイス固有の動きに基づいてデバイスを復帰させることができます。このセンサーによってトリガーされると、デバイスは電源ボタンが押された場合と同様に動作し、画面はオンに切り替わります。この動作(このセンサーによってトリガーされたときに画面をオンにする)は、ユーザーがデバイス設定で無効にすることができます。設定を変更しても、センサーの動作には影響しません。フレームワークがトリガーされたときに画面をオンにするかどうかのみに関係します。検出される実際のジェスチャーは指定されておらず、デバイスのメーカーが選択できます。

このセンサーは 24 時間 365 日有効にされた状態である可能性が高いため、省電力性能を有している必要があります。

各センサー イベントで sensors_event_t.data[0]1 が報告されます。

ピックアップ ジェスチャー

基礎となる物理センサー: 未定義(省電力性能を有しているもの)

レポートモード: ワンショット

省電力

このセンサーのウェイクアップ バージョンのみを実装します。

getDefaultSensor(SENSOR_TYPE_PICK_UP_GESTURE) はウェイクアップ センサーを返します

ピックアップ ジェスチャーを検出するセンサーは、それまでどこにあったか(デスク、ポケット、バッグなど)に関係なく、デバイスが持ち上げられたときにトリガーします。

各センサー イベントで sensors_event_t.data[0]1 が報告されます。

視線を投げかけるジェスチャー

基礎となる物理センサー: 未定義(省電力性能を有しているもの)

レポートモード: ワンショット

省電力

このセンサーのウェイクアップ バージョンのみを実装します。

getDefaultSensor(SENSOR_TYPE_GLANCE_GESTURE) はウェイクアップ センサーを返します

視線を投げかけるジェスチャーを検出するセンサーにより、画面が短時間オンになり、ユーザーは特定の動きに基づいて画面上のコンテンツを一目見ることができます。このセンサーによってトリガーされると、デバイスが画面を短時間の間のみオンにし、ユーザーはデバイスが非インタラクティブ状態でロックされたままで(半スリープ状態)通知やその他のコンテンツを一目見ることができるようになります。その後、画面が再びオフになります。この動作(このセンサーによってトリガーされたときに画面を短時間オンにする)は、ユーザーがデバイス設定で無効にすることができます。設定を変更しても、センサーの動作には影響しません。フレームワークがトリガーされたときに画面を短時間オンにするかどうかのみに関係します。検出される実際のジェスチャーは指定されておらず、デバイスのメーカーが選択できます。

このセンサーは 24 時間 365 日有効にされた状態である可能性が高いため、省電力性能を有している必要があります。各センサー イベントで sensors_event_t.data[0]1 が報告されます。

軸数制限付き IMU センサー

Android 13 以降で利用可能な軸数制限付き IMU センサーとは、3 軸(x、y、z)をすべて利用できるわけではないユースケースをサポートするセンサーです。Android の標準 IMU タイプ(SENSOR_TYPE_ACCELEROMETERSENSOR_TYPE_GYROSCOPE など)では、3 軸がすべてサポートされています。しかし、すべてのフォーム ファクタやデバイスが、3 軸加速度計と 3 軸ジャイロスコープをサポートしているわけではありません。

軸数制限付き加速度計

基礎となる物理センサー: 加速度計

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES) は非ウェイクアップ センサーを返します

軸数制限付き加速度計センサーは TYPE_ACCELEROMETER と同等ですが、1 軸または 2 軸に対応していないケースをサポートしています。

センサーからレポートされた最後の 3 つのセンサー イベント値が、x 軸、y 軸、z 軸の加速度値がサポートされているかどうかを表します。値 1.0 はその軸がサポートされていることを示し、値 0 はサポートされていないことを示します。デバイス メーカーは、ビルド時にサポートされている軸を確認します。これらの値が実行時に変わることはありません。

デバイス メーカーは、未使用の軸の加速度値を 0 に設定する必要があります(未定義の値は設定しません)。

軸数制限付きジャイロスコープ

基礎となる物理センサー: ジャイロスコープ

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES) は非ウェイクアップ センサーを返します

軸数制限付きジャイロスコープ センサーは TYPE_GYROSCOPE と同等ですが、1 軸または 2 軸に対応していないケースをサポートしています。

センサーからレポートされた最後の 3 つのセンサー イベント値が、x 軸、y 軸、z 軸の角速度値がサポートされているかどうかを表します。値 1.0 はその軸がサポートされていることを示し、値 0 はサポートされていないことを示します。デバイス メーカーは、ビルド時にサポートされている軸を確認します。これらの値が実行時に変わることはありません。

デバイス メーカーは、未使用の軸の角速度値を 0 に設定する必要があります。

軸数制限付き未調整加速度計

基礎となる物理センサー: 加速度計

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES_UNCALIBRATED) は非ウェイクアップ センサーを返します

軸数制限付き未調整加速度計センサーは TYPE_ACCELEROMETER_UNCALIBRATED と同等ですが、1 軸または 2 軸に対応していないケースをサポートしています。

センサーからレポートされた最後の 3 つのセンサー イベント値が、x 軸、y 軸、z 軸の加速度値とバイアス値がサポートされているかどうかを表します。値 1.0 はその軸がサポートされていることを示し、値 0 はサポートされていないことを示します。デバイス メーカーは、ビルド時にサポートされている軸を確認します。これらの値が実行時に変わることはありません。

デバイス メーカーは、未使用の軸の加速度値とバイアス値を 0 に設定する必要があります。

軸数制限付き未調整ジャイロスコープ

基礎となる物理センサー: ジャイロスコープ

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_GYROSCOPE_LIMITED_AXES_UNCALIBRATED) は非ウェイクアップ センサーを返します

軸数制限付き未調整ジャイロスコープ センサーは TYPE_GYROSCOPE_UNCALIBRATED と同等ですが、1 軸または 2 軸に対応していないケースをサポートしています。

センサーからレポートされた最後の 3 つのセンサー イベント値が、x 軸、y 軸、z 軸の角速度値とドリフト値がサポートされているかどうかを表します。値 1.0 はその軸がサポートされていることを示し、値 0 はサポートされていないことを示します。デバイス メーカーは、ビルド時にサポートされている軸を確認します。これらの値が実行時に変わることはありません。

デバイス メーカーは、未使用の軸の角速度値とドリフト値を 0 に設定する必要があります。

複合軸数制限付き IMU

基礎となる物理センサー: 3 軸加速度計、3 軸ジャイロスコープ、未調整の 3 軸加速度計、未調整の 3 軸ジャイロスコープの各センサーの任意の組み合わせ。

レポートモード: 連続

複合軸数制限付き IMU センサーは、軸数制限付き IMU センサーと同等ですが、HAL でサポートされず、3 軸センサーのデータを同等の軸数制限付きのデータに変換します。このような複合センサーは、自動車デバイスでのみ有効になります。

次の表に、標準の 3 軸加速度計から複合軸数制限付き加速度計への変換例を示します。

SENSOR_TYPE_ACCELEROMETER の SensorEvent 値 SENSOR_TYPE_ACCELEROMETER の SensorEvent の例 複合の SENSOR_TYPE_ACCELEROMETER_LIMITED_AXES の SensorEvent
values[0]

-0.065

-0.065

values[1]

0.078

0.078

values[2]

9.808

9.808

values[3]

なし

1.0

values[4]

なし

1.0

values[5]

なし

1.0

自動車用センサー

自動車のユースケースをサポートするセンサー。

方位

基礎となる物理センサー: GPS、磁力計、加速度計、ジャイロスコープの各センサーの任意の組み合わせ。

レポートモード: 連続

getDefaultSensor(SENSOR_TYPE_HEADING) は非ウェイクアップ センサーを返します

Android 13 以降で利用可能な方位センサーは、デバイスの真北を基準とした方向を度数で測定します。方位センサーには、2 つの SensorEvent 値が含まれています。一つは、測定されたデバイスの方位で、もう一つは、提供された方位値の精度です。

このセンサーでレポートされる方位値は、必ず 0.0(含む)から 360.0(含まず)までの範囲となります(0 は北、90 は東、180 は南、270 は西を表します)。

このセンサーの精度は 68% 信頼区間で定義されます。基礎となる分布がガウス正規分布である場合、精度は 1 標準偏差になります。たとえば、方位センサーが 60 度の方位値と 10 度の精度値を返す場合、真の方位が 50 度から 70 度の間である確率は 68% です。