VIO残差函数的构建以及IMU预积分和协方差传递

该文详细介绍了基于滑动窗口的视觉惯性里程计(VIO)优化中,如何利用预积分减少计算量。预积分通过积分IMU测量值减少了重复计算,同时引入了误差传递矩阵F和G来考虑状态误差和测量噪声。文中还讨论了预积分的离散形式以及协方差传递性质,并展示了如何构建VIO残差函数,用于系统状态的优化更新。
摘要由CSDN通过智能技术生成

在这里插入图片描述
基于滑动窗口的 VIO Bundle Adjustment,为了节约计算量采用滑动窗口形式的 Bundle Adjustment,在 i 时刻,
滑动窗口内待优化的系统状态量定义如下:
χ = [ X n , X n + 1 , . . . , X n + N , λ m , λ m + 1 , . . . , λ m + M ] \chi = [X_n,X_{n+1},...,X_{n+N},\lambda{m},\lambda{m+1},...,\lambda{m+M}] χ=[Xn,Xn+1,...,Xn+N,λm,λm+1,...,λm+M] X i = [ p w b i , q w b i , v i w , b a b i , b g b i ] , i ∈ [ n , n + N ] X_i=[p_{wb_i},q_{wb_i},v_i^w,b_a^{b_i},b_g^b{_i}],i \in [n,n+N] Xi=[pwbi,qwbi,viw,babi,bgbi],i[n,n+N]
其中:

  • x i x_i xi包含 i i i 时刻 IMU 机体的在惯性坐标系中的位置,速度,姿态,以及 IMU 机体坐标系中的加速度和角速度的偏置量估计。
  • m , n m,n m,n分别是机体状态量,路标在滑动窗口里的起始时刻。
  • N N N 滑动窗口中关键帧数量。
  • M M M 是被滑动窗口内所有关键帧观测到的路标数量。
  • λ \lambda λ 是逆深度。

IMU的真实值为 w , a w,a w,a,测量值为 w ~ , a ~ \tilde{w},\tilde{a} w~,a~,则有:
w ~ b = w b + b g + n g \tilde{w}^b=w^b+b^g+n^g w~b=wb+bg+ng a ~ b = q b w ( a w + g w ) + b a + n a \tilde{a}^b=q_{bw}(a^w+g^w)+b^a+n^a a~b=qbw(aw+gw)+ba+na


