8

重複の可能性:
Android加速度計の精度(慣性航法)

次のコードを使用して距離を計算しています。tnewとには、それぞれタイムスタンプ加速度anewarraylists含まれています。

 double distance=0;
 double init_vel=0;
long time_prev=tnew.next();
   while(anew.hasNext())
   {
    float temp_acc=anew.next();
    long temp_time=tnew.next();

    interval=(temp_time-time_prev)/1000f;   //milliseconds to seconds
    double fin_vel=init_vel+(temp_acc*interval);
    distance+=(init_vel*interval)+0.5f*temp_acc*interval*interval;

    init_vel=fin_vel;
    time_prev=temp_time;
   }


コードに論理的な間違いはありますか?実際の長さよりもはるかに小さい値を取得しているためです。

の出力LogCat

--------- beginning of /dev/log/system

--------- beginning of /dev/log/main

V/PhonetapeActivity( 8842): Sensor Listener Registered

V/PhonetapeActivity( 8842): Sensor Unregistered

V/PhonetapeActivity( 8842): No. of Iterations : 49

V/PhonetapeActivity( 8842): Value of acceleration : 3.5762787E-7

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665585965

V/PhonetapeActivity( 8842): Value of acceleration : -0.15275347

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586017

V/PhonetapeActivity( 8842): Value of acceleration : 0.15585232

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586077

V/PhonetapeActivity( 8842): Value of acceleration : 1.075269

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586138

V/PhonetapeActivity( 8842): Value of acceleration : 3.6529458

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586199

V/PhonetapeActivity( 8842): Value of acceleration : 9.645137

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586257

V/PhonetapeActivity( 8842): Value of acceleration : 17.022213

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586316

V/PhonetapeActivity( 8842): Value of acceleration : 9.721476

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586376

V/PhonetapeActivity( 8842): Value of acceleration : -18.729362

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586437

V/PhonetapeActivity( 8842): Value of acceleration : -22.868385

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586497

V/PhonetapeActivity( 8842): Value of acceleration : -16.777517

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586557

V/PhonetapeActivity( 8842): Value of acceleration : -7.0492268

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586617

V/PhonetapeActivity( 8842): Value of acceleration : -3.860828

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586677

V/PhonetapeActivity( 8842): Value of acceleration : 1.7244682

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586737

V/PhonetapeActivity( 8842): Value of acceleration : 5.0734243

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586797

V/PhonetapeActivity( 8842): Value of acceleration : 6.4193974

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586857

V/PhonetapeActivity( 8842): Value of acceleration : 2.739545

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586917

V/PhonetapeActivity( 8842): Value of acceleration : 5.559997

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665586977

V/PhonetapeActivity( 8842): Value of acceleration : 4.2290807

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587037

V/PhonetapeActivity( 8842): Value of acceleration : 5.0012918

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587097

V/PhonetapeActivity( 8842): Value of acceleration : 5.9317436

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587157

V/PhonetapeActivity( 8842): Value of acceleration : 5.20226

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587217

V/PhonetapeActivity( 8842): Value of acceleration : 7.1381693

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587276

V/PhonetapeActivity( 8842): Value of acceleration : 7.6460614

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587337

V/PhonetapeActivity( 8842): Value of acceleration : 5.566694

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587396

V/PhonetapeActivity( 8842): Value of acceleration : 3.355657

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587457

V/PhonetapeActivity( 8842): Value of acceleration : 1.8876343

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587517

V/PhonetapeActivity( 8842): Value of acceleration : -0.8815446

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587577

V/PhonetapeActivity( 8842): Value of acceleration : -0.9595623

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587646

V/PhonetapeActivity( 8842): Value of acceleration : -4.233544

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587697

V/PhonetapeActivity( 8842): Value of acceleration : -1.9580669

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587765

V/PhonetapeActivity( 8842): Value of acceleration : -1.4569702

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587822

V/PhonetapeActivity( 8842): Value of acceleration : -0.6058636

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587876

