VIO第3讲:基于优化的IMU与视觉信息融合之IMU预积分

VIO第3讲:基于优化的IMU与视觉信息融合之IMU预积分

文章目录

  • VIO第3讲:基于优化的IMU与视觉信息融合之IMU预积分
  • 1 IMU预积分
    • 1.1 IMU常规积分—连续时间—不适用
    • 1.2 预积分形式
      • ① 定义
      • ② 如何推导出预积分定义
      • ③ 用预积分表达IMU积分公式
      • ④ 预积分误差(残差)
      • ⑤ 预积分的离散形式
    • 1.3 为什么采用预积分
    • 1.4 预积分量的误差递推(噪声模型)
      • ① 基于一阶泰勒展开的误差递推方程
      • ② 基于误差随时间变化的递推方程
      • ③ 预积分误差传递的形式
    • 1.4 零偏更新
  • 2 VIO残差函数的构建
    • 2.1 VIO系统的状态量
    • 2.2 目标函数

1 IMU预积分

在这里插入图片描述

1.1 IMU常规积分—连续时间—不适用

旋转矩阵表示(没有写出噪声项,0均值)

p b k + 1 w = p b k w + ν b k w Δ t k + ∬ t ∈ [ k , k + 1 ] [ R t w ( a ^ t − b a t ) − g w ] d t 2 v b k + 1 w = v b k w + ∫ t ∈ [ k , k + 1 ] [ R t w ( a ^ t − b a t ) − g w ] d t q b k + 1 w = q b k w ⊗ ∫ t ∈ [ k , k + 1 ] 1 2 Ω ( ω ^ t − b ω t ) q t b k d t \begin{gathered} p_{b_{k+1}}^{w}=p_{b_{k}}^{w}+\nu_{b_{k}}^{w}\Delta t_{k}+\iint_{t\in[k,k+1]}\bigl[R_{t}^{w}\bigl(\widehat{a}_{t}-b_{a_{t}}\bigr)-g^{w}\bigr]dt^{2} \\ v_{b_{k+1}}^{w}=v_{b_{k}}^{w}+\int_{t\in[k,k+1]}\bigl[R_{t}^{w}\bigl(\widehat{a}_{t}-b_{a_{t}}\bigr)-g^{w}\bigr]dt \\ q_{b_{k+1}}^{w}=q_{b_{k}}^{w}\otimes\int_{t\in[k,k+1]}\frac{1}{2}\Omega(\widehat{\omega}_{t}-b_{\omega_{t}})q_{t}^{b_{k}}dt \end{gathered} pbk+1w=pbkw+νbkwΔtk+t[k,k+1][Rtw(a tbat)gw]dt2vbk+1w=vbkw+t[k,k+1][Rtw(a tbat)gw]dtqbk+1w=qbkwt[k,k+1]21Ω(ω tbωt)qtbkdt

四元数表示—上面是k时刻至k+1时刻,下面是i-j时刻,道理相同

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{aligned} &\mathbf{p}_{wb_{j}}=\mathbf{p}_{wb_{i}}+\mathbf{v}_{i}^{w}\Delta t+\int\int_{t\in[i,j]}(\mathbf{q}_{wb_{t}}\mathbf{a}^{b_{t}}-\mathbf{g}^{w})\delta t^{2} \\ &\begin{aligned}\mathbf{v}_j^w=\mathbf{v}_i^w+\int_{t\in[i,j]}(\mathbf{q}_{wb_t}\mathbf{a}^{b_t}-\mathbf{g}^w)\delta t\end{aligned} \\ &\mathbf{q}_{wb_j}=\int_{t\in[i,j]}\mathbf{q}_{wb_t}\otimes\begin{bmatrix}0\\\frac{1}{2}\boldsymbol{\omega}^{b_t}\end{bmatrix}\delta t \end{aligned} pwbj=pwbi+viwΔt+t[i,j](qwbtabtgw)δt2vjw=viw+t[i,j](qwbtabtgw)δtqwbj=t[i,j]qwbt[021ωbt]δt

对于上面积分的离散形式-----中值法----把定积分展开!认为区间内加速度等于两个边界对应的平均值

