在博客文章《一起深入读懂Mahony互补滤波器》(https://blog.csdn.net/jessecw79/article/details/84668189) 的基础上,本文将对Mahony互补滤波器的Matlab代码进行详细解读。本文是Jesse Chen的原创文章,如果转载请注明出处。
在上一篇文章中,我们介绍了Mahony互补滤波器的推导过程和公式。如图1是一个基本SO(3)的Mahony互补滤波器的框图。
图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^(Ωy−b^+ω)×=−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^(Ωy−b^+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可以是9轴,包括:
捷联式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=∣g0∣e3,通常 ∣ 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=∣a∣a≈−RTe3
作为惯性坐标系的 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=∣m∣m
向量 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=argR∈SO(3)min(λ1∣e3−Rva∣2+λ2∣vm∗−Rvm∣2)≈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。
设 v 0 i ∈ A ,   i = 1 , ⋯   , n \mathbf{v}_{0i}\in\mathcal{A},\,i=1,\cdots,n v0i∈A,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,vi∈B
其中 μ 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} ∣v0i∣∣vi∣=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=1−cos(∠vi,v^i)=1−⟨vi,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=1−tr(R^Tv0iv0iTR)=1−tr(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=i∑kiEi=i=1∑nki−tr(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=1∑nkiv0iv0iT
假设惯性方向之间是线性不相关的,那么
我们可以得到按照如下方程组描述的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^((Ωy−b^)×+kP(ωmes)×),R^(0)=R^0=−kIωmes=i=1∑nkivi×v^i,ki>0
下面我们来推导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=1∑nki(v^iviT−viv^iT))=−vex(i=1∑nki(viv^iT−v^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=1∑nkiv^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。
ω 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=1∑nkiv×v^iT,ki>0=21q^⊗p(Ωy−b^+kPωmes),kP>0=−kIωmes,kI>0
其中, p   :   R 3 → Q \mathbf{p}\,:\,\mathbb{R}^3\to\mathbb{Q} p:R3→Q。
下面,我们将解读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:
if(obj.Ki > 0)
obj.eInt = obj.eInt + e * obj.SamplePeriod;
else
obj.eInt = [0 0 0];
end
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^T⎝⎛001⎠⎞
[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