誰かが加速度計の読み取り値からgファクターを削除するのを手伝ってもらえますか?
Sensor.TYPE_ACCELEROMETERデータを取得するためにonSensorChanged()
メソッドでSensorEventListenerを使用しています。すべての方向の純粋な加速度値のみが必要です。したがって、どの状態でも、デバイスが安定している(または一定速度である)場合は、おおよそ(0.0,0.0,0.0)が得られるはずです。
現在、ピッチとロールに応じて、各軸に作用するg力に応じて可変出力が得られます。
Sensor.TYPE_ORIENTATIONリスナーから方向の値(ピッチとロール)も取得するため、これを削除する式があることを願っています。私はいくつかを使用しましたが、それは機能しませんでした。
ローパスフィルターを使用できます。
センサー値ごとにこれを行います。
g = 0.9 * g + 0.1 * v
ここで、v
は現在のセンサー値であり、g
は最初にゼロに設定されたグローバル変数です。軸と同じ数のg変数が必要になることに注意してください。
v = v - g
センサー値から重力係数を削除できます。
Sensor.TYPE_ACCELEROMETERの代わりにSensor.TYPE_LINEAR_ACCELERATIONを使用します
回転行列のz方向のg(〜9.8m/s ^ 2)を引くだけです。またはそれについてより明確にするために、
a = your accelerometer reading,
R = your rotation matrix (as a 9-long vector).
それならあなたが欲しいのは
(a[0]-g*R[6], a[1]-g*R[7], a[2]-g*R[8]).
時間の関数を時間に関して区別すると、定数がなくなります。
したがって、加速度計の信号の導関数を取得することにより、「ジャーク」を取得します。これを再統合して、探している加速度の一定でない部分を取得できます。
レイマンの用語では、1秒ごとに加速度計からサンプルを取得し、前のサンプルからそれを減算します。答えが(非常に近い)ゼロである場合、あなたは地球に対して比較的加速していません。結果がゼロ以外の場合は、それを積分し(この場合、1秒を掛けます)、加速します。
ただし、2つのことがあります。-信号のノイズに注意し、入力を丸めます。 -オンチップ加速度計からの超高精度の結果を期待しないでください。それらを使用して、揺れや向きの変化を検出できますが、車の中で急旋回しているときに発生しているGの数を知るためには実際には使用できません。
1つの方法(加速度計のみを備えたデバイスの場合)は、同じ方向で静的な場合に発生する値を差し引くことにより、加速度計データから重力ベクトルを削除することです。しかし、方向は、独立してではなく加速度の読み取り値を取得することによって再び計算されるため、あまり正確ではありません。
この場合、ジャイロスコープが役立つ場合があります。しかし、まだ真のジャイロスコープを持っているアンドロイドはほとんどありません。そして、その生の測定値を使用することはそれほど簡単ではありません。
2つの座標系を想定する必要があります。1-固定グローバルシステム。 2-原点がセンサーのように移動および回転する移動座標系。グローバルシステムでは、gは常にz軸に平行ですが、移動システムではそうではありません。したがって、あなたがしなければならないのは、配向角度またはヨー、ピッチ、ロールから3 * 3回転行列を計算することだけです。 (どこでも数式を見つけることができます)。次に、この回転行列に、センサーによって測定された3 * 1の加速度ベクトルを掛けます。これにより、座標が変換され、固定グローバルシステムで値が宣言されます。その後の唯一のことは、単にz値からgを引くことです。