VINS的整个VIO的实现方法,也就是对应的esimator部分的代码内容。理论部分主要介绍三种因子(IMU预积分因子、视觉因子和边缘化因子)的残差构造及雅克比推导
VINS的VIO是基于紧耦合框架实现的,其本质就是一个基于滑动窗口的和图优化的VIO
公式
滑动窗口中的全状态向量被定义为:
我们使用视觉惯性BA。我们最小化所有测量残差的先验和Mahalanobis范数之和,得到最大后验估计:
这个式子就分成了三个部分
边缘化:
这里首先说说什么是边缘化,边缘化就是在进行图优化的时候,为了保持实时性,对优化变量的维度控制在一定的程度的操作,在VINS中对应的就是滑动窗口的处理。既然是滑动窗口,就涉及到了对老旧图像帧的处理问题,最最直观的想法是每来一帧新的图像,就直接丢弃原来滑窗中最老的帧,然后对滑窗内的帧进行优化。这种朴素的做法显然会导致这样一个问题:没有了第一帧的约束,那我们只能约束滑窗内每帧之间的相对位姿,而不能约束它们的绝对位姿(相对[0,0,0]的位姿)因此,进行边缘化时我们需要将丢弃的图像帧也作为一个约束项,加入到我们的优化问题中,这也是VINS里面对边缘化的处理方法,将边缘化掉的帧作为先验约束加入到损失函数中进行计算。
在理解边缘化的时候,我们需要把握边缘化的核心是什么?边缘化的作用是什么?我的理解是边缘化一方面控制优化维度,保持计算的实时性;另一方面,它相当于对现在还在滑窗中的优化变量进行约束,不至于让滑窗中优化前后的数值相差太远。可以理解为,被边缘化的变量已经固定了,然后我们基于这些已经固定的量去优化滑窗里的内容。所以在实际实现的时候,首先我们需要找到需要边缘化的帧,然后找出该帧包含哪些因子,然后找到这些和这些因子相关联的优化变量,然后再对这些优化变量构建残差项,这大体就是VINS在边缘化上实现的总体逻辑。
这里我的感觉真的很像lstm部分,引入权重来保证之前的“记忆”不会丢失,
(边缘化那部分的数学实在是看不明白推导过程,就不多说了)
IMU残差部分
这里用到的就是之前IMU预积分的内容
视觉代价误差函数部分
继续引用之前推导过的视觉因子中的残差,以及残差关于状态量的雅克比矩阵。
参考链接
- 紧耦合VIO实现 https://zhuanlan.zhihu.com/p/499831202 Derek Lee
- VINS 所有知识点梳理 https://blog.csdn.net/hltt3838/article/details/106075292 他人是一面镜子,保持谦虚的态度
- 边缘化 https://blog.csdn.net/weixin_44580210/article/details/95748091 Leo-Peng
- vinsmono翻译 https://blog.csdn.net/yys2324826380/article/details/105046864/ 闭关修炼到走火入魔