p b i + 1 w = p b i w + v b i w δ t + 1 2 a ^ ˉ i δ t 2 v b i + 1 w = v b i w + a ^ ˉ i δ t q b i + 1 w = q b i w ⊗ [ 1 1 2 ω ‾ i δ t ] a ^ ˉ i = 1 2 [ q i ( a ^ i − b a i ) − g w + q i + 1 ( a ^ i + 1 − b a i ) − g w ] ω ^ ‾ i = 1 2 ( ω ^ i + ω ^ i + 1 ) − b ω i \begin{gathered} p_{b_{i+1}}^{w}=p_{b_{i}}^{w}+v_{b_{i}}^{w}\delta t+\frac{1}{2}\bar{\hat{a}}_{i}\delta t^{2} \\ v_{b_{i+1}}^{w}=v_{b_{i}}^{w}+\bar{\hat{a}}_{i}\delta t \\ q_{b_{i+1}}^{w}=q_{b_{i}}^{w}\otimes\left[\frac1{\frac12\overline{\omega}_{i}\delta t}\right] \\ \bar{\hat{a}}_i=\frac{1}{2}\bigl[q_{i}\bigl(\widehat{a}_{i}-b_{a_{i}}\bigr)-g^{w}+q_{i+1}\bigl(\widehat{a}_{i+1}-b_{a_{i}}\bigr)-g^{w}\bigr] \\ \overline{\widehat{\omega}}_{i}=\frac{1}{2}\left(\widehat{\omega}_{i}+\widehat{\omega}_{i+1}\right)-b_{\omega_{i}} \end{gathered} pbi+1w=pbiw+vbiwδt+21a^ˉiδt2vbi+1w=vbiw+a^ˉiδtqbi+1w=qbiw[21ωiδt1]a^ˉi=21[qi(a ibai)gw+qi+1(a i+1bai)gw]ω i=21(ω i+ω i+1)bωi

1.2 预积分形式

  预积分量是利用传感器数据积分得到的观测量。它和真实值即差一个噪声量!

① 定义

  预积分量将一段时间内的 IMU 数据直接积分起来就得到了预积分量

  VINS中定义,注意加速度和角速度都是IMU坐标系,展开后会带上噪声与偏置。
α 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 ω b t ] δ t \begin{aligned} &\boldsymbol{\alpha}_{b_{i}b_{j}} \begin{aligned}=\int\int_{t\in[i,j]}(\mathbf{q}_{b_ib_t}\mathbf{a}^{b_t})\delta t^2\end{aligned} \\ &\boldsymbol{\beta}_{b_ib_j} =\int_{t\in[i,j]}(\mathbf{q}_{b_ib_t}\mathbf{a}^{b_t})\delta t \\ &\mathbf{q}_{b_i}b_j =\int_{t\in[i,j]}\mathbf{q}_{b_ib_t}\otimes\begin{bmatrix}0\\\frac12\boldsymbol{\omega}^{b_t}\end{bmatrix}\delta t \end{aligned} αbibj=t[i,j](qbibtabt)δt2βbibj=t[i,j](qbibtabt)δtqbibj=t[i,j]qbibt[021ωbt]δt

  高博新书的定义如下(离散,已经噪声分离)
Δ R ~ i j = ∏ k = i j − 1 Exp ⁡ ( ( ω ~ k − b g , i ) Δ t ) \Delta\tilde{\boldsymbol{R}}_{ij}=\prod_{k=i}^{j-1}\operatorname{Exp}\left((\tilde{\boldsymbol{\omega}}_k-\boldsymbol{b}_{g,i})\Delta t\right) ΔR~ij=k=ij1Exp((ω~kbg,i)Δt)

Δ v ~ i j = ∑ k = i j − 1 Δ R ~ i k ( a ~ k − b a , i ) Δ t . \begin{aligned}\Delta\tilde{\boldsymbol{v}}_{ij}=\sum_{k=i}^{j-1}\Delta\tilde{\boldsymbol{R}}_{ik}(\tilde{\boldsymbol{a}}_k-\boldsymbol{b}_{a,i})\Delta t.\end{aligned} Δv~ij=k=ij1ΔR~ik(a~kba,i)Δt.

