web-dev-qa-db-ja.com

android加速度計の測定値から重力を取り除く

私はAndroidのアプリケーションを開発しています。ここでは、加速度計の読み取り値から重力を取り除く必要があります。この問題に関する複数の議論を読み、アルゴリズムも見つけました ここ 、しかし、私はそれを本当に理解していませんでした。

総加速度からではなく、各軸から重力をフィルタリングしたいと思います。

手伝ってくれませんか。私のコードは次のようになります。

public void onSensorChanged(SensorEvent sensorEvent) {
    float vals[] = sensorEvent.values;
    float accelerationX = filterGravity(vals[0]);
    float accelerationY = filterGravity(vals[1]);
    float accelerationZ = filterGravity(vals[2]);
}

FilterGravity()メソッドにどのコードを配置する必要がありますか?

18
Gabriel

基本的な解決策には、 ローパスフィルター カルマンフィルターのような他のアプローチは、背後にある数学に関してかなり難しいでしょう。 Androidの簡単な例は、リンクからワンクリックで離れた場所です http://developer.Android.com/reference/Android/hardware/SensorEvent.html#values

単純に話されたローパスフィルターは、すべての履歴値から加重平均を作成します。たとえば、フィルタリング係数が0.1の場合、現在の値の10%が前の平均値に追加されることを意味します。newMeanValue= currentValueの10%+ oldMeanValueの90%。つまり、突然のピークがあったとしても、10%であるため、平均値をゆっくりとプッシュするだけです。

24
Kay

直線加速度が必要です。 Sensor.TYPE_LINEAR_ACCELERATION ここ を確認してください。

13
Ali

TYPE_LINEAR_ACCELERATIONを備えた電話をお持ちでない場合は、重力(傾斜)を線形加速度から分離できないTYPE_ACCELERATIONで立ち往生しています。

1つのオプションは、ローパスフィルターを適用することです。別のアプローチは、ジャイロスコープが利用可能な場合にセンサーフュージョンを使用することです。どちらのアプローチにも長所と短所があります。

オープンソースプロジェクトには多くの実例があります Acceleration Explorer

10
Kaleb