2011-06-06 35 views
10

過去幾天我一直在研究一個小羅盤應用程序,並且已經開始運行代碼,但是看起來羅盤閱讀並不準確。在對兩部手機進行校準之後,我的第一個測試是,我發現了這一點,我只是拿着手機對着它,平坦的表面看着讀數,然後水平翻轉並將它放在同一平面上(180 *轉),數值沒有改變180 *它接近240 *。安卓羅盤看起來不可靠

然後我測試了讀數與指南針,有時讀數似乎很接近,但在其他地方它超過50 * off。我甚至試圖把我的手機和指南針放在地板上,使圓規遠離任何磁性干擾,並得到相同的結果(請注意,我還要保持指南針和手機分開,通過排列書本邊緣來保持它們在同一個方向) 。

然後我把示例應用程序放在另一個手機上(第一個是nexus S,第二個是Motorola droid 1)。在兩部手機之間,差異的範圍從某些點相等,但最多點在50到15度之間。

我查看了文檔,也查看了許多不同的論壇帖子,我沒有看到任何人有相同的結果。我的代碼中可能存在一些小錯誤,導致我的閱讀錯誤地出現,或者我沒有看到某些記錄的錯誤。

任何有識之士或建議將不勝感激!

我的繼承人傳感器在我SensorEventListener類

public void onSensorChanged(SensorEvent event) 
    { 
     // If the sensor data is unreliable return 
     if (event.accuracy == SensorManager.SENSOR_STATUS_UNRELIABLE) 
     { 
      Toast.makeText(main.this, "Sensor Status Unreliable",Toast.LENGTH_SHORT).show(); 
     } 





     // Gets the value of the sensor that has been changed 
     switch (event.sensor.getType()) 
     { 
     case Sensor.TYPE_ACCELEROMETER: 
      m_vfgravity = event.values.clone(); 
      break; 
     case Sensor.TYPE_MAGNETIC_FIELD: 
      m_vfgeomag = event.values.clone(); 
      break; 
     } 

     if (m_vfgravity != null && m_vfgeomag != null) 
     { 
      if(SensorManager.getRotationMatrix(m_vfinR, m_vfI, m_vfgravity, m_vfgeomag)) 
      { 
       SensorManager.getOrientation(m_vfinR, m_vforientVals); 

       m_fCompBearing = (float) Math.round((Math.toDegrees(m_vforientVals[0])) *2)/2; 

       //convert to 0-360 from -180-180 
       if(m_fCompBearing < 0.0) 
       { 
        m_fCompBearing = 360 + m_fCompBearing; 
       } 


       mCompHead.setText("" + (int)m_fCompBearing); 
      } 

      calcOffset(); 
      rotateCmp(); 
     } 
    } 

和代碼在改變代碼事先在創造我的活動

mSMngr = (SensorManager) getSystemService(Context.SENSOR_SERVICE); 
    mSListener = new cSensorListener(); 

    mSMngr.registerListener(mSListener, 
      mSMngr.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
      SensorManager.SENSOR_DELAY_UI); 
    mSMngr.registerListener(mSListener, 
      mSMngr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_UI); 

謝謝!

編輯:也嘗試過用最壞的結果與droid X ...當手機滾動45度(繞z軸旋轉一個電腦座標系統)返回的指南針標題可以改變超過180度,在事實上,當朝相同方向旋轉時,標題值與其他手機的相反方向相反。即使在設置中進行校準後,這也是唯一能夠產生此結果的手機。另外他們是一個指南針我測試的動態壁紙不具有相同的問題。所以我會假設我會在軟件中做些什麼來避免這種情況。

+0

你確定Android是問題,而不是硬件? – 2011-06-06 19:09:39

+0

差異的一個明顯來源是磁性與真北方。 FWIW,我的基本garmin gps單位直指前進,如果你轉圈不動。使用這些基本的GPS單元的唯一方法是將其指向旅行和_move_ forward方向。這可能與你的問題沒有關係,但? – JAL 2011-06-06 22:16:31

+0