Δ p ~ i j = ∑ k = i j − 1 [ ( Δ v ~ i k Δ t ) + 1 2 Δ R ~ i k ( a ~ k − b a , i ) Δ t 2 ] . \Delta\tilde{p}_{ij}=\sum_{k=i}^{j-1}\left[(\Delta\tilde{\boldsymbol{v}}_{ik}\Delta t)+\frac{1}{2}\Delta\tilde{\boldsymbol{R}}_{ik}(\tilde{\boldsymbol{a}}_{k}-b_{a,i})\Delta t^{2}\right]. Δp~ij=k=ij1[(Δv~ikΔt)+21ΔR~ik(a~kba,i)Δt2].

② 如何推导出预积分定义

  就是把旋转进行了一个拆分,后面的项就和状态量无关了!这里也可以推出预积分残差,把非预积分量都移到等式坐标,即左边状态量,右边预积分量。
在这里插入图片描述

③ 用预积分表达IMU积分公式

  说白了,就是IMU只取和cam相同的帧,第i帧到第j帧之间的量会由预积分量来表示。
[ 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}\mathbf{p}_{wb_j}\\\mathbf{v}_j^w\\\mathbf{q}_{wb_j}\\\mathbf{b}_j^a\\\mathbf{b}_j^g\end{bmatrix}=\begin{bmatrix}\mathbf{p}_{wb_i}+\mathbf{v}_i^w\Delta t-\frac12\mathbf{g}^w\Delta t^2+\mathbf{q}_{wb_i}\boldsymbol{\alpha}_{b_ib_j}\\\mathbf{v}_i^w-\mathbf{g}^w\Delta t+\mathbf{q}_{wb_i}\boldsymbol{\beta}_{b_ib_j}\\\mathbf{q}_{wb_i}\mathbf{q}_{b_ib_j}\\\mathbf{b}_i^a\\\mathbf{b}_i^g\end{bmatrix} pwbjvjwqwbjbjabjg = pwbi+viwΔt21gwΔt2+qwbiαbibjviwgwΔt+qwbiβbibjqwbiqbibjbiabig

④ 预积分误差(残差)

  定义:一段时间内 IMU 构建的预积分量作为测量值,对两时刻之间的状态量进行约束。(预积分是通过传感器数据aw积分得到的观测量,状态量pvq推断的是预测值
[ r p r q r v r b a r b a ] 15 × 1 = [ 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}\mathbf{r}_p\\\mathbf{r}_q\\\mathbf{r}_v\\\mathbf{r}_{ba}\\\mathbf{r}_{ba}\end{bmatrix}_{15\times1}=\begin{bmatrix}\mathbf{q}_{b_iw}(\mathbf{p}_{wb_j}-\mathbf{p}_{wb_i}-\mathbf{v}_i^w\Delta t+\frac12\mathbf{g}^w\Delta t^2)-\color{red}{\alpha}_{b_ib_j}\\2[\mathbf{q}_{b_jb_i}\otimes(\mathbf{q}_{b_iw}\otimes\mathbf{q}_{wb_j})]_{xyz}\\\mathbf{q}_{b_iw}(\mathbf{v}_j^w-\mathbf{v}_i^w+\mathbf{g}^w\Delta t)-\boldsymbol{\beta}_{b_ib_j}\\\mathbf{b}_j^a-\mathbf{b}_i^a\\\mathbf{b}_j^g-\mathbf{b}_i^g\end{bmatrix} rprqrvrbarba 15×1= qbiw(pwbjpwbiviwΔt+21gwΔt2)αbibj2[qbjbi(qbiwqwbj)]xyzqbiw(vjwviw+gwΔt)βbibjbjabiabjgbig
  就像eskf一样,我们都是认为噪声是属于0均值的高斯分布,所以后面计算的是误差变量协方差,误差变量均值没什么用。

  高博新书写的还是很清楚的,传感器数据积分得到的观测量(预积分)预测值(状态预测)之间相差一个噪声量。噪声量原本是存在于预积分式子中的,但通过噪声分离把它分离了出来。

在这里插入图片描述

  总而言之,预积分看起来很复杂,实际上只是为了避免庞大的计算找了一个相对状态量-预积分来表示状态。ESKF中因为只是算了一次直接积分,后续就不会再管了,所以不存在计算量问题。本质上都是一样的,只不过基于优化的方法会多次优化进行最小二乘迭代!

⑤ 预积分的离散形式

  预积分量将一段时间内的 IMU 数据直接积分起来就得到了预积分量。所以要搞清楚预积分的本质,两个时间内不参杂状态量的一个积分。

  连续形式的定积分转换为离散形式,本质就是下面的一个过程。
α b i b k + 1 − α b i b k = α b k b k + 1 \color{red}{\alpha_{b_ib_{k+1}}} - \color{red}{\alpha_{b_ib_{k}}} = \color{red}{\alpha_{b_kb_{k+1}}} αbibk+1αbibk=αbkbk+1
在这里插入图片描述

1.3 为什么采用预积分

  通过观察公式可知,IMU 的直接积分需要依赖与第 k 帧的状态 vR,当我们在后端进行非线性优化时,需要迭代更新第 k 帧的 状态vR,这将导致我们需要根据每次迭代后值重新进行积分,这将非常耗时。
  那为什么预积分不会造成上面的影响?因为预积分利用了在t时刻测量的加速度、角速度,我们无法改变,也不会去优化。所以才说,预积分在状态pvq发生改变后不需要重新积分。所以不要认为aw在变化,预积分也会变化。

1.4 预积分量的误差递推(噪声模型)

  写在前面,我们要搞清楚预积分量的误差是什么?噪声又是什么?否则就会逻辑混乱。从1.2中我们已经知道,预积分是一段时间内传感器数据的积分,是观测量;而我们同时利用计算的状态量PVQ可以得到预测值,观测和预测之间存在误差,也就是噪声量。我们这里要递推的误差就是预测-观测。(如果把预积分看作一种状态量,那么预积分误差以可以看作一种误差状态,这种误差状态可以通过递推来计算)
在这里插入图片描述
  上面为了方便计算,所以进行噪声分离,使得预积分量和状态量的预测值之间存在一个误差,我们这里的主要目的就是为了对这个误差量进行递推!同时,误差递推中加入了噪声项。
在这里插入图片描述

注意,这里类似ESKF,都是利用误差状态求的方差

  一个 IMU 数据作为测量值的噪声方差我们能够标定。现在,一段时间内多个 IMU 数据积分形成的预积分量的方差呢?

  线性高斯运算如下

在这里插入图片描述

  要推导预积分量的协方差,我们需要知道 imu 噪声和预积分量之间的线性递推关系

相邻时刻误差的线性传递方程

状态量误差: η i k = [ δ θ i k , δ v i k , δ p i k ] \boldsymbol{\eta}_{ik}=[\delta\boldsymbol{\theta}_{ik},\delta\mathbf{v}_{ik},\delta\mathbf{p}_{ik}] ηik=[δθik,δvik,δpik]

测量噪声: n k = [ n k g , n k a ] \mathbf{n}_k=[\mathbf{n}_k^g,\mathbf{n}_k^a] nk=[nkg,nka]-高斯白噪声

η i k = F k − 1 η i k − 1 + G k − 1 n k − 1 \boldsymbol{\eta}_{ik}=\mathbf{F}_{k-1}\boldsymbol{\eta}_{ik-1}+\mathbf{G}_{k-1}\mathbf{n}_{k-1} ηik=Fk1ηik1+Gk1nk1

协方差矩阵可以通过递推计算得到,其中

Σ i k = F k − 1 Σ i k − 1 F k − 1 ⊤ + G k − 1 Σ n G k − 1 ⊤ \mathbf{\Sigma}_{ik}=\mathbf{F}_{k-1}\mathbf{\Sigma}_{ik-1}\mathbf{F}_{k-1}^\top+\mathbf{G}_{k-1}\mathbf{\Sigma_n}\mathbf{G}_{k-1}^\top Σik=Fk1Σik1Fk1+Gk1ΣnGk1

① 基于一阶泰勒展开的误差递推方程

在这里插入图片描述

② 基于误差随时间变化的递推方程

在这里插入图片描述

对比两种方法可知
F = I + A Δ t ,   G = B Δ t \mathbf{F}=\mathbf{I}+\mathbf{A}\Delta t,\textbf{ G}=\mathbf{B}\Delta t F=I+AΔt, G=BΔt
  实际上两种方法都是非常类似的,在ESKF里面,通过连续误差状态方程的系统矩阵A进行泰勒展开,将其转为离散时间下状态状态转移矩阵!
Φ ( t + Δ t , t ) = exp ⁡ ( A c Δ t ) = I 6 × 6 + A c Δ t + 1 2 ! A c 2 Δ t 2 + … \begin{aligned} \Phi(t+\Delta t,t)& =\exp\left(\mathbf{A}_{c}\Delta t\right) \\ &=\mathbf{I}_{6\times6}+\mathbf{A}_{c}\Delta t+\frac{1}{2!}\mathbf{A}_{c}^{2}\Delta t^{2}+\ldots \end{aligned} Φ(t+Δt,t)=exp(AcΔt)=I6×6+AcΔt+2!1Ac2Δt2+

③ 预积分误差传递的形式

  注意,我们这里的误差状态是指预积分的误差状态,不是PVQ。具体推导见崔华坤的论文解析

连续时间下

在这里插入图片描述

离散时间下

在这里插入图片描述

1.4 零偏更新

  理论上来讲,如果IMU零偏发生了变化,预积分就应该重新计算,因为预积分的每一步都用到了 i 时刻的 IMU 零偏。但是实际操作过程中,我们也可以选用一种取巧的做法:假定预积分观测是随零偏线性变化的

Δ R ~ i j ( b g , i + δ b g , i ) = Δ R ~ i j ( b g , i ) E x p ( ∂ Δ R ~ i j ∂ b g , i δ b g , i ) , Δ v ~ i j ( b g , i + δ b g , i , b a , i + δ b a , i ) = Δ v ~ i j ( b g , i , b a , i ) + ∂ Δ v ~ i j ∂ b g , i δ b g , i + ∂ Δ v ~ i j ∂ b a , i δ b a , i , Δ p ~ i j ( b g , i + δ b g , i , b a , i + δ b a , i ) = Δ p ~ i j ( b g , i , b a , i ) + ∂ Δ p ~ i j ∂ b g , i δ b g , i + ∂ Δ p ~ i j ∂ b a , i δ b a , i . \begin{gathered} \Delta\tilde{\boldsymbol{R}}_{ij}(\boldsymbol{b}_{g,i}+\delta\boldsymbol{b}_{g,i}) =\Delta\tilde{\boldsymbol{R}}_{ij}(\boldsymbol{b}_{g,i})\mathrm{Exp}\left(\frac{\partial\Delta\tilde{\boldsymbol{R}}_{ij}}{\partial\boldsymbol{b}_{g,i}}\delta\boldsymbol{b}_{g,i}\right), \\ \begin{aligned}\Delta\tilde{\boldsymbol{v}}_{ij}(\boldsymbol{b}_{g,i}+\delta\boldsymbol{b}_{g,i},\boldsymbol{b}_{a,i}+\delta\boldsymbol{b}_{a,i})\end{aligned} =\Delta\tilde{\boldsymbol{v}}_{ij}(\boldsymbol{b}_{g,i},\boldsymbol{b}_{a,i})+\frac{\partial\Delta\tilde{\boldsymbol{v}}_{ij}}{\partial\boldsymbol{b}_{g,i}}\delta\boldsymbol{b}_{g,i}+\frac{\partial\Delta\tilde{\boldsymbol{v}}_{ij}}{\partial\boldsymbol{b}_{a,i}}\delta\boldsymbol{b}_{a,i}, \\ \begin{aligned}\Delta\tilde{\boldsymbol{p}}_{ij}(\boldsymbol{b}_{g,i}+\delta\boldsymbol{b}_{g,i},\boldsymbol{b}_{a,i}+\delta\boldsymbol{b}_{a,i})\end{aligned} =\Delta\tilde{\boldsymbol{p}}_{ij}(\boldsymbol{b}_{g,i},\boldsymbol{b}_{a,i})+\frac{\partial\Delta\tilde{\boldsymbol{p}}_{ij}}{\partial\boldsymbol{b}_{g,i}}\delta\boldsymbol{b}_{g,i}+\frac{\partial\Delta\tilde{\boldsymbol{p}}_{ij}}{\partial\boldsymbol{b}_{a,i}}\delta\boldsymbol{b}_{a,i}. \end{gathered} ΔR~ij(bg,i+δbg,i)=ΔR~ij(bg,i)Exp(bg,iΔR~ijδbg,i),Δv~ij(bg,i+δbg,i,ba,i+δba,i)=Δv~ij(bg,i,ba,i)+bg,iΔv~ijδbg,i+ba,iΔv~ijδba,i,Δp~ij(bg,i+δbg,i,ba,i+δba,i)=Δp~ij(bg,i,ba,i)+bg,iΔp~ijδbg,i+ba,iΔp~ijδba,i.
  相当于只要每一次计算了预积分对偏置的雅可比,利用泰勒这种展开进行近似即可。

在这里插入图片描述

2 VIO残差函数的构建

2.1 VIO系统的状态量

在这里插入图片描述

  一般来讲,优化的是与相机保持同步的IMU数据,区间内的IMU数据会被积分累计。

  为了节约计算量采用滑动窗口形式Bundle Adjustment, 在 i 时刻,滑动窗口内待优化的系统状态量定义如下:

  下面N表示了滑动窗口中的关键帧数量,对应位姿;M表示被滑动窗口所有关键帧观测到的路标点数量,对应地图点。 x i \mathbf{x}_i xi表示了IMU在惯性坐标系(世界坐标系)中的位置、速度、姿态、以及IMU坐标系中的加速度和角速度偏置。
X = [ x n , x n + 1 , . . . , x n + 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 ] \begin{aligned}\mathcal{X}&=[\mathbf{x}_n,\mathbf{x}_{n+1},...,\mathbf{x}_{n+N},\lambda_m,\lambda_{m+1},...,\lambda_{m+M}]\\\mathbf{x}_i&=\Big[\mathbf{p}_{wb_i},\mathbf{q}_{wb_i},\mathbf{v}_i^w,\mathbf{b}_a^{b_i},\mathbf{b}_g^{b_i}\Big]^\top,i\in[n,n+N]\end{aligned} Xxi=[xn,xn+1,...,xn+N,λm,λm+1,...,λm+M]=[pwbi,qwbi,viw,babi,bgbi],i[n,n+N]

2.2 目标函数

  三个残差项即误差项分别为边缘化的先验信息IMU 测量残差视觉的重投影残差。三种残差都是用马氏距离表示。

min ⁡ X ρ ( ∥ r p − J p X ∥ Σ p 2 ) ⏟ prior + ∑ i ∈ B ρ ( ∥ r b ( z b i b i + 1 , X ) ∥ Σ b i b i + 1 2 ) ⏟ IMU error + ∑ ( i , j ) ∈ F ρ ( ∥ r f ( z f j c i , X ) ∥ Σ f j c i 2 ) ⏟ image error \begin{aligned}\min_{\mathcal{X}}\underbrace{\rho\left(\|\mathbf{r}_p-\mathbf{J}_p\mathcal{X}\|_{\Sigma_p}^2\right)}_{\text{prior}} + \underbrace { \sum _ { i \in B }\rho\left(\|\mathbf{r}_b(\mathbf{z}_{b_ib_{i+1}},\mathcal{X})\|_{\Sigma_{b_ib_i+1}}^2\right)}_{\text{IMU error}}\\ + \underbrace { \sum _ { ( i , j ) \in F }\rho\left(\left\|\mathbf{r}_f(\mathbf{z}_{\mathbf{f}_j}^{c_i},\mathcal{X})\right\|_{\Sigma_{\mathbf{f}_j}^{c_i}}^2\right)}_{\text{image error}}\end{aligned} Xminprior ρ(rpJpXΣp2)+IMU error iBρ(rb(zbibi+1,X)Σbibi+12)+image error (i,j)Fρ( rf(zfjci,X) Σfjci2)

套入上面最小二乘,以IMU残差为例,X即优化变量,这里就是那5个状态

min ⁡ δ X ∥ r B ( z ^ b k + 1 b k , X + Δ X ) ∥ P b k + 1 b k 2 = min ⁡ δ X ∥ r B ( z ^ b k + 1 b k , X ) + J b k + 1 b k Δ X ∥ P b k + 1 b k 2 \min_{\delta X}\left\|r_B\left(\hat{z}_{b_{k+1}}^{b_k},X+\Delta X\right)\right\|_{P_{b_{k+1}}^{b_k}}^2=\min_{\delta X}\left\|r_B\left(\hat{z}_{b_{k+1}}^{b_k},X\right)+J_{b_{k+1}}^{b_k}\Delta X\right\|_{P_{b_{k+1}}^{b_k}}^2 δXmin rB(z^bk+1bk,X+ΔX) Pbk+1bk2=δXmin rB(z^bk+1bk,X)+Jbk+1bkΔX Pbk+1bk2

  其中, J b k + 1 b k J_{bk+1}^{bk} Jbk+1bk是误差项 r B r_{B} rB关于所有状态向量(即优化变量)X 的 Jacobian,将上式展开并令关于∆X的导数为 0,可以得到增量∆X的计算公式:
J b k + 1 b k T P b k + 1 b k − 1 J b k + 1 b k Δ X = − J b k + 1 b k T P b k + 1 b k − 1 r B \begin{matrix}{J_{b_{k+1}}^{b_{k}}}^T{P_{b_{k+1}}^{b_{k}}}^{-1}J_{b_{k+1}}^{b_{k}}\Delta X=-\begin{matrix}{J_{b_{k+1}}^{b_{k}}}^T{P_{b_{k+1}}^{b_{k}}}^{-1}r_{B}\end{matrix}\end{matrix} Jbk+1bkTPbk+1bk1Jbk+1bkΔX=Jbk+1bkTPbk+1bk1rB
  整体目标函数的整体增量方程可写成

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/399609.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

APP要做哪些测试?APP测试要注意哪些问题?

APP要做哪些测试?APP测试要注意哪些问题?对于移动测试,测试员不得不基于用户移动使用模式考虑移动相关的功能。而针对手机应用软件APP的系统测试,我们通常从如下几个角度开展:功能测试(流程测试、功能点测试)、兼容性测…

WEB APIs (3)

事件对象 事件对象有事件触发时的相关信息,如点击事件中事件对象储存了鼠标点在哪个位置的信息 场景: 用户按下了哪个键,按下回车键可以发布新闻 鼠标点击了哪个元素,从而做哪些操作 参数e为事件对象 常用属性 type 获取当前…

枚举类(enum)

优质博文:IT-BLOG-CN ​ 枚举类: 就是对象的实例个数是确定的(例如:单例模式),也就说我们在创建枚举类的时候,会对构造器进行设置 一、自定义创建枚举类 为什么需要枚举类? 【1】…

前端开发,Vue的双向数据绑定的原理

目录 一、什么是前端 二、Vue.JS框架 三、双向数据绑定 四、Vue的双向数据绑定的原理 一、什么是前端 前端通常指的是网页或应用程序中用户直接交互和感知的部分,也称为客户端。前端开发涉及使用HTML、CSS和JavaScript等技术来构建用户界面和交互功能。前端开发…

[WebDav] WebDav基础知识

文章目录 什么是WebDavWebDav常用命令WebDav常用命令的测试(代码)PROPFIND 方法测试PUT 方法测试GET 方法测试PROPPATCH方法 WebDav缓存Cache-ControlEtag测试 强制重新验证不需要缓存 WebDav的锁WebDav的状态码WebDav身份验证WebDav版本控制WebDav和FTP…

安卓adb调试备忘录

由于 MAC 的 USB 口全被占用着,采用无线连接刚方便,记录一下,以防忘记~ ADB原理 adb devices -l ## 列出连接的设备adb tcpip [端口号] adb tcpip 6666 # 将当前已连接USB上的Mobile端切换为TCP/IP模式,以6666端口进行监听. adb…

数据结构笔记1线性表及其实现

终于开始学习数据结构了 c语言结束之后 我们通过题目来巩固了 接下来我们来学习数据结构 这里我们将去认识到数据结构的一些基础知识,我在第一次学习的时候会很迷糊现在重新学习发现之前的时候还是因为c语言学的不牢固导致学习数据结构困难 这里 我会尽量的多写代码…

Day51 42 接雨水 84柱状图中的最大矩形

42 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1]输出:6解释:上面是由数组 [0,1,0,2,1,0,1,3,…

前端 webSocket 的使用

webSocket使用 注意要去监听websocket 对象事件,处理我们需要的数据 我是放在了最外层的index 内,监听编辑状态,去触发定义的方法。因为我这个项目是组件化开发,全部只有一个总编辑按钮,我只需监听是否触发了编辑即可…

深入探索STM32的存储选项:片内RAM、片内Flash与SDRAM

博客:深入探索STM32的存储选项:片内RAM、片内Flash与SDRAM 在嵌入式系统设计中,存储管理是一个至关重要的方面,尤其是对于基于STM32这类强大的微控制器来说。STM32系列微控制器因其高性能、低功耗以及灵活的存储选项而广受欢迎。本…

数智化转型的三大关键点

一、重新认识数智化转型 消费红利时代,伴随中国宏观经济向好发展,相当一部分企业可以轻松实现快速增长,如同搭乘了一架高速运转的电梯一路飞升。然而,随着宏观经济增速放缓,时代的电梯逐渐失去效力,中国商…

18. 四数之和 - 力扣(LeetCode)

问题描述 给你一个由 n 个整数组成的数组 nums ,和一个目标值 target 。请你找出并返回满足下述全部条件且不重复的四元组 [nums[a], nums[b], nums[c], nums[d]] (若两个四元组元素一一对应,则认为两个四元组重复): …

C#,洗牌问题(Card Shuffle Problem)的算法与源代码

1 洗牌问题(Card Shuffle Problem) 洗牌问题(Card Shuffle Problem)的基本描述 你有 100 张牌,从 1 到 100。 你把它们分成 k 堆,然后按顺序收集回来。 例如,如果您将它们分成 4 堆&#xff0…

关于发送邮件时Reply Reply All和Forward的区别

我们发送邮件的时候总是会纠结到底是用回复,还是回复全部,还是转发。 回复- 仅回复发件人。 全部回复- 回复发件人和抄送/密件抄送的联系人。 转发- 将电子邮件的副本发送给其他收件人。 这几种情形分别在什么时候用呢? 回复 比如Alen给你…

【设计模式】23种设计模式笔记

设计模式分类 模板方法模式 核心就是设计一个部分抽象类。 这个类具有少量具体的方法,和大量抽象的方法,具体的方法是为外界提供服务的点,具体方法中定义了抽象方法的执行序列 装饰器模式 现在有一个对象A,希望A的a方法被修饰 …

浏览器缓存机制

浏览器缓存有先后顺序,总体分为以下四个方面: Memory Cache Service Worker Cache Disk Cache Push Cache 缓存位置 1. Memory Cache 内存中的缓存 优点: 浏览器会优先去命中的一种缓存 响应速度最快 缺点: 缓存时间短&#xf…

ABAP 导入Excel表示例程序

目录 ABAP 导入excel示例程序创建程序使用的结构上传下载模板 ABAP 导入excel示例程序 批量导入程序,需要使用到导入模板,首先需要创建程序,之后是需要创建excel导入模板,并且需要将excel导入模板上传到SAP系统里面,之…

Code-Audit(代码审计)习题记录

介绍: 自己懒得搭建靶场了,靶场地址是 GitHub - CHYbeta/Code-Audit-Challenges: Code-Audit-Challenges为了方便在公网练习,可以随地访问,本文所有的题目均来源于网站HSCSEC-Code Audit 1、习题一 题目内容如下: 1…

运行jar时提示缺少依赖的类

供应商丢过来一个jar,是用Java写的Windows桌面程序,运行jar时提示缺少依赖的类,一看就是打包没带依赖的库,下面是解决方法: 1、解压缩jar,查看 META-INF 目录下的 MANIFEST.MF,看看都引用了哪些…

FlinkCDC详解

1、FlinkCDC是什么 1.1 CDC是什么 CDC是Chanage Data Capture(数据变更捕获)的简称。其核心原理就是监测并捕获数据库的变动(例如增删改),将这些变更按照发生顺序捕获,将捕获到的数据,写入数据…