Vins mono源码阅读笔记

Vins mono源码阅读笔记

前言

对Vins mono的流程以及一部分细节发布自己的见解,作者很懒,所以现在先写边缘化,等有空了再去写外参标定、初始化、回环检测那些东西。

边缘化

看过论文的同学都知道,边缘化有两种情况:第一种是边缘化最老帧,也就是滑动窗口中的第0帧;第二中是边缘化次新帧,也就是当前帧的前一帧。造成这两种情况的原因也很简单,就是次新帧是否是关键帧,是的话,执行第一种,不是的话,执行第二种。一般来说,我们会边缘化被选中的帧以及以该帧为起始帧的特征点,如果是第一次边缘化,只会有IMU约束和视觉约束;如果时第二次及以后的边缘化,如果被边缘化的帧和上一次边缘化的帧有约束关系,会再添加上上一次边缘化时留下来的先验信息

我们假设是第一种情况,如果我们把最老帧给边缘化,我们肯定不能是直接把它扔掉,我们需要将它的约束给保留下来,比如对于滑动窗口的第1帧,两者之间肯定有IMU约束啊,直接去掉,那事情肯定大条了。我们知道通过非线性方法对残差进行优化的时候,每一次都等价于求这样一个HX=b类似的方程,x代表着被优化的变量,那么最老帧也就是第0帧的变量(比如:位姿)在这个式子里面是有一 一对应的,我们假设x1看成将要被边缘化的参数块,x2看成与被边缘的参数块相关的参数块,那么我们可以对于它可以进行分块,H分成H11,H12,H21,H22,X分成X1,X2,b分成b1,b2,可以通过在等式两边同时乘以舒尔项,实现不需要求解x1,借助x2直接求解并且保留相关的约束。大概就是这么个感觉吧。在这里插入图片描述

为了具有普遍性,以第2次边缘化及以后的边缘化为例来进行讲解,首先说明一下,找出来的全部的需要被边缘化的参数块以及全部的与被边缘化的参数块相关的参数块都会被放入三个容器中:分别是parameter_block_size parameter_block_idx parameter_block_data。存放的分别是参数块的维度,比如:位姿的维度是7(3+4),里面就放入pose| 7;参数块的索引id;参数块的数据。

具体的流程如下:
首先根据上一次边缘化后留下的信息,找到此次要被边缘化且与上一次被边缘化参数块相关的参数块,加入到drop_set中,然后根据它去计算边缘化的残差项和雅各比,而后计算视觉和IMU的残差项和雅各比,然后将所有残差块的信息都保存在factors中,然后我们将这些都投放进上述三个容器中,我们先将这些参数块的维度投入parameter_block_size中,然后将drop_set中的参数块和以被边缘化的帧为起始帧的特征点传入parameter_block_idx,注意此时值都为0,再然后加入剩余的参数块,这些参数块也就是与被边缘化的参数块关联的参数快,这些参数块才会根据每个参数块的维度得到索引id,将各自的值传入parameter_block_data,根据所有参与边缘化参数块总的维度pos,生成pos * pos的A矩阵和pos * 1的B矩阵。然后将各自对应的残差项放入不同的线程中,分别去求IMU约束矩阵,视觉约束矩阵和边缘化约束矩阵,最后将这些矩阵合并生成最终的A矩阵,得到了完整的A矩阵之后,我们就进行舒尔补操作就可以了

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值