Mahony互补滤波器代码详解

Mahony互补滤波器代码详解

在博客文章《一起深入读懂Mahony互补滤波器》(https://blog.csdn.net/jessecw79/article/details/84668189) 的基础上,本文将对Mahony互补滤波器的Matlab代码进行详细解读。本文是Jesse Chen的原创文章,如果转载请注明出处。

文章目录

  • Mahony互补滤波器代码详解
    • 回顾《一起深入读懂Mahony互补滤波器》
    • IMU的测量值
      • 陀螺仪测量误差模型
      • 加速度计测量误差模型
      • 磁力计
    • Explicit Error Formulation of the Passive Complementary Filter
      • Passive Complementary Filter和Explicit Complementary Filter之间的关系
    • Explicit Complementary Filter的四元数实现形式
    • Mahony互补滤波器的Matlab代码详解
    • 参考文献

回顾《一起深入读懂Mahony互补滤波器》

在上一篇文章中,我们介绍了Mahony互补滤波器的推导过程和公式。如图1是一个基本SO(3)的Mahony互补滤波器的框图。
Mahony互补滤波器代码详解_第1张图片
图1 Block diagram of the passive complementary filter on SO(3)

如果采用估计值 R ^ \hat{R} R^作为反馈,可以得到在估计参考坐标系下的互补滤波器方程(将陀螺仪的bias考虑在内):
R ^ ˙ = R ^ ( Ω y − b ^ + ω ) × b ^ ˙ = − k b vex ⁡ ( π a ( R ~ ) ) , with  k b > 0 ω = k est vex ⁡ ( π a ( R ~ ) ) , with  k est > 0 R ~ = R ^ T R \begin{aligned} \dot{\hat{R}} &= \hat{R}\left(\Omega^y - \hat{\mathbf{b}} + \omega\right)_\times \\ \dot{\hat{\mathbf{b}}} & = -k_b\operatorname{vex}\left(\pi_a\left(\widetilde{R}\right)\right),\qquad\text{with }k_b > 0 \\ \omega &= k_{\text{est}}\operatorname{vex}\left(\pi_a\left(\widetilde{R}\right)\right),\qquad\text{with }k_\text{est} > 0 \\ \widetilde{R} &= \hat{R}^T R \end{aligned} R^˙b^˙ωR =R^(Ωyb^+ω)×=kbvex(πa(R )),with kb>0=kestvex(πa(R )),with kest>0=R^TR
假设 k P = k est k_P = k_\text{est} kP=kest k I = k b k_I = k_b kI=kb,那么很容易得到参考文献[1],[2],[3]中的passive complementary filter:
R ^ ˙ = R ^ ( Ω y − b ^ + k P ω ) × , R ^ ( 0 ) = R ^ 0 b ^ ˙ = − k I ω , b ^ ( 0 ) = b ^ 0 ω = vex ⁡ ( P a ( R ~ ) ) , R ~ = R ^ T R y \begin{aligned} \dot{\hat{R}} &= \hat{R}\left(\Omega^y - \hat{\mathbf{b}} + k_P\omega\right)_\times,\qquad\hat{R}\left(0\right) = \hat{R}_0 \\ \dot{\hat{\mathbf{b}}} &= -k_I\omega,\qquad\qquad\qquad\qquad\quad\hat{\mathbf{b}}\left(0\right) = \hat{\mathbf{b}}_0 \\ \omega &= \operatorname{vex}\left(\mathbb{P}_a\left(\widetilde{R}\right)\right),\qquad\qquad\qquad\widetilde{R} = \hat{R}^T R_y \end{aligned} R^˙b^˙ω=R^(Ωyb^+kPω)×,R^(0)=R^0=kIω,b^(0)=b^0=vex(Pa(R )),R =R^TRy
其中 P a ( ⋅ ) = π a ( ⋅ ) \mathbb{P}_a\left(\cdot\right) = \pi_a\left(\cdot\right) Pa()=πa()

IMU的测量值

一般情况下,IMU可以是9轴,包括:

  • 3轴的陀螺仪;
  • 3轴的加速度计;
  • 3轴的磁力计;

捷联式IMU的参考坐标系是和IMU固定在一起的(body fixed frame)坐标系 { B } \{\mathcal{B}\} {B},惯性参考坐标系为 { A } \{\mathcal{A}\} {A},旋转 R = B A R R = {}_\mathcal{B}^\mathcal{A}R R=BAR表示 { B } \{\mathcal{B}\} {B}相对于 { A } \{\mathcal{A}\} {A}的旋转。

陀螺仪测量误差模型

陀螺仪的测量值可以表示为:
Ω y = Ω + b + μ   ∈ R 3 \Omega^y = \Omega + \mathbf{b} + \boldsymbol{\mu}\,\in\mathbb{R}^3 Ωy=Ω+b+μR3
其中 Ω \Omega Ω是真实值, μ \boldsymbol{\mu} μ是加性高斯噪声,而 b : = b ( t ) \mathbf{b}:=\mathbf{b}\left(t\right) b:=b(t)是陀螺仪的bias。

加速度计测量误差模型

加速度计的测量值可以表示为:
a = R T ( v ˙ − g 0 ) + b a + μ a \mathbf{a} = R^T\left(\dot{\mathbf{v}} - \mathbf{g}_0\right) + \mathbf{b}_a + \boldsymbol{\mu}_a a=RT(v˙g0)+ba+μa
其中, b a \mathbf{b}_a ba是加速度计的bias, μ a \boldsymbol{\mu}_a μa是加性高斯噪声。如果我们规定重力加速度的方向为 e 3 \mathbf{e}_3 e3,那么 g 0 = ∣ g 0 ∣ e 3 \mathbf{g}_0 = \left\vert\mathbf{g}_0\right\vert\mathbf{e}_3 g0=g0e3,通常 ∣ g 0 ∣ = 9.8 \left\vert\mathbf{g}_0\right\vert = 9.8 g0=9.8

通常使用
v a = a ∣ a ∣ ≈ − R T e 3 \mathbf{v}_a = \frac{\mathbf{a}}{\left\vert\mathbf{a}\right\vert} \approx -R^T\mathbf{e}_3 va=aaRTe3
作为惯性坐标系的 z z z轴在和IMU固定的坐标系(body fixed frame)中的一个低频估计。

磁力计

磁力计的测量值可以表示为:
m = R T   A m + B m + μ b \mathbf{m} = R^T\,{}^A\mathbf{m} + \mathbf{B}_m + \boldsymbol{\mu}_b m=RTAm+Bm+μb
其中, A m {}^A\mathbf{m} Am表示在惯性坐标系下表示的地球磁场, B m \mathbf{B}_m Bm表示本地磁力干扰, μ b \boldsymbol{\mu}_b μb是噪声。只有磁力计的方向和方向估计有关,因此我们通常使用如下的向量形式的测量
v m = m ∣ m ∣ \mathbf{v}_m = \frac{\mathbf{m}}{\lvert\mathbf{m}\rvert} vm=mm

向量 v a \mathbf{v}_a va v m \mathbf{v}_m vm可以用来构造 B A R   :   { B } → { A } {}_\mathcal{B}^\mathcal{A}R\,:\,\{\mathcal{B}\}\to\{\mathcal{A}\} BAR:{B}{A}的一个瞬时代数测量值
R y = arg ⁡ min ⁡ R ∈ S O ( 3 ) ( λ 1 ∣ e 3 − R v a ∣ 2 + λ 2 ∣ v m ∗ − R v m ∣ 2 ) ≈ B A R R_y = \arg\min_{R\in SO\left(3\right)}\left(\lambda_1\lvert\mathbf{e}_3 - R\mathbf{v}_a\rvert^2 + \lambda_2\lvert\mathbf{v}_m^\ast - R\mathbf{v}_m\rvert^2\right) \approx {}_\mathcal{B}^\mathcal{A}R Ry=argRSO(3)min(λ1e3Rva2+λ2vmRvm2)BAR
其中 v m ∗ \mathbf{v}_m^\ast vm是磁场的惯性方向。

注意 v a \mathbf{v}_a va v m \mathbf{v}_m vm就是参考文献中所说的惯性方向。

我想没人愿意按照上式在线估计 R y R_y Ry,Mahony等学者提出了直接使用IMU测量值得互补滤波器–explicit complementary filter

Explicit Error Formulation of the Passive Complementary Filter

v 0 i ∈ A ,   i = 1 , ⋯   , n \mathbf{v}_{0i}\in\mathcal{A},\,i=1,\cdots,n v0iA,i=1,,n表示 n n n个已知的惯性方向。而与之相对,我们所测量到的惯性方向都是在和IMU固定在一起(body fixed frame)的坐标系中的观测:
v i = R T v 0 i + μ i , v i ∈ B \mathbf{v}_i = R^T\mathbf{v}_{0i} + \boldsymbol{\mu}_i,\qquad\mathbf{v}_i\in\mathcal{B} vi=RTv0i+μi,viB
其中 μ i \boldsymbol{\mu}_i μi是噪声。因为我们只关心惯性方向的方向,因此我们可以做出归一化:
∣ v 0 i ∣ = 1 ∣ v i ∣ = 1 \begin{aligned} \lvert\mathbf{v}_{0i}\rvert &= 1 \\ \lvert\mathbf{v}_i\rvert &= 1 \end{aligned} v0ivi=1=1

R ^ \hat{R} R^ R R R的一个估计,定义:
v ^ i = R ^ T v 0 i \hat{\mathbf{v}}_i = \hat{R}^T\mathbf{v}_{0i} v^i=R^Tv0i
是于 v 0 i \mathbf{v}_{0i} v0i对应的估计值。对于单个方向 v i \mathbf{v}_i vi,方向误差可以定义为:
E i = 1 − cos ⁡ ( ∠ v i , v ^ i ) = 1 − ⟨ v i , v ^ i ⟩ E_i = 1 - \cos\left(\angle\mathbf{v}_i,\hat{\mathbf{v}}_i\right) = 1 - \langle\mathbf{v}_i,\hat{\mathbf{v}}_i\rangle Ei=1cos(vi,v^i)=1vi,v^i
继而得到
E i = 1 − tr ⁡ ( R ^ T v 0 i v 0 i T R ) = 1 − tr ⁡ ( R ~ R T v 0 i v 0 i T R ) E_i = 1 - \operatorname{tr}\left(\hat{R}^T\mathbf{v}_{0i}\mathbf{v}_{0i}^T R\right) = 1 - \operatorname{tr}\left(\widetilde{R}R^T\mathbf{v}_{0i}\mathbf{v}_{0i}^T R\right) Ei=1tr(R^Tv0iv0iTR)=1tr(R RTv0iv0iTR)
对于多个测量 v i \mathbf{v}_i vi,考虑下面的误差:
E mes = ∑ i k i E i = ∑ i = 1 n k i − tr ⁡ ( R ~ M ) , k i > 0 E_\text{mes} = \sum_ik_i E_i = \sum_{i=1}^nk_i - \operatorname{tr}\left(\widetilde{R}M\right),\qquad k_i > 0 Emes=ikiEi=i=1nkitr(R M),ki>0
其中
M = R T M 0 R with     M 0 = ∑ i = 1 n k i v 0 i v 0 i T M = R^T M_0 R\qquad\text{with }\,\,M_0 = \sum_{i=1}^n k_i\mathbf{v}_{0i}\mathbf{v}_{0i}^T M=RTM0Rwith M0=i=1nkiv0iv0iT
假设惯性方向之间是线性不相关的,那么

  • n ≥ 3 n \geq 3 n3时,矩阵 M M M是正定的;
  • n ≤ 2 n \leq 2 n2时,矩阵 M M M是半正定的,且其中一个特征值为0。

我们可以得到按照如下方程组描述的Explicit Complementary Filter:
R ^ ˙ = R ^ ( ( Ω y − b ^ ) × + k P ( ω mes ) × ) , R ^ ( 0 ) = R ^ 0 b ^ ˙ = − k I   ω mes ω mes : = ∑ i = 1 n k i v i × v ^ i , k i > 0 \begin{aligned} \dot{\hat{R}} &= \hat{R}\left(\left(\Omega^y - \hat{\mathbf{b}}\right)_\times + k_P\left(\omega_\text{mes}\right)_\times\right),\qquad\hat{R}\left(0\right) = \hat{R}_0 \\ \dot{\hat{\mathbf{b}}} &= -k_I\,\omega_\text{mes} \\ \omega_\text{mes} :&= \sum_{i=1}^n k_i\mathbf{v}_i\times\hat{\mathbf{v}}_i,\qquad k_i > 0 \end{aligned} R^˙b^˙ωmes:=R^((Ωyb^)×+kP(ωmes)×),R^(0)=R^0=kIωmes=i=1nkivi×v^i,ki>0

Passive Complementary Filter和Explicit Complementary Filter之间的关系

下面我们来推导Explicit Complementary Filter和Passive Complementary Filter之间的关系。

容易证明:
ω mes = vex ⁡ ( ∑ i = 1 n k i ( v ^ i v i T − v i v ^ i T ) ) = − vex ⁡ ( ∑ i = 1 n k i ( v i v ^ i T − v ^ i v i T ) ) \omega_\text{mes} = \operatorname{vex}\left(\sum_{i=1}^n k_i\left(\hat{\mathbf{v}}_i\mathbf{v}_i^T - \mathbf{v}_i\hat{\mathbf{v}}_i^T\right)\right) = -\operatorname{vex}\left(\sum_{i=1}^n k_i\left(\mathbf{v}_i\hat{\mathbf{v}}_i^T - \hat{\mathbf{v}}_i\mathbf{v}_i^T\right)\right) ωmes=vex(i=1nki(v^iviTviv^iT))=vex(i=1nki(viv^iTv^iviT))

本人反复计算过上式,也借助过计算机,仍然和参考文献中间的结论有2倍的差异,但是由于有一组可调系数 { k i } \{k_i\} {ki},因此不会影响参考文献结论的正确性。看到本文的同学,如果对这段计算感兴趣或者对我的结论有不同意见的,请联系[email protected]

同时也容易证明:
R ~ M = R ^ T M 0 R = ∑ i = 1 n k i v ^ i v i T \widetilde{R}M = \hat{R}^T M_0 R = \sum_{i=1}^n k_i\hat{\mathbf{v}}_i\mathbf{v}_i^T R M=R^TM0R=i=1nkiv^iviT
显然
( ω mes ) × = P a ( R ~ M ) \left(\omega_\text{mes}\right)_\times = \mathbb{P}_a\left(\widetilde{R}M\right) (ωmes)×=Pa(R M)
在一种特殊情况下:当 n = 3 n = 3 n=3 k i = 1 k_i = 1 ki=1,且测量的惯性方向是两两正交的( v i T v j = 0 ,   ∀   i ≠ j \mathbf{v}_i^T\mathbf{v}_j = 0,\,\forall\, i\neq j viTvj=0,i̸=j),显然 M 0 = I 3 M_0 = \mathbf{I}_3 M0=I3。那么
M = R T M 0 R = R T R = I 3 M = R^T M_0 R = R^T R = \mathbf{I}_3 M=RTM0R=RTR=I3
在这种情况下,
( ω mes ) × = P a ( R ~ ) ⇒ ω mes = vex ⁡ ( P a ( R ~ ) ) \begin{aligned} \left(\omega_\text{mes}\right)_\times &= \mathbb{P}_a\left(\widetilde{R}\right) \\ \Rightarrow\qquad\omega_\text{mes} &= \operatorname{vex}\left(\mathbb{P}_a\left(\widetilde{R}\right)\right) \end{aligned} (ωmes)×ωmes=Pa(R )=vex(Pa(R ))
这就和开篇回顾的Mahony互补滤波器公式一致了。前不久,有一个工程师和我讲:他看参考文献[3]写技术报告,因为参考文献[3]是非线性的,而参考文献[4]中的互补滤波器是线性的。这种说法是不正确的,本文已经说明了explicit complementary filter就是Mahony Complementary Filter。

Explicit Complementary Filter的四元数实现形式

ω mes = ∑ i = 1 n k i v × v ^ i T , k i > 0 q ^ ˙ = 1 2 q ^ ⊗ p ( Ω y − b ^ + k P ω mes ) , k P > 0 b ^ ˙ = − k I ω mes , k I > 0 \begin{aligned} \omega_\text{mes} &= \sum_{i=1}^n k_i\mathbf{v}\times\hat{\mathbf{v}}_i^T,\qquad k_i > 0 \\ \dot{\hat{q}} &= \frac{1}{2}\hat{q}\otimes\mathbf{p}\left(\Omega^y - \hat{\mathbf{b}} + k_P\omega_\text{mes}\right),\qquad k_P > 0 \\ \dot{\hat{\mathbf{b}}} &= -k_I\omega_\text{mes},\qquad k_I > 0 \end{aligned} ωmesq^˙b^˙=i=1nkiv×v^iT,ki>0=21q^p(Ωyb^+kPωmes),kP>0=kIωmes,kI>0
其中, p   :   R 3 → Q \mathbf{p}\,:\,\mathbb{R}^3\to\mathbb{Q} p:R3Q

Mahony互补滤波器的Matlab代码详解

下面,我们将解读Matlab版本的Mahony互补滤波器代码,这个版本是由Madgwick实现的。

function obj = UpdateIMU(obj, Gyroscope, Accelerometer)
    q = obj.Quaternion; % short name local variable for readability
 
    % Normalise accelerometer measurement
    if(norm(Accelerometer) == 0), return; end   % handle NaN
    Accelerometer = Accelerometer / norm(Accelerometer);	% normalise magnitude
 
    % Estimated direction of gravity and magnetic flux
    v = [2*(q(2)*q(4) - q(1)*q(3))
        2*(q(1)*q(2) + q(3)*q(4))
        q(1)^2 - q(2)^2 - q(3)^2 + q(4)^2];
 
    % Error is sum of cross product between estimated direction and measured direction of field
    e = cross(Accelerometer, v); 
    if(obj.Ki > 0)
        obj.eInt = obj.eInt + e * obj.SamplePeriod;   
    else
        obj.eInt = [0 0 0];
    end
            
    % Apply feedback terms
    Gyroscope = Gyroscope + obj.Kp * e + obj.Ki * obj.eInt;            
            
    % Compute rate of change of quaternion
    qDot = 0.5 * quaternProd(q, [0 Gyroscope(1) Gyroscope(2) Gyroscope(3)]);
 
    % Integrate to yield quaternion
    q = q + qDot * obj.SamplePeriod;
    obj.Quaternion = q / norm(q); % normalise quaternion
end

Note:

  • obj.eInt就是 b ^ \hat{\mathbf{b}} b^,这里是积分运算。
    if(obj.Ki > 0)
        obj.eInt = obj.eInt + e * obj.SamplePeriod;   
    else
        obj.eInt = [0 0 0];
    end
  • 关于代码中Estimated direction of gravity and magnetic flux的解释:首先来看unit quaternion转换为旋转矩阵的公式:The orthogonal matrix corresponding to a rotation by the unit quaternion z = a + b i + c j + d k \mathbf{z} = a + b\mathbf{i} + c\mathbf{j} + d\mathbf{k} z=a+bi+cj+dk (with ∣ z ∣ = 1 \vert\mathbf{z}\vert = 1 z=1,说明是unit quaternion) when post-multiplying with a column vector is given by
    R = ( a 2 + b 2 − c 2 − d 2 2 b c − 2 a d 2 b d + 2 a c 2 b c + 2 a d a 2 − b 2 + c 2 − d 2 2 c d − 2 a b 2 b d − 2 a c 2 c d + 2 a b a 2 − b 2 − c 2 + d 2 ) R=\left(\begin{array}{ccc} a^{2}+b^{2}-c^{2}-d^{2} & 2bc-2ad & 2bd+2ac \\ 2bc+2ad & a^{2}-b^{2}+c^{2}-d^{2} & 2cd-2ab \\ 2bd-2ac & 2cd+2ab & a^{2}-b^{2}-c^{2}+d^{2} \end{array}\right) R=a2+b2c2d22bc+2ad2bd2ac2bc2ada2b2+c2d22cd+2ab2bd+2ac2cd2aba2b2c2+d2
    那么代码中的这段
v = [2*(q(2)*q(4) - q(1)*q(3))
     2*(q(1)*q(2) + q(3)*q(4))
     q(1)^2 - q(2)^2 - q(3)^2 + q(4)^2];

的计算就是
v ^ i = R ^ T ( 0 0 1 ) \hat{\mathbf{v}}_i = \hat{R}^T\left(\begin{array}{c} 0 \\ 0 \\ 1 \end{array}\right) v^i=R^T001

  • 这段代码的中的Accelerometer就是 v i \mathbf{v}_i vi:
    v i = R T v 0 i + μ i , v i ∈ { B } \mathbf{v}_i = R^T\mathbf{v}_{0i} + \boldsymbol{\mu}_i,\qquad\qquad\mathbf{v}_i\in\{\mathcal{B}\} vi=RTv0i+μi,vi{B}

参考文献

[1] Tarek Hamel, Robert Mahony, Attitude Estimation on SO(3) Based on Direct Inertial Measurements, https://www.researchgate.net/profile/T_Hamel/publication/224635156_Attitude_estimation_on_SO3_based_on_direct_inertial_measurements/links/00b4951a50e818d6be000000/Attitude-estimation-on-SO3-based-on-direct-inertial-measurements.pdf
[2] Robert Mahony, Tarek Hamel, A Study of Non-linear Complementary Filter Design for Kinematic Systems on the Special Orthogonal group, Internal report: ISRN I3S/RR-2006-36-FR.
[3] Robert Mahony, Tarek Hamel, Jean-Michel Pflimlin, Non-linear Complementary Filters on the Special Orthogonal Group, IEEE Transactions on Automatic Control, Volume: 53 , Issue: 5 , June 2008. https://hal.archives-ouvertes.fr/hal-00488376/document
[4] Robert Mahony, Tarek Hamel, Jean-Michel Pflimlin, Complementary filter design on the special orthogonal group SO(3), http://folk.ntnu.no/skoge/prost/proceedings/cdc-ecc05/pdffiles/papers/1889.pdf

你可能感兴趣的:(IMU)