Android 携帯の加速度計から取得した 3 次元の加速度ベクトル (a、b、c) があります。
このベクトル (a、b、c) と、正確に下向きの重力ベクトルとの間の角度を計算したいと思います。
Android では、ワールド座標系ではなく電話座標系のコンテキストで重力ベクトルを取得する方法があることに気付きました。単にセンサー タイプSENSOR_TYPE_GRAVITY
を使用するだけで、3 次元の重力ベクトル (d、e、f) を取得できます。両方のベクトルが同じ座標系の下にあるため、電話の座標系です。単純なベクトル内積によって、それらの角度を簡単に見つけることができます。
この角度を見つけたら、電話の座標系から現実世界の座標系に移動しても、角度は変わりません。
私の質問:
の背後にある動作メカニズムは何SENSOR_TYPE_GRAVITY
ですか?
重力を測定するハードウェアは他にないと思います。したがって、重力を測定するのは加速度計だけです。重力は、結果として生じる加速度からどのように抽出されますか?
この重力の出し方の精度が気になるので質問させていただきます。
不正確な場合は、LPF を実装して、DC 成分である重力を自分でフィルター処理することができます。SENSOR_TYPE_GRAVITY
から取得する方が自分で行うよりも正確かどうかはわかりません。
================================== アップデート =============== ========================
明確にするために、次のコードで加速度と重力の両方のデータを正しく取得できますか?
正しくは、加速度と重力が同じ特定の瞬間に属しているということですか? ある時点で値を使用する必要があります。したがって、加速が time=13:12:00 で、重力が後の時間、たとえば time=13:12:01 である状況は望ましくありません。
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
acceleration[0] = event.values[0];
acceleration[1] = event.values[1];
acceleration[2] = event.values[2];
}
if (event.sensor.getType() == Sensor.TYPE_GRAVITY) {
gravity[0] = event.values[0];
gravity[1] = event.values[1];
gravity[2] = event.values[2];
}
}