首先感謝您的快速解答。以及傳感器管理器始終應該返回磁北,GPS將返回真北,因爲它使用基於真北的緯度/經度上的運動方向。至於它是一個硬件問題,這是一種可能性,但是我看到應用程序會全面返回類似的結果,並想知道如何做到這一點。我也測試過DroidX,並且結果在Droid X上有很大的不同,我的指南針圖像甚至在相反的方向旋轉? – ocross 2011-06-06 23:14:01

回答

3

那麼經過多次測試和調試。我得出的結論是,正如你們中有些人提到我的droid 1和Nexus S是純硬件差異和磁干擾的差異。

但是,Droid X是一個不同的問題,無論我嘗試過,我無法通過getRotationMatrix和getOrientation獲得正確的讀數,即使添加了重新映射座標函數。所以經過一些修補沒有成功後,我覺得ID給方向傳感器一個鏡頭。

谷歌說,這種方式已被棄用,他們建議按照我開始的方式來做,但我嘗試了所有類型的組合,但沒有成功。所以我繼續前進,忽略了他們的警告,並使用了方向傳感器......它工作。爲什麼?我不知道,droid x比我的droid 1更新,所以它不應該使用遺留代碼。然而,當我的應用程序執行「推薦的方式」不起作用時,爲什麼指南針應用程序寫入目標1.6會起作用。

如果任何人有更好的方法來做到這一點,讓我知道,或者如果你知道一種方法使它與getRotationMatrix和getOrientation一起工作也告訴。

否則對於任何碰到這堵磚牆的人來說,像我一樣努力的話,最終會爲我工作的代碼。

我對傳感器改變

 switch (event.sensor.getType()) 
     { 
     case Sensor.TYPE_ORIENTATION: 
      m_vforientVals = event.values.clone(); 
      break; 
     } 

     if(m_vforientVals != null) 
     { 
      m_fCompBearing = m_vforientVals[0];    


      mCompHead.setText("" + (int)m_fCompBearing); 

      calcOffset(); 
      rotateCmp(); 
     } 

和初始化傳感器聽衆

mSMngr.registerListener(mSListener,mSMngr.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
          SensorManager.SENSOR_DELAY_NORMAL); 
2

您的代碼對我來說看起來很好,如果您的代碼中存在錯誤,我非常確定這兩個設備都會因此受到影響。我認爲這是導致差異的設備中的硬件。 您是否通過以八字形移動手機來「校準」兩個指南針?許多指南針應用程序建議,包括symbian設備附帶的地圖軟件。這可以工作

+0

感謝您的迴應,並且您確實提出了一個關於校準的重要意見,這可以產生巨大的影響,並使指南針不可靠。不幸的是,這是我忘了提及我在測試前做過的一步(我現在編輯它)。這次我會再試一次並校準更長的時間,看看我是否看到了更好的結果。 – ocross 2011-06-06 23:26:49

31

即使筆者回答了自己的問題,我要在這裏附和只是爲了加強對任何幾乎全然無用Android平臺上的一種指南針功能。

我得出的結論是,任何依賴於Android指南針應用程序的人都在尋求麻煩,他們中的任何一個都不能可靠地工作,而且這不是開發人員的錯。

谷歌和製造商根本沒有提供一種方法來從這些設備獲得可靠的準確性,甚至確定準確性是否可靠,甚至更糟糕,因爲有時他們很多時候他們不是,如果有人相信這些真正的定向神器幫助他們。

作者可能認爲他得到了更好的結果的原因是他們對棄用的方向傳感器使用了一個相當不錯的噪聲濾波器(爲什麼他們不能在新的方法上做到這一點,超出了我)以及有限的測試校準後的單個設備似乎可以工作,但在現場使用很多設備時,我發現大多數情況下可靠性始終存在問題。

首先,由磁性和方向傳感器產生的噪聲是可怕的,是的,這可以通過適當的DSP技術來克服,而且使用2.3和陀螺儀的手機將會獲得更好的整體性,但對谷歌和製造商來說,許多開發人員用劣質的硬件和軟件輸出實現了時間。其次,我已經測試了至少18部具有適當DSP濾波功能的手機,雖然這樣可以清除噪音,但對準確性沒有幫助,即使是相同型號的手機也有不同的輸出(儘管有些型號似乎比其他型號更好)