V/PhonetapeActivity( 8842): Value of acceleration : -0.21207428

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587937

V/PhonetapeActivity( 8842): Value of acceleration : 0.5068469

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665587997

V/PhonetapeActivity( 8842): Value of acceleration : 5.614555

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588057

V/PhonetapeActivity( 8842): Value of acceleration : -4.5297813

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588122

V/PhonetapeActivity( 8842): Value of acceleration : -0.29250193

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588178

V/PhonetapeActivity( 8842): Value of acceleration : -2.4922757

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588237

V/PhonetapeActivity( 8842): Value of acceleration : -1.7652755

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588297

V/PhonetapeActivity( 8842): Value of acceleration : -2.3279366

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588357

V/PhonetapeActivity( 8842): Value of acceleration : -1.8127642

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588419

V/PhonetapeActivity( 8842): Value of acceleration : -1.956768

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588477

V/PhonetapeActivity( 8842): Value of acceleration : -0.8337221

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588537

V/PhonetapeActivity( 8842): Value of acceleration : -0.24841261

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588601

V/PhonetapeActivity( 8842): Value of acceleration : 0.23997736

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588657

V/PhonetapeActivity( 8842): Value of acceleration : 0.14441395

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588723

V/PhonetapeActivity( 8842): Value of acceleration : 0.23150349

V/PhonetapeActivity( 8842): Value of timestamp(milli) : 1350665588777

V/PhonetapeActivity( 8842):  1st while loop ended

V/PhonetapeActivity( 8842): 2nd while loop ended

V/PhonetapeActivity( 8842): Avg value : 0.4006781578063965

V/PhonetapeActivity( 8842): Max Value : 17.022213

V/PhonetapeActivity( 8842): Min Value : -22.868385

V/PhonetapeActivity( 8842): Standard Deviation : -0.0031174493

V/PhonetapeActivity( 8842): 3rd while loop started

V/PhonetapeActivity( 8842): startpos=3 endpos=8

V/PhonetapeActivity( 8842): acceleration=0.1558523178100586 interval=0.061000000685453415

V/PhonetapeActivity( 8842): distance=5.799264876044276E-4

V/PhonetapeActivity( 8842): next init velocity=0.009506991493243078

V/PhonetapeActivity( 8842): acceleration=1.0752689838409424 interval=0.061000000685453415

V/PhonetapeActivity( 8842): distance=0.005160928954000712

V/PhonetapeActivity( 8842): next init velocity=0.07509840024458736

V/PhonetapeActivity( 8842): acceleration=3.6529457569122314 interval=0.057999998331069946

V/PhonetapeActivity( 8842): distance=0.021805144861910285

V/PhonetapeActivity( 8842): next init velocity=0.2869692480489858

V/PhonetapeActivity( 8842): acceleration=9.645136833190918 interval=0.05900000035762787

V/PhonetapeActivity( 8842): distance=0.07231105232279186

V/PhonetapeActivity( 8842): next init velocity=0.8560323246566197

V/PhonetapeActivity( 8842): acceleration=17.022212982177734 interval=0.05999999865889549

V/PhonetapeActivity( 8842): distance=0.18495295465057213

V/PhonetapeActivity( 8842): next init velocity=1.8773650807587172

V/PhonetapeActivity( 8842): 3rd while loop ended

V/PhonetapeActivity( 8842): final distance=0.18495295465057213

V/PhonetapeActivity( 8842): values of acceleration, timestamp, distance, start_time and calibrating reset


logcatを観察すると、最初に49個の加速度の値とそれぞれのタイムスタンプをミリ秒単位で繰り返します。次に、avg、sum、max、minなど
があります。次に、astartpos=3とが表示されendpos=8ます。これは、反復回数の範囲です。距離の計算に使用しています。つまり、加速度とタイムスタンプの値は、反復3から8までのみ使用しています。
これは、加速度の上昇から距離の計算の開始を検出するためです反対方向への突然の変化。3〜8の値がロジックに適合していることがわかります。3からは加速度がかなり上昇し、8を過ぎると急激に減少します。

