论文链接:http://202.114.96.204/cache/13/03/x-io.co.uk/35c82431852f2aa7d0feede9dc138626/madgwick_internal_report.pdf

IMU 是指六轴传感器,包含陀螺仪和加速度计。MARG 是指九轴传感器,在 IMU 的基础上添加了磁力计。
IMU = gyroscope + accelerometer
MARG(Magnetic, Angular Rate, and Gravity) = gyroscope + accelerometer + magnetometer

为方便起见,下文中,我将 IMU 与 MARG 统称为 IMU。

原理

Madgwick 是一个 Orientation Filter,用于获得精确的姿态数据,并不考虑整个 IMU 的积分过程。

在 IMU 与其他传感器的融合中我们一般都把 IMU 当做是内部(Intrinsic)传感器。内部传感器能够获得精确的加速度、角速度数据,实际使用中将加速度进行二次积分、角速度进行一次积分获得位置与姿态。但是因为与外界缺乏联系,积分能迅速扩大误差的累积,所以内部传感器需要与外部传感器融合使用。

将 IMU 分解成陀螺仪、加速度计、磁力计,加速度计测量的是地球重力场(受力平衡情况下),磁力计测量的是地磁场(忽略人工磁场影响)。

所以在 IMU 受力平衡状态下,陀螺仪是内部传感器,加速度计和磁力计是外部传感器。

Madgwick IMU Update 是使用加速度计或磁力计的数据与陀螺仪融合使用,提供精确的姿态数据。

过程

Madgwick 使用两种方法分别使用内部传感器、外部传感器求出两个姿态(四元数),随后将这两个姿态进行融合。

1. 内部传感器积分的四元数

用陀螺仪测量值与 \(t-1\) 时刻的四元数积分计算出 \(t\) 时刻四元数。

陀螺仪的测量值:

\[\sideset{^S}{}\omega = \begin{bmatrix} 0 & \omega_x & \omega_y & \omega_z\end{bmatrix}\]

(注:左上角 \(S\) 表示在 Sensor 坐标系下的坐标。)

四元数关于时间 \(t\) 的一阶导数:

\[ \sideset{^S_E}{}{\dot{q}} = {1 \over 2} {}\sideset{^S_E}{}{\hat{q}} \otimes \sideset{^S}{}{\omega} \]

(注:左下角 \(E\) 表示 Earth 坐标系,\(\sideset{^S_E}{}{\dot{q}}\) 表示 Earth 坐标系在 Sensor 坐标系下的四元数时间变化率。)

代入时间,从 \(t-1\) 时刻计算到 \(t\) 时刻:

\[ \sideset{^S_E}{_{\omega, t}}{\dot{q}} = {1 \over 2} \sideset{^S_E}{_{est, t-1}}{\hat{q}} \otimes \sideset{^S}{_t}\omega \]

\[ \sideset{^S_E}{_{\omega, t}}{q} = \sideset{^S_E}{_{est, t-1}}{\hat{q}} + \sideset{^S_E}{_{\omega, t}}{\dot{q}} {\Delta t}\]

(注:下标 \(\omega\) 指使用角速度计算得到的四元数,\(est, \hat{}\) 指上一时刻的“后验值”。)

2. 外部传感器优化的四元数

用 \(t\) 时刻加速度计或磁力计的测量值构建最小化问题,求 \(t\) 时刻四元数。

最小化问题:

\[ {min}_{\sideset{^S_E}{}{\hat{q}} \in \mathbb{R}^4} = f(\sideset{^S_E}{}{\hat{q}}, \sideset{^E}{}{\hat{d}}, \sideset{^S}{}{\hat{s}}) \]

\[ f(\sideset{^S_E}{}{\hat{q}}, \sideset{^E}{}{\hat{d}}, \sideset{^S}{}{\hat{s}}) = \sideset{^S_E}{^*}{\hat{q}} \otimes \sideset{^E}{}{\hat{d}} \otimes \sideset{^S_E}{}{\hat{q}} - \sideset{^S}{}{\hat{s}} \]

其中:

\[ \sideset{^S_E}{}{\hat{q}} = \begin{bmatrix} q_1 & q_2 & q_3 & q_4\end{bmatrix} \]

\[ \sideset{^E}{}{\hat{d}} = \begin{bmatrix} 0 & d_x & d_y & d_z \end{bmatrix} \]

\[ \sideset{^S}{}{\hat{s}} = \begin{bmatrix} 0 & s_x & s_y & s_z \end{bmatrix} \]

