2012-11-28 45 views
5

在我當前的項目中,我遇到了有關Core Motion CMAttitude提供的四元數的問題。我將iPhone 5(iOS 6.0.1)放在明確的起始位置。然後,我開始快速移動設備,就像在快速步調遊戲中一樣。當我在10-30秒後返回起始位置時,報告的偏航角度與起始位置相差10-20度(大部分時間≈11°)。快速移動後漂移偏航角

我用舊的(可悲的是不再可用)Core Motion茶壺樣本來驗證效果。歐拉角的記錄是從CMAttitude直接讀取:

Start PositionSame place after 15 seconds

 NSLog(@"pitch: %f, roll: %f, yaw: %f", attitude.pitch * 180/M_PI, attitude.roll * 180/M_PI, attitude.yaw * 180/M_PI); 

,我發現這個在不同時間在不同的工廠生產兩種不同的iPhone 5的設備。但真奇怪的是,我的運行iOS 5.1.1的iPhone 4按預期工作。在我看來,這是一個iOS bug,我已經提交了一個bug報告,但另一方面,我很難想象沒有人會發現它。我懷疑它可能與重新設計的Core Motion API有關。從版本5開始,磁力計(指南針)也被用於傳感器融合。控制檯顯示,從locationd偏置估計被提供給CoreMotion:

locationd[41] <Notice>: GYTT inserted: bias,-0.196419,1.749323,-1.828088,variance,0.002644,0.004651,0.002527,temperature,31.554688 

我的問題(S):是否有機會使用設備到運動時阻止磁力計讀數?我嘗試停用位置服務,但它不影響Core Motion。如果不可能,替代/解決方法是什麼,基於加速度計的重力估計?

PS:由於我們面對的是基於四元數模型,這是關係到萬向鎖

編輯 做一些更多的測量它似乎很清楚,只有偏航受到影響後。無論起始位置如何,在偏航漂移的情況下,俯仰和側傾顯示偏差在公差內(< = 1°)。 CMDeviceMotion.gravity看起來也很乾淨。

編輯(2): 我可以重現最新的XCode版本附帶的MotionGraphs示例的問題。偏航圖可重現地偏離原點。

+1

Upvoted,一個有趣的問題!是的,我對磁力計也有不好的經驗:它滯後(引起偏見!)和嘈雜地獄。我也注意到,很容易飽和陀螺儀,尤其是快速移動。有沒有辦法排除犯罪嫌疑人的飽和? – Ali

+0

@Ali我不知道一個方法。但另一方面,我的iPhone 4的iOS 5.1.1與之前安裝的iOS 4.3一樣也很有魅力。在黑暗中拍攝,但我認爲應該責怪iOS 6。 – Kay

+0

我希望有人會知道答案,對不起,我不能幫助:( – Ali

回答

4

不是最終的解決方案,但至少是我自己的問題的解決方法(我把它留作未回答邀請你)。原來,至少DeviceMotion.gravity不受此錯誤影響。所以我決定重新設計這個非常簡單的運動檢測部分,並在傾斜設備時使用arcsin (gravity.x/||gravity||)將主要玩家角色移動到側面。

這絕對是第二個最好的解決方案,因爲它破壞了關於四元數中包含的完整旋轉狀態的信息。我決定給它的戰略考慮,道:

  1. 我想大多數開發人員傾斜,運動檢測與重力矢量,而不是CMAttitude.quaternion,因爲大多數人都不是好玩的約四元數的數學;-)因此有關未來的任何錯誤由於用戶數量較多,重力矢量可能在beta階段被固定。
  2. 如果這是一個軟件錯誤,並且與硬件問題無關,我認爲,如果該錯誤將盡快修復,仍然有許多設備可能因爲什麼原因而無法更新。因此潛在的未來客戶會遇到麻煩的風險很小,但> 0。因此,第二個最佳解決方案有時可能是最好的。
1

我在自己的代碼中做了類似的事情,發現相同的z軸旋轉漂移(偏航)。我已經應用了一個平衡過濾器。在每個運動管理器時間間隔中,我抓取當前四元數(z-分量),然後在計算之後將其保存爲oldZ,以用於下一組計算。我的過濾器只是將新的z值與緊接其前面的z值平衡,防止它太快地移動得太快。根據您的硬件和程序中的精確容差,您可以通過這種方式很好地管理漂移。你會看到陀螺儀稍微漂移,但隨着濾波器繼續動作,開始糾正。我的過濾器看起來像這樣,並防止超過0.5度的「流浪」:

filtZ = 0.65 * oldZ + 0.35 * z;

0.65和0.35的數值是通過實驗確定的,我建議你在有空的時候和那些玩家一起玩。輸出仍然會按比例縮小0-1,然後可以按照您一直使用的方式使用(或者如果您必須保留全部4個維度,則重新引入四元數)。