系列教程来自某学院,侵权删除。
学习完这一系列课程再去看VINS才能做到不吃力,不然直接撸网上的各种VINS解析完全云里雾里-_-!
这一讲是本系列的最后一讲,我们会对之前的内容进行一个回顾,并对VINS系统进行研究。
预积分的作用是为了避免世界坐标系和body系下的变换,如上图中红色的表示预积分值,而每个小黑点代表一个IMU测量,通过预积分就可以约束两帧图像之间的变换,IMU的传感器模型如下:
预积分的公式如下:
另外还有一点是IMU的协方差传递,由于每一个小黑点测量时都有一个测量误差,那么我们后来运用的预计分量也就存在误差,那么一段时间内多个误差的传递就要用到协方差的传递,最后用来估计预积分的不确定度。
这部分在第六讲刚刚讲过,主要在视觉部分如何获取相机的变换。
在纯视觉的vSlam中,前三步就完成了相机的初始化,但是此时我们是在系统内部形成了尺度,并不知道系统在实际3D空间中的米制信息。
上图就是一个VIO系统,在我们了解了视觉和IMU分别是如何工作之后,我们还需要考虑一些问题:
这就是VIO系统初始化时需要考虑的一些问题,下面我们一一来进行分析。
视觉和IMU之间存在着一定的联系,利用这些几何的约束,我们就可以进行初始化,对于下面这幅图:
使用外参数 q b c q_{bc} qbc、 t b c t_{bc} tbc可以获得下面两个式子,记为式3,第一行表示从bk位置变换到c0位置的旋转变换,第二行中s表示尺度因子,带bar的p: p ˉ \bar p pˉ表示非米制单位下,也就是系统内部的单位下的位移,第二行的式子就表示bk到c0的位置变换。
对第二行的式子进行变换可以得到非米制单位下ck到c0的位置变换:
这几个量会在后面的公式推到中用到。下面我们先对视觉 IMU 对齐流程做一个梳理:
q b c q_{bc} qbc是相机系和body系的旋转矩阵,当然还有它对应的平移矩阵 p b c p_{bc} pbc,但是这个矩阵通常就是几厘米的位移或者是固定在已知标定板上的,所以重点需要估计的是旋转矩阵,这个平移矩阵通常默认为已知值。
在相邻两个视觉帧下,我们可以通过两条路径从 b k + 1 b_{k+1} bk+1到 c k c_k ck,分别是先换到 b k b_k bk再右乘 q b c q_{bc} qbc到 c k c_k ck(对应等式左边),或者先换到 c k + 1 c_{k+1} ck+1再右乘相机系下的旋转到 c k c_k ck:
将上式挪到一边,并将左乘右乘写到一起,得到:
我们将多个时刻的方程累计起来,并加上鲁棒核权重得到:
这里就得到一个Ax=0的方程,利用上节课求三角化的时候解方程的结论,此时的 q b c q_{bc} qbc的解就是 Q N Q_N QN的特征值分解后最小的特征向量,这里鲁棒核权重取:
其中
它表示的是旋转的轴角角度误差,由公式 t r ( R ) = 1 + 2 c o s θ tr(R)=1+2cos\theta tr(R)=1+2cosθ可以得到,上式中的四个旋转相乘后应该旋转角度为0,那么如果r计算出来很大则说明该次计算结果出现了误差,就应该给它一个小的权重。另外在VINS中还有一个trick就是当 Q N Q_N QNSVD分解后的特征向量很小时,就说明这次估计无效,会重新估计。
在 q b c q_{bc} qbc已经标定好的情况下,利用旋转约束可以得到:
其中 q c 0 b k + 1 q_{c_0b_{k+1}} qc0bk+1和 q c 0 b k q_{c_0b_k} qc0bk都是由视觉和已知的 q b c q_{bc} qbc计算得到,可以认为是比较准确的值,而后面的 q b k b k + 1 q_{b_kb_{k+1}} qbkbk+1是有IMU积分得到的,存在bias,将其进行一阶泰勒展开:
带hat的q和相机得到的q相乘理论上是一个单位阵,那么整个最小二乘最后就只有 J b g q δ b g J_{b^g}^q\delta b^g Jbgqδbg(1/2被消掉),构建Hx=b即可求解。
在这一部分需要估计的变量有body系下n个时刻的速度v,相机系下的重力加速度g,尺度因子s:
通过世界坐标系下的预积分约束我们可以得到:
将其转换到相机坐标系下得到下式,其中就有 g c 0 g^{c_0} gc0、 v k b k v_k^{b_k} vkbk、s:
将之前的公式3带入上式,将其中的p转换为相机坐标系下的。
我们将带pbc的项移到等式左边,待估计的量放在等式右边,这样可以把 α \alpha α和 β \beta β写成下面的矩阵形式,方便我们后面进行最小二乘优化:
其中:
这样就构建了一个等式,我们就可以将其写成最小二乘的形式进行求解:
由于在上面优化g时没有引入模长9.81的限制,因此估计出的g只有两个自由度,不够准确,之后还要用到重力向量来估计旋转,所以需要对g进行优化,三维向量只有2个自由度时可以采用球面坐标进行参数化:
将其表示成如下的式子,带hat的g表示单位向量,乘上模长就是上图的蓝色箭头表示上一步估计出来的g,然后w1和w2为待优化的变量。
其中
展开了一个球的切面,将新的g带入回上一步的待估计变量矩阵中:
利用最小二乘再进行优化。
完成了前面四步,我们可以将两个坐标系对齐,就完成了系统的初始化:
初始化完成!
终于到了这个课程的最后一章,回忆之前的所学,基本涉及到了VINS系统的各个部分。VINS系统可以分为三大块:
1 前端,数据处理:特征提取匹配,imu 积分
2 初始化:系统初始状态变量(重力方向,速度,尺度等等)
3 后端:滑动窗口优化
后端的滑动窗口的优化的状态变量我们再回顾一下:
xk是每个时刻的pose、速度、旋转、偏置, λ \lambda λ是路标点的逆深度,xbc是外参数。最后要优化的整个残差项为:
终于结束了这门课程的学习,当然很多知识不是学习一遍就能够全部掌握的,所以之后我会利用VINS的论文和源码再进行一次巩固和查漏补缺,同时VINS作为基于优化的VIO系统,自然就有基于滤波的VIO系统,这都是之后学习的方向。总之前路漫漫,同志仍需努力。