$ \sideset{^S_E}{}{\hat{q}} $ 表示待求的姿态四元数。
$ \sideset{^E}{}{\hat{d}} $ 表示在地球坐标系下的一个向量,即重力场或磁力场;$ \sideset{^S_E}{^*}{\hat{q}} \otimes \sideset{^E}{}{\hat{d}} \otimes \sideset{^S_E}{}{\hat{q}} $ 表示将 $ \sideset{^E}{}{\hat{d}} $ 旋转到 Sensor 坐标系下。
$ \sideset{^S}{}{\hat{s}} $ 是重力场或磁力场在 Sensor 坐标系下的测量值。

使用梯度下降法求解:

\[ \sideset{^S_E}{}{q_{k+1}} = \sideset{^S_E}{}{\hat{q}_k} - \mu {{\nabla f(\sideset{^S_E}{}{\hat{q}}, \sideset{^E}{}{\hat{d}}, \sideset{^S}{}{\hat{s}})}\over{\left\Vert \nabla f(\sideset{^S_E}{}{\hat{q}}, \sideset{^E}{}{\hat{d}}, \sideset{^S}{}{\hat{s}}) \right\Vert}}, k = 0,1,2,\dots,n\]

\[ \nabla f(\sideset{^S_E}{}{\hat{q}}, \sideset{^E}{}{\hat{d}}, \sideset{^S}{}{\hat{s}}) = J^T(\sideset{^S_E}{}{\hat{q}}, \sideset{^E}{}{\hat{d}}) f(\sideset{^S_E}{}{\hat{q}}, \sideset{^E}{}{\hat{d}}, \sideset{^S}{}{\hat{s}}) \]

$ J $ 是 $ f $ 对 $ q $ 求一阶偏导,即 Jacobian 矩阵。

然而梯度下降的方法不行,迭代消耗大量的计算资源,与 IMU 的频率不匹配。

Madgwick 使用了替代方法:

\[ \sideset{^S_E}{_{\nabla, t}}{q} = \sideset{^S_E}{_{est, t-1}}{\hat{q}} - \mu_t {{\nabla f}\over{\left\Vert \nabla f \right\Vert}} \]