P(位置),V(速度),Q(位姿) 对时间的导数可写成:
p ˙ w b t = v t w , v ˙ t w = a t w , q ˙ w b t = q w b t ⊗ [ 0 1 2 w b t ] \dot{p}_{wb_t}=v^w_t,\dot{v}^w_t=a^w_t,\dot{q}_{wb_t}=q_{wb_t}⊗ \begin{bmatrix} 0 \\ {1\over 2}w^{b_t} \\ \end{bmatrix} p˙wbt=vtw,v˙tw=atw,q˙wbt=qwbt[021wbt]
从第 i i i 时刻的 PVQ 对 IMU 的测量值进行积分得到第 j j 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 p_{wb_j}=p_{wb_i}+v_i^w\Delta t +\iint_{t \in [i,j]}(q_{wb_t}a^{b_t}-g^w)\delta t^2 pwbj=pwbi+viwΔt+t[i,j](qwbtabtgw)δt2 v i w = v i w + ∫ t ∈ [ i , j ] ( q w b t a b t − g w ) δ t v_i^w=v_i^w+\int_{t \in [i,j]}(q_{wb_t}a^{b_t}-g^w)\delta t viw=viw+t[i,j](qwbtabtgw)δt q w b j = ∫ t ∈ [ i , j ] q w b t ⊗ [ 0 1 2 w b t ] δ t q_{wb_j}=\int_{t \in [i,j]}q_{wb_t}⊗ \begin{bmatrix} 0 \\ {1\over 2}w^{b_t} \\ \end{bmatrix}\delta t qwbj=t[i,j]qwbt[021wbt]δt
每次 q w b t q_{wb_t} qwbt 优化更新后,都需要重新进行积分,运算量较大。因此提出IMU预积分:
q w b t = q w b i ⊗ q b i b t q_{wb_t}=q_{wb_i}⊗q_{b_ib_t} qwbt=qwbiqbibt
那么,PVQ 积分公式中的积分项则变成相对于第 i i i 时刻的姿态,而不是相对于世界坐标系的姿态:
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 = p w b i + v i w Δ t − 1 2 g w Δ t 2 + ∬ t ∈ [ i , j ] ( q w b t a b t ) δ t 2 p_{wb_j}=p_{wb_i}+v_i^w\Delta t +\iint_{t \in [i,j]}(q_{wb_t}a^{b_t}-g^w)\delta t^2 =p_{wb_i}+v_i^w\Delta t- {1\over 2}g^w \Delta t^2+\iint_{t \in [i,j]}(q_{wb_t}a^{b_t})\delta t^2 pwbj=pwbi+viwΔt+t[i,j](qwbtabtgw)δt2=pwbi+viwΔt21gwΔt2+t[i,j](qwbtabt)δt2    ⟹    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 \implies \color{red}{p_{wb_j}=p_{wb_i}+v_i^w\Delta t- {1\over 2}g^w \delta t^2+q_{wb_i}\iint_{t \in [i,j]}(q_{b_ib_t}a^{b_t})\delta t^2} pwbj=pwbi+viwΔt21gwδt2+qwbit[i,j](qbibtabt)δt2 v i w = v i w + ∫ t ∈ [ i , j ] ( q w b t a b t − g w ) δ t    ⟹    v i w = v i w − g w Δ t + q w b i ∫ t ∈ [ i , j ] ( q b i b t a b t ) δ t v_i^w=v_i^w+\int_{t \in [i,j]}(q_{wb_t}a^{b_t}-g^w)\delta t \implies \color{red}{ v_i^w=v_i^w-g^w\Delta t+q_{wb_i}\int_{t \in [i,j]}(q_{b_ib_t}a^{b_t})\delta t} viw=viw+t[i,j](qwbtabtgw)δtviw=viwgwΔt+qwbit[i,j](qbibtabt)δt q w b j = ∫ t ∈ [ i , j ] q w b t ⊗ [ 0 1 2 w b t ] δ t    ⟹    q w b j = q w b i ∫ t ∈ [ i , j ] q b i b t ⊗ [ 0 1 2 w b t ] δ t q_{wb_j}=\int_{t \in [i,j]}q_{wb_t}⊗ \begin{bmatrix} 0 \\ {1\over 2}w^{b_t} \\ \end{bmatrix}\delta t \implies \color{red}{q_{wb_j}=q_{wb_i}\int_{t \in [i,j]}q_{b_ib_t}⊗ \begin{bmatrix} 0 \\ {1\over 2}w^{b_t} \\ \end{bmatrix}\delta t} qwbj=t[i,j]qwbt[021wbt]δtqwbj=qwbit[i,j]qbibt[021wbt]δt


预积分量仅仅跟 IMU 测量值有关,它将一段时间内的 IMU 数据直接积分起来就得到了预积分量:
α b i b j = ∬ t ∈ [ i , j ] ( q b i b t a b t ) δ t 2 \alpha_{b_ib_j}=\iint_{t \in [i,j]}(q_{b_ib_t}a^{b_t})\delta t^2 αbibj=t[i,j](qbibtabt)δt2 β b i b j = ∫ t ∈ [ i , j ] ( q b i b t a b t ) δ t \beta_{b_ib_j}=\int_{t \in [i,j]}(q_{b_ib_t}a^{b_t})\delta t βbibj=t[i,j](qbibtabt)δt q b i b j = ∫ t ∈ [ i , j ] q b i b t ⊗ [ 0 1 2 w b t ] δ t q_{b_ib_j}=\int_{t \in [i,j]}q_{b_ib_t}⊗ \begin{bmatrix} 0 \\ {1\over 2}w^{b_t} \\ \end{bmatrix}\delta t qbibj=t[i,j]qbibt[021wbt]δt α b i b j , β b i b j , q b i b j \alpha_{b_ib_j},\beta_{b_ib_j},q_{b_ib_j} αbibj,βbibj,qbibj代入整理可得到最终的PVQ积分公式:
[ p w b j v j w q w b j b j a b j g ] = [ p w b i + v i w Δ t − 1 2 g w Δ t 2 + q w b i α b i b j v i w − g w Δ t + q w b i β b i b j q w b i q b i b j b i a b i g ] \begin{bmatrix} p_{wb_j}\\v_j^w\\q_{wb_j}\\b_j^a\\b_j^g\\ \end{bmatrix}=\begin{bmatrix} p_{wb_i}+v_i^w\Delta t- {1\over 2}g^w \Delta t^2+q_{wb_i}\color{red}{\alpha_{b_ib_j}}\\v_i^w-g^w\Delta t+q_{wb_i}\color{red}{\beta_{b_ib_j}} \\q_{wb_i}\color{red}{q_{b_ib_j}}\\b_i^a\\b_i^g\\ \end{bmatrix} pwbjvjwqwbjbjabjg=pwbi+viwΔt21gwΔt2+qwbiαbibjviwgwΔt+qwbiβbibjqwbiqbibjbiabig


