web-dev-qa-db-ja.com

Android TYPE_LINEAR_ACCELERATIONセンサー-何が表示されますか?

私は車の加速追跡のためのアプリケーションを開発しています。標準の加速度計を使用して、事前に特定の位置で較正しました。

次に、電話機の向きが変わらないと仮定して、指定された時間の加速度計データを記録し、移動パラメーターを計算しました。そのパラメーターの1つは、テスト終了時の車の速度です。

まっすぐで水平な道路では、数パーセントの誤差でかなりうまくいきます。

しかし、APIレベル10には_TYPE_LINEAR_ACCELERATION_と呼ばれる仮想センサーがあり、理解する限り、必要なことを行う必要があることを発見しました:重力のフィルタリング、方向の変更-それを使用することができますモバイルデバイスの純粋な線形加速を取得します。

しかし、実生活では..

私は簡単なアプリケーションを作成しましたが、それは少しテストを行います:

_//public class Accelerometer implements SensorEventListener { ...
public void onSensorChanged(SensorEvent se) 
{
    if(!active)
        return;

    lastX = se.values[SensorManager.DATA_X];
    lastY = se.values[SensorManager.DATA_Y];
    lastZ = se.values[SensorManager.DATA_Z];
    long now = System.currentTimeMillis();
    interval = now - lastEvetn;
    lastEvetn = now;
    out.write(Float.toString(lastX) + ";" + 
                    Float.toString(lastY) + ";" + 
                    Float.toString(lastZ) + ";" + 
                    Long.toString(interval) + "\n");
}
_

次のパラメーターでリスナーをバインドします。

_  mSensorManager.registerListener(linAcc,
                mSensorManager.getDefaultSensor(Sensor.TYPE_LINEAR_ACCELERATION),
                SensorManager.SENSOR_DELAY_GAME);
_

それは問題なく動作しますが、データダンプを分析し、最初に_V = V0 + AT_のような速度を計算すると、最初は_V0 = 0_、次に-この前の間隔の速度、A = acceleration (SQRT (x*x+y*y+z*z))(t =間隔の時間)、最終的には非常に低速になります-実際の速度よりも3倍遅くなります。

センサータイプを_TYPE_ACCELEROMETER_に変更し、速度を計算するために同じ式を調整して使用する-現実にはるかに近い良い結果が得られます。

したがって、質問は次のとおりです。

_Sensor.TYPE_LINEAR_ACCELERATION_は実際に何を示しますか?

どこが間違っていますか、または_Sensor.TYPE_LINEAR_ACCELERATION_実装に何か問題がありますか?

Samsung Nexus S電話を使用しました。

35
Maep

非常に興味深い質問!!!!

私はあなたのアプリケーションに似た何かを開発しています。 TYPE_LINEAR_ACCELERATIONについて見つけたものは、私にとって不幸です。

1)TYPE_LINEAR_ACCELERATION、TYPE_GRAVITY、eccはAndroid 2.3(以降)に対してのみ実装されているため、Android 2.2であり、テストできません。

2)TYPE_LINEAR_ACCELERATIONは、重力を差し引くときに単純な問題があるため、それほど正確ではありません。実際には、加速度センサーと方向を使用して、重力と次に潜水艦の方向を知る「センサーフュージョン」です。それ。

ここで私はそれを説明する非常に有用な答えを見つけました:

https://groups.google.com/forum/#!topic/Android-developers/GOm9yhTFZaM

TYPE_ACCELEROMETERは、加速度計と加速度計のみを使用します。生の加速度計イベントを、最小限の処理で、またはまったく処理せずに返します。

TYPE_GYROSCOPE(存在する場合)は、ジャイロスコープとジャイロスコープのみを使用します。上記のように、処理なしで(オフセット/スケール補正なし)生のイベント(角速度un rad/s)を返します。

TYPE_ORIENTATIONは非推奨です。向きをヨー/ピッチ/ロールとしてデグレで返します。あまり明確に定義されておらず、デバイスに「ロール」がない場合にのみ信頼できます。このセンサーは、加速度計と磁力計の組み合わせを使用します。 SensorManagerのヘルパーを使用すると、わずかに優れた結果が得られます。このセンサーはかなり「処理」されています。

TYPE_LINEAR_ACCELERATION、TYPE_GRAVITY、TYPE_ROTATION_VECTORは、それぞれ線形加速度、重力、回転ベクトル(四元数)を返す「融合」センサーです。これらの実装方法は定義されていません。一部のデバイスではh/wで実装され、一部のデバイスでは加速度計と磁力計を使用し、他の一部のデバイスではジャイロを使用します。

Nexus SおよびXoomでは、ジャイロスコープは現在使用されていません。 Nexus OneやDroidのように、利用可能なジャイロがないかのように動作します。将来のリリースでこの状況を改善する予定です。

現在、ジャイロを活用する唯一の方法は、TYPE_GYROSCOPEを使用して、出力を手動で統合することです。

これがお役に立てば幸いです、

マティアス

とにかく、ウェブ上のさまざまな場所で、正確ではないという事実のために、電話センサーとその可能性について最高の言葉は見つかりませんでした...

カルマンフィルターを使用すると、さらに精度を上げることができますが、その方法がわかりません...

20
Lork

答えがかなり遅れていることに気付きました。 TYPE_LINEAR_ACCELERATIONに関する情報を探しているときに、このスレッドにぶつかりました。

A = sqrt(ax ^ 2 + ay ^ 2 + az ^ 2)を実行してからv = u + a t。を実行するのは正しくありません。これは、vとaがまったく同じ方向にある場合にのみ機能します偏差と誤差が加算されます加速度と速度はベクトル量であり、そのように扱う必要がありますvx = ux + ax t、vy = uy + ay t and vz = uz + az t。そして、v = sqrt(vx ^ 2 + vy ^ 2 + vz ^ 2)。

5
sudP

TYPE_LINEAR_ACCELERATIONはセンサーからの「生の」データを表示せず、高周波数フィルターで処理されたデータを表示します。そのため、重力やその他のゆっくり変化する加速度のような一定の加速度はフィルターを通過できません。

あなたの車は、フィルターを通過できないかなり一定の加速を持っています。ブレーキを非常に速く押して加速度を変更し、加速度計ペダルを押してからブレーキに戻すと、TYPE_LINEAR_ACCELERATIONはかなり正しい結果を表示します。そうでない場合は、実際の加速度値よりも常に小さく表示されます。

TYPE_ACCELEROMETERを使用してから、G(9.81)を手動で削除します。実際、実際の加速度が0のときにGを自分で測定し、TYPE_ACCELEROMETER値をGとして使用する必要があります。私の場合は9.6です。

TYPE_ACCELEROMETERは、箱や剣の戦いをエミュレートする手の動きのように、1秒未満続く急速に変化する加速に適しています。

4
Dmitry

TYPE_LINEAR_ACCELERATIONは、重力を含まない各デバイス軸に沿った加速度を示す3次元ベクトルです。 TYPE_ACCELEROMETER = TYPE_GRAVITY + TYPE_LINEAR_ACCELERATION

2
Evgeny Karpov

TYPE_LINEAR_ACCELERATIONから取得した絶対ベクトルに、TYPE_ROTATION_VECTORからの逆行列を掛ける必要があります。

0
thxmxx