2012-03-22 17 views
1

私はちょっと奇妙な状況です。私が現在持っている状況は、通常、良いものです - ジャイロドリフトは全くありませんが、なぜこれが当てはまるのかわかりません。私はジャイロスコープがあらゆるところで報告されているように多くのドリフトを予想していました。したがって、私はドリフトを見ない理由を見つけるためにこの質問。ジャイロスコープにドリフトが表示されない

私は、Galaxy Nexus(Android 4.0.3)とそのジャイロスコープを使用して、最終的に姿勢変更の検出を行います。まず、センサーの読み取り値をログに記録したいだけで、大きな値が表示されることが予想されます(例:here)。また、他のウェブサイトでは、毎秒約1度のドリフト、または同様の測定値を読みました。

センサデータをログに記録する私のコード

は非常に基本的である:

@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に設定され、二つのリスト:

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の非常に基本的な実装であります時間と測定値を追跡する必要があります。

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) { 
    } 

すべてが正常に動作しますが、唯一のドリフトが、私はLETのためのテーブルとログの値の上に横たわる装置を備えたとき、たとえば(参照することができます(ボタンをクリック)私の測定が終了した場合の値がファイルに書き込まれます例えば60秒)は約0.2度である。 上記のスクリーンショットのようなものを得るためにデバイスを動かすと、ドリフトはまったく観測できません...

私は間違っていますか?

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

+0

私は理解するまで3回最初の文章を読まなければならなかった;) – MrTJ

+0

申し訳ありませんが、私はそれを少なくとも少しはっきりさせるように改正しました... – fkerber

答えて

2

あなたが持っているジャイロがポストフィルタリングされたものかもしれない、私はこれをSAMSUNG I9100デバイスのいくつかで見つけました。彼らは、インベンセンスCORPによって生成ジャイロを使用しています。

編集2014年12月10日をLourençoのカストロ @コメントのためにLourençoのカストロ約正しかった@私は信じています "工場のドリフト(またはゼロドリフト)と「蓄積されたドリフト」。アンドロイド、6DOF(ACC + GYRO)IMPL上の相補的/カルマン・フィルタにについて

、。加速度計のキャリブレーションにより、ジャイロスコープのドリフトと工場の両方を取り除くことができます。

しかし、9dofインプリメンテーション、または磁力計センサーを追加すると、フィルターは必要のない状態になります。私のテストによると、それは核兵器の未校正状態によって引き起こされます。この状態では、人が融合する前に取り外すために電話を握手する必要があります。

9dofはフル回転推定を提供し、6dofはy軸周りの回転の累積ドリフトを処理できません(軸定義のアンドロイド参照)。そして私は、アプリを起動する前に「揺れ動く数」が良いUEだとは思っていないので、6dofメソッドに戻ってy方向の回転の工場ドリフトを除去する方法を見つけなければならない。軸。

(相補/カルマン・フィルタについての退屈が、素晴らしい内容の多くはここでなければなりません。しかし、私はそれらがそれを知って、すでにここに来ると思います。)

あなたは360パノラマアプリをすることができGoogleカメラに含まれて試すことができます市場からダウンロードしました。このアプリは、実際にキャプチャを開始する前に、センサーを較正するための視覚補助(画像処理に基づく動き推定)を使用しています。簡単に確認できます。そして磁力計の使用はありません。

Androidでsensor-fusionを使用する際のアドバイスは、 です。1.磁力計はありません。 (これがハードウェアの問題であるのか、ソフトウェアで解決できるのかは分かりません) 2.加速度計+ジャイロスコープは滑らかで安定した動き推定を提供します。 3. y軸の周りのドリフトを解決しようとすると、主にビジュアルメソッドを追加する必要があります。 4. 3回試してみてください...

誰かがこの質問にぶつかり、上記のすべてが役に立つと思うかもしれません。 StackOverflowに関するこの質問に関連する投稿のおかげで あなたの名前は正確に覚えていませんが、皆さんは私を多く助けました。 :)

+0

あなたの返信ありがとうございます。私はInvensenseか別のものかを調べるにはどうしたらいいですか?それらがどのようにフィルタリングされているかについての追加情報はありますか? – fkerber

+0

Sensor.getType() Sensor.getVendor() が役に立ちます。あなたはセンサーのタイプを見つけるでしょう。出力が加速度計とコンパスを使用する融合アルゴリズムでフィルタリングされているかどうかを調べてください。 – iicodec

+0

これでベンダーを確認しました。実際、Invensenseです。あなたの推測は正しいかもしれません。再度、感謝します。 – fkerber

0

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

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

Androidの場合、API 18(Jelly Bean MR2)にGYROSCOPE_UNCALIBRATEDセンサーが追加されました。このセンサーでは、おそらくこの工場のドリフト校正を検証できます。とにかく、キャリブレーションされたセンサイベントとキャリブレーションされていないセンサイベントを統合しようとすると、どちらもかなり騒がしいので、ドリフトが発生します。この問題を軽減するには、complementaryまたはKalmanフィルタを調べる必要があります。

(詳しい情報のリンクを投稿していない、評判が足りないと申し訳ありません)

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

関連する問題