预积分误差:一段时间内 IMU 构建的预积分量作为测量值,对两时刻之间的状态量进行约束
[ r p r q r v r b a r b g ] = [ p w b j − p w b i − v i w Δ t + 1 2 g w Δ t 2 − q w b i α b i b j 2 [ q b j b i ⊗ ( q b i w ⊗ q w b j ) ] x y z v j w − v i w + g w Δ t − q w b i β b i b j b j a − b i a b j g − b i g ] = [ q b i w ( p w b j − p w b i − v i w Δ t + 1 2 g w Δ t 2 ) − α b i b j 2 [ q b j b i ⊗ ( q b i w ⊗ q w b j ) ] x y z q b i w ( v j w − v i w + g w Δ t ) − β b i b j b j a − b i a b j g − b i g ] \begin{bmatrix} r_p\\r_q\\r_v\\r_{ba}\\r_{bg}\\ \end{bmatrix}=\begin{bmatrix} p_{wb_j} - p_{wb_i}-v_i^w\Delta t+ {1\over 2}g^w \Delta t^2-q_{wb_i}\color{red}{\alpha_{b_ib_j}}\\ 2[{\color{red}{q_{b_jb_i}}}⊗(q_{b_iw} ⊗ q_{wb_j})]_{xyz} \\v_j^w - v_i^w+g^w\Delta t-q_{wb_i}\color{red}{\beta_{b_ib_j}} \\b_j^a-b_i^a\\b_j^g-b_i^g\\ \end{bmatrix}=\begin{bmatrix} q_{b_iw}(p_{wb_j} - p_{wb_i}-v_i^w\Delta t+ {1\over 2}g^w \Delta t^2)-\color{red}{\alpha_{b_ib_j}}\\ 2[{\color{red}{q_{b_jb_i}}}⊗(q_{b_iw} ⊗ q_{wb_j})]_{xyz} \\q_{b_iw}(v_j^w - v_i^w+g^w\Delta t)-\color{red}{\beta_{b_ib_j}} \\b_j^a-b_i^a\\b_j^g-b_i^g\\ \end{bmatrix} rprqrvrbarbg=pwbjpwbiviwΔt+21gwΔt2qwbiαbibj2[qbjbi(qbiwqwbj)]xyzvjwviw+gwΔtqwbiβbibjbjabiabjgbig=qbiw(pwbjpwbiviwΔt+21gwΔt2)αbibj2[qbjbi(qbiwqwbj)]xyzqbiw(vjwviw+gwΔt)βbibjbjabiabjgbig
上面误差中位移,速度,偏置都是直接相减得到。第二项是关于四元数的旋转误差,其中 [ ⋅ ] x y z [\cdot]_{xyz} []xyz 表示只取四元数的虚部 ( x , y , z ) (x, y, z) (x,y,z) 组成的三维向量。


预积分的离散形式
以上是预积分的连续形式,也可以使用离散形式,这里使用 m i d − p o i n t mid-point midpoint 方法,即两个相邻时刻 k k k k + 1 k+1 k+1 的位姿是用两个时刻的测量值 a , ω a, ω a,ω 的平均值来计算: w = 1 2 ( ( w b k − b k g ) + ( w b k + 1 − b k g ) ) w={1 \over 2}((w^{b_k}-b_k^g)+(w^{b_{k+1}}-b_k^g)) w=21((wbkbkg)+(wbk+1bkg)) a = 1 2 ( q b i b k ( a b k − b k a ) + q b i b k + 1 ( a b k + 1 − b k a ) ) a={1\over 2}(q_{b_ib_k}(a^{b_k}-b_k^a)+q_{b_ib_{k+1}}(a^{b_{k+1}}-b_k^a)) a=21(qbibk(abkbka)+qbibk+1(abk+1bka))


