私は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()メソッドにどのコードを配置する必要がありますか?
基本的な解決策には、 ローパスフィルター カルマンフィルターのような他のアプローチは、背後にある数学に関してかなり難しいでしょう。 Androidの簡単な例は、リンクからワンクリックで離れた場所です http://developer.Android.com/reference/Android/hardware/SensorEvent.html#values 。
単純に話されたローパスフィルターは、すべての履歴値から加重平均を作成します。たとえば、フィルタリング係数が0.1の場合、現在の値の10%が前の平均値に追加されることを意味します。newMeanValue= currentValueの10%+ oldMeanValueの90%。つまり、突然のピークがあったとしても、10%であるため、平均値をゆっくりとプッシュするだけです。
直線加速度が必要です。 Sensor.TYPE_LINEAR_ACCELERATION ここ を確認してください。
TYPE_LINEAR_ACCELERATIONを備えた電話をお持ちでない場合は、重力(傾斜)を線形加速度から分離できないTYPE_ACCELERATIONで立ち往生しています。
1つのオプションは、ローパスフィルターを適用することです。別のアプローチは、ジャイロスコープが利用可能な場合にセンサーフュージョンを使用することです。どちらのアプローチにも長所と短所があります。
オープンソースプロジェクトには多くの実例があります Acceleration Explorer 。