1.概述
在進行代碼分析之前,了解Mahony濾波器的原理和公式推導是必要的。Mahony濾波器是一種基于四元數的姿態估計濾波器,其主要思想是通過加速度計和陀螺儀的測量值來估計姿態,并通過四元數來表示姿態。其公式推導涉及到四元數的運算和旋轉矩陣的推導,需要具備一定的數學基礎和姿態估計相關的知識。
四元數是一種數學工具,它可以用來表示三維空間的旋轉信息。在秦永元的《慣性導航》這本書第9.2章節中,介紹了姿態更新計算的四元數算法,其中詳細講解了四元數的概念、四元數與姿態陣之間的關系以及四元數微分方程。閱讀完9.2章節的推導后,我們可以更深入地理解四元數的應用和原理。
之前我也寫過一篇 《MEMS_慣性傳感器09 - Mahony姿態解算算法詳解》,但是還是建議閱讀秦永元的《慣性導航》,這樣更容易理解。
物體的姿態變化可以等效為繞某個軸的一次旋轉。我們不需要關注物體變化的中間過程,只需要找到一種變換關系,就能夠求出物體從導航坐標系到載體坐標系或從載體坐標系到導航坐標系的坐標。因此,我們需要推導出這種變化關系。
利用四元數與姿態陣的關系,可以推導得到如下結論:
(1) 四元數 Q (表達式如下) 描述了物體的定點轉動,即,當之關心 b 系(載體系)相對于 R 系(導航系)的角位置時,可認為 b 系是由 R系經過無中間過程的一次性等效旋轉形成的。
Q包含了這種等效旋轉的全部信息;u^R 為旋轉瞬間和旋轉方向 θ為旋轉過的角度
(2) 四元數可以確定出 b 系至 R 系的坐標變換矩陣
根據上述推導,已經得到了姿態變換矩陣和四元數表示法中的姿態角。然而,目前四元數的具體數值未知。為了得到真正的姿態角,需要找到確定四元數數值的方法。
通過已知的陀螺儀和加速度計獲得的角速度和加速度,我們可以利用四元數微分來求解四元數的具體數值。四元數微分是指將四元數看作一個向量,然后對其進行微分,得到一個表示四元數變化率的向量。通過對四元數微分的計算,可以得到四元數的具體數值。
通過解微分方程,可以計算四元數的參數
以上公式的推導過程已在書中詳細說明,故本文不再贅述。針對誤差消除,本文采用了Mahony濾波算法,該算法是本文的核心內容。
2.陀螺儀誤差的消除
角度測量中存在偏差,由于角速度是積分得到的,陀螺儀獲得的角速度信息存在小的偏差,積分后誤差會不斷累積,導致角度測量結果偏差較大。雖然加速度計獲得的角度信息不會出現偏差,但其受噪聲影響較大,短時間內可靠性不高。因此,我們可以利用加速度計獲得的角度信息去矯正陀螺儀獲得的姿態信息,從而消除算出來的角度誤差。
核心思想是利用加速度計獲取信息來補償陀螺儀的角速度信息。具體實現步驟如下:
1.獲取加速度的值,并對其歸一化 (歸一化是為了確保姿態變化矩陣中的四元數是規范四元數,并且利用陀螺儀更新的四元數也需要歸一化。以確保與其他數據對應)
//Normaliseaccelerometermeasurement recipNorm = invSqrt(ax * ax + ay * ay + az * az); ax *= recipNorm; ay *= recipNorm; az *= recipNorm;
2.獲取陀螺儀算出的姿態矩陣中的重力分量, 重力分量記為Vx、Vy、Vz
// Estimated direction of gravity and vector perpendicular to magnetic flux halfvx = q1 * q3 - q0 * q2; halfvy = q0 * q1 + q2 * q3; halfvz = q0 * q0 - 0.5f + q3 * q3;
3.獲取姿態誤差,(將第一步中 獲取的重力向量歸一化后的值與提取的姿態矩陣的重力向量叉乘)
// Error is sum of cross product between estimated and measured direction of gravity halfex = (ay * halfvz - az * halfvy); halfey = (az * halfvx - ax * halfvz); halfez = (ax * halfvy - ay * halfvx);
4.消除誤差, (通過對重力分量叉乘后的誤差進行積分,可以得到角速度值。ki為積分系數,dt為積分周期)
integralFBx += twoKi * halfex * (1.0f / sampleFreq); // integral error scaled by Ki integralFBy += twoKi * halfey * (1.0f / sampleFreq); integralFBz += twoKi * halfez * (1.0f / sampleFreq); gx += integralFBx; // apply integral feedback gy += integralFBy; gz += integralFBz;
5.互補濾波(在PID控制器中加入誤差值,并將其與陀螺儀測得的角速度相加,得到修正的角速度值。使用修正的角速度值來更新四元素,以獲得更準確的姿態角信息)
// Apply proportional feedback gx += twoKp * halfex; gy += twoKp * halfey; gz += twoKp * halfez; //Integrate rate of change of quaternion gx *= (0.5f * (1.0f / sampleFreq)); // pre-multiply common factors gy *= (0.5f * (1.0f / sampleFreq)); gz *= (0.5f * (1.0f / sampleFreq));
6.求解微分方程
qa = q0; qb = q1; qc = q2; q0 += (-qb * gx - qc * gy - q3 * gz); q1 += (qa * gx + qc * gz - q3 * gy); q2 += (qa * gy - qb * gz + q3 * gx); q3 += (qa * gz + qb * gy - qc * gx);
7.四元數歸一化
// Normalise quaternion recipNorm = invSqrt(q0 * q0 + q1 * q1 + q2 * q2 + q3 * q3); q0 *= recipNorm; q1 *= recipNorm; q2 *= recipNorm; q3 *= recipNorm;
8.四元數求解歐拉角 (在求解角度時要清楚的知道導航坐標系是:東北天; 北東地)
roll = asinf(2 * q0 * q2 - 2 * q1 * q3) * (180 / M_PI); // 繞X軸旋轉 pitch = atan2f(2 * q2 * q3 + 2 * q0 * q1, -2 * q1 * q1 - 2 * q2 * q2 + 1) * (180 / M_PI); // 繞Y軸旋轉 yaw = atan2f(2 * q1 * q2 + 2 * q0 * q3, -2 * q2 * q2 - 2 * q3 * q3 + 1) * (180 / M_PI); // 繞Z軸旋轉
3.算法效果演示
不足:
1)當X軸角度大于90度時,Y軸角度發生了漂移
2)在從旋轉到靜止的過程之后,Z軸角度沒有趨近于0度。
責任編輯:彭菁
-
濾波器
+關注
關注
161文章
7817瀏覽量
178126 -
導航
+關注
關注
7文章
528瀏覽量
42413 -
慣性傳感器
+關注
關注
2文章
169瀏覽量
27948
原文標題:MEMS_慣性傳感器14 - Mahony 濾波算法的代碼分析
文章出處:【微信號:SmartHWFW,微信公眾號:SmartHWFW】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論