前言
这一章主要内容是讲的VINS系统初始化的事,内容上还是比较全面丰满的,有一些有疑问的点我之后读了代码会在博客里补上。一句话总结初始化:以优化量与观测值构建残差,提取优化量构成最小二乘问题
内容
1. IMU和相机旋转外参 q b c q_{bc} qbc以及角速度计(陀螺仪)的bias
在这一部分的初始化过程中,我们已知的信息有:
- 相机以一定频率采样得到的帧图像(可提取出相机旋转信息)
- IMU以一定频率采样得到的角速度值(同样可提取出IMU旋转信息)
旋转外参
q
b
c
q_{bc}
qbc我们认为在相机位移过程中是不会改变的,如果
q
b
c
q_{bc}
qbc给的准,那么对于每一帧匹配的相机和IMU旋转信息,我们从相机帧k->相机帧k+1->IMU帧k+1,或是从相机帧k->IMU帧k->IMU帧k+1的旋转变换的误差应该是趋向于0的,所以我们构建了如下所示的最小二乘问题求取
q
b
c
q_{bc}
qbc:
这里加入了鲁棒核函数,具体鲁棒核函数的构造这里我不截了,说一下思路:以上述误差角进行阈值的判断
同样基于上面的已知信息,在这里我们还多知道一个前提,也就是
q
b
c
q_{bc}
qbc,本来是可以精确计算出各个旋转矩阵的,但是由于bias的存在,
q
b
k
b
k
+
1
q_{b_kb_{k+1}}
qbkbk+1将存在误差,从而导致转一个圆回来后的旋转矩阵不是单位矩阵。每两帧都将提供一个误差信息,我们希望找到一个bias使得所有帧的误差最小化(也就相当于静止初始化的求平均过程),因此我们构建了如下所示的最小二乘问题:
有关于该问题对于bias的雅可比矩阵我本来是有所疑问的,感谢这位博主的讲解手写VIO-初始化第三部分,另外强推该博主的手写VIO专栏,都是高质量的梳理代码逻辑的文章,这里我把博主关于这个问题如何化成Ax=b的形式的推导记录在下面:
2. 初始化关键帧相机的速度,初始帧的重力方向、相机相对位移转化到世界坐标系的尺度信息
在这个问题中,我们已知的信息又多了两个:各关键帧之间的平移信息,也就是说相机的相对平移以及IMU关于速度和位置的预积分我们都是知道的。
这里新增了一项VINS中关于初始帧重力方向的处理,把它处理成已知一维信息的二维约束问题,相当于把可变量减少了一维,构建的优化量如下:
我们可以利用上面的已知信息,根据预积分公式,计算出预积分的值,再与IMU给出的预积分结果形成残差
构建的最小二乘形式如下:
根据优化给出的初始帧重力加速度方向,我们可以把相机初始帧对齐到世界坐标系下,从而以世界坐标系来进行相关操作
3. VINS初始化存在的一些疑问以及解答
- Q1:优化给出的初始帧重力加速度方向是不准的,那么对齐过程也是不准的,这会对后续优化过程带来哪些影响
- A1:在后续对齐过程中,我们使用的不再是 R W C 0 R_{WC_0} RWC0,而是对应帧到世界坐标系的旋转矩阵,而这个是后端优化过程中的优化量,所以是在不断修正的,也就是对齐过程是不断变好的,初始给定的不准也将被修正
- Q2:加速度 bias 为何没有估计
- A2:因为相对于重力加速度,加速度bias是否初始化的影响很小,所以忽略了它的初始化
- Q3:平移外参数 p b c p_{bc} pbc 为何没有初始化
- A3:平移是一个线性函数,它的初始值是多少不会影响优化曲线,这与旋转初始值是不同的,所以我们可以不关心它的初始值(也可以把它放在之后的优化量中去得到)