題:
通過磁力計和加速度計計算偏航
dnotol
2016-01-09 05:27:29 UTC
view on stackexchange narkive permalink

我使用Arduino和9 DOF傳感器(陀螺儀,加速計和磁力計),並且我嘗試使用傳感器使我能夠統一旋轉對象的俯仰,橫搖和偏航。

我設法從加速度計正確計算俯仰和橫滾(z和x軸的單位),但似乎無法正確地完成偏航。意思是說,當我旋轉傳感器的俯仰角或滾動時,它也以一種怪異的方式旋轉了偏航角。


arduino中的代碼以獲取航向

  void getHeading(void){heading = 180 * atan2(Mxyz [0],Mxyz [1])/ PI; if(heading <0)heading + = 360;} void getTiltHeading(void){//浮動音高= asin(-Axyz [0]); // float roll = asin(Axyz [1] / cos(pitch));浮點間距= atan(Axyz [0] / sqrt(Axyz [1] * Axyz [1] + Axyz [2] * Axyz [2]));浮點數= atan(Axyz [1] / sqrt(Axyz [0] * Axyz [0] + Axyz [2] * Axyz [2]));浮點xh = Mxyz [0] * cos(音高)+ Mxyz [2] * sin(音高); float yh = Mxyz [0] * sin(roll)* sin(pitch)+ Mxyz [1] * cos(roll)-Mxyz [2] * sin(roll)* cos(pitch); float zh = -Mxyz [0] * cos(roll)* sin(pitch)+ Mxyz [1] * sin(roll)+ Mxyz [2] * cos(roll)* cos(pitch);傾角= 180 * atan2(yh,xh)/ PI; if(yh<0)傾斜+ = 360;}  

俯仰和滾動

  float _Pitch =(float)(180 / Math.PI * Math.Atan(m_ResultX / Math.Sqrt(m_ResultY * m_ResultY + m_ResultZ * m_ResultZ))); float _Roll =(float)(180 / Math.PI * Math.Atan(m_ResultY / Math.Sqrt(m_ResultX * m_ResultX + m_ResultZ * m_ResultZ)))); float _Yaw =(float)(m_TiltHeadingResult);  

請隨時詢問詳細信息。

您是否弄清楚了為什麼傾斜/滾動傳感器會改變偏航?以及如何解決?任何信息也會對我有幫助。
一 回答:
BrettAM
2016-01-09 06:08:13 UTC
view on stackexchange narkive permalink

我不知道您的傳感器的所有軸如何對齊,但是看起來您應該通過按 -pitch -roll 旋轉磁力計讀數來使其水平回到全局參考框架,而不是將磁力計的讀數旋轉正角。

但是,代碼中的俯仰角和側傾角都是相對於水平線的,而不是一組歐拉角定義兩個狀態之間的旋轉;因此,它們不會像我假設方程式那樣嘗試將磁力計旋轉回全局xy框架。該代碼還僅使用 atan 進行俯仰和滾動,而不是 atan2 ,因此它們的範圍僅為180度。

您需要確保您將磁力計讀數乘以一個旋轉矩陣是基於與用於從加速度計獲得俯仰和橫滾的方程式相同的約定,並且它會抵消觀測到的旋轉。您讀到了歐拉角。您也可以嘗試搜索一個好的庫來為您處理9自由度傳感器融合。

我已經閱讀了一些關於歐拉角的信息,但是我的數學並不是很好,也沒有時間做進一步的研究,但是我設法找到了一個很好的9自由度傳感器融合。現在一切都很好。
您是否會提供所用傳感器融合的鏈接?


該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 3.0許可。
Loading...