2011-08-02 13 views
14

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

全加速からではなく、各軸から重力をフィルタリングする必要があります。

私を助けてください。

私はfilterGravity()メソッドに配置する必要がありますどのようなコード
public void onSensorChanged(SensorEvent sensorEvent) { 
    float vals[] = sensorEvent.values; 
    float accelerationX = filterGravity(vals[0]); 
    float accelerationY = filterGravity(vals[1]); 
    float accelerationZ = filterGravity(vals[2]); 
} 

:私のコードのようなものでなければなりませんか?

答えて

20

基本的な解決策として、low pass filterカルマンフィルタのような他のアプローチは、後ろの数学に関してかなり難しいです。 Androidの簡単な例は、リンク先のワンクリックでhttp://developer.android.com/reference/android/hardware/SensorEvent.html#valuesです。

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

+0

ありがとうございます。それは役に立ちました。 – Gabriel

+0

@Kay申し訳ありませんが、私はあなたの答えをUPしたいと思っていました。私のdownvoteがupvoteになるように最後の文にドットを追加してください(または何らかの編集をしてください)。申し訳ありません... – Ali

+0

@Ali:ドット付き、問題ありません:-) – Kay

11

リニアアクセラレータが必要です。 Sensor.TYPE_LINEAR_ACCELERATION hereをチェックします。

+0

ありがとうございました。これは私の問題を成し遂げるだろう。ただし、これはAPIレベル9以降でのみサポートされています。以前のAPIバージョンでこれを実装する方法はありますか? – Gabriel

+0

@Gabriel私は恐れていません。この背後には、加速度計、ジャイロ、コンパスのデータを融合させた重い数学があります。ここでは、センサーの融合に関する興味深いビデオがあります:http://www.youtube.com/watch?v=C7JQ7Rpwn2k – Ali

-1

ないあなたがacomplishしようとしているものをあまりにも必ずいますが(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); 
で結果を分割していますゲーム環境で

}

センサーがフルである、あなたのオブジェクトがその最大速度になります傾け

7

あなたはTYPE_LINEAR_ACCELERATIONで携帯電話を持っていない場合、あなたは、TYPE_ACCELERATIONで立ち往生しています線形加速から重力(傾斜)を分離することができない。

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

私はオープンソースプロジェクトAcceleration Explorerで多くの実用例を持っています。

+0

こんにちはKaleb、私は現在あなたのFusedLinearAccelerationに似てJavaアプリケーションに取り組んでいます。重力を計算する仮想センサ私はsensorManagerからいくつかのメソッドを移植しましたが、重力ベクトルを得るためのアルゴリズムを見つけることができません。私はこれが四元数を使って達成できることを発見し、次のように変更/書いた:https://gist.github.com/Bresiu/c0a69552881b8df34a2e。しかし、それは悪い結果をもたらします - 重力はz軸からのみ補償されます(残りのコードはアプリケーションに基づいています)。あなたはいくつかのヒントを持っていますか、何が間違っていますか?私のコード:http://goo.gl/5jmlvY – Bresiu

+0

@ Bresiu:FusedLinearAccelerationが使用する唯一の仮想センサーはSensor.TYPE_GRAVITYで、Sensor.TYPE_ACCELERATIONに変更できます。ただし、ジャイロスコープを備えたデバイスを使用している場合は、Sensor.TYPE_GRAVITYを実装する必要があります。このブログ記事(http://www.kircherelectronics.com/blog/index.php/11-android/sensors/17-gyroscope-linear-acceleration)を見れば、あなたが投稿したコード(そして私のコード)。それは重力ベクトルをカバーするので役立ちます。ダイナミックな加速(車のような)中に何かを測定しようとしているのであれば、修正が必要であることを覚えておいてください。 – Kaleb

+0

私はジャイロスコープ、加速度計、磁力計を備えたデバイスを用意していますので、最良の結果を得るためにセンサーの融合を探しています。私はあなたの他のアプリを見ました、そしてFusedLinearは最も正確であるようです。私は検索を続けます... – Bresiu

関連する問題