4

3 に答える 3

6

加速度計は非常に正確ですが、推測航法には不向きです。ジャイロスコープはそれが得意ですが、時間の経過とともに「ドリフト」します。「センサーフュージョン」とは、アクセル/ジャイロデータを組み合わせて使用​​し、一方の欠陥をもう一方の欠陥を修正するプロセスです。AFAIR、「センサーフュージョン」はGalaxyAceでは有効になっていません。重力成分LINEAR_ACCELERATIONに他なりません。ACCELEROMETERジャイロスコープのないデバイスでは、定義上、加速とジャイロが必要な融合は不可能です。

加速度計のデータには、9.8の重力成分が含まれています。これは、加速度計データの2つの連続するサンプル間の差を単純に決定することによって除外されます。これにより、LINEAR_ACCELERATIONデータが得られます。

実際の内部コードについては、次を確認してください:
frameworks / base / services / Sensorservice/LinearAccelerationSensor.cpp
この関数LinearAccelerationSensor::process()は上記のファイルで重要です。

また、上記のリンクやビデオで説明されているフィルタリング/平均化などの基本的な操作は、アプリで取得した加速度データに対して実行する必要があります。この方法で取得された処理値は、生の値よりも優れています(ただし、センサーフュージョンがデバイスに存在する場合に取得された値ほど良くはありません)。これらを使用して、速度と位置をより正確に計算できます。

とはいえ、1秒間に16サンプル(@ poll-rate = 60ms)は、それ自体では比較的不正確です。sensorEventListnerを使用して登録しSENSOR_DELAY_FASTESTて、デバイスで取得できるサンプルの最大数を確認することをお勧めします。

また、電話の加速度計は特定の最大感度(通常は-/ + 2/4/8 G範囲)に固定されていることに注意してください。通常のウォーキング/ランニングはこれらの範囲で動作する可能性がありますが、加速の突然の衝動(たとえば自転車)は確実にMAXに固定され、推測航法で同期が失われます。これは、-/+MAXに非常に近いサンプルの数に注目することで確認できます。-/ + MAXのサンプルが多いということは、実際の位置との同期が確実に失われていることを意味します。

于 2012-10-19T03:04:15.283 に答える
4

最初にチェックするのは、あなたの時間間隔です。正しく変換されているかどうかはわかりません。タイムスタンプは次のようにリストされます。

public long timestamp イベントが発生したナノ秒単位の時間

そのため、ドキュメントでは、変換は 1,000 ではなく 10 億で割ることによって行われていることがわかります。

float dT = (event.timestamp - timestamp) / 1000000000.0f;
timestamp = event.timestamp;

そうは言っても、変更は値を縮小するだけだと思いますが、実際の距離を計算するには、単位を監視する必要があります.

次に、これらのことについて読むとき、人々は常に、実際の線形測定に関して意味をなすために、各読み取りの最初の位置をどのように知る必要があるかについて話しています. 完全な加速度ではなく、瞬間的な加速度または加速度の変化に基づいて、次の各測定の統合を行う以前の加速度を追跡しているとは思いません。

次のようなことを試してください:

final int X = 0;
double distance[];
double init_vel[];
double total_Accel[];

void dblIntegrate(SensorEvent event){
    double data[] = new double[3];
    for(int i = 0; i < event.lenght; i++){
        data[i] = (double)event[i];
        total_Accel[i] += data[i];
        vel[i] = init_vel[i] + (total_Accel[i] * dt);
        init_vel[i] = vel[i];

        ....rinse and repeate to get distance
        (not using the accel data of course)
    }
}

私はあなたがこれを理解していることを理解していますが、他の誰かがこれを読んでいることを認識しています => dblIntegrate() を呼び出すたびにカウント変数 total_Accel または init_vel を再インスタンス化できないことを覚えておいてください。

