1

私は少し奇妙な状況にあります。私が現在抱えている状況は、通常は良い状況であり、ジャイロドリフトはまったくありませんが、なぜそうなるのかわかりません。どこでも報告されているように、ジャイロスコープが大きくドリフトすることを期待していました。したがって、この質問は、ドリフトが見られない理由を見つけるためのものです。

最終的に、Galaxy Nexus(Android 4.0.3)とそのジャイロスコープを使用して、向きの変化を検出します。そもそも、センサーの読み取り値をログに記録したかっただけで、たとえばここのように大きなドリフト値が見られると予想していました。他のウェブサイトでも、毎秒約1度のドリフトまたは同様の測定値を読んでいます。

センサーデータをログに記録する私のコードは非常に基本的です:

SensorManager sm = (SensorManager) getSystemService(SENSOR_SERVICE);
LogSensorEventListener listener = new LogSensorEventListener(
       SensorLoggerActivity.this, Sensor.TYPE_GYROSCOPE);
sm.registerListener(listener, sm.getDefaultSensor(Sensor.TYPE_GYROSCOPE),
       SensorManager.SENSOR_DELAY_FASTEST);

LogSensorEventListenerは、SensorEventListenerInterfaceの非常に基本的な実装でもあります。

@Override
public void onSensorChanged(SensorEvent event) {

    final float dT = (event.timestamp - mTimestamp) / 1000000000.f;
    if (dT < 1) { // just a fix for the first step

        mRelZ += event.values[2] * dT;
        list.add(mRelZ);
        list2.add(event.timestamp);
    }
    mTimestamp = event.timestamp;

mRelZは最初は0に設定されており、2つのリストは時間と測定値を追跡する必要があります。測定が終了すると(ボタンをクリック)、値がファイルに書き込まれます。

    try {

        for (int i = 0; i < list.size(); i++) {

            long time = list2.get(i);

            if (mStartTime < 0) {
                mStartTime = time;
                time = 0;
            } else {
                time = time - mStartTime;
            }

            float timef = time / 1000000000.0f;
            sb.append(timef);
            sb.append(";");
            sb.append(Math.toDegrees(list.get(i)));
            sb.append("\n");
        }

        mOutFileStream.write(sb.toString().getBytes());

        mOutFileStream.flush();
        mOutFileStream.close();
    } catch (IOException e) {
    }

すべてが正常に機能しますが、私が見ることができる唯一のドリフト(たとえば、デバイスをテーブルに置いて、たとえば60秒間値をログに記録する場合)は約0.2度です。上記のスクリーンショットのようなものを取得するためにデバイスを移動すると、ドリフトはまったく観察されません...

私は何を間違っているのですか(または正しいですか?)??

アドバイスありがとうございます!

4

2 に答える 2

2

あなたが持っているジャイロはポストフィルターされたものかもしれません、私はこれをいくつかのSAMSUNGI9100デバイスで見つけました。INVENSENSECORP製のジャイロを使用しています。

@LourençoCastroのコメントについては2014/12/10を編集してください。@LourençoCastroは「ファクトリードリフト」(またはゼロドリフト)と「累積ドリフト」について正しかったと思います。

補完/カルマンフィルターに関しては、Androidでは6dof(ACC + GYRO)implです。正常に動作し、加速度計のキャリブレーションのおかげで、ジャイロスコープの工場出荷時のドリフトと蓄積されたドリフトの両方を取り除くことができます。

ただし、9dof impl。、または磁力計センサーを考慮に入れると、フィルターは望ましくない状態になります。私のテストによると、それは磁力計のキャリブレーションされていない状態が原因で、融合する前に電話を振る(「8」を描くこととして知られている)必要があります。

9dofは完全な回転推定を提供しますが、6dofはy軸を中心に回転する累積ドリフトを処理できません(軸の定義については、Androidの参照を参照してください)。そして、アプリを起動する前の「シェイクアンドドローイングナンバー8」は良いUEだとは思わないので、6dofの方法に戻って、y-の周りの回転の工場ドリフトを取り除く方法を見つける必要があります。軸。

(補完的/カルマンフィルターに関する多くの退屈で素晴らしいコンテンツがここにあるはずです。しかし、ここに来る人はすでにそれを知っていると思います。)

市場からダウンロードできるGoogleカメラに含まれている360パノラマアプリを試すことができます。このアプリは、実際にキャプチャを開始する前にセンサーをキャリブレーションするために視覚補助(画像処理ベースのモーションエスティメーション)を使用します。これを確認するのは簡単です。そして、磁力計は使用しないと思います。

したがって、Androidでセンサーフュージョンを使用するための私のアドバイスは次のとおりです。1。磁力計がない。(これがハードウェアの問題なのか、ソフトウェアで解決できるのかわからない。)2.加速度計+ジャイロスコープは、スムーズで安定した6自由度のモーション推定を提供します。3. y軸の周りのドリフトを解決しようとします。これは、主に視覚的な方法を追加する必要があることを意味します。4.3を試して3を試してください...

たぶん誰かがこの質問に出くわすでしょう、そして私は上記のすべてが役立つかもしれないことを願っています。StackOverflowでこの質問に関連する投稿に感謝します。私はあなたの名前を正確に覚えていませんが、あなたは皆私を大いに助けてくれました。:)

于 2012-07-19T03:31:26.413 に答える
0

私はこの主題を閲覧していました。これは古い質問ですが、受け入れられた答えは正しいとは思いません。「どこでも報告される」ドリフトは、単にセンサーデータを出力することではなく、ノイズの多いジャイロスコープデータ(OPが提供するリンクに表示される)の統合によって引き起こされます。時間の経過に伴う方向の変化を計算するには、この統合が必要になります。

積分期間が長くなると、ノイズ量が大きくなり、ドリフトがかなり早く蓄積されます。Invensenseハードウェアで発生する信号の内部フィルタリングは、ジャイロスコープの独自の前処理によって引き起こされるドリフトを除去するために使用されていると思います。

Androidの場合、API 18(Jelly Bean MR2)で、GYROSCOPE_UNCALIBRATEDセンサーが追加されました。これにより、(おそらく)このファクトリドリフトキャリブレーションを検証できます。とにかく、キャリブレーションされたセンサーイベントとキャリブレーションされていないセンサーイベントのどちらかを統合しようとすると、両方ともかなりノイズが多いため、ドリフトが発生します。この問題を減らすには、補完フィルターまたはカルマンフィルターを詳しく調べる必要があります。

(より多くの情報リンクを投稿しないことについて申し訳ありません、十分な評判ではありません)。

これが将来のユーザーに役立つことを願っています。

于 2014-04-29T11:31:06.967 に答える