相机IMU融合四部曲(二):误差状态四元数详细解读
相机IMU融合四部曲(二):误差状态四元数详细解读
极品巧克力
前言
上一篇文章,《D-LG-EKF详细解读》中,讲了理论上的SE3上相机和IMU融合的思想。但是,还没有涉及到实际的操作,以及实际操作中会遇到的一些问题。所以,本文开始讲实际操作,包括,在相机和IMU融合的过程中,IMU速度的计算,加速度计和陀螺仪的使用,偏移的处理,重力的滤波等。
本文的主要参考文献为John sola的《Quaternion kinematics for the error state Kalman》,简称为误差状态四元数。它的基本思想和D-LG-EKF是一样的,都是对均值状态和扰动状态的进行处理。但是,不同的是,在误差状态四元数里,是把偏移也放到状态里滤波的,而Google Cardboard里的偏移是通过低通滤波滤出来的。
而且John sola的相机和IMU融合的程序是开源的,项目名称为RT-SLAM,源代码地址为https://www.openrobots.org/wiki/rtslam/。
其运行效果如视频(https://vimeo.com/114879173)所示。
本文目标读者:传感器融合算法工程师。
1.预测
首先,列出运动方程。

其中,下标t表示的是true的意思。
又因为实际测量值与真实值的关系为,

把实际测量值代入到上式中,

所以,用D-LG-EKF里面的均值+扰动的思想,表示两个时刻的均值以及扰动状态之间要满足的关系,
因为,
,所以,代入上式,得到,

里面,其实是
,而不是
,
是中间的一个转换。
其中,上式左边的
等都为均值,就是由
时刻的均值变换过来的,新的均值的计算过程如下,

再代回到之前的公式中,

从而得到,新的扰动与旧的扰动的关系,

把
的平方项都忽略掉,忽略二阶的极小值,进一步推导。

参考《从角轴到四元数微分方程》,角轴扰动与四元数扰动的关系为,

原先的表达式可以转换为,

在上面的推导中,因为
是二阶极小值,所以忽略掉。因为
是各向相同的噪声,所以
,参考论文里面的推导,
并不会影响协方差的计算。
对下一个表达式进行转换,

把上面的四元数乘法,全部都解开,应该就能算出来。但是太麻烦了。
利用,

上式转换为,

在上式中,因为,认为
是一个微小值,所以直接
。
或者,另外一种方法,参考论文上的方法,对表达式两边求导,导数也应该是相同的。
因为,
,所以,

在上面,进行了两处简化,首先,忽略掉了
项,然后,
。积分之后,就得到,

与前面那种方法的结果相同。但是,论文上的这种方法难想到,为了思考上的方便,以后仍然还是用前面的那种方法。
启发:这里用旋转矩阵,而不是叉乘,这么操作的目的应该是,叉乘只是对旋转矩阵的近似,而角轴转旋转矩阵,用罗德里格斯变换,得到的结果最准确。所以,最终结果里,还是尽量少用叉乘,能组合成旋转矩阵就组合成旋转矩阵,而角轴到旋转矩阵的方法用罗德里格斯变换。
然后,算后面的扰动。

新的扰动与旧的扰动的关系,总结起来就是,

所以,都转换成了线性的关系,可以表示为,

其中,


因为,
,所以,

其中,
的计算,参考论文上的公式(270)。

2.更新
然后,使用贝叶斯公式,用
表示,

上面的
表示的是一种特殊的运算,意思是距离。
为了能像《D-LG-EKF》里面那样转换成卡尔曼滤波的形式,上式的右边内容,需要进行线性化。在扰动的均值处进行线性化,在这里,即为
处进行线性化。

当然,
,也可以进一步变换,比如,MSF里,把四元数残差转换成角轴残差。但这些残差都要有相对应的
。
而在误差状态四元数论文里,是通过级联求导的方法。

其中,
要根据具体的残差方程来计算,而
则是固定的。无论是四元数残差还是角轴残差,还是其它的残差,不同的仅仅只是
,而
和
都是一样的。所以,上面的表达式,是一个通用模型,适用于所有的残差,也可以说是,适用于所有的观测。
所以,
可以提前计算好,

其中,其它项都是单位阵,除了
,则计算如下,

所以,

这是可以提前计算好的,在实际计算时,只需要把
代进来就行。
用
,则原式可以转换为,

然后,就可以转换为卡尔曼滤波公式,这些对应的是扰动的均值和协方差,

然后,就是把卡尔曼滤波算出来的最大后验值,加入到原先的状态中,
。
也就是论文里面的reset部分,就是让旧的状态吸收进卡尔曼滤波出来的扰动的均值,让新扰动的均值变为0。
则新的扰动,与旧的扰动的关系为,

其中,

代回到之前的公式,得到,

从而得到,

所以,新的扰动的均值为,

新的扰动的协方差为,

所以,也就得到的新的协方差,
。

或者,也没必要这么麻烦,直接根据前面新旧扰动的关系,算
,然后
。其实根据协方差计算公式,本质上是一样的。
3.全局扰动
之前的扰动都是加在右边的,全局扰动就是加在左边的扰动。
全局扰动与本地扰动的区别,如论文中的表格4所示。差别不大,主要是角度上的扰动的雅克比。这里也计算一下。

4.微分方程的积分
论文的附录部分,就是讨论用龙格库塔的方法,或者泰勒多阶展开的方法,对状态转移矩阵进行积分。
5.总结
虽然论文中有说这么一句话,全局扰动的方法比局部扰动的方法要好,比如李名杨的MSCKF中的方法,但是没有具体举例说明好在哪里。
用四元数来表示状态,四元数扰动与角轴扰动的转换太麻烦了,可以改成用李代数来表示旋转,但是李代数里面的BCH近似的
又不好算。
6.参考文献
- Solà J. Quaternion kinematics for the error-state Kalman filter[J]. 2017.
相机IMU融合四部曲(二):误差状态四元数详细解读的更多相关文章
- 相机IMU融合四部曲(三):MSF详细解读与使用
相机IMU融合四部曲(三):MSF详细解读与使用 极品巧克力 前言 通过前两篇文章,<D-LG-EKF详细解读>和<误差状态四元数详细解读>,已经把相机和IMU融合的理论全部都 ...
- 相机IMU融合四部曲(一):D-LG-EKF详细解读
相机IMU融合四部曲(一):D-LG-EKF详细解读 极品巧克力 前言 前两篇文章<Google Cardbord的九轴融合算法>,<Madgwick算法详细解读>,讨论的都是 ...
- 【用户状态】详细解读Oracle用户ACCOUNT_STATUS的九种状态
转至:http://blog.itpub.net/519536/viewspace-672276/ DBA_USERS视图中ACCOUNT_STATUS记录的用户的当前状态,一般情况下在使用的正常用户 ...
- 一步一步学习S-MSCKF(一)连续时间IMU误差状态运动模型
1 IMU真实状态运动模型 状态向量: \(x_{I}=\left[{{_{G}^{I}{q(t)}}^{T},{b_{g}(t)}^{T},{^{G}v_{I}(t)}^{T},{b_{a}(t)} ...
- VINS(四)初始化与相机IMU外参标定
和单目纯视觉的初始化只需要获取R,t和feature的深度不同,VIO的初始化话通常需要标定出所有的关键参数,包括速度,重力方向,feature深度,以及相机IMU外参$R_{c}^{b}$和$p_{ ...
- 相机-imu外参校准总结
1. 研究背景及相关工作 1)研究背景 单目视觉惯性slam是一种旨在跟踪移动平台的增量运动并使用来自单个车载摄像头和imu传感器的测量结果同时构建周围环境地图的技术.视觉相机和惯性测量单元(imu) ...
- 相机imu外参标定
1. 第一步初始化imu外参(可以从参数文档中读取,也可以计算出),VINS中处理如下: # Extrinsic parameter between IMU and Camera. estimate_ ...
- Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS)
原文:Introduction to 3D Game Programming with DirectX 12 学习笔记之 --- 第二十二章:四元数(QUATERNIONS) 学习目标 回顾复数,以及 ...
- 第2章 rsync(二):inotify+rsync详细说明和sersync
本文目录: inotify+rsync 1.1 安装inotify-tools 1.2 inotifywait命令以及事件分析 1.3 inotify应该装在哪里 1.4 inotify+rsync示 ...
随机推荐
- 常见企业IT支撑【2、samba共享文件夹】
samba共享文件夹,较Window自带的比较:开源,安全 建议安装samba4,兼容性好 1.安装samba #yum -y install samba4 samba4-client 2.备份sam ...
- python的mp3play库试用
没有见过比这个更小型的库了,下面程序实现的功能:播放音乐,按空格键实现暂停和播放的切换. #coding=utf-8 import mp3play import pythoncom, pyHook i ...
- [模板]LCA的倍增求法解析
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每 ...
- springboot+idea 热部署
1 配置pom.xml <!--spring-boot-devtools 热部署--> <dependency> <groupId>org.springframew ...
- HBase之八--(3):Hbase 布隆过滤器BloomFilter介绍
布隆过滤器( Bloom filters) 数据块索引提供了一个有效的方法,在访问一个特定的行时用来查找应该读取的HFile的数据块.但是它的效用是有限的.HFile数据块的默认大小是64KB,这个大 ...
- Linux route命令
route 命令 route命令用于显示和操作IP路由表.要实现两个不同的子网之间的通信,需要一台连接两个网络的路由器,或者同时位于两个网络的网关来实现.在Linux系统中,设置路由通常是 为了解决以 ...
- JAVA中构造函数的参数传递给类中的实例变量
class VolcanoRobot1 { String status; int speed; float temperature; VolcanoRobot1(int speed,float tem ...
- Java死锁以及命令检测
Java每个对象都有一把锁,当前进程使用对象锁1,没有释放该锁,又想要去获取另一把对象锁2,而对象锁2被另外一个线程持有,没有释放,这就很容易出现死锁 1.死锁实例 public class Dead ...
- 初探asciinema
在学习c++的时候想到so库注入到某些程序中,网上查了一些资料,发现了一些比较好玩的程序,分享一下. 主要可以对操作的进行视频回放,类似堡垒机的功能 安装: pip3 install asciinem ...
- EMMA 覆盖率工具
1. EMMA 介绍 EMMA 是一个开源.面向 Java 程序测试覆盖率收集和报告工具.它通过对编译后的 Java 字节码文件进行插装,在测试执行过程中收集覆盖率信息,并通过支持多种报表格式对覆盖率 ...