第三,對於確定傳感器是否進行了校準,甚至是做痙攣狀態的數字8運動可能會或可能不會校準電話,並且用戶從不真正知道它是否工作,除非您有一個指南針來驗證,哪種失敗點不是它?

注意:您可以相互乘積和求和磁傳感器,並取sqrt(x * x + y * y + z * z)的平方根並確保它在25到65之間,這個是你可以用來檢測異常場的一個指標,但它不是完全可靠的,比我猜想的要好。第四,很多手機都是完全不可靠的,無論是否校準,這不僅限於模型類型,也可能是製造商方面質量低劣的問題,我真的不知道爲什麼,但我可以說3 HTC ARIA的生產不同的結果(一個30度關閉,另一個50度,第三個幾乎發現)與令人難以置信的聯繫等相同的事情。

我測試了18部手機,其中許多手機相當接近精確如果您可以正確校準,但其中許多手機需要2-10次嘗試(我們使用高精度指南針進行了每次校準嘗試後進行了驗證),並且其中有很多次根本不會校準。

注意:如果您有權訪問當前的GPS座標,海拔高度,一天中的時間等,則您必須考慮真正北偏移的偏角,如果您有權訪問當前的GPS座標,則可以使用android中的API進行偏移。如果你正在比較一個不是問題的指南針,因爲它也會受到局部磁場的影響。

FITH,冷啓動時總是要求我們測試每一個電話,其中包括X,令人難以置信,曉月的Nexus和迅雷的校準步驟。換句話說,首次啓動傳感器時,95%的時間需要校準步驟(即使是一個破損的時鐘一天兩次),所以如果您堅持添加此功能,我只會告訴您的用戶在每個聽衆事件的開始。

如果離開運行senors(壞電池),那麼你可能會或可能不會有依賴於它遇到的領域進行重新校準)上述方法工作正常了點。

底線是,當他們的工作,他們似乎很酷,但你永遠目前可以肯定的方位,這使得它們非常不可靠的,無用的任何實際工作的準確性。

就我個人而言,如果可能的話,我會在移動時使用GPS軸承,然後在可能的情況下使用旋轉矢量方法,但它可能不是完美的,但它比您在當前手機系列中的隨機實現要好得多爲方位角。

對不起,我已經浪費了將近一個月的時間,在一位專家的DSP工程師的幫助下工作,我們已經寫了很多關於android平臺的文章。

A「有時候這工作,其他時間也不會,你永遠無法確定,除非你有一個真正的指南針」免責聲明應放在在我看來,每一個指南針的應用程序。

+2

是的,我同意你的意見。我得出的結論是,你必須意識到,將有大約有好像在我的大多數設備(僅適用於6測試)讀數誤差±30度的餘量是一個範圍內圍繞10 之間枝爲什麼我說方向傳感器是修復是因爲機器人X根本沒有工作。當其他人靠近時有一個誤差餘量,並且切換到方向使X的工作與其他工作類似。降噪效果不錯,但在獲得價值之後,我已經在做我自己的低通濾波器了。 – ocross 2011-06-14 21:17:58

+0

@ocross我發現的是,如果傳感器cfg文件被刪除了偏移問題,並且重新校準問題消失了。問題是需要root訪問權限,並且只是暫時的。此外,粘連問題似乎與我測試的手機上的手動校準有關,至少,懶惰-8手腕的運動是固定的。對於另一個我必須包括和抵消功能,可以「同步」到GPS軸承(速度精度必須是好的)或手動由用戶。問題在於漂移隨着時間的推移而發生 – Idistic 2011-07-09 20:02:25

+0

這種帖子既是祝福也是詛咒:我將依靠加速度計來確定標題(另一種不太可靠的方法),但是想知道是否切換到磁力儀的標題決心從一開始就不是一個好主意。由於我需要逐步準確地讀取標題,加速度計不起作用,圓規似乎不起作用,那麼剩下的是什麼? GPS足夠可靠嗎?即使有天際線的干擾? – ravemir 2013-04-02 10:13:06