2010-12-15 82 views
19

我正在開發一個增強現實應用程序(目前)想要在表面上顯示簡單的立方體,並且能夠在空間(旋轉和位移)中移動到在所有不同的角度看立方體。校準相機的問題在這裏不適用,因爲我要求用戶將iPhone放在他想要放置立方體的表面上,然後按下按鈕重置姿態。 陀螺儀和核心運動爲了找出相機的旋轉非常簡單。我這樣做:使用Core Motion獲取加速度計數據的位移

if (referenceAttitude != nil) { 
    [attitude multiplyByInverseOfAttitude:referenceAttitude]; 
} 

CMRotationMatrix mat = attitude.rotationMatrix; 

GLfloat rotMat[] = { 
    mat.m11, mat.m21, mat.m31, 0, 
    mat.m12, mat.m22, mat.m32, 0, 
    mat.m13, mat.m23, mat.m33, 0, 
    0, 0, 0, 1 
}; 

glMultMatrixf(rotMat); 

這工作真的很好。 無論如何,當我嘗試在加速期間發現空間位移時會出現更多問題。 Core Motion的Apple Teapot示例只是將加速度矢量的x,y和z值添加到位置矢量。這(除了沒有多少意義)在加速之後具有將對象返回到原始位置的結果。 (由於加速度從正向負向反向)。 他們這樣做,是這樣的:

translation.x += userAcceleration.x; 
translation.y += userAcceleration.y; 
translation.z += userAcceleration.z; 

我應該怎麼做,找出在一些istant加速位移? (有已知的時間差)。尋找其他答案,似乎我必須整合兩次才能從加速度獲得速度,然後從速度獲取位置。但是無論如何,代碼中都沒有例子,我認爲這不是必須的。此外,還有一個問題,即當iPhone仍在飛機上時,加速度計值不爲空(我認爲有一些噪音)。我應該過濾這些值多少?我應該過濾它們嗎?

回答

7

當iPhone 4非常新,我花了很多很多時間試圖使用加速度計和陀螺儀獲得準確的位移。由於設備最多隻需移動幾米,數據收集通常最多運行幾分鐘,所以不應該關注增量漂移。我們嘗試了各種方法,甚至得到了幾位蘋果工程師的幫助。最終,陀螺儀似乎無法完成任務。這對於3D定位很有好處,但那是它......再次,根據非常有知識的工程師。

我很想聽到有人反駁這一點 - 因爲應用程序從未真正果然如我們所希望的,等

21

酷,還有人在那裏用相同​​的問題所困擾,因此是值得花了一些時間:-)

我同意westsider的聲明,因爲我花了幾個星期的時間來嘗試不同的方法,結果很糟糕。我相信,對於持續超過1秒或2秒的較大距離或較慢運動,將不會有可接受的解決方案。如果你可以忍受一些限制,比如小距離(< 10釐米)以及你的動作的給定最小速度,那麼我相信可能有機會找到解決方案 - 完全沒有保證。如果是這樣,它會花費你一個相當困難的時間研究和很多挫折,但如果你得到它,它將是非常非常酷:-)也許你會發現這些提示有用:

首先要做的事情很簡單,只需看一個軸,例如x,但同時考慮左(-x)和右(+ x)​​就有可表示的情況。

是的,你是對的,你必須整合兩次以獲得作爲時間函數的位置。並且爲了進一步處理,您應該存儲第一個集成的結果(==速度),因爲您將在稍後階段需要它進行優化。這樣做非常小心,因爲每一個微小的錯誤都會在短時間內導致巨大的錯誤。

永遠記住,即使是很小的錯誤(例如< 0.1%)會做兩次整合後快速增長。如果您將加速度計配置爲50 Hz,即處理了50個滴答並且微小的可忽略錯誤將超出「真實」值,情況在一秒鐘後會變得更糟。我強烈建議不要依賴梯形法則,而是至少使用辛普森或更高等級的牛頓 - 科特斯公式。

如果你管理這個,你將不得不留意設置正確的低通濾波。我不能給出一般的價值,但作爲一個經驗法則,過濾因子在0.2到0.8之間進行試驗將是一個很好的起點。正確的價值取決於你所需要的商業案例,比如什麼樣的遊戲,如何快速對事件作出反應,...

現在你將有哪些工作在某些情況下,並在短期內相當不錯的解決方案一段的時間。但是,幾秒鐘後,你會遇到麻煩,因爲你的物體正在漂移。現在,您將進入我在給定時間範圍內最終無法處理的難題: - (

一個很有希望的方法是引入一些我稱之爲「合成力」或「虛擬力」的東西。策略對幾種不利情況作出反應,儘管設備在您的手中保持固定(我的意思是沒有移動),但是這種情況會引發物體漂移,最麻煩的是速度大於0而沒有任何加速度。錯誤傳播的不可避免的結果,並且可以通過人工減速來處理,這意味着即使沒有真實的對應也會引入虛擬減速。一個非常簡單的例子:

if (vX > 0 && lastAccelerationXTimeStamp > 0.3sec) { 

    vX *= 0.9; 
} 

`

你需要這樣的條件的組合馴服野獸。需要進行大量的嘗試和錯誤才能獲得正確的方式,這將成爲問題的難題。

如果你設法破解代碼,pleeeease讓我知道,我很好奇,想看看它是否是一般可能或不:-)

乾杯凱

5

我也想在iPhone上獲得位移。假設初始速度爲0(聽起來不像您可以假設初始速度爲0),我使用的基本物理公式爲d = 0.5a * t^2。到目前爲止,它似乎工作得很好。

我的問題是,我正在使用deviceMotion並且值不正確。 deviceMotion.gravity閱讀近0.任何想法? - 確定固定,顯然deviceMotion.gravity有x,y和z值。如果你沒有指定你想要的東西,你可以返回x(它應該接近0)。

+1

與d的問題= 0.5 *在一般A * T^2是,它需要一個恆定的加速度等在http://en.wikipedia.org/wiki/描述加速。 – Kay 2011-01-16 12:34:44

+1

那麼,假設v(0)== 0是至關重要的,但我們需要一個點開始,並應該忍受。海事組織更關鍵的部分出現幾秒後,當你有一個== 0和v!= 0(如我的答案中所解釋的)。 – Kay 2011-01-16 12:42:34