SensorManager.getRotationMatrix()
做了以下概述,寫在我發現之前。我會留下補充說明,因爲如果你想糾正磁性和真正北方之間的差異,你仍然需要它。
粗略的算法是獲得旋轉矩陣,乘以它的矢量[0,0,-1]
,然後調整它到你的座標系。爲什麼? Android的文檔給出了設備和世界
注[0,0,-1]
座標系中垂直向下遠離屏幕的Android設備COORDS點。如果您將旋轉矩陣R乘以此矢量,則當設備在桌面上時,您將在世界座標系中獲得[0,0,-1]
。當它向北直立時,您會得到[0,-1,0]
,這表示您已經選擇了一個座標系,其中x
和y
與Android系統交換,但這只是一個約定的更改。
注意R * [0,0,-1]^T
只是R
的第三列否定。從這我得到的僞代碼:
getRotationMatrix(R);
Let v = first three elements of third column of R.
swap v[0] and v[1]
這應該得到你想要的。
關於getRotationMatrix()
正在做什麼的其他信息如下。
同時需要accerometer數據確立方向「向下」和磁力數據來確定方向「北」。您必須假定加速度計只感應重力(設備靜止或以穩定速度移動)。然後,您需要將磁強計矢量投影到垂直於重力矢量的平面上(因爲磁場通常不與地球表面相切)。這給你兩個軸。第三個是正交的,所以可以通過交叉積來計算。這給出了設備系統中的地球座標向量。它看起來像你想要的反轉:地球座標中的設備座標。爲此只需構造方向餘弦矩陣和反轉矩陣。
我會補充一點,上面的討論假設磁力儀矢量指向北方。我想(從高中科學!)它實際上是向南磁性的,但手頭沒有裝置,所以不能嘗試。當然,磁北/南與真的不同,從零到180度取決於你在地球上的位置。您可以檢索GPS座標並計算實際偏移量。
如果您不熟悉這些所需的數學運算,我可以進一步解釋,但必須晚一些。
太感謝了,這是真的很有幫助。你們都給出了這麼好的答案,我希望有一種方法可以選擇它們。看起來我只能用Sensor.TYPE_GRAVITY獲得重力矢量 - 他們確實對我有用。我希望得到一個「北方」矢量也很容易。 – Joey
我最終使用你的解釋得到它。原來,我將重力傳感器和磁場傳感器返回的值直接傳遞給getRotationMatrix(),它將所有東西都處理完畢。然後,將該矩陣乘以[0,0,-1]並得到dv。 – Joey