Madgwick IMU Filter
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的更多相关文章
- django 操作数据库--orm(object relation mapping)---models
思想 django为使用一种新的方式,即:关系对象映射(Object Relational Mapping,简称ORM). PHP:activerecord Java:Hibernate C#:Ent ...
- Reading a IMU Without Kalman: The Complementary Filter
目标是将惯性测量元件(IMU)之中陀螺仪.加速计的数据结合使用.Kalman filter太复杂,在微机上倾向用一种更简单的方法:Complementary filter 姿态估计(获得3个角度,俯仰 ...
- 【浅析】IMU代码
IMU的代码的引自https://storage.googleapis.com/google-code-archive-downloads/v2/code.google.com/imumargalgo ...
- 相机IMU融合四部曲(一):D-LG-EKF详细解读
相机IMU融合四部曲(一):D-LG-EKF详细解读 极品巧克力 前言 前两篇文章<Google Cardbord的九轴融合算法>,<Madgwick算法详细解读>,讨论的都是 ...
- ARDUNIO IMU processing姿态数据可视化
https://www.arduino.cn/thread-42852-1-1.html 关键数据打包 float roll, pitch, heading; Serial.print("O ...
- [转]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 ...
- IMU
(1)用IMU来进行预测 读入一个10/20帧的数据集,通过IMU来初步预测出位姿以及显示其路径. Christian Forster, Luca Carlone, Frank Dellaert, D ...
- 四元数运动学笔记(5)IMU驱动的运动误差方程
1.扩展卡尔曼滤波EKF1.1线性化卡尔曼滤波1.2偏差微分方程的推导1.3线性化卡尔曼滤波的流程1.4 离散EKF2.误差状态的运动方程2.1连续时间的IMU系统动态方程2.1.1相关变量2.1.2 ...
- 相机IMU融合四部曲(二):误差状态四元数详细解读
相机IMU融合四部曲(二):误差状态四元数详细解读 极品巧克力 前言 上一篇文章,<D-LG-EKF详细解读>中,讲了理论上的SE3上相机和IMU融合的思想.但是,还没有涉及到实际的操作, ...
随机推荐
- JAVA每日一旅2
1.关于类型转换 两个数值进行二元操作时,会有如下的转换操作: 如果两个操作数其中有一个是double类型,另一个操作就会转换为double类型. 否则,如果其中一个操作数是float类型,另一个将会 ...
- 【Alpha】第四次Scrum meeting
今天任务一览: 姓名 今日完成任务 所耗时间 刘乾 配置好了所有物理实验的通配模板,为服务器配置了latex中文环境,设置了一些常用字体. Issue链接:https://github.com/bua ...
- Linux内核分析——第一章 Linux内核简介
第一章 Linux内核简介 一.Unix的历史 1.Unix系统成为一个强大.健壮和稳定的操作系统的根本原因: (1)简洁 (2)在Unix中,很多东西都被当做文件对待.这种抽象使对数据和对设备的 ...
- 软工实践周六实践课安排(2017秋学期) | K 班
软工实践周六实践课安排(2017秋学期) | K 班 周数 截止时间 工作内容 阶段成果展示形式 验收方式 备注 4之前 2017.10月前 组队 随笔(提供组队名单.组队队员的介绍--包括擅长的地方 ...
- Python的三种格式化输出
今天刚学了python的三种格式化输出,以前没接触过这么有趣的输出方式,现在来分享一下. #!/user/bin/env python#coding:utf-8#三种格式化输出 #第一种格式化输出na ...
- Ubuntu安装eclipse,并创建桌面快捷方式
系统:Ubuntu 16.04 JDK版本:1.8.0_121 Ubuntu下安装JDK配置环境变量可见我的这篇文章 http://www.cnblogs.com/AloneZ/p/Ubuntu1 ...
- 三星a9上测试egret与pixi.js的渲染性能
for (let i = 0; i < 500; i++) { let shape = new egret.Shape(); shape.graphics.beginFill(0xff0000) ...
- Codeforces Round #485 Div. 1 vp记
A:对每种商品多源bfs一下每个点到该商品的最近距离,对每个点sort一下取前s个即可. #include<iostream> #include<cstdio> #includ ...
- HGOI20180812 (NOIP2018 提高组 Day1 模拟试题)
前缀数组其实就是有序的,那么答案显然是 我们尝试求出通项公式: 证明如下: 因为 所以: 解之得: 更加通俗的写法如下: 易知 令 那么, (错位相减) 由易知等式代入得, 所以, 所以程 ...
- 监控IIS的运行状态
IIS经常出现假死的情况,具体什么时候会出现假死,我就不说了,今天我要写的是如何监控IIS的状态. 程序的功能是:如果IIS是为运行的状态,就重启IIS,如果IIS的连接数达到了设置的连接数,也重启I ...