正しく実行している場合、total_Accel が 0 から最大値になり、デバイスを移動するたびに 0 に戻るはずです。これは、デバイスがいずれかの方向に移動するたびに、等しい部分の正と負の加速度を追加していることを意味します。

デバイスが休止状態から休止状態に移行するために、total_acceleration が 0 から最大の pos/neg 値に戻り、反対の最大値に戻るため、これは適切に理解するのが最も難しい加速の特性だと思いますゼロに戻る。

たとえば、テーブルの上に仰向けに置いた電話を、底面を胸に向けて右に 1 メートル移動すると、次のようになります。

total_Accel = 0.0 (0 メートル)

総加速 = 0.5

総加速 = 1.0

total_Accel = 1.5 (約 0.25 メートル)

総加速 = 1.0

総加速 = 0.5

total_Accel = 0.0 (加速度が完全に分散されている場合、0.5 メートル)

total_Accel = -0.5

total_Accel = -1.0

total_Accel = -1.5 (約 0.75 メートル)

total_Accel = -1.0

total_Accel = -0.5

total_Accel = 0.0 (1 メートル)

この例では、加速度の変化を単純に 2 重に積分しても速度/変位の実際の変化が得られない理由がわかり始めます。

とにかく、これを書くのに思っていたよりもずっと時間がかかったので、そう願っています! :)

于 2012-10-17T20:24:18.623 に答える
2

これはあなたの質問に対する答えです:

以前の加速度を追跡する必要がある理由。onSensorChanged(MotionEvent event){} は、加速度が変化したときに呼び出されます。加速度の変化ではなく、新しい加速度を提供します。

簡単な答えは、初期条件 (以前の加速度の合計) を含まない読み取り値を統合すると、すべての情報が含まれていない値になってしまうということです。さらに、より多くの情報を失うため、長く続けるほど、実際の価値から離れてしまいます。

加速度、速度、および変位の説明が必要だとは思わないので (これはそのための場所ではありません)、上記の例を拡張して示すことができるかもしれません。

下を胸に向けてテーブルの上に仰向けに置かれた電話は、右に任意の距離移動して停止します。データを見ると、このようなものが得られます。もちろん、実際の数は大きく異なりますが、その符号は同じで、比率もほぼ同じですが、予想されるようにピークよりも小さくなります (壁などで銃から発砲しない限り)。 .:

時間...........加速度の読み値....総加速度....総速度


00ms........ 0.0.................................0.0.... ..........0.000..

10ms........ 0.5.................................0.5.... .........0.005m/s..

20ms........ 0.5.................................1.0.... .........0.015m/s..

30ms........ 0.5.................................1.5........ .........0.030m/s..

40ms........ -0.5.................................1.0.... .........0.040m/s..

50ms......... -0.5.................................0.5.... .........0.045m/s..

60ms...................... -0.5......................0.0........ .........0.045m/s..

70ms...................... -0.5.................................-0.5................... .........0.040m/s..

80ms...................... -0.5.................................-1.0................... .........0.030m/s..

90ms...................... -0.5.................-1.5................... .........0.015m/s..

100ms........ 0.5.................................-1.0........ .........0.005m/s..

110ms........ 0.5.................................-0.5.... .........0.000m/s..

120ms......................0.5......................0.0....... .........0.000 m/s..

合計加速度を追跡しない場合、合計速度は上の合計加速度とマークされた列になることがわかります。つまり、携帯電話は常に x 軸の正の方向に移動しますが、速度は移動の後半で負 (後方に移動) になります。

加速度または加速度計の背後にあるメカニズムを説明していなくても、これが私の主張を証明することを願っています.

加速度計がどのように機能するかを調べたい場合、それらはMEMSタイプのセンサーであり、加速度の力を測定するために重みのある端を持つ吊り下げられた片持ち梁を使用していると思います.

于 2012-10-18T15:54:24.547 に答える