\[ \nabla f =
\left\{
\begin{array}{c}
J^T_g(\sideset{^S_E}{_{est, t-1}}{\hat{q}})f_g(\sideset{^S_E}{_{est, t-1}}{\hat{q}}, \sideset{^S}{_t}{\hat{a}}) \\
J^T_{g,b}(\sideset{^S_E}{_{est, t-1}}{\hat{q}}, \sideset{^E}{}{\hat{b}})f_{g,b}(\sideset{^S_E}{_{est, t-1}}{\hat{q}}, \sideset{^S}{_t}{\hat{a}}, \sideset{^E}{}{\hat{b}}, \sideset{^S}{}{\hat{m}})
\end{array}
\right. \]

\[ \mu_t = \alpha \left\Vert \sideset{^S_E}{}{\dot{q}_{\omega, t}}\right\Vert \Delta t , \alpha > 1\]

论文中又有一句话说到

the convergence rate governed by \(\mu_t\) is equal or greater than the physical rate of change of orientation

这是一个 convergence 收敛的过程,这个 convergence 不能很好理解,但是看了论文后面的内容,就知道 convergence 是指四元数关于 \(\Delta t\) 的一阶导数。

所谓的 equal or greater than 对应着 \(\alpha > 1\) (不是应该是 greater than 吗???)。

这个方法在 \(\sideset{^S_E}{}{\hat{q}_{est, t-1}}\) 处求一次偏导,得到梯度方向,随后在这个梯度方向上前进 \(\mu_t\) 的步长。而前面的梯度下降方法要求很多次偏导,前进的路线是曲线,得到的最终结果会更好,但是相应的计算消耗很大。这个方法只向最初的方向前进了比较大的步长,得到的不是最优点,整体方向是对的。

(注:\(\sideset{^S_E}{}{q_{\nabla, t}}\) 的下标 \(\nabla\) 指通过梯度方法得到的四元数,与前面通过角速度计算得到的四元数 \(\sideset{^S_E}{_{\omega, t}}{q}\) 相对应。)

个人想法,如果将 \(\sideset{^S_E}{}{\hat{q}_{est, t-1}}\) 换成 \(\sideset{^S_E}{_{\omega, t}}{q}\) 会更合理一些。或许因为这两个四元数需要并行计算,不方便使用 \(\sideset{^S_E}{_{\omega, t}}{q}\)。

3. 融合

融合前面两个四元数:

\[ \sideset{^S_E}{_{est, t}}{q} = \gamma_t \sideset{^S_E}{_{\nabla, t}}{q} + (1 - \gamma_t) \sideset{^S_E}{_{\omega, t}}{q}, 0 \le \gamma_t \le 1\]

对于控制 \(\sideset{^S_E}{_{\nabla, t}}{q}\) 与 \(\sideset{^S_E}{_{\omega, t}}{q}\) 比例的 \(\gamma_t\) 文中说了一句:

An optimal value of \(\gamma_t\) can be defined as that which ensures the weighted divergence
of \(\sideset{^S_E}{_{\omega}}{q}\) is equal to the weighted convergence of \(\sideset{^S_E}{_{\nabla}}{q}\).

于是得出了下面这个方程:

\[ (1 - \gamma_t)\beta = \gamma_t {\mu_t \over \Delta t} \]

\(\beta\) 在论文后面有提到(这个公式有点写得混乱了):

\[ \beta = \left\Vert {1 \over 2} \hat{q} \otimes \begin{bmatrix} 0 & \tilde{\omega}_\beta & \tilde{\omega}_\beta & \tilde{\omega}_\beta \end{bmatrix} \right\Vert = \sqrt{3 \over 4} \tilde{\omega}_\beta \]

推导一下就知道 \(\gamma_t\) 是将 \(\sideset{^S_E}{_{\nabla, t}}{q}\) 与 \(\sideset{^S_E}{_{\omega, t}}{q}\) 分别对 \(\Delta t\) 求一阶偏导,并且让导数的模互为相反数的结果。(\(\left\Vert{{\nabla f}\over{\left\Vert \nabla f \right\Vert}}\right\Vert = 1\))

\[
\begin{cases}
\sideset{^S_E}{_{\nabla, t}}{q} = \sideset{^S_E}{_{est, t-1}}{\hat{q}} - \alpha \left\Vert \sideset{^S_E}{}{\dot{q}_{\omega, t}}\right\Vert \Delta t {{\nabla f}\over{\left\Vert \nabla f \right\Vert}} \\
\sideset{^S_E}{_{\omega, t}}{q} = \sideset{^S_E}{_{est, t-1}}{\hat{q}} + \sideset{^S_E}{_{\omega, t}}{\dot{q}} {\Delta t}
\end{cases} \]

所以

\[ \beta = \left\Vert \sideset{^S_E}{_{\omega, t}}{\dot{q}} \right\Vert \]

继续推导 \(\gamma_t\):

\[ \gamma_t = {\beta \over {{\mu_t \over \Delta t} + \beta}} \]

因为 \(\mu_t\) 很大,所以:

\[ \gamma_t \simeq {\beta \Delta t \over \mu_t} \simeq 0 \]

\[ \sideset{^S_E}{_{\nabla, t}}{q} \simeq - \mu_t {{\nabla f}\over{\left\Vert \nabla f \right\Vert}} \]

将上式代回 $ \sideset{^S_E}{_{est, t}}{q} $:

\[ \sideset{^S_E}{_{est, t}}{q} = {\beta \Delta t \over \mu_t} (-\mu_t {\nabla f \over \left\Vert \nabla f \right\Vert}) + (1-0)(\sideset{^S_E}{_{est, t-1}}{\hat{q}} + \sideset{^S_E}{_{\omega, t}}{\dot{q}} {\Delta t}) \]

整理一下就有最终结果:

\[ \sideset{^S_E}{_{est, t}}{q} = \sideset{^S_E}{_{est, t-1}}{\hat{q}} + \sideset{^S_E}{_{est, t}}{\dot{q}} {\Delta t} \]

\[ \sideset{^S_E}{_{est, t}}{\dot{q}} = \sideset{^S_E}{_{\omega, t}}{\dot{q}} - \beta \sideset{^S_E}{_{\epsilon, t}}{\dot{\hat q}} \]

\[ \sideset{^S_E}{_{\epsilon, t}}{\dot{\hat q}} = {{\nabla f}\over{\left\Vert \nabla f \right\Vert}} \]

补偿

对陀螺仪漂移的补偿和对磁力计变化的补偿。

对磁力计变化的补偿就是将全局坐标系的正北方向,一直对准磁力计得出的磁北方向。

陀螺仪漂移的补偿看不太懂,我看看再补上。

Madgwick IMU Filter的更多相关文章

  1. django 操作数据库--orm(object relation mapping)---models

    思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...

  2. Reading a IMU Without Kalman: The Complementary Filter

    目标是将惯性测量元件(IMU)之中陀螺仪.加速计的数据结合使用.Kalman filter太复杂,在微机上倾向用一种更简单的方法:Complementary filter 姿态估计(获得3个角度,俯仰 ...

  3. 【浅析】IMU代码

    IMU的代码的引自https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/imumargalgo ...

  4. 相机IMU融合四部曲(一):D-LG-EKF详细解读

    相机IMU融合四部曲(一):D-LG-EKF详细解读 极品巧克力 前言 前两篇文章<Google Cardbord的九轴融合算法>,<Madgwick算法详细解读>,讨论的都是 ...

  5. ARDUNIO IMU processing姿态数据可视化

    https://www.arduino.cn/thread-42852-1-1.html 关键数据打包 float roll, pitch, heading; Serial.print("O ...

  6. [转]A Guide To using IMU (Accelerometer and Gyroscope Devices) in Embedded Applications.

    原文地址http://www.starlino.com/imu_guide.html Introduction There’s now a FRENCH translation of this art ...

  7. IMU

    (1)用IMU来进行预测 读入一个10/20帧的数据集,通过IMU来初步预测出位姿以及显示其路径. Christian Forster, Luca Carlone, Frank Dellaert, D ...

  8. 四元数运动学笔记(5)IMU驱动的运动误差方程

    1.扩展卡尔曼滤波EKF1.1线性化卡尔曼滤波1.2偏差微分方程的推导1.3线性化卡尔曼滤波的流程1.4 离散EKF2.误差状态的运动方程2.1连续时间的IMU系统动态方程2.1.1相关变量2.1.2 ...

  9. 相机IMU融合四部曲(二):误差状态四元数详细解读

    相机IMU融合四部曲(二):误差状态四元数详细解读 极品巧克力 前言 上一篇文章,<D-LG-EKF详细解读>中,讲了理论上的SE3上相机和IMU融合的思想.但是,还没有涉及到实际的操作, ...

随机推荐

  1. PAT甲题题解-1038. Recover the Smallest Number (30)-排序/贪心,自定义cmp函数的强大啊!!!

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789138.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  2. HDU 6081 度度熊的王国战略(全局最小割Stoer-Wagner算法)

    Problem Description 度度熊国王率领着喵哈哈族的勇士,准备进攻哗啦啦族. 哗啦啦族是一个强悍的民族,里面有充满智慧的谋士,拥有无穷力量的战士. 所以这一场战争,将会十分艰难. 为了更 ...

  3. springmvc 集成apache cxf 开发webservice 示例

    今天需要在springmvc中增加webservice功能,试了多次axis2,和cxf都不行,后来发现在springmvc中最好用cxf集成非常方便,在又一次尝试后终于把demo整合到现有的项目中 ...

  4. 祝贺自己操作系统JAVA项目有进展!!

    先公布研发过程的心得吧!!! ^_^ /** * 作者:范铭祥 * 内容及功能: 显示框创造1.0 * 我将在这个类里 一:面板1:用来先显示一副图表示顺序和处理中 * 二:面板2:类1:用来显示要处 ...

  5. java 读写 excle 完整版

    pom.xml <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</a ...

  6. php 的优缺点

    1.优点:开源 免费性 快捷性 [程序开发快,运行快,技术本身学习快] 插件丰富,网上的解决方案有很多,而且还有庞大的开源社区可以提供帮助. 跨平台性强  效率高   图像处理 面向对象 [在php4 ...

  7. const和typedef的常见用法详解

    一.说说const 一般而言,const主要是用来防止定义的对象再次被修改,定义对象变量时要初始化变量. 常见用法如下: 1.用于定义常量变量,这样这个变量在后面就不可以再被修改 const int ...

  8. phpStudy-坑爹的数据库管理器-phpMyAdmin的默认用户名和密码

    在这里我必须承认自己的弱智,第一次使用phpMyAdmin竟然搞了10分钟才进去!!! 要使用默认的用户名和密码: 用户名:root 密码:root 尼玛!坑爹啊!不说清楚让我百度了半天!!!!

  9. maven依赖包冲突解决思路

    1.显示依赖关系mvn dependency:tree > tree.txt显示所有依赖关系,并输出到text.txtmvn dependency:tree -Dverbose > tre ...

  10. SQLServer将一个表的数据导入到另一个表

    1.假如A表存在 insert into A(a,b,c) (select a,b,c from B) 2.假如A表不存在 select a,b,c into A from B 3.假如需要跨数据库 ...