预积分量的方差
协方差传递性质:在一个线性系统中,已知一个变量 y = A x , x ∈ N ( 0 , Σ x ) y = Ax, x ∈ \mathcal N (0, Σ_x) y=Ax,xN(0,Σx), 则有 Σ y = A Σ x A ⊤ Σ_y = AΣ_xA^⊤ Σy=AΣxA
Σ y = E ( ( A x ) ( A x ) ⊤ ) = E ( A x x ⊤ A ⊤ ) = A Σ x A ⊤ Σ_y = E((Ax)(Ax)^⊤) = E(Axx^⊤A^⊤) = AΣ_xA^⊤ Σy=E((Ax)(Ax))=E(AxxA)=AΣxA要推导预积分量的协方差,我们需要知道 imu 噪声和预积分量之间的线性递推关系。

假设已知了相邻时刻误差的线性传递方程: η i k = F k − 1 η i k − 1 + G k − 1 n k − 1 η_{ik} = {\color{red}F_{k−1}η_{ik−1}} + {\color{blue}G_{k−1}n_{k−1}} ηik=Fk1ηik1+Gk1nk1比如:状态量误差为 η i k = [ δ θ i k , δ v i k , δ p i k ] η_{ik} = [δθ_{ik}, δv_{ik}, δp_{ik}] ηik=[δθik,δvik,δpik],测量噪声为 n k = [ n k g , n k a ] n_k = [n^g_k, n^a_k] nk=[nkg,nka]
误差的传递由两部分组成:1.当前时刻的误差传递给下一时刻,2.当前时刻测量噪声传递给下一时刻。
协方差矩阵可以通过递推 Σ y = A Σ x A ⊤ Σ_y = AΣ_xA^⊤ Σy=AΣxA计算得到: Σ i k = F k − 1 Σ i k − 1 F k − 1 ⊤ + G k − 1 Σ n G k − 1 ⊤ Σ_{ik} = {\color{red} F_{k−1}Σ_{ik−1}F^⊤_{k−1}} +{\color{blue} G_{k−1}Σ_nG^⊤_{k−1}} Σik=Fk1Σik1Fk1+Gk1ΣnGk1其中, Σ n Σ_n Σn 是测量噪声的协方差矩阵,方差从 i i i 时刻开始进行递推, Σ i i = 0 Σ_{ii} = 0 Σii=0


状态误差线性递推公式的推导(线性化)
协方差传递性质只对于线性化系统,通常对于状态量之间的递推关系是非线性的方程如 x k = f ( x k − 1 , u k − 1 ) x_k = f(x_{k−1}, u_{k−1}) xk=f(xk1,uk1),其中状态量为 x , u x,u xu为系统的输入量。

我们可以用两种方法来推导状态误差传递的线性递推关系:

  1. 一种是基于一阶泰勒展开的误差递推方程(应用于 EKF 的协方差预测)。
    令状态量为 x = x ^ + δ x x = \hat{x} + δx x=x^+δx,其中,真值为 x ^ \hat{x} x^,误差为 δ x δx δx。另外,输入量 u u u 的噪声为 n n n
    非线性系统 x k = f ( x k − 1 , u k − 1 ) x_k = f(x_{k−1}, u_{k−1}) xk=f(xk1,uk1) 方程进行一阶泰勒展开有: x k = f ( x k − 1 , u k − 1 ) x_k = f(x_{k−1}, u_{k−1}) xk=f(xk1,uk1) x ^ k + δ x k = f ( x ^ k − 1 + δ x k − 1 , u ^ k − 1 + n k − 1 ) \hat{x}_k +δx_k= f(\hat{x}_{k−1}+δx_{k-1}, \hat{u}_{k−1}+n_{k-1}) x^k+δxk=f(x^k1+δxk1,u^k1+nk1) x ^ k + δ x k = f ( x ^ k − 1 , u ^ k − 1 ) + F δ x k − 1 + G n k − 1 \hat{x}_k +δx_k= f(\hat{x}_{k−1}, \hat{u}_{k−1})+Fδx_{k-1}+Gn_{k-1} x^k+δxk=f(x^k1,u^k1)+Fδxk1+Gnk1 δ x k = F δ x k − 1 + G n k − 1 {\color{red}δx_k= Fδx_{k-1}+Gn_{k-1}} δxk=Fδxk1+Gnk1其中,F 是状态量 x k x_k xk 对状态量 x k − 1 x_{k−1} xk1 的雅克比矩阵,G 是状态量 x k x_k xk对输入量 u k − 1 u_{k−1} uk1 的雅克比矩阵。
  2. 一种是基于误差随时间变化的递推方程。
    如果我们能够推导状态误差随时间变化的导数关系,比如: δ x ˙ = A δ x + B n δ\dot{x} = Aδx + Bn δx˙=Aδx+Bn则误差状态的传递方程为:
    δ x k = δ x k − 1 + δ x ˙ k − 1 ∆ t → δ x k = ( I + A ∆ t ) δ x k − 1 + B ∆ t n k − 1 δx_k = δx_{k−1} + δ\dot{x}_{k−1}∆t → δx_k = (I + A∆t)δx_{k−1} + B∆tn_{k−1} δxk=δxk1+δx˙k1tδxk=(I+At)δxk1+Btnk1

这两种推导方式的可以看出有:
F = I + A ∆ t , G = B ∆ t F = I + A∆t, G = B∆t F=I+At,G=Bt


回顾预积分(离散形式)的误差递推公式,将测量噪声也考虑进模型:
w = 1 2 ( ( w b k + n k g − b k g ) + ( w b k + 1 + n k + 1 g − b k g ) ) w={1 \over 2}((w^{b_k}+ {\color{red}n_k^g}-b_k^g)+(w^{b_{k+1}}+ {\color{red}n_{k+1}^g}-b_k^g)) w=21((wbk+nkgbkg)+(wbk+1+nk+1gbkg)) a = 1 2 ( q b i b k ( a b k + n k a − b k a ) + q b i b k + 1 ( a b k + 1 + n k + 1 a − b k a ) ) a={1\over 2}(q_{b_ib_k}(a^{b_k}+ {\color{red}n_k^a}-b_k^a)+q_{b_ib_{k+1}}(a^{b_{k+1}}+ {\color{red}n_{k+1}^a}-b_k^a)) a=21(qbibk(abk+nkabka)+qbibk+1(abk+1+nk+1abka))确定误差传递的状态量,噪声量,然后开始构建传递方程。用前面一阶泰勒展开的推导方式,我们能推导出如下的形式: [ δ α b k + 1 b ′ k + 1 δ θ b k + 1 b ′ k + 1 δ β b k + 1 b ′ k + 1 δ b k + 1 a δ b k + 1 g ] = F [ δ α b k b ′ k δ θ b k b ′ k δ β b k b ′ k δ b k a δ b k g ] + G [ n k a n k g n k + 1 a n k + 1 g n b a a n b k g ] \begin{bmatrix} δα_{b_{k+1}b′_{k+1}} \\ δθ_{b_{k+1}b′_{k+1}} \\ δβ_{b_{k+1}b′_{k+1}} \\δb^a_{k+1}\\ δb^g_{k+1}\\ \end{bmatrix}=F\begin{bmatrix} δα_{b_{k}b′_{k}} \\ δθ_{b_{k}b′_{k}} \\ δβ_{b_{k}b′_{k}} \\δb^a_{k}\\ δb^g_{k}\\ \end{bmatrix}+G\begin{bmatrix} n^a_k\\n^g_k\\n^a_{k+1}\\n^g_{k+1}\\n_{b^a_a}\\n_{b^g_k}\\ \end{bmatrix} δαbk+1bk+1δθbk+1bk+1δβbk+1bk+1δbk+1aδbk+1g=Fδαbkbkδθbkbkδβbkbkδbkaδbkg+Gnkankgnk+1ank+1gnbaanbkgF, G 为两个时刻间的协方差传递矩阵。


对VIO残差函数的构建的理解:

对于 T T T时刻的状态量,如位置、速度、变换、偏置。可通过IMU测量值 ( w , a ) (w,a) (w,a)积分得到 T + 1 T+1 T+1时刻的状态。

由于状态量中的参考系都在全局坐标系下,对于每一时刻的状态优化完成之后,需要重新积分得到下一时刻的状态,因此提出预积分的概念,将积分转换成相对于上一时刻的量。

通过对上一时刻 T T T预积分得到当前时刻 T + 1 T+1 T+1的状态作为测量值,通过当前时刻的真实值作为约束,得到残差函数

以上过程再考虑到噪声、误差的影响,通过线性系统的协方差传递性质,将状态量之间的递推关系线性化,即利用F,G,考虑到上一时刻的误差以及当前时刻的观测误差。最终所得到的残差函数即为,上一时刻的预积分加上传递误差,与当前时刻的约束。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秃头队长

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值