本文已参与「新人创作礼」活动,一起开启掘金创作之路。

基于滑动窗口的 VIO Bundle Adjustment,为了节约计算量采用滑动窗口形式的 Bundle Adjustment,在 i 时刻,
滑动窗口内待优化的系统状态量定义如下:
χ=[Xn,Xn+1,...,Xn+N,λm,λm+1,...,λm+M]
Xi=[pwbi,qwbi,viw,babi,bgbi],i∈[n,n+N]
其中:
- xi包含i 时刻 IMU 机体的在惯性坐标系中的位置,速度,姿态,以及 IMU 机体坐标系中的加速度和角速度的偏置量估计。
- m,n分别是机体状态量,路标在滑动窗口里的起始时刻。
- N 滑动窗口中关键帧数量。
- M 是被滑动窗口内所有关键帧观测到的路标数量。
- λ 是逆深度。
IMU的真实值为w,a,测量值为w~,a~,则有:
w~b=wb+bg+ng
a~b=qbw(aw+gw)+ba+na
P(位置),V(速度),Q(位姿) 对时间的导数可写成:
p˙wbt=vtw,v˙tw=atw,q˙wbt=qwbt⊗[021wbt]
从第 i 时刻的 PVQ 对 IMU 的测量值进行积分得到第 j 时刻的 PVQ:
pwbj=pwbi+viwΔt+∬t∈[i,j](qwbtabt−gw)δt2
qwbj=∫t∈[i,j]qwbt⊗[021wbt]δt
每次 qwbt 优化更新后,都需要重新进行积分,运算量较大。因此提出IMU预积分:
qwbt=qwbi⊗qbibt
那么,PVQ 积分公式中的积分项则变成相对于第 i 时刻的姿态,而不是相对于世界坐标系的姿态:
pwbj=pwbi+viwΔt+∬t∈[i,j](qwbtabt−gw)δt2=pwbi+viwΔt−21gwΔt2+∬t∈[i,j](qwbtabt)δt2
⟹pwbj=pwbi+viwΔt−21gwδt2+qwbi∬t∈[i,j](qbibtabt)δt2
viw=viw+∫t∈[i,j](qwbtabt−gw)δt⟹viw=viw−gwΔt+qwbi∫t∈[i,j](qbibtabt)δt
qwbj=∫t∈[i,j]qwbt⊗[021wbt]δt⟹qwbj=qwbi∫t∈[i,j]qbibt⊗[021wbt]δt
预积分量仅仅跟 IMU 测量值有关,它将一段时间内的 IMU 数据直接积分起来就得到了预积分量:
αbibj=∬t∈[i,j](qbibtabt)δt2
βbibj=∫t∈[i,j](qbibtabt)δt
qbibj=∫t∈[i,j]qbibt⊗[021wbt]δt
将αbibj,βbibj,qbibj代入整理可得到最终的PVQ积分公式:
⎣⎡pwbjvjwqwbjbjabjg⎦⎤=⎣⎡pwbi+viwΔt−21gwΔt2+qwbiαbibjviw−gwΔt+qwbiβbibjqwbiqbibjbiabig⎦⎤
预积分误差:一段时间内 IMU 构建的预积分量作为测量值,对两时刻之间的状态量进行约束
⎣⎡rprqrvrbarbg⎦⎤=⎣⎡pwbj−pwbi−viwΔt+21gwΔt2−qwbiαbibj2[qbjbi⊗(qbiw⊗qwbj)]xyzvjw−viw+gwΔt−qwbiβbibjbja−biabjg−big⎦⎤=⎣⎡qbiw(pwbj−pwbi−viwΔt+21gwΔt2)−αbibj2[qbjbi⊗(qbiw⊗qwbj)]xyzqbiw(vjw−viw+gwΔt)−βbibjbja−biabjg−big⎦⎤
上面误差中位移,速度,偏置都是直接相减得到。第二项是关于四元数的旋转误差,其中 [⋅]xyz 表示只取四元数的虚部 (x,y,z) 组成的三维向量。
预积分的离散形式
以上是预积分的连续形式,也可以使用离散形式,这里使用 mid−point 方法,即两个相邻时刻 k 到 k+1 的位姿是用两个时刻的测量值 a,ω 的平均值来计算:
w={1 \over 2}((w^{b_k}-b_k^g)+(w^{b_{k+1}}-b_k^g))\
a=21(qbibk(abk−bka)+qbibk+1(abk+1−bka))
预积分量的方差
协方差传递性质:在一个线性系统中,已知一个变量 y=Ax,x∈N(0,Σx), 则有Σy=AΣxA⊤
Σy=E((Ax)(Ax)⊤)=E(Axx⊤A⊤)=AΣxA⊤
要推导预积分量的协方差,我们需要知道 imu 噪声和预积分量之间的线性递推关系。
假设已知了相邻时刻误差的线性传递方程:
ηik=Fk−1ηik−1+Gk−1nk−1
比如:状态量误差为 ηik=[δθik,δvik,δpik],测量噪声为nk=[nkg,nka]。
误差的传递由两部分组成:1.当前时刻的误差传递给下一时刻,2.当前时刻测量噪声传递给下一时刻。
协方差矩阵可以通过递推Σy=AΣxA⊤计算得到:
Σik=Fk−1Σik−1Fk−1⊤+Gk−1ΣnGk−1⊤
其中,Σn 是测量噪声的协方差矩阵,方差从i 时刻开始进行递推,Σii=0。
状态误差线性递推公式的推导(线性化)
协方差传递性质只对于线性化系统,通常对于状态量之间的递推关系是非线性的方程如xk=f(xk−1,uk−1),其中状态量为 x,u为系统的输入量。
我们可以用两种方法来推导状态误差传递的线性递推关系:
- 一种是基于一阶泰勒展开的误差递推方程(应用于 EKF 的协方差预测)。
令状态量为 x=x^+δx,其中,真值为 x^,误差为 δx。另外,输入量u 的噪声为 n。
非线性系统 xk=f(xk−1,uk−1) 方程进行一阶泰勒展开有:
xk=f(xk−1,uk−1)
x^k+δxk=f(x^k−1+δxk−1,u^k−1+nk−1)
x^k+δxk=f(x^k−1,u^k−1)+Fδxk−1+Gnk−1
δxk=Fδxk−1+Gnk−1
其中,F 是状态量 xk 对状态量 xk−1 的雅克比矩阵,G 是状态量 xk对输入量 uk−1 的雅克比矩阵。
2. 一种是基于误差随时间变化的递推方程。
如果我们能够推导状态误差随时间变化的导数关系,比如:δx˙=Aδx+Bn则误差状态的传递方程为:
δxk=δxk−1+δx˙k−1∆t→δxk=(I+A∆t)δxk−1+B∆tnk−1
这两种推导方式的可以看出有:
F=I+A∆t,G=B∆t
回顾预积分(离散形式)的误差递推公式,将测量噪声也考虑进模型:
w=21((wbk+nkg−bkg)+(wbk+1+nk+1g−bkg))
a=21(qbibk(abk+nka−bka)+qbibk+1(abk+1+nk+1a−bka))
确定误差传递的状态量,噪声量,然后开始构建传递方程。用前面一阶泰勒展开的推导方式,我们能推导出如下的形式:
⎣⎡δαbk+1b′k+1δθbk+1b′k+1δβbk+1b′k+1δbk+1aδbk+1g⎦⎤=F⎣⎡δαbkb′kδθbkb′kδβbkb′kδbkaδbkg⎦⎤+G⎣⎡nkankgnk+1ank+1gnbaanbkg⎦⎤
F, G 为两个时刻间的协方差传递矩阵。
对VIO残差函数的构建的理解:
对于T时刻的状态量,如位置、速度、变换、偏置。可通过IMU测量值(w,a)积分得到T+1时刻的状态。
由于状态量中的参考系都在全局坐标系下,对于每一时刻的状态优化完成之后,需要重新积分得到下一时刻的状态,因此提出预积分的概念,将积分转换成相对于上一时刻的量。
通过对上一时刻T预积分得到当前时刻T+1的状态作为测量值,通过当前时刻的真实值作为约束,得到残差函数。
以上过程再考虑到噪声、误差的影响,通过线性系统的协方差传递性质,将状态量之间的递推关系线性化,即利用F,G,考虑到上一时刻的误差以及当前时刻的观测误差。最终所得到的残差函数即为,上一时刻的预积分加上传递误差,与当前时刻的约束。