多传感器融合定位十四-基于图优化的定位方法

news2024/11/27 0:38:49

多传感器融合定位十四-基于图优化的定位方法

  • 1. 基于图优化的定位简介
    • 1.1 核心思路
    • 1.2 定位流程
  • 2. 边缘化原理及应用
    • 2.1 边缘化原理
    • 2.2 从滤波角度理解边缘化
  • 3. 基于kitti的实现原理
    • 3.1 基于地图定位的滑动窗口模型
    • 3.2 边缘化过程
  • 4. lio-mapping 介绍
    • 4.1 核心思想
    • 4.2 具体流程
      • 4.2.1 各类因子
      • 4.2.2 滑窗模型
      • 4.2.3 边缘化
      • 4.2.4 添加新帧

Reference:

  1. 深蓝学院-多传感器融合
  2. 多传感器融合定位理论基础

文章跳转:

  1. 多传感器融合定位一-3D激光里程计其一:ICP
  2. 多传感器融合定位二-3D激光里程计其二:NDT
  3. 多传感器融合定位三-3D激光里程计其三:点云畸变补偿
  4. 多传感器融合定位四-3D激光里程计其四:点云线面特征提取
  5. 多传感器融合定位五-点云地图构建及定位
  6. 多传感器融合定位六-惯性导航原理及误差分析
  7. 多传感器融合定位七-惯性导航解算及误差分析其一
  8. 多传感器融合定位八-惯性导航解算及误差分析其二
  9. 多传感器融合定位九-基于滤波的融合方法Ⅰ其一
  10. 多传感器融合定位十-基于滤波的融合方法Ⅰ其二
  11. 多传感器融合定位十一-基于滤波的融合方法Ⅱ
  12. 多传感器融合定位十二-基于图优化的建图方法其一
  13. 多传感器融合定位十三-基于图优化的建图方法其二
  14. 多传感器融合定位十四-基于图优化的定位方法
  15. 多传感器融合定位十五-多传感器时空标定(综述)

1. 基于图优化的定位简介

1.1 核心思路

核心思路是把融合方法从滤波换成图优化,其元素不再是简单的惯性解算,而是预积分。
一个暴力的模型可以设计为:
在这里插入图片描述
缺陷:随着时间的进行,图模型会越来越大,导致无法达到实时性。

解决方法:不断删除旧的帧,只优化最新的几帧,即维持一个滑动窗口。
模型如下:
在这里插入图片描述
问题:直接从模型中删除,等于损失了信息。
解法:通过模型把旧帧的约束传递下来,即边缘化(后面讲具体细节)。

1.2 定位流程

在这里插入图片描述
整个流程:不断往滑窗里添加新信息,并边缘化旧信息。
需要注意的是:

  1. 正常行驶时,不必像建图那样,提取稀疏的关键帧;
  2. 停车时,需要按一定策略提取关键帧,但删除的是次新帧,因此不需要边缘化。

2. 边缘化原理及应用

2.1 边缘化原理

优化问题具有如下通用形式:
H X = b H X=b HX=b并可拆解成如下形式:
[ H m m H m r H r m H r r ] [ X m X r ] = [ b m b r ] \left[\begin{array}{cc} H_{m m} & H_{m r} \\ H_{r m} & H_{r r} \end{array}\right]\left[\begin{array}{c} X_m \\ X_r \end{array}\right]=\left[\begin{array}{l} b_m \\ b_r \end{array}\right] [HmmHrmHmrHrr][XmXr]=[bmbr]拆解的目的是通过一系列操作,把 X m X_m Xm 从状态量 里删除掉,并把它的约束保留下来。
在滑窗模式里,这个 X m X_m Xm 即为要边缘化掉的量。
回顾舒尔补:
给定矩阵
M = [ A B C D ] M=\left[\begin{array}{ll} \mathrm{A} & \mathrm{B} \\ \mathrm{C} & \mathrm{D} \end{array}\right] M=[ACBD]它可以通过如下变换,变成上三角矩阵,即
[ I 0 − C A − 1 I ] [ A B C D ] = [ A B 0 Δ A ] \left[\begin{array}{cc} \mathrm{I} & 0 \\ -\mathrm{CA}^{-1} & \mathrm{I} \end{array}\right]\left[\begin{array}{cc} \mathrm{A} & \mathrm{B} \\ \mathrm{C} & \mathrm{D} \end{array}\right]=\left[\begin{array}{cc} \mathrm{A} & \mathrm{B} \\ 0 & \Delta \mathrm{A} \end{array}\right] [ICA10I][ACBD]=[A0BΔA]其中, Δ A = D − C A − 1   B \Delta \mathrm{A}=\mathrm{D}-\mathrm{CA}^{-1} \mathrm{~B} ΔA=DCA1 B 称为 A \mathrm{A} A 关于 M \mathrm{M} M 的舒尔补。

拆解后的优化问题,可通过舒尔补对矩阵三角化, 即
[ I 0 − H r m H m m − 1 I ] [ H m m H m r H r m H r r ] [ X m X r ] = [ I 0 − H r m H m m − 1 I ] [ b m b r ] \begin{aligned} & {\left[\begin{array}{cc} I & 0 \\ -H_{r m} H_{m m}^{-1} & I \end{array}\right]\left[\begin{array}{cc} H_{m m} & H_{m r} \\ H_{r m} & H_{r r} \end{array}\right]\left[\begin{array}{c} X_m \\ X_r \end{array}\right] } \\ = & {\left[\begin{array}{cc} I & 0 \\ -H_{r m} H_{m m}^{-1} & I \end{array}\right]\left[\begin{array}{l} b_m \\ b_r \end{array}\right] } \end{aligned} =[IHrmHmm10I][HmmHrmHmrHrr][XmXr][IHrmHmm10I][bmbr]
进一步化简得,
[ H m m H m r 0 H r r − H r m H m m − 1 H m r ] [ X m X r ] = [ b m b r − H r m H m m − 1 b m ] \begin{aligned} & {\left[\begin{array}{cc} H_{m m} & H_{m r} \\ 0 & H_{r r}-H_{r m} H_{m m}^{-1} H_{m r} \end{array}\right]\left[\begin{array}{c} X_m \\ X_r \end{array}\right] } \\ = & {\left[\begin{array}{c} b_m \\ b_r-H_{r m} H_{m m}^{-1} b_m \end{array}\right] } \end{aligned} =[Hmm0HmrHrrHrmHmm1Hmr][XmXr][bmbrHrmHmm1bm]此时,可以利用等式第2行直接得到:
( H r r − H r m H m m − 1 H m r ) X r = b r − H r m H m m − 1 b m \left(H_{r r}-H_{r m} H_{m m}^{-1} H_{m r}\right) X_r=b_r-H_{r m} H_{m m}^{-1} b_m (HrrHrmHmm1Hmr)Xr=brHrmHmm1bm
其含义为:此时可以不依赖 X m X_m Xm 求解出 X r X_r Xr,若我们只关心 X r X_r Xr 的值,则可以把 X m X_m Xm 从模型里删除。

2.2 从滤波角度理解边缘化

kalman滤波是此前已经熟悉的,从边缘化的 角度重新看一遍滤波器的推导,更有利于深入 理解。
运动模型与观测模型分别为:
x k = A k − 1 x k − 1 + v k + w k y k = C k x k + n k \begin{aligned} & \mathbf{x}_k=\mathbf{A}_{k-1} \mathbf{x}_{k-1}+\mathbf{v}_k+\mathbf{w}_k \\ & \mathbf{y}_k=\mathbf{C}_k \mathbf{x}_k+\mathbf{n}_k \end{aligned} xk=Ak1xk1+vk+wkyk=Ckxk+nk
其中 k = 1 … K k=1 \ldots K k=1K状态量的求解,可以等效为如下模型
x ^ = arg ⁡ min ⁡ x J ( x ) \hat{\mathbf{x}}=\arg \min _{\mathbf{x}} J(\mathbf{x}) x^=argxminJ(x)
其中
J ( x ) = ∑ k = 0 K ( J v , k ( x ) + J y , k ( x ) ) J v , k ( x ) = { 1 2 ( x 0 − x ˇ 0 ) T P ˇ 0 − 1 ( x 0 − x ˇ 0 ) , k = 0 1 2 ( x k − A k − 1 x k − 1 − v k ) T × Q k − 1 ( x k − A k − 1 x k − 1 − v k ) , k = 1 … K J y , k ( x ) = 1 2 ( y k − C k x k ) T R k − 1 ( y k − C k x k ) , k = 0 … K \begin{aligned} & J(\mathbf{x})=\sum_{k=0}^K\left(J_{v, k}(\mathbf{x})+J_{y, k}(\mathbf{x})\right) \\ & J_{v, k}(\mathbf{x})=\left\{\begin{array}{c} \frac{1}{2}\left(\mathbf{x}_0-\check{\mathbf{x}}_0\right)^T \check{\mathbf{P}}_0^{-1}\left(\mathbf{x}_0-\check{\mathbf{x}}_0\right), k=0 \\ \frac{1}{2}\left(\mathbf{x}_k-\mathbf{A}_{k-1} \mathbf{x}_{k-1}-\mathbf{v}_k\right)^T \\ \times \mathbf{Q}_k^{-1}\left(\mathbf{x}_k-\mathbf{A}_{k-1} \mathbf{x}_{k-1}-\mathbf{v}_k\right), k=1 \ldots K \end{array}\right. \\ & J_{y, k}(\mathbf{x})=\frac{1}{2}\left(\mathbf{y}_k-\mathbf{C}_k \mathbf{x}_k\right)^T \mathbf{R}_k^{-1}\left(\mathbf{y}_k-\mathbf{C}_k \mathbf{x}_k\right), \quad k=0 \ldots K \end{aligned} J(x)=k=0K(Jv,k(x)+Jy,k(x))Jv,k(x)= 21(x0xˇ0)TPˇ01(x0xˇ0),k=021(xkAk1xk1vk)T×Qk1(xkAk1xk1vk),k=1KJy,k(x)=21(ykCkxk)TRk1(ykCkxk),k=0K将上述模型整理为更简洁的形式,令
z = [ x ˇ 0 v 1 ⋮ v K y 0 y 1 ⋮ y K ] , x = [ x 0 ⋮ x K ] \mathbf{z}=\left[\begin{array}{c} \check{\mathbf{x}}_0 \\ \mathbf{v}_1 \\ \vdots \\ \mathbf{v}_K \\ \hline \mathbf{y}_0 \\ \mathbf{y}_1 \\ \vdots \\ \mathbf{y}_K \end{array}\right], \quad \mathbf{x}=\left[\begin{array}{c} \mathbf{x}_0 \\ \vdots \\ \mathbf{x}_K \end{array}\right] z= xˇ0v1vKy0y1yK ,x= x0xK H = [ 1 − A 0 1 ⋱ ⋱ − A K − 1 1 C 0 C 1 ⋱ C K ] W = [ P ˇ 0 Q 1 ⋱ Q K R 0 R 1 R K ] \begin{aligned} & \mathbf{H}=\left[\begin{array}{cccc} \mathbf{1} & & & \\ -\mathbf{A}_0 & \mathbf{1} & & \\ & \ddots & \ddots & \\ & & -\mathbf{A}_{K-1} & \mathbf{1} \\ \hline \mathbf{C}_0 & \mathbf{C}_1 & & \\ & & \ddots & \\ & & & \mathbf{C}_K \end{array}\right] \\ & \mathbf{W}=\left[\begin{array}{llll|lll} \check{\mathbf{P}}_0 & & & & & & \\ & \mathbf{Q}_1 & & & & & \\ & & \ddots & & & \\ & & & \mathbf{Q}_K & & & \\ \hline & & & & \mathbf{R}_0 & & \\ & & & & & \mathbf{R}_1 & \\ & & & & & \mathbf{R}_K \end{array}\right] \\ & \end{aligned} H= 1A0C01C1AK11CK W= Pˇ0Q1QKR0R1RK 此时,目标函数可以重新表示为
J ( x ) = 1 2 ( z − H x ) T W − 1 ( z − H x ) J(\mathbf{x})=\frac{1}{2}(\mathbf{z}-\mathbf{H x})^T \mathbf{W}^{-1}(\mathbf{z}-\mathbf{H x}) J(x)=21(zHx)TW1(zHx)求解其最小值,即令其一阶导为零
∂ J ( x ) ∂ x T ∣ x ^ = − H T W − 1 ( z − H x ^ ) = 0 \left.\frac{\partial J(\mathbf{x})}{\partial \mathbf{x}^T}\right|_{\hat{\mathbf{x}}}=-\mathbf{H}^T \mathbf{W}^{-1}(\mathbf{z}-\mathbf{H} \hat{\mathbf{x}})=\mathbf{0} xTJ(x) x^=HTW1(zHx^)=0
( H T W − 1 H ) x ^ = H T W − 1 z \left(\mathbf{H}^T \mathbf{W}^{-1} \mathbf{H}\right) \hat{\mathbf{x}}=\mathbf{H}^T \mathbf{W}^{-1} \mathbf{z} (HTW1H)x^=HTW1z然而,这是批量求解模型,当只关心当前时 刻(k时刻)状态时,应改为滤波模型。
假设上一时刻后验为
{ x ^ k − 1 , P ^ k − 1 } \left\{\hat{\mathbf{x}}_{k-1}, \hat{\mathbf{P}}_{k-1}\right\} {x^k1,P^k1}
目标是得到当前时刻后验
{ x ^ k − 1 , P ^ k − 1 , v k , y k } ↦ { x ^ k , P ^ k } \left\{\hat{\mathbf{x}}_{k-1}, \hat{\mathbf{P}}_{k-1}, \mathbf{v}_k, \mathbf{y}_k\right\} \mapsto\left\{\hat{\mathbf{x}}_k, \hat{\mathbf{P}}_k\right\} {x^k1,P^k1,vk,yk}{x^k,P^k}由于马尔可夫性,仅与前一时刻有关,因此令
z k = [ x ^ k − 1 v k y k ] H k = [ 1 − A k − 1 1 C k ] W k = [ P ^ k − 1 Q k R k ] \begin{aligned} \mathbf{z}_k & =\left[\begin{array}{c} \hat{\mathbf{x}}_{k-1} \\ \mathbf{v}_k \\ \mathbf{y}_k \end{array}\right] \\ \mathbf{H}_k & =\left[\begin{array}{ccc} \mathbf{1} & \\ -\mathbf{A}_{k-1} & 1 \\ & \mathbf{C}_k \end{array}\right] \\ \mathbf{W}_k & =\left[\begin{array}{ccc} \hat{\mathbf{P}}_{k-1} & \\ & \mathbf{Q}_k & \\ & & \mathbf{R}_k \end{array}\right] \end{aligned} zkHkWk= x^k1vkyk = 1Ak11Ck = P^k1QkRk 则模型的解为
( H k T W k − 1 H k ) x ^ = H k T W k − 1 z k \left(\mathbf{H}_k^T \mathbf{W}_k^{-1} \mathbf{H}_k\right) \hat{\mathbf{x}}=\mathbf{H}_k^T \mathbf{W}_k^{-1} \mathbf{z}_k (HkTWk1Hk)x^=HkTWk1zk
其中
x ^ = [ x ^ k − 1 ′ x ^ k ] \hat{\mathbf{x}}=\left[\begin{array}{c} \hat{\mathbf{x}}_{k-1}^{\prime} \\ \hat{\mathbf{x}}_k \end{array}\right] x^=[x^k1x^k] x ^ k − 1 \hat{\mathbf{x}}_{k-1} x^k1 x ^ k − 1 ′ \hat{\mathbf{x}}_{k-1}^{\prime} x^k1 有本质区别,下图可以明确展示
在这里插入图片描述
在此基础上,求解模型可以展开为
[ P ^ k − 1 − 1 + A k − 1 T Q k − 1 A k − 1 − A k − 1 T Q k − 1 − Q k − 1 A k − 1 Q k − 1 + C k T R k − 1 C k ] [ x ^ k − 1 ′ x ^ k ] = [ P ^ k − 1 − 1 x ^ k − 1 − A k − 1 T Q k − 1 v k Q k − 1 v k + C k T R k − 1 y k ] \left[\begin{array}{cc} \hat{\mathbf{P}}_{k-1}^{-1}+\mathbf{A}_{k-1}^T \mathbf{Q}_k^{-1} \mathbf{A}_{k-1} & -\mathbf{A}_{k-1}^T \mathbf{Q}_k^{-1} \\ -\mathbf{Q}_k^{-1} \mathbf{A}_{k-1} & \mathbf{Q}_k^{-1}+\mathbf{C}_k^T \mathbf{R}_k^{-1} \mathbf{C}_k \end{array}\right]\left[\begin{array}{c} \hat{\mathbf{x}}_{k-1}^{\prime} \\ \hat{\mathbf{x}}_k \end{array}\right]=\left[\begin{array}{c} \hat{\mathbf{P}}_{k-1}^{-1} \hat{\mathbf{x}}_{k-1}-\mathbf{A}_{k-1}^T \mathbf{Q}_k^{-1} \mathbf{v}_k \\ \mathbf{Q}_k^{-1} \mathbf{v}_k+\mathbf{C}_k^T \mathbf{R}_k^{-1} \mathbf{y}_k \end{array}\right] [P^k11+Ak1TQk1Ak1Qk1Ak1Ak1TQk1Qk1+CkTRk1Ck][x^k1x^k]=[P^k11x^k1Ak1TQk1vkQk1vk+CkTRk1yk]利用舒尔补,等式两边左乘如下矩阵,便可以直接求解出 x ^ k \hat{\mathbf{x}}_k x^k ,且不需求解 x ^ k − 1 ′ \hat{\mathbf{x}}_{k-1}^{\prime} x^k1
[ 1 0 Q k − 1 A k − 1 ( P ^ k − 1 − 1 + A k − 1 T Q k − 1 A k − 1 ) − 1 1 ] \left[\begin{array}{cc} \mathbf{1} & \mathbf{0} \\ \mathbf{Q}_k^{-1} \mathbf{A}_{k-1}\left(\hat{\mathbf{P}}_{k-1}^{-1}+\mathbf{A}_{k-1}^T \mathbf{Q}_k^{-1} \mathbf{A}_{k-1}\right)^{-1} & \mathbf{1} \end{array}\right] [1Qk1Ak1(P^k11+Ak1TQk1Ak1)101]可得:
P ^ k − 1 x ^ k = P ˇ k − 1 ( A k − 1 x ^ k − 1 + v k ) + C k T R k − 1 y k \hat{\mathbf{P}}_k^{-1} \hat{\mathbf{x}}_k=\check{\mathbf{P}}_k^{-1}\left(\mathbf{A}_{k-1} \hat{\mathbf{x}}_{k-1}+\mathbf{v}_k\right)+\mathbf{C}_k^T \mathbf{R}_k^{-1} \mathbf{y}_k P^k1x^k=Pˇk1(Ak1x^k1+vk)+CkTRk1yk其中
P ˇ k = Q k + A k − 1 P ^ k − 1 A k − 1 T P ^ k = ( P ˇ k − 1 + C k T R k − 1 C k ) − 1 \begin{aligned} & \check{\mathbf{P}}_k=\mathbf{Q}_k+\mathbf{A}_{k-1} \hat{\mathbf{P}}_{k-1} \mathbf{A}_{k-1}^T \\ & \hat{\mathbf{P}}_k=\left(\check{\mathbf{P}}_k^{-1}+\mathbf{C}_k^T \mathbf{R}_k^{-1} \mathbf{C}_k\right)^{-1} \end{aligned} Pˇk=Qk+Ak1P^k1Ak1TP^k=(Pˇk1+CkTRk1Ck)1以上过程,核心即为边缘化,因此滤波(IEKF)可以看做长度为1的滑动窗口。
在这里插入图片描述

3. 基于kitti的实现原理

3.1 基于地图定位的滑动窗口模型

  1. 窗口优化模型构成
    在图优化模型中,优化模型也可写成如下形式:
    J ⊤ Σ J δ x = − J ⊤ Σ r \mathbf{J}^{\top} \boldsymbol{\Sigma} \mathbf{J} \delta \boldsymbol{x}=-\mathbf{J}^{\top} \boldsymbol{\Sigma} \mathbf{r} JΣJδx=JΣr其中
    r r r 是残差;
    J J J 是残差关于状态量的雅可比;
    ∑ \sum 是信息矩阵。
    在kitti工程中,基于地图定位的滑动窗口,其残差包括:

    • 地图匹配位姿和优化变量的残差
    • 激光里程计相对位姿和优化变量的残差
    • IMU预积分和优化变量的残差
    • 边缘化形成的先验因子对应的残差

    此处先介绍前3项,第4项待边缘化后介绍。

  2. 地图匹配位姿和优化变量的残差
    该残差对应的因子为地图先验因子。
    一个因子仅约束一个位姿,其模型如下:
    在这里插入图片描述
    残差关于优化变量的雅可比,可视化如下:
    在这里插入图片描述
    因此,对应的Hessian矩阵的可视化为:
    在这里插入图片描述

  3. 激光里程计相对位姿和优化变量的残差
    该残差对应的因子为激光里程计因子。
    一个因子约束两个位姿,其模型如下:
    在这里插入图片描述
    残差关于优化变量的雅可比,可视化如下:
    在这里插入图片描述
    因此,对应的Hessian矩阵可视化为:
    在这里插入图片描述

  4. IMU预积分和优化变量的残差
    该残差对应的因子为IMU因子。
    一个因子约束两个位姿,并约束两个时刻 IMU
    的速度与 bias。
    在这里插入图片描述
    残差关于优化变量的雅可比,可视化如下:
    在这里插入图片描述
    因此,对应的Hessian矩阵可视化为:
    在这里插入图片描述

  5. 完整模型
    完整Hessian矩阵,即为以上各因子对应矩阵的累加。
    在这里插入图片描述
    上述过程用公式可表示为:
    J ⊤ Σ J ⏟ H δ x = − J ⊤ Σ r ⏟ b  \underbrace{\mathbf{J}^{\top} \boldsymbol{\Sigma} \mathbf{J}}_{\mathbf{H}} \delta \boldsymbol{x}=\underbrace{-\mathbf{J}^{\top} \boldsymbol{\Sigma} \boldsymbol{r}}_{\text {b }} H JΣJδx= JΣr其中
    r = [ r Y 0 r Y 1 r Y 2 r L 0 r L 1 r M 0 r M 1 ] \boldsymbol{r}=\left[\begin{array}{l} \boldsymbol{r}_{Y 0} \\ \boldsymbol{r}_{Y 1} \\ \boldsymbol{r}_{Y 2} \\ \boldsymbol{r}_{L 0} \\ \boldsymbol{r}_{L 1} \\ \boldsymbol{r}_{M 0} \\ \boldsymbol{r}_{M 1} \end{array}\right] r= rY0rY1rY2rL0rL1rM0rM1
    J = ∂ r ∂ δ x = [ ∂ r 0 ∂ δ 0 ∂ r 1 ∂ δ x ∂ r 2 ∂ δ x ∂ r L 0 ∂ δ x ∂ r L 1 ∂ δ x ∂ r M 0 ∂ δ x ∂ r M 1 ∂ δ x ] = [ J 1 J 2 J 3 J 4 J 5 J 6 J 7 ] J ⊤ = [ J 1 ⊤ J 2 ⊤ J 3 ⊤ J 4 ⊤ J 5 ⊤ J 6 ⊤ J 7 ⊤ ] \begin{aligned} & \mathbf{J}=\frac{\partial \mathbf{r}}{\partial \delta x}=\left[\begin{array}{c} \frac{\partial \mathbf{r}_0}{\partial \delta_0} \\ \frac{\partial \mathbf{r}_1}{\partial \delta x} \\ \frac{\partial \mathbf{r}_2}{\partial \delta x} \\ \frac{\partial \mathbf{r}_{L 0}}{\partial \delta x} \\ \frac{\partial \mathbf{r}_{L 1}}{\partial \delta x} \\ \frac{\partial \mathbf{r}_{M 0}}{\partial \delta x} \\ \frac{\partial \mathbf{r}_{M 1}}{\partial \delta x} \end{array}\right]=\left[\begin{array}{l} \mathbf{J}_1 \\ \mathbf{J}_2 \\ \mathbf{J}_3 \\ \mathbf{J}_4 \\ \mathbf{J}_5 \\ \mathbf{J}_6 \\ \mathbf{J}_7 \end{array}\right] \\ & \mathbf{J}^{\top}=\left[\begin{array}{lllllll} \mathbf{J}_1^{\top} & \mathbf{J}_2^{\top} & \mathbf{J}_3^{\top} & \mathbf{J}_4^{\top} & \mathbf{J}_5^{\top} & \mathbf{J}_6^{\top} & \mathbf{J}_7^{\top} \end{array}\right] \\ & \end{aligned} J=δxr= δ0r0δxr1δxr2δxrL0δxrL1δxrM0δxrM1 = J1J2J3J4J5J6J7 J=[J1J2J3J4J5J6J7]矩阵乘法写成累加形式为:
    ∑ i = 1 7 J i ⊤ Σ i J i δ x = − ∑ i = 1 7 J i ⊤ Σ i r i \sum_{i=1}^7 \mathbf{J}_i^{\top} \boldsymbol{\Sigma}_i \mathbf{J}_i \delta \boldsymbol{x}=-\sum_{i=1}^7 \mathbf{J}_i^{\top} \boldsymbol{\Sigma}_i \mathbf{r}_i i=17JiΣiJiδx=i=17JiΣiri此累加过程,即对应前面可视化时各矩阵叠加。

3.2 边缘化过程

  1. 移除老的帧
    假设窗口长度为3,在加入新的帧之前,需要先边缘化掉老的帧,即下图方框中的变量。
    在这里插入图片描述用前述公式,可以表示为
    ( H r r − H r m H m m − 1 H m r ) δ x r = b r − H r m H m m − 1 b m \left(H_{r r}-H_{r m} H_{m m}^{-1} H_{m r}\right) \delta x_r=b_r-H_{r m} H_{m m}^{-1} b_m (HrrHrmHmm1Hmr)δxr=brHrmHmm1bm但是在实际代码中,会把它拆成两步实现。

    第一步:使用和要边缘化掉的量无关的因子,构建剩余变量对应的Hessian矩阵。
    在这里插入图片描述
    上标 a a a 代表是第一步中的变量,包含Hessian矩阵的完整表达式为
    H r r a δ x r = b r a H_{r r}^a \delta x_r=b_r^a Hrraδxr=bra第二步:挑出和要边缘化掉的量相关的因子,构建待边缘化的Hessian矩阵,并使用舒尔补做边缘化。
    在这里插入图片描述
    上标 b b b 代表是第二步中的变量,包含Hessian矩阵的完整表达式为
    [ H r r b − H r m b ( H m m b ) − 1 H m r b ] δ x r = b r b − H r m b ( H m m b ) − 1 b m b \left[H_{r r}^b-H_{r m}^b\left(H_{m m}^b\right)^{-1} H_{m r}^b\right] \delta x_r=b_r^b-H_{r m}^b\left(H_{m m}^b\right)^{-1} b_m^b [HrrbHrmb(Hmmb)1Hmrb]δxr=brbHrmb(Hmmb)1bmb这一步形成的约束(上式)就叫先验因子,它包含了边缘化掉的量对剩余变量的约束关系。
    最终使用的是两步的叠加,Hessian矩阵叠加的可视化如下:
    在这里插入图片描述
    对应的完整公式为
    H r r δ x r = b r H_{r r} \delta x_r=b_r Hrrδxr=br其中
    H r r = H r r a + H r r b − H r m b ( H m m b ) − 1 H m r b b r = b r a + b r b − H r m b ( H m m b ) − 1 b m b \begin{gathered} H_{r r}=H_{r r}^a+H_{r r}^b-H_{r m}^b\left(H_{m m}^b\right)^{-1} H_{m r}^b \\ b_r=b_r^a+b_r^b-H_{r m}^b\left(H_{m m}^b\right)^{-1} b_m^b \end{gathered} Hrr=Hrra+HrrbHrmb(Hmmb)1Hmrbbr=bra+brbHrmb(Hmmb)1bmb边缘化之后,模型如下:
    在这里插入图片描述
    注意:边缘化先验因子只有在第一次边缘化之前是不存在的,完成第一次边缘化之后就一直存在,并且随着后续新的边缘化进行,其内容不断更新。

  2. 添加新的帧
    添加新的帧之后,模型如下:
    在这里插入图片描述
    此处直接给出新的Hessian矩阵可视化结果:
    在这里插入图片描述
    此后,随着定位过程的进行,便不断循环“边缘化老帧->添加新帧”的过程,从而维持窗口长度不变。
    该过程的代码实现可参考后面lio-mapping的实现,理解后者便很容易实现前者。

4. lio-mapping 介绍

4.1 核心思想

在这里插入图片描述
基于滑动窗口方法,把雷达线/面特征、IMU预积分等的约束放在一起进行优化。

  1. 𝑜 𝑜 o 𝑖 𝑖 i 是滑窗;
  2. 只有 𝑝 𝑝 p 𝑖 𝑖 i 的位姿在滑窗中优化;
  3. 𝑜 𝑜 o 𝑝 𝑝 p 是为了构建局部地图,防止地图过于稀疏;
  4. 局部地图都投影到 𝑝 𝑝 p 的位姿处;
  5. 滑窗中点云约束是当前优化帧和局部地图特征匹配,因此特征对应的因子约束的是 𝑝 𝑝 p 帧和 𝑘 𝑘 k 帧( 𝑝 𝑝 p< 𝑘 𝑘 k<= 𝑗 𝑗 j)。

其优化模型为
min ⁡ X 1 2 { ∥ r P ( X ) ∥ 2 + ∑ m ∈ m L α α ∈ { p + 1 , ⋯ , j } ∥ r L ( m , X ) ∥ C L α m 2 + ∑ β ∈ { p , ⋯   , j − 1 } ∥ r B ( z β + 1 β , X ) ∥ C B β + 1 B β 2 } \begin{aligned} & \min _{\mathbf{X}} \frac{1}{2}\left\{\left\|\mathbf{r}_{\mathcal{P}}(\mathbf{X})\right\|^2+\sum_{\substack{m \in \mathbf{m}_{L_\alpha} \\ \alpha \in\{p+1, \cdots, j\}}}\left\|\mathbf{r}_{\mathcal{L}}(m, \mathbf{X})\right\|_{\mathbf{C}_{L_\alpha}^m}^2\right. \\ & \left.+\sum_{\beta \in\{p, \cdots, j-1\}}\left\|\mathbf{r}_{\mathcal{B}}\left(z_{\beta+1}^\beta, \mathbf{X}\right)\right\|_{\mathbf{C}_{B_{\beta+1}}^{B_\beta}}^2\right\} \end{aligned} Xmin21 rP(X)2+mmLαα{p+1,,j}rL(m,X)CLαm2+β{p,,j1} rB(zβ+1β,X) CBβ+1Bβ2 其中
r P ( X ) \mathbf{r}_{\mathcal{P}}(\mathbf{X}) rP(X) 是边缘化产生的先验因子对应的残差;
r L ( m , X ) \mathbf{r}_{\mathcal{L}}(m, \mathbf{X}) rL(m,X) 是点云特征匹配对应的残差;
r B ( z β + 1 β , X ) \mathbf{r}_{\mathcal{B}}\left(z_{\beta+1}^\beta, \mathbf{X}\right) rB(zβ+1β,X) 是IMU约束对应的残差。

4.2 具体流程

流程讲解思路:
• 以前述kitti中实现原理为基础,此处只是多了点云特征的约束;
• 只介绍可借鉴的内容,因此不介绍bias、外参初始化和外参优化等内容。

4.2.1 各类因子

  1. 定义IMU 因子
    在这里插入图片描述

  2. 添加imu因子
    在这里插入图片描述

  3. 定义点云面特征因子
    在这里插入图片描述

  4. 添加点云面特征
    在这里插入图片描述

  5. 定义边缘化先验因子i
    由于不确定边缘化后会和哪些量产生关联,因此没有固定size。
    其详细内容待讲解边缘化实现时再展开。

  6. 添加边缘化先验因子
    在这里插入图片描述

4.2.2 滑窗模型

在这里插入图片描述
• 帧与帧之间通过特征约束,因此没有了激光里程计因子。
• 当前模型中没有使用点云的线特征。

  1. IMU预积分和优化变量的残差
    一个因子约束两个位姿,并约束两个时刻 IMU 的速度与 bias
    在这里插入图片描述
    残差关于优化变量的雅可比可视化如下:
    在这里插入图片描述
    因此对应的Hessian矩阵的可视化为:
    在这里插入图片描述

  2. 点云面特征对应的残差
    一个因子约束两个位姿
    在这里插入图片描述
    残差关于优化变量的雅可比可视化如下:
    在这里插入图片描述
    因此对应的Hessian矩阵的可视化为
    在这里插入图片描述

  3. 完整模型
    在这里插入图片描述以上工程,就是前述代码中添加各类因子到模型的过程。

4.2.3 边缘化

  1. 边缘化模型
    在这里插入图片描述
    需要边缘化掉的为方框中的变量

  2. 边缘化可视化
    第一步:使用和要边缘化掉的量无关的因子,构建剩余变量对应的Hessian矩阵。
    在这里插入图片描述
    第二步:挑出和要边缘化掉的量相关的因子,构建待边缘化的Hessian矩阵,并使用舒尔补做边缘化。
    在这里插入图片描述
    对应的完整Hessian矩阵就是他们合在一起的结果。
    在这里插入图片描述

  3. 边缘化实现
    核心思路是把要边缘化掉的变量,以及跟这些变量被同一个因子约束的变量,汇总在一起。

    在该例中,把和模型无关的量去除,剩余部分如下(设每帧有20个面特征)
    因此,放入MarginalizationInfo中的信息包括:
    5个变量: T 0 M 0 T 1 M 1 T 2 T_0 \quad M_0 \quad T_1 \quad M_1 T_2 T0M0T1M1T2
    41个因子: 40 个面特征因子、1个IMU因子
    (此处假设的是第一次进行边缘化,若不是第 一次,因子中还应该有边缘化先验因子)
    找出所有变量后,需要知道哪些是应该边缘化的,哪些是应该保留的。
    右图代码中,形参里_parameter_blocks包含所有相关参数,而_drop_set即为这些参数中要边缘化掉的参数的id。
    在这里插入图片描述
    添加和IMU因子相关的ResidualBlockInfo
    在这里插入图片描述
    添加和面特征因子相关的ResidualBlockInfo
    在这里插入图片描述
    在添加以上ResidualBlockInfo的同时,核心变量parameter_block_size 就被赋值。
    在这里插入图片描述
    第二个核心函数的作用是计算每个因子对应的变量(parameter_blocks)、误差项(residuals)、雅可比矩阵(jacobians),并把变量数值放到parameter_block_data中。
    在这里插入图片描述
    第三个核心函数的作用构建Hessian矩阵,Schur掉需要marg的变量,得到对剩余变量的约束,即为边缘化约束(先验约束)。
    函数的前半部分,对m、n和parameter_block_idx 这三个核心变量进行了赋值。
    在这里插入图片描述
    函数的中间部分开始构建Hessian 矩阵,由于使用多线程,因此要给不同的线程平均分配因子。
    在这里插入图片描述
    函数的最后便是执行边缘化,得到边缘化先验因子。
    在这里插入图片描述
    上述过程是假设第一次执行边缘化,当不是第一次时,步骤上只是多了在AddResidualBlockInfo时把边缘化先验因子也加入进来,剩余过程不变。
    在这里插入图片描述

4.2.4 添加新帧

边缘化之后,模型如下:
在这里插入图片描述
注意:由于面特征因子都是和第一帧( T 0 T_0 T0)关联,当它边缘化掉之后,该因子便不存在,因此在加入新的帧的同时,还需要构建所有帧和当前第一帧( T 1 T_1 T1)的面特征关联。

添加新的帧以后,模型如下:
在这里插入图片描述
Hessian矩阵可视化如下:
在这里插入图片描述
此后不断循环该过程,便可以实现lio功能。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

lamada表达式、stream、collect整理

lamada表达式格式 格式&#xff1a;( parameter-list ) -> { expression-or-statements } 实例&#xff1a;简化匿名内部类的写法 原本写法&#xff1a; public class LamadaTest { public static void main(String[] args) { new Thread(new Runnable() { …

基于PYTHON django四川旅游景点推荐系统

摘 要基于四川旅游景点推荐系统的设计与实现是一个专为四川旅游景点为用户打造的旅游网站。该课题基于网站比较流行的Python 语言系统架构,B/S三层结构模式&#xff0c;通过Maven项目管理工具进行Jar包版本的控制。本系统用户可以发布个人游记&#xff0c;查看景点使用户达到良…

树莓派安装虚拟键盘matchbox-keyboard,解决虚拟键盘乱码问题,解决MIPI DSI触摸屏触控漂移问题

安装虚拟键盘&#xff0c;解决乱码问题 当我们买了触摸屏后&#xff0c;会发现没有键盘&#xff0c;还是无法输入&#xff0c;因此需要虚拟键盘 如果你的语言和地区是中文&#xff0c;那么安装虚拟键盘后可能显示乱码&#xff0c;所以还需要安装中文字体 sudo apt install ttf…

音视频开发—FFMpeg编码解码

FFMpeg 作为音视频领域的开源工具&#xff0c;它几乎可以实现所有针对音视频的处理&#xff0c;本文主要利用 FFMpeg 官方提供的 SDK 实现音视频最简单的几个实例&#xff1a;编码、解码、封装、解封装、转码、缩放以及添加水印。 接下来会由发现问题&#xff0d;&#xff1e;分…

Elasticsearch5.5.1 自定义评分插件开发

文本相似度插件开发&#xff0c;本文基于Elasticsearch5.5.1&#xff0c;Kibana5.5.1 下载地址为&#xff1a; Past Releases of Elastic Stack Software | Elastic 本地启动两个服务后&#xff0c;localhost:5601打开Kibana界面&#xff0c;点击devTools&#xff0c;效果图…

koa ts kick off 搭建项目的基本架子

koa ts kick off 使用ts开发koa项目的基本架子&#xff0c;便于平时随手调研一些技术 项目结构 ├── src │ ├── controller //controller层 │ ├── service //service层 │ ├── routes.ts //路由 │ └── index.ts //项目入…

【图像配准】多图配准/不同特征提取算法/匹配器比较测试

前言 本文首先完成之前专栏前置博文未完成的多图配准拼接任务&#xff0c;其次对不同特征提取器/匹配器效率进行进一步实验探究。 各类算法原理简述 看到有博文[1]指出&#xff0c;在速度方面SIFT<SURF<BRISK<FREAK<ORB&#xff0c;在对有较大模糊的图像配准时&…

04 react css上下浮动动画效果

react css上下浮动动画效果html原生实现上下浮动react 实现上下浮动思路分析实现步骤1.引入useRef2.在所属组件内定义—个变量3.在按钮上添加事件4.定义点击事件对window.scrollTo()进行了解&#xff1a;在react中实现效果图&#xff1a;html原生实现上下浮动 我们有一个导向箭…

【分享】订阅金蝶KIS集简云连接器同步OA付款审批数据至金蝶KIS

方案简介 集简云基于钉钉连接平台完成与钉钉的深度融合&#xff0c;实现钉钉OA审批与数百款办公应用软件&#xff08;如金蝶KIS、用友等&#xff09;的数据互通&#xff0c;让钉钉的OA审批流程与企业内部应用软件的采购、付款、报销、收款、人事管理、售后工单、立项申请等环节…

【2023面试秘籍】 测试工程师的简历该怎么写?

作为软件测试的垂直领域深耕者&#xff0c;面试或者被面试都是常有的事&#xff0c;可是不管是啥&#xff0c;总和简历有着理不清的关系&#xff0c;面试官要通过简历了解面试者的基本信息、过往经历等&#xff0c;面试者希望通过简历把自己最好的一面体现给面试官&#xff0c;…

【Java 面试合集】重写以及重载有什么区别能简单说说嘛

重写以及重载有什么区别能简单说说嘛 前述 这是一道非常基础的面试题&#xff0c;我们在回答的过程中一定要逐一横向比较。 从方法的 修饰符&#xff0c;返回值&#xff0c;方法名&#xff0c;含义&#xff0c;参数等方面进行逐一分析来比较不同。 话不多话&#xff0c;看下…

什么样的台灯适合学生做作业的?开学季,适合孩子写作业的台灯

学生在做作业时&#xff0c;是离不开台灯的&#xff0c;在台灯下学习三四个小时&#xff0c;如果台灯质量不好&#xff0c;那对视力造成很大影响&#xff0c;研究表明&#xff0c;儿童在过亮或者过暗的环境中长时间学习&#xff0c;会导致视力下降等&#xff0c;那么什么样的台…

瀚博半导体载天VA1 加速卡安装过程

背景&#xff1a; 想用 瀚博半导体载天VA1 加速卡 代替 NVIDIA 显卡跑深度学习模型 感谢瀚博的周工帮助解答。 正文&#xff1a; 小心拔出 NVIDIA 显卡&#xff0c;在PCIe 接口插上瀚博半导体载天VA1加速卡&#xff0c;如图&#xff1a; 这时显示屏连接主板的集成显卡 卸载…

cookie和Session的作用和比较

目录 什么是cookie cookie的工作原理 什么是session Session的工作原理 为什么会有session和cookie cookie和session如何配合工作 cookie和Session作用 什么是会话 什么是cookie cookie是web服务器端向我们客户端发送的一块小文件&#xff0c;该文件是干嘛的呢&#xf…

Java基础知识疑难点

1. 基础 1.1. 正确使用 equals 方法1.2. 整型包装类值的比较1.3. BigDecimal 1.3.1. BigDecimal 的用处1.3.2. BigDecimal 的大小比较1.3.3. BigDecimal 保留几位小数1.3.4. BigDecimal 的使用注意事项1.3.5. 总结 1.4. 基本数据类型与包装数据类型的使用标准 2. 集合 2.1. Arr…

Docker-用Jenkins发版Java项目-(1)Docke安装Jenkins

文章目录前言环境背景操作流程docker安装及jenkins软件安装jenkins配置登录配置安装插件及创建账号前言 学海无涯&#xff0c;旅“途”漫漫&#xff0c;“途”中小记&#xff0c;如有错误&#xff0c;敬请指出&#xff0c;在此拜谢&#xff01; 最近新购得了M2的MAC&#xff0c…

LeetCode刷题--- 138. 复制带随机指针的链表(哈希表+迭代)

文章目录一、编程题&#xff1a;430. 扁平化多级双向链表&#xff08;双指针&#xff09;1.题目描述2.示例1&#xff1a;3.示例2&#xff1a;4.示例3&#xff1a;5.提示&#xff1a;二、解题思路1. 题目分析2. 方法1&#xff08;哈希表&#xff09;思路&#xff1a;复杂度分析&…

备考 PMP 考试时需要着重注意什么?

PMP考试难度并不是很大。科学备考一定没有问题的&#xff5e;这里在和大家说说2023年PMP的考试时间&#xff1a;3月、5月、8月、11月&#xff08;其中3月不开启新报名&#xff09;需要注意的地方还是蛮多的。我就根据自己考试的经验和大家分享一下在考试整个过程中注意啥&#…

2023年广西最新建筑施工焊工(建筑特种作业)模拟试题及答案

百分百题库提供特种工&#xff08;焊工&#xff09;考试试题、特种工&#xff08;焊工&#xff09;考试预测题、特种工&#xff08;焊工&#xff09;考试真题、特种工&#xff08;焊工&#xff09;证考试题库等,提供在线做题刷题&#xff0c;在线模拟考试&#xff0c;助你考试轻…

【nodejs】nodejs入门核心知识(命令行使用、内置模块、node 模块化开发)

&#x1f4bb; nodejs入门核心知识(命令行使用、内置模块、node 模块化开发) &#x1f3e0;专栏&#xff1a;JavaScript &#x1f440;个人主页&#xff1a;繁星学编程&#x1f341; &#x1f9d1;个人简介&#xff1a;一个不断提高自我的平凡人&#x1f680; &#x1f50a;分享…