2012-03-22 57 views
1

我有點奇怪的情況。我現在的情況通常是很好的 - 沒有陀螺儀漂移 - 但我不知道爲什麼會出現這種情況。據我所知,隨着各地報道陀螺儀漂移很大。所以這個問題找到了我沒有看到任何漂移的原因。陀螺儀不顯示任何漂移

我使用Galaxy Nexus(Android 4.0.3)及其陀螺儀在最後進行一些方向變化檢測。首先,我只想記錄傳感器讀數,並預計會看到較大的漂移值,例如here。同樣在其他網站上,我讀到每秒漂移約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,兩個列表應該跟蹤時間和測量值。如果與我的測量完成(點擊按鈕)的值寫入文件:

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度。 如果我移動設備得到像上面的截圖一樣沒有漂移可以觀察到所有...

我在做什麼錯了(或對吧?

感謝您的任何建議!

+0

我不得不閱讀你的第一句話的3倍,直到我理解它;) – MrTJ 2012-03-22 15:18:57

+0

對不起,我重新制定它至少有點清晰... – fkerber 2012-03-22 16:33:12

回答

2

陀螺儀您可能是後過濾的,我發現這在一些SAMSUNG I9100設備。他們使用InvenSense公司可公司生產的陀螺儀。

編輯2014年12月10日的評論@洛倫索·卡斯特羅 我相信@洛倫索·卡斯特羅是對有關「工廠漂移「(或零漂)和」累積漂移「;

關於互補/卡爾曼濾波器,在Android,6自由度(ACC + GYRO)IMPL。工作正常,由於加速度計的校準,它可以消除陀螺儀的工廠和累積的漂移;

然而,9dof impl,或者加入一個磁力計傳感器考慮,過濾器運行到你不想要的狀態。根據我的測試,這是由磁力計的未校準狀態引起的,需要人們在融合之前搖動(稱爲繪製'8')手機。

9dof提供完整的旋轉估計,而6dof無法處理圍繞y軸旋轉的累積漂移(請參閱android的軸定義參考)。我不認爲在開始一個應用程序之前「搖動和繪製數字8」是一個好的UE,所以我們必須回到6dof方法並嘗試找到一種方法來消除圍繞y軸旋轉的工廠漂移,軸。

(很多約互補/卡爾曼濾波無聊,但是驚人的內容,應該在這裏。但我想那些來這裏已經知道了。)

您可以嘗試包括在谷歌相機360全景應用程序,它可以從市場下載。這個應用程序使用視覺輔助(基於圖像處理的運動估計)在我們真正開始捕獲之前校準傳感器,這很容易驗證。我猜沒有使用磁力計。

所以我建議在Android上使用傳感器融合: 1.沒有磁力計; (不知道這是硬件問題還是可以通過軟件解決。) 2.加速度計+陀螺儀提供平滑和穩定的6dof運動估計; 3.試圖解決圍繞y軸的漂移,主要是指應該加入視覺方法; 4.嘗試3並嘗試3 ...

也許有人會遇到這個問題,我希望以上所有可能會有所幫助。 感謝與StackOverflow上的這些問題有關的帖子。 我完全不記得你的名字,但你們都幫了我很多。 :)

+0

感謝您的回覆。我如何才能知道我是否有來自Invensense或另一個人。你有額外的信息如何過濾? – fkerber 2012-07-19 07:22:15

+0

Sensor.getType() Sensor.getVendor() 可能會對您有所幫助。你會發現傳感器的類型。如果輸出已經通過使用加速度計和指南針的融合算法過濾,請檢查類型。 – iicodec 2012-07-19 08:18:58

+0

好吧,我現在檢查了供應商 - 事實上,它是Invensense。所以你的猜測可能是正確的。再次感謝。 – fkerber 2012-07-22 23:40:22

0

我在瀏覽這個主題,雖然這是一個老問題,但我不相信接受的答案是正確的。 「隨處報告」的漂移是由噪聲陀螺儀數據的集成(如O.P.提供的鏈接中所見)引起的,而不是簡單地輸出傳感器數據。您將需要此集成來計算隨時間變化的方位變化。

更長的積分時間將包含更大的噪音量,這將會相當快地積累漂移。我相信在Invensense硬件上發生的信號的內部濾波用於消除由他們自己的陀螺儀預處理引起的漂移。

在Android的情況下,在API 18(Jelly Bean MR2)中添加了GYROSCOPE_UNCALIBRATED傳感器,您可以(可能)驗證此工廠漂移校準。無論如何,當您嘗試整合校準和未校準的傳感器事件時,您將會發生漂移,因爲兩者都非常嘈雜。爲了減少這個問題,你必須深入研究complementaryKalman過濾器。

(對不起,沒有發佈更多信息鏈接,沒有足夠的聲望)。

希望這有助於未來的用戶。