20

加速度計の測定値から重力を取り除く必要がある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()メソッドにどのコードを配置する必要がありますか?

4

4 に答える 4

25

基本的な解決策としては、ローパスフィルターが必要になります。カルマンフィルターのような他のアプローチは、背後にある計算に関してかなり難しいものです。Androidの簡単な例は、 http://developer.android.com/reference/android/hardware/SensorEvent.html#valuesのリンクからワンクリックで移動することです。

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

于 2011-08-02T13:38:44.993 に答える
14

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

于 2011-08-02T13:44:50.220 に答える
10

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

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

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

于 2013-07-25T16:53:38.220 に答える
-2

何を達成しようとしているのかよくわかりませんが、大きさ(0から1の間の結果が得られます)を探している場合は、結果を10で割るだけです。

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

}

センサーがフルチルトのゲーム環境では、オブジェクトは最大速度になります

于 2011-08-02T14:27:25.537 に答える