[Arduino] Madgwick算法的数学推演

Madgwick算法的数学推演:基于惯性导航元件的位姿估计

《An efficient orientation filter for inertial and inertial/magnetic sensor arrays》 Sebastian O.H. Madgwick

  • 文章简介:这篇文章详细的介绍了基于惯性导航元件位姿估计的Madgwick算法的推导过程并将实验结果和基于卡尔曼滤波算法的结果比对,证明了Madgwick算法的优秀性能。在摘要中主要提到了三个亮点:
    1) Wadgwick算法对于IMU(Inertial Measurement Unit)每次迭代仅使用109次运算,对于MARG(IMU + magntetometers)传感器使用277次运算,非常适合开发轻量级惯导设备。
    2) Wadgwick算法在低采样频率的情况下仍保持良好性能。
    3) 对于IMU传感器有一个可调参数,对于MARG传感器有仅有两个可调参数。下面对文章中的数学过程进行逐一翻译和梳理。
     
  • 需要提前掌握的数学内容
    四元数的概念,四元数的乘法以及含义,四元数的共轭,用四元数计算向量的旋转,四元数与旋转矩阵的转换,四元数与欧拉角的转换。文章中的四元数 B A q ^ _B^A\bm{\hat q}_{} BAq^含义为:坐标系B相对于坐标系A的单位旋转四元数。
     
  • 算法核心思想
    Wadgwick算法的核心思想如下:首先,通过陀螺仪的角速度初步计算传感器方向偏移 E S q ω , t _E^S\bm{q}_{\omega,t} ESqω,t;然后,通过对重力加速度和地磁这两个恒定量在传感器坐标系下的投影计算传感器方向偏移 E S q ∇ , t _E^S\bm{q}_{\nabla,t} ESq,t;最后通过互补滤波器融合 E S q ω , t _E^S\bm{q}_{\omega,t} ESqω,t E S q ∇ , t _E^S\bm{q}_{\nabla,t} ESq,t 来得到一个更加可信的结果。除此之外还需要校正地磁计数据畸变陀螺仪零点漂移。我们下面会一步一步看各部分的数学推演。
     
  • 通过陀螺仪的角速度对 E S q ω , t _E^S\bm{q}_{\omega,t} ESqω,t的计算
    从陀螺仪中直接读取的数据为 S ω = [ 0 , ω x , ω y , ω z ] ^S\bm{\omega}=[0,{\omega_x},{\omega_y},{\omega_z}] Sω=[0,ωx,ωy,ωz]。地面参考系(Earth)相对于传感器参考系(Sensor)的旋转可以由其四元数的导数对时间的积分获得。
     
    E S q ω , t = E S q ^ e s t , t − 1 + E S q ˙ ω , t Δ t _E^S\bm{q}_{\omega,t}=_E^S\bm{\hat q}_{est,t-1}+_E^S\bm{\dot q}_{\omega,t}\Delta t ESqω,t=ESq^est,t1+ESq˙ω,tΔt
     
    其中 E S q ^ e s t , t − 1 _E^S\bm{\hat q}_{est,t-1} ESq^est,t1是在t-1时刻得到的最佳单位位姿四元数。而 E S q ˙ ω , t _E^S\bm{\dot q}_{\omega,t} ESq˙ω,t可以用David et al.提出的Npsnet中的数学模型进行运算,公式如下:
     
    E S q ˙ ω , t = 1 2 E S q ^ e s t , t − 1 × S ω t _E^S\bm{\dot q}_{\omega,t}=\frac{1}{2}_E^S\bm{\hat q}_{est,t-1}×^S\bm{\omega}_t ESq˙ω,t=21ESq^est,t1×Sωt
     
    公式中的角速度可以直接从传感器读出,上一时刻的位姿也是已知,时间间隔也可以从传感器芯片中的获得。可以轻松的计算出 E S q ω , t _E^S\bm{q}_{\omega,t} ESqω,t的数值结果。
     
  • 通过恒定向量对 E S q ∇ , t _E^S\bm{q}_{\nabla,t} ESq,t的计算
    这一部分是利用外部恒定的向量在各个角度的投影来估算传感器的位姿。在IMU中将利用重力加速度,而在MARG中将同时利用重力加速度和地磁方向来计算。对于在Earth参考系下的恒定向量 E d ^ = [ 0 , d x , d y , d z ] ^E\bm{\hat d}=[0,d_x,d_y,d_z] Ed^=[0,dx,dy,dz],在Sensor坐标系下通过传感器读出的数据为 S s ^ = [ 0 , s x , s y , s z ] ^S\bm{\hat s}=[0,s_x,s_y,s_z] Ss^=[0,sx,sy,sz]。在理论上,这二者存在如下关系:
     
    S s ^ = E S q ^ ∗ × E d ^ × E S q ^ ^S\bm{\hat s}=_E^S\bm{\hat q}^*×^E\bm{\hat d}×_E^S\bm{\hat q} Ss^=ESq^×Ed^×ESq^
     
    但是这二者是通过不同的方式获得的,其间的等式关系基本不存在,这也恰好提供了一个估计 E S q ^ _E^S\bm{\hat q} ESq^ 的一个好方法,就是:构建优化目标函数 f = E S q ^ ∗ × E d ^ × E S q ^ − S s ^ f=_E^S\bm{\hat q}^*×^E\bm{\hat d}×_E^S\bm{\hat q}-^S\bm{\hat s} f=ESq^×Ed^×ESq^Ss^,在 f f f 取得最小值时的 E S q ^ _E^S\bm{\hat q} ESq^ 就是我们想要的结果。优化算法使用的是大名鼎鼎的梯度下降法,迭代公式如下:
     
    E S q k + 1 = E S q k − μ ∇ f ∥ ∇ f ∥ _E^S\bm{q}_{k+1}=_E^S\bm{q}_{k}-\mu{\frac{\nabla \bm f}{\|{\nabla \bm f}\|}} ESqk+1=ESqkμff
     
    其中 μ \mu μ是学习率, ∇ f {\nabla \bm f} f在论文中也给出了解析表达式,可以方便查阅。如果使用的是IMU,仅需要将其中的 E d ^ ^E\bm{\hat d} Ed^看成重力加速度 [ 0 , 0 , 0 , 1 ] [0,0,0,1] [0,0,0,1] S s ^ ^S\bm{\hat s} Ss^就是加速度计的单位四元数。若使用的是MARG,在考虑重力加速度的基础上还需要将当地的准确地磁和地磁传感器的读出考虑进来。最终通过梯度下降的方法就能够得到 E S q ∇ , t _E^S\bm{q}_{\nabla,t} ESq,t的结果。值得一提的是,学习率的选择上需要满足条件:
     
    μ t = α ∥ E S q ˙ ω , t ∥ Δ t \mu_t=\alpha\|_E^S\bm{\dot q}_{\omega,t}\|\Delta t μt=αESq˙ω,tΔt,其中 α > 1 \alpha>1 α>1
     
    上述式子的含义是 E S q ∇ , t _E^S\bm{q}_{\nabla,t} ESq,t的收敛速度需要大于 E S q ω , t _E^S\bm{q}_{\omega,t} ESqω,t的发散速度。其中 E S q ˙ ω , t _E^S\bm{\dot q}_{\omega,t} ESq˙ω,t就是 E S q ω , t _E^S\bm{q}_{\omega,t} ESqω,t的发散速度,而 μ t Δ t \frac {\mu_t}{\Delta t} Δtμt则是通过梯度下降运算中的 E S q ∇ , t _E^S\bm{q}_{\nabla,t} ESq,t的收敛速度。
     
  • 通过互补滤波方法融合 E S q w , t _E^S\bm{q}_{w,t} ESqw,t E S q ∇ , t _E^S\bm{q}_{\nabla,t} ESq,t 的结果
    互补滤波的方法非常简单,就是这两个部分的加权平均而已:
     
    E S q e s t , t = γ t E S q ∇ , t + ( 1 − γ t ) E S q w , t _E^S\bm{q}_{est,t}={\gamma_t}_E^S\bm{q}_{\nabla,t}+(1-\gamma_t)_E^S\bm{q}_{w,t} ESqest,t=γtESq,t+(1γt)ESqw,t,其中 0 < γ t < 1 0<\gamma_t<1 0<γt<1
     
    如果假设 β \beta β E S q ω , t _E^S\bm{q}_{\omega,t} ESqω,t 的发散速度,一般用陀螺仪的误差四元数导数的模来表示。如果 E S q ω , t _E^S\bm{q}_{\omega,t} ESqω,t 的发散速度和 E S q ∇ , t _E^S\bm{q}_{\nabla,t} ESq,t 的收敛速度相等,则 γ t \gamma_t γt有:
     
    ( 1 − γ t ) β = γ t μ t Δ t (1-\gamma_t)\beta={\gamma_t}{\frac{\mu_t}{\Delta t}} (1γt)β=γtΔtμt
     
    进而得到 γ t = β μ t Δ t + β \gamma_t={\frac{\beta}{\frac{\mu_t}{\Delta t}+\beta}} γt=Δtμt+ββ
     
    假设 E S q ∇ _E^S\bm{q}_{\nabla} ESq 的收敛速度突破了物理极限,则 α \alpha α 会远远大于 μ t \mu_t μt,这会带来一些近似的化简(很简单,这里不详细列出)。这些化简步骤将会进一步减少运算。最终我们得到的迭代公式如下:
     
    E S q e s t , t = E S q ^ e s t , t + ( E S q ˙ ω , t − β ∇ f ∥ ∇ f ∥ ) Δ t _E^S\bm q_{est,t}=_E^S\bm {\hat q}_{est,t}+(_E^S\bm {\dot q}_{\omega,t}-\beta\frac{\nabla \bm f}{\|\nabla \bm f\|})\Delta t ESqest,t=ESq^est,t+(ESq˙ω,tβff)Δt
     
  • 地磁计数据畸变校正
    地磁计的畸变产生是由于周围的电磁波的干扰。在传感器坐标系下静止的外界电磁干涉源可以通过地磁计的校准进行校正剔除。而在Earth坐标系下的干扰源将会主要产生地磁的测量偏差。在t时刻的地磁方向 E h ^ t ^E\bm {\hat h}_t Eh^t可以通过地磁计的读数 S m ^ t ^S\bm {\hat m}_t Sm^t计算:
     
    E h ^ t = [ 0 , h x , h y , h z ] = E S q ^ e s t , t − 1 × S m ^ t × E S q ^ e s t , t − 1 ∗ ^E\bm {\hat h}_t=[0,h_x,h_y,h_z]=_E^S\bm{\hat q}_{est,t-1}×^S\bm {\hat m}_t×_E^S\bm{\hat q}^*_{est,t-1} Eh^t=[0,hx,hy,hz]=ESq^est,t1×Sm^t×ESq^est,t1
     
    最终参与位姿估计运算的地磁向量 E b ^ t ^E\bm {\hat b}_t Eb^t为:
     
    E b ^ t = [ 0 , h x 2 + h y 2 , 0 , h z ] ^E\bm {\hat b}_t=[0,\sqrt{h_x^2+h_y^2},0,h_z] Eb^t=[0,hx2+hy2 ,0,hz]
     
    这样的校准计算可以将外界的电磁干扰影响约束在对传感器指向的方向估计中。而且不需要预先给定地磁方向。
  • 陀螺仪零点漂移校正
    E S q ^ ˙ ϵ _E^S\bm{\dot{\hat q}}_\epsilon ESq^˙ϵ代表了陀螺仪在各个轴的角误差,使用前文提到的 E S q ˙ ω , t = 1 2 E S q ^ e s t , t − 1 × S ω t _E^S\bm{\dot q}_{\omega,t}=\frac{1}{2}_E^S\bm{\hat q}_{est,t-1}×^S\bm{\omega}_t ESq˙ω,t=21ESq^est,t1×Sωt公式的逆运算可以得出陀螺仪当前度数的可能偏差:
     
    S ω ϵ , t = 2 E S q ^ e s t , t − 1 ∗ × E S q ^ ˙ ϵ , t ^S\bm {\omega}_{\epsilon,t}=2_E^S\bm{\hat q}_{est,t-1}^*×_E^S\bm{\dot{\hat q}}_{\epsilon,t} Sωϵ,t=2ESq^est,t1×ESq^˙ϵ,t
     
    那么陀螺仪随着时间的漂移量为:
     
    S ω b , t = ζ ∑ S ω ϵ , t Δ t ^S\bm {\omega}_{b,t}=\zeta \sum{^S\bm {\omega}_{\epsilon,t}}\Delta t Sωb,t=ζSωϵ,tΔt
     
    最后得到校正后的陀螺仪读数为:
     
    S ω c , t = S ω t − S ω b , t ^S\bm {\omega}_{c,t}=^S\bm {\omega}_{t}-^S\bm {\omega}_{b,t} Sωc,t=SωtSωb,t
     
  • 算法的整体流程图
    [Arduino] Madgwick算法的数学推演_第1张图片
  • 论文结尾附有该算法在C中的实现,详情请查阅论文。

你可能感兴趣的:(Arduino相关)