【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理

文章目录

  • 融合框架
  • 最小二乘
    • G-N和L-M
  • VIO残差函数
    • 视觉部分
    • IMU部分
      • 预积分方差
  • 系统残差函数雅各比
    • 视觉的雅克比
    • IMU的雅克比
  • 总结

系列教程来自某学院,侵权删除。
学习完这一系列课程再去看VINS才能做到不吃力,不然直接撸网上的各种VINS解析完全云里雾里-_-!

融合框架

基于优化的VIO融合原理上是从视觉的BA发展而来,其代价函数是多个重投影误差的和,详见十四讲。在VIO中还需要考虑IMU的数据,因此需要对多个传感器的数据进行融合,这里分为松耦合和紧耦合,目前比较火的方案如VINS等都使用紧耦合。
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第1张图片

最小二乘

最小二乘定义是找到一个x使得代价函数F(x)的取值最小,F(x)是由多个f(x)的平方求和组成的。所以这个问题叫做最小二乘,意义是求f(x)的二次方之和的最小值。在SLAM中这个问题基本上是非线性的,所以对该F(x)求解析形式的导数形式是不现实的(即无法使用直接求解法),一般需要进行泰勒展开使用迭代下降法求解。
F ( x + Δ x ) = F ( x ) + J ( x − x k ) + 1 2 Δ x T H ( x k ) Δ x + o n F(\mathbf x+\Delta \mathbf x) = F(\mathbf x)+\mathbf J(\mathbf x-\mathbf x_k)+\frac1{2}\Delta \mathbf x^T\mathbf H(\mathbf x_k)\Delta \mathbf x+o^n F(x+Δx)=F(x)+J(xxk)+21ΔxTH(xk)Δx+on
其中的J和H分别是F对x的一阶导和二阶导矩阵。
最小二乘的求解有一阶和二阶梯度下降法,但是由于其本身具有较大缺陷(一阶法过于贪心,会走出锯齿路线;二阶法需要计算H矩阵),一般不会在实际SLAM系统中使用。

G-N和L-M

针对上述方法的问题,我们采用更实用的高斯牛顿法和LM法,其中GN法是对f(x)进行泰勒展开,从而避免H的计算。上述的最速下降法适用于迭代的开始,而牛顿法适用于最优值附近,那么将两者结合的方案就是LM法。
GN法对f(x)进行一阶泰勒展开,在这里插入图片描述
并将上式带入F(x),得到:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第2张图片
此时将F(x)的表达式与牛顿法做对比,可以发现使用J来近似表达了H,从而避免了H的计算,对上式求 Δ x \Delta x Δx的一阶导并令其等于0,得到:
在这里插入图片描述
也就是我们经常看到的 H Δ x = b \mathbf H\Delta x=\mathbf b HΔx=b,求解这个方程就能得到待估计的x。
而LM法则在上述增量方程中加入了阻尼因子:
在这里插入图片描述
它的作用是保证左边的H矩阵正定,确保迭代方向是朝着下降的方向进行,μ 非常大时,接近最速下降法;μ 比较小时,接近高斯牛顿法。它的更新策略在g2o和ceres里采取的是Nielsen策略:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第3张图片
那么整个最小二乘的求解步骤总结为:
1 找到一个合适的关于状态量x 的残差函数fi(x)
2 计算残差函数对状态量x 的雅克比J。
3 选定cost function 以及其参数。
4 LM 算法求解。
这些量也是我们接下来要在VIO系统中弄清楚的。

VIO残差函数

min ⁡ χ { ∣ ∣ r p − H p χ ∣ ∣ 2 ⏟ m a r g i n a l i z a t i o n   r e s i d u a l + ∑ k ∈ B ∣ ∣ r B ( z ^ b k + 1 b k , χ ) ∣ ∣ 2 ⏟ I M U   r e s i d u a l + ∑ ( l , j ) ∈ C ∣ ∣ r c ( z ^ l c j , χ ) ∣ ∣ P l c i 2 ⏟ v i s u a l   r e s i d u a l } \min_{\chi} \left\{ \underbrace{\left|\left|r_p-H_p \chi \right|\right|^2}_{marginalization~residual} + \underbrace {\sum_{k\in B} \left|\left|r_B(\hat{z}_{b_{k+1}}^{b_k}, \chi)\right|\right|^2}_{IMU~residual} + \underbrace{\sum_{(l,j)\in C}\left|\left|r_c(\hat{z}_l^{c_j},\chi) \right|\right|^2_{P_l^{c_i}}}_{visual~residual}\right\} χminmarginalization residual rpHpχ2+IMU residual kBrB(z^bk+1bk,χ)2+visual residual (l,j)Crc(z^lcj,χ)Plci2
整体的VIO的cost function由上式中的三个部分组成:
1、由滑动窗口中被去掉(marginalize)的节点和特征点构成的约束,也叫prior(先验)
2、IMU 运动模型的误差, 每相邻的两帧IMU之间产生一个residual
3、视觉的误差, 单个特征点l在相机cj下的投影会产生一个residual
在k时刻,滑动窗口中待估计的系统状态量定义如下:
χ = [ x n , x n + 1 , . . . , x n + N , x c b , λ 0 , λ 1 , . . . , λ m ] x k = [ p b k w , v b k w , q b k w , b a , b g ] , k ∈ [ n , n + N ] x c b = [ p c b , q c b ] \begin{gathered} \chi = [x_n,x_{n+1},..., x_{n+N}, x_c^b,\lambda_0,\lambda_1,...,\lambda_m]\\x_k = [p_{b_k}^w,v_{b_k}^w,q_{b_k}^w,b_a,b_g] , k \in [n,n+N]\\x_c^b =[p_c^b,q_c^b] \end{gathered} χ=[xn,xn+1,...,xn+N,xcb,λ0,λ1,...,λm]xk=[pbkw,vbkw,qbkw,ba,bg],k[n,n+N]xcb=[pcb,qcb]
其中, x k x_k xk表示k时刻IMU在惯性系(世界坐标系world)的位置、速度、姿态,和body系下的加速度和角速度的偏置,15维。N是滑动窗口的尺寸, λ \lambda λ是特征点对应的逆深度, x c b x_c^b xcb是相机内参,6维。
所以总体BA要估计的残差 χ \chi χ是一个15×N+6+M长度的量,要注意的是:这里最后我们需要维护的量中仅考虑每帧相机时刻的姿态,而由于IMU的更新速度通常比相机要快很多,也就是说两帧相机之间会有很多IMU数据,这些数据将会被积分转化为上述的位置、速度、姿态,最后是不参与优化的。
解释一下逆深度:特征点在归一化平面和相机坐标系下的坐标关系为:
[ x y z ] = 1 λ [ u v 1 ] \begin{bmatrix} x \\ y\\z \end{bmatrix}=\frac1{\lambda}\begin{bmatrix} u \\ v\\1 \end{bmatrix} xyz=λ1uv1其中 λ = 1 z \lambda=\frac1{z} λ=z1称为逆深度,使用逆深度的原因是使用xyz时,其值可能会特别大(如很远的点),采用逆深度和uv可以节省存储空间。
归一化平面:在相机前z=1处的假想平面,将像素平面上的像素坐标转换为米制坐标。

视觉部分

视觉部分的BA可以参考十四讲,但是与纯视觉不同的是,
特征点的逆深度在第i帧中初始化得到,在第j帧中又被观测到,则其在第j帧中的预测坐标表示如下:
[ x c j y c j z c j 1 ] = T b c − 1 T w b j − 1 T w b i T b c [ 1 λ u c i 1 λ v c i 1 λ 1 ] \begin{bmatrix} x_{c_j} \\ y_{c_j}\\z_{c_j}\\1 \end{bmatrix}=\mathbf T^{-1}_{bc}\mathbf T^{-1}_{wb_j}\mathbf T_{wb_i}\mathbf T_{bc}\begin{bmatrix} \frac1{\lambda}u_{c_i} \\ \frac1{\lambda} v_{c_i}\\\frac1{\lambda}\\1 \end{bmatrix} xcjycjzcj1=Tbc1Twbj1TwbiTbcλ1uciλ1vciλ11
其中 T b c \mathbf T_{bc} Tbc表示body坐标系到相机坐标系的变换矩阵,是一个固定的矩阵, T w b j − 1 \mathbf T^{-1}_{wb_j} Twbj1是j时刻body坐标系到惯性系的转换矩阵, T w b i \mathbf T_{wb_i} Twbi同理。那么在VIO中重投影误差可以表示为:
r c = [ x c j z c j − u c j y c j z c j − v c j ] \mathbf r_c=\begin{bmatrix} \frac {x_{c_j}}{z_{c_j}}-u_{c_j} \\ \frac {y_{c_j}}{z_{c_j}}-v_{c_j} \end{bmatrix} rc=zcjxcjucjzcjycjvcj

IMU部分

从第i帧到第j帧对IMU的测量值进行积分,即可得到相对的PVQ(对应平移、速度、旋转):
p b j w = p b k w + v b k w Δ t k + ∫ ∫ t ∈ [ i , j ] ( R t w ( a ^ t − b a t ) − g w ) d t 2 v b j w = v b k w + ∫ t ∈ [ i , j ] ( R t w ( a ^ t − b a t ) − g w ) d t q b j w = q b k w ⨂ ∫ t ∈ [ i , j ] 1 2 Ω ( ω ^ t − b w t ) q t b k d t \begin{aligned} p_{b_{j}}^w &= p_{b_k}^w+v_{b_k}^w\Delta t_k+ \int\int_{t\in[i,j]}\left(R_t^w(\hat{a}_t-b_{a_t})-g^w\right)dt^2\\ v_{b_{j}}^w &= v_{b_k}^w+ \int_{t\in[i,j]}\left(R_t^w(\hat{a}_t-b_{a_t})-g^w\right)dt\\ q_{b_{j}}^w &= q_{b_k}^w\bigotimes \int_{t\in[i,j]}\frac12\Omega(\hat{\omega}_t-b_{w_t})q_t^{b_k}dt \end{aligned} pbjwvbjwqbjw=pbkw+vbkwΔtk+t[i,j](Rtw(a^tbat)gw)dt2=vbkw+t[i,j](Rtw(a^tbat)gw)dt=qbkwt[i,j]21Ω(ω^tbwt)qtbkdt
由于这个式子中存在一个 R t w R_t^w Rtw(惯性系下的旋转, q b k q_{b_k} qbk同理),每一次积分都要重新估计这个旋转,使得积分变得十分复杂,所以我们要用到IMU的预积分,由于 q w b t = q w b i ⨂ q b i b t q_{wb_t}=q_{wb_i}\bigotimes q_{b_ib_t} qwbt=qwbiqbibt,则可以将 q w b i q_{wb_i} qwbi提出来,将以下的式子定义为预积分量:
α b i b j = ∫ ∫ t ∈ [ i , j ] ( q b i b t a b t ) δ t 2 β b i b j = ∫ t ∈ [ i , j ] ( q b i b t a b t ) δ t q b i b j = ∫ t ∈ [ i , j ] q b i b t ⨂ [ 0 1 2 w b t ] δ t \begin{aligned} \alpha _{b_ib_j} &= \int\int_{t\in[i,j]}\left(q_{b_ib_t}a^{b_t}\right)\delta t^2\\ \beta _{b_ib_j} &= \int_{t\in[i,j]}\left(q_{b_ib_t}a^{b_t}\right)\delta t\\q_{b_ib_j} &=\int_{t\in[i,j]}q_{b_ib_t}\bigotimes \begin{bmatrix}0\\\frac1{2}w^{bt}\end{bmatrix}\delta t \end{aligned} αbibjβbibjqbibj=t[i,j](qbibtabt)δt2=t[i,j](qbibtabt)δt=t[i,j]qbibt[021wbt]δt
则可以得到新的PVQ积分表达式(太长了不想敲了)
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第4张图片
最后得到预积分的误差表达式:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第5张图片
这就是最后三项中的IMU residual

预积分方差

IMU的测量值我们看做是有误差的,且误差服从高斯分布,那么在两帧之间的时间内的多个IMU数据形成的预积分量的误差也需要我们进行表示,高斯分布经过线性变换还是高斯分布,假设有一个线性变换A,那么协方差的递推公式如下(协方差表示的是数据之间的协同性,在这里指的就是IMU不同参数误差之间的联系,这有一篇科普:协方差和协方差矩阵):
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第6张图片
将相邻时刻的误差线性传递方差表示为:
在这里插入图片描述
其中
在这里插入图片描述
表示状态量误差
在这里插入图片描述
表示测量噪声,可以看到状态量就是指的PVQ,而测量噪声则是指的IMU本身的偏置。
根据之前说的性质,协方差矩阵表示为:
在这里插入图片描述
那么这个式子我们将其抽象为 x k = f ( x k − 1 , u k − 1 ) x_k=f(x_{k-1},u_{k-1}) xk=f(xk1,uk1),这里的f就明显是非线性的,为了能用上之前的性质,我们就需要对它进行线性化。举例来说,从0积分到10的数据记为 x 10 x_{10} x10,那么新来一帧IMU数据, x 11 x_{11} x11就表示为上式中左边的量, u 10 u_{10} u10表示输入量。
这里线性化有两种方法,第一种是基于泰勒展开的,第二种是求一个随时间变化的递推方差。
第一种:对上面式子进行变换
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第7张图片
得到
在这里插入图片描述
F和G就是一阶泰勒展开的雅各比矩阵,分别是 x k x_k xk x k − 1 x_{k-1} xk1 u k − 1 u_{k-1} uk1的, δ x k − 1 \delta x_{k-1} δxk1 n k − 1 n_{k-1} nk1分别表示两者的误差。
第二种:有空填坑。。。
最后我们得到的预积分误差传递方程如下:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第8张图片
那么F和G怎么计算呢?由于其计算量非常大,先给出最后的结果:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第9张图片
其中
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第10张图片
在这里科普一句,雅各比矩阵可以简单的理解为导数在多维方程中的表达形式,这个矩阵的第一行就是等式左边的第一个因变量对所有变量的偏导,第一列同理,是所有因变量对第一个变量的偏导。而在这里我们把所有偏导简写一下:【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第11张图片
对于F和G的推导是一个工作量较大的任务,首先看到F的对角项都是单位阵,这是因为对角项相当于对自己上一时刻求导,举例说明:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第12张图片
这是速度的预积分展开为中值积分的形式,它是第三项,即f33(对上一时刻速度的雅各比)可以表示为:
在这里插入图片描述
其他的过长,有空再填坑

系统残差函数雅各比

这里的雅各比是指的系统函数的雅各比,而上面的F和G是预积分递推的雅各比。

视觉的雅克比

将之前的重投影误差的表达式转换成三维坐标下的形式:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第13张图片
f c j \mathbf f_{c_j} fcj表示j时刻相机的坐标,我们用 r c r_c rc来表示重投影误差,其对于各个变量的雅克比矩阵可以表示为下面这样:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第14张图片
其中
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第15张图片
分别表示
根据链式法则, ∂ r c 所 有 状 态 变 量 = ∂ r c ∂ f c j ∂ f c j 所 有 状 态 变 量 \frac{\partial r_c}{所有状态变量} = \frac{\partial r_c}{\partial \mathbf f_{c_j}}\frac{\partial \mathbf f_{c_j}}{所有状态变量} rc=fcjrcfcj ,其中:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第16张图片
之后就可以求 f c j \mathbf f_{c_j} fcj对各个状态量的偏导,包括对i和j时刻的状态量:
例如【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第17张图片
就是由一开始的式子对pbi那一项求偏导,其他项全部为0,只留下和pbi相乘的两个旋转矩阵。
其他的复杂一点的举一个例子来说:
在这里插入图片描述
与角度相关的就是标红的旋转矩阵,其他项求导为0,所以化简为:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第18张图片
这里第二行的合并见上面的式子,对fcj求雅克比之后得到:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第19张图片
这里用到的技巧是上一篇中写到的,旋转点的右扰动雅克比可以表示为:
【VIO笔记(学习VINS的必备基础)】第三讲 基于优化的IMU和视觉融合的实现原理_第20张图片
这样上面的式子就很好理解了,p就表示的是上面的fbi,^和x的意义相同表达形式不同而已。
其他的项求解的方式类似,不再赘述。具体结果太长我就不在这贴出来了。

IMU的雅克比

有空填坑。。。

总结

这讲里面涉及到很多公式的推导,在课程里也并没有讲的很清楚,还是得靠自己去查资料推。。对新手太不友好了。。。
回顾之前说的最小二乘的求解步骤:

1 找到一个合适的关于状态量x 的残差函数fi(x)
2 计算残差函数对状态量x 的雅克比J。
3 选定cost function 以及其参数。
4 LM 算法求解。

第一步中的残差函数就是我们的三项residual,x指的就是各项待优化的量,而我们花大时间推导的雅克比则是为了在实际编程中,将这些参数送给我们的solver,例如VINS里使用的ceres就需要这些参数。

你可能感兴趣的:(VIO)