从零开始学习VIO笔记 --- 第三讲:基于优化的IMU和视觉信息融合
一. 预备知识
1.1 知识点概述
PnP(Perspective-n-Point)是求解 3D 到 2D 点对运动的方法。它描述了当我们知道n 个 3D 空间点以及它们的投影位置时,如何估计相机所在的位姿。(双目和RGB-D相机上的方法,双目可以通过三角化得到landmark 3D坐标,RGB-D则可以直接读取深度图获取像素平面点对应的深度信息/具体如何利用 见后续文章)
PnP 问题可以通过线性方法,DLT(直接线性变化)P3P ,EPnP 等求解,或者非线性优化求解,也就是通过BA优化求解。
线性方法,往往是先求相机位姿,再求空间点位置;而非线性优化则是把它们都看成优化变量,放在一起优化,我们把相机和三维点放在一起进行最小化问题,统称为Bundle Adjustment。
- 构建最小化重投影误差问题,可以解PnP问题,也就是对误差函数,使用高斯牛顿/LM算法迭代的方式,解得相机的位姿,这是针对两帧图像之间的问题,也是BA的方式,属于slam的前端。
- 另一种是后端优化中,通过多帧的相机位姿以及其观测到的 landmark 构建最小化投影误差函数,优化相机位姿和 3D的特征点/landmark。
于是我们分别对上面两种情况进行介绍。
1.2 PnP 中的重投影误差函数
构建的函数如下:
具体求解: 见单独的文章
1.3 后端优化中重投影误差函数/BA问题
优化问题组成:
- 待优化的状态量:特征点的空间坐标,相机的位姿
- 测量值/观测值:特征点在不同图像上的图像坐标(u,v)
构建重投影误差函数,最小化误差函数,得到最优的状态量
(理论投影值减去实际观测值)
可以使用 g2o或者ceres求解
二. VIO 信息融合问题
2.1 问题提出
前面构建的误差函数,误差项只是包含了 相机位姿和landmark。 现如今需要通过紧耦合方式融合imu信息。那么需要构建关于IMU的误差。
2.2 线性最小二乘简介
线性最小二乘求解: 最速下降法和牛顿法
非线性线性最小二乘求解: Gauss-Newton 和 LM
最小二乘中遇到 outlier,通过添加鲁棒核函数
Gauss-Newton:
整体的残差函数为 F ( x ) F(x) F(x) ,非线性最小二乘,是单独对里面残差项 f i ( x ) f_i\left(x\right) fi(x)分析
F ( x ) = 1 2 ∑ i = 1 m ( f i ( x ) ) 2 F(x)=\frac12\sum_{i=1}^m\left(f_i\left(x\right)\right)^2 F(x)=21i=1∑m(fi(x))2
将残差组合成向量的形式
得: F ( x + △ x ) ≈ F ( x ) + △ x T J T f + 1 2 △ x T J T J △ x F(x+\bigtriangleup x)\approx F(x)+\bigtriangleup x^TJ^Tf+\frac12\bigtriangleup x^TJ^TJ\bigtriangleup x F(x+△x)≈F(x)+△xTJTf+21△xTJTJ△x
上式对 △ x \bigtriangleup x △x进行一阶求导得: d F ( x + △ x ) d △ x = J T f + J T J △ x \frac{\operatorname d{F(x+\bigtriangleup x)}}{\operatorname d\bigtriangleup x}=J^Tf+J^TJ\bigtriangleup x d△xdF(x+△x)=JTf+JTJ△x
令导数为0, 即得:
J T J △ x g n = − J T f J^TJ\bigtriangleup x_{gn}=-J^Tf JTJ△xgn=−JTf
或写为 H △ x g n = b H\bigtriangleup x_{gn}=b H△xgn=b, 使用 J T J J^TJ JTJ近似 H H H,
具体见后续
2.3 VIO 残差函数的构建
2.3.1 VIO 误差函数:
m i n χ { ∥ r p − H p χ ∥ ∑ p 2 ⏟ m a r g i n a l i z a t i o n / p r i o r r e s i d u a l + ∑ i ∈ B ∥ r b ( z b i b i + 1 , χ ) ∥ ∑ b i b i + 1 2 ⏟ I M U r e s i d u a l + ∑ ( i , j ) ∈ F ∥ r f ( z f j c i , χ ) ∥ ∑ f j c i 2 ⏟ i m a g e r e s i d u a l } \underset\chi{min}\left\{\underbrace{\left\|r_p-H_p\chi\right\|_{\textstyle\sum_p}^2}_{marginalization/prior\;residual}\right.+\left.\underbrace{\sum_{i\in B}\left\|r_b(z_{b_ib_{i+1}},\chi)\right\|_{\textstyle\sum_{b_ib_{i+1}}}^2}_{IMU\;residual}+\underbrace{\sum_{(i,j)\in F}\left\|r_f(z_{f_j}^{c_i},\chi)\right\|_{\textstyle\sum_{f_j}^{c_i}}^2}_{image\;residual}\right\} χmin⎩⎪⎪⎨⎪⎪⎧marginalization/priorresidual ∥rp−Hpχ∥∑p2+IMUresidual i∈B∑∥rb(zbibi+1,χ)∥∑bibi+12+imageresidual (i,j)∈F∑∥∥∥rf(zfjci,χ)∥∥∥∑fjci2⎭⎪⎪⎪⎪⎬⎪⎪⎪⎪⎫
1、由滑动窗口中被去掉(marginalize)的节点和特征点构成的约束,也叫prior(先验)
2、IMU 运动模型的误差, 每相邻的两帧IMU之间产生一个residual/预计分误差,下面会详细介绍
3、视觉的投影误差, 单个特征点 f j f_j fj 在相机 c i c_i ci下的投影会产生一个residual
每一部分的误差和右下角 ∑ \textstyle\sum_{} ∑为协方差
2.3.2 系统需要优化的状态量
系统需要优化的状态量
为了节约计算量采用滑动窗口形式的 Bundle Adjustment, 在 i 时刻,滑动窗口内待优化的系统状态量定义如下:
χ = [ x n , x n + 1 , … , x n + N , λ m , λ m + 1 , … , λ m + M ] x i = [ p b i w , v b i w , q b i w , b a b i , b g b i ] T , i ∈ [ n , n + N ] \begin{array}{c} \chi=\left[\mathbf x_{n},\mathbf x_{n+1}, \ldots, \mathbf x_{n+N}, \lambda_{m}, \lambda_{m+1}, \ldots, \lambda_{m+M}\right] \\\\ \mathbf x_{i}=\left[p_{b_{i}}^{w}, v_{b_{i}}^{w}, q_{b_{i}}^{w}, b_{a}^{b_i}, b_{g}^{b_i}\right]^T, i \in[n, n+N] \end{array} χ=[xn,xn+1,…,xn+N,λm,λm+1,…,λm+M]xi=[pbiw,vbiw,qbiw,babi,bgbi]T,i∈[n,n+N]
- χ \chi χ 为系统需要优化的状态量;
- x i \mathbf x_i xi 包含 i 时刻 IMU 机体的在惯性坐标系中的位置 p p p,速度 v v v,姿态 q q q,以及 IMU 机体坐标系中的加速度和角速度的偏置量估计 b a b_a ba , b g b_g bg;
- λ \lambda λ 是逆深度
- n , m n,m n,m 分别是机器人状态量和路标在滑动窗口里的起始时刻;
- N N N 是滑动窗口中关键帧数量
- M M M是被滑动窗口内所有关键帧观测到的路标数量
2.3.3 视觉重投影误差
定义:一个特征点在归一化相机坐标系(z=1平面)下的估计值与观测值的差。
r c = [ x z − u y z − v ] \mathbf{r}_{c}=\left[\begin{array}{l} \frac{x}{z}-u \\ \frac{y}{z}-v \end{array}\right] rc=[zx−uzy−v]
其中,待估计的状态量为特征点的三维空间坐标 ( x , y , z ) ⊤ (x, y, z)^⊤ (x,y,z)⊤,观测值 ( u , v ) ⊤ (u, v)^⊤ (u,v)⊤ 为特征在相机归一化平面的坐
标。
这儿选择的观测值是在归一化平面的下,也可以选择在像素平面,需要相机内参K 。。。。(后续补上)
2.3.4 逆深度参数化
特征点在相机坐标系与归一化相机坐标系下的坐标关系为:
[ x y z ] ⏟ c a m e r a f r a m e = 1 λ [ u v 1 ] ⏟ z = 1 f r a m e \underbrace{\begin{bmatrix}x\\y\\z\end{bmatrix}}_{camera\;frame}=\frac1\lambda\underbrace{\begin{bmatrix}u\\v\\1\end{bmatrix}}_{z=1\;frame} cameraframe
⎣⎡xyz⎦⎤=λ1z=1frame
⎣⎡uv1⎦⎤
其中 λ = 1 / z λ = 1/z λ=1/z 称为逆深度 ; 使用逆深度的原因是使用xyz时,其值可能会特别大(如很远的点),不易优化,并且采用逆深度和uv可以节省存储空间。归一化平面:在相机前z=1处的假想平面,将米制坐标转换为像素平面上的像素坐标。观测值 ( u , v ) ⊤ (u, v)^⊤ (u,v)⊤ 已知,只需要优化逆深度值,便可以得到优化之后的特征点三维空间坐标 ( x , y , z ) ⊤ (x, y, z)^⊤ (x,y,z)⊤
2.3.5 VIO 中基于逆深度的重投影误差
视觉重投影误差为:
r c = [ x c j z c j − u c j y c j z c j − v c j ] \mathbf{r}_{c}=\left[\begin{array}{c} \frac{x_{c_{j}}}{z_{c_{j}}}-u_{c_{j}} \\ \frac{y_{c_{j}}}{z_{c_{j}}}-v_{c_{j}} \end{array}\right] rc=⎣⎡zcjxcj−ucjzcjycj−vcj⎦⎤
2.3.6 IMU 测量值积分
更为详细公式推导见上一讲VIO 中的 imu模型
从第 i 时刻的 PVQ 对 IMU 的测量值进行积分得到第 j 时刻的 PVQ:
p w b j = p w b i + v i w Δ t + ∬ t ∈ [ i , j ] ( q w b t a b t − g w ) δ t 2 v j w = v i w + ∫ t ∈ [ i , j ] ( q w b t a b t − g w ) δ t q w b j = ∫ t ∈ [ i , j ] q w b t ⊗ [ 0 1 2 ω b t ] δ t \begin{array}{l} \mathbf{p}_{w b_{j}}=\mathbf{p}_{w b_{i}}+\mathbf{v}_{i}^{w} \Delta t+\iint_{t \in[i, j]}\left(\mathbf{q}_{w b_{t}} \mathbf{a}^{b_{t}}-\mathbf{g}^{w}\right) \delta t^{2} \\ \mathbf{v}_{j}^{w}=\mathbf{v}_{i}^{w}+\int_{t \in[i, j]}\left(\mathbf{q}_{w b_{t}} \mathbf{a}^{b_{t}}-\mathbf{g}^{w}\right) \delta t \\ \mathbf{q} w_{b_{j}}=\int_{t \in[i, j]} \mathbf{q}_{w b_{t}} \otimes\left[\begin{array}{c} 0 \\ \frac{1}{2} \boldsymbol{\omega}^{b_{t}} \end{array}\right] \delta t \end{array} pwbj=pwbi+viwΔt+∬t∈[i,j](qwbtabt−gw)δt2vjw=viw+∫t∈[i,j](qwbtabt−gw)δtqwbj=∫t∈[i,j]qwbt⊗[021ωbt]δt
- 其中 a \mathbf a a 与 ω \omega ω都是测量值;要想结果更准确当然都需要减去各自的偏差bias;
- 式中 q \mathbf q q 为惯性系/世界坐标系 w w w下body的旋转,四元数表达,也可以是 R t w \mathbf R_t^w Rtw;
- 在每一次进行imu积分操作时, q b t w \mathbf q_{b_t}^w qbtw 每次都需要重新估计这个旋转,使得积分变得复杂,所以我们使用imu预积分
2.3.6 IMU 预积分
将积分模型转为预积分模型 : q w b t = q w b i ⊗ q b i b t \mathbf{q}_{w b_{t}}=\mathbf{q}_{w b_{i}} \otimes \mathbf{q}_{b_{i} b_{t}} qwbt=qwbi⊗qbibt
那么,PVQ 积分公式中的积分项则变成相对于第 i 时刻的姿态,而不是相对于世界坐标系的姿态:
p w b j = p w b i + v i w Δ t − 1 2 g w Δ t 2 + q w b i ∬ t ∈ [ i , j ] ( q b i b t a b t ) δ t 2 v j w = v i w − g w Δ t + q w b i ∫ t ∈ [ i , j ] ( q b i b t a b t ) δ t q w b j = q w b i ∫ t ∈ [ i , j ] q b i b t ⊗ [ 0 1 2 ω b t ] δ t \begin{array}{l} \mathbf{p}_{w b_{j}}=\mathbf{p}_{w b_{i}}+\mathbf{v}_{i}^{w} \Delta t-\frac{1}{2} \mathbf{g}^{w} \Delta t^{2}+\mathbf{q}_{w b_{i}} \iint_{t \in[i, j]}\left(\mathbf{q}_{b_{i} b_{t}} \mathbf{a}^{b_{t}}\right) \delta t^{2} \\ \mathbf{v}_{j}^{w}=\mathbf{v}_{i}^{w}-\mathbf{g}^{w} \Delta t+\mathbf{q} w b_{i} \int_{t \in[i, j]}\left(\mathbf{q}_{b_{i} b_{t}} \mathbf{a}^{b_{t}}\right) \