当前位置: 首页 > news >正文

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

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

  • 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 边缘化原理

优化问题具有如下通用形式:
HX=bH X=b HX=b并可拆解成如下形式:
[HmmHmrHrmHrr][XmXr]=[bmbr]\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]拆解的目的是通过一系列操作,把 XmX_mXm 从状态量 里删除掉,并把它的约束保留下来。
在滑窗模式里,这个 XmX_mXm 即为要边缘化掉的量。
回顾舒尔补:
给定矩阵
M=[ABCD]M=\left[\begin{array}{ll} \mathrm{A} & \mathrm{B} \\ \mathrm{C} & \mathrm{D} \end{array}\right] M=[ACBD]它可以通过如下变换,变成上三角矩阵,即
[I0−CA−1I][ABCD]=[AB0Δ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−CA−1B\Delta \mathrm{A}=\mathrm{D}-\mathrm{CA}^{-1} \mathrm{~B}ΔA=DCA1 B 称为 A\mathrm{A}A 关于 M\mathrm{M}M 的舒尔补。

拆解后的优化问题,可通过舒尔补对矩阵三角化, 即
[I0−HrmHmm−1I][HmmHmrHrmHrr][XmXr]=[I0−HrmHmm−1I][bmbr]\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]
进一步化简得,
[HmmHmr0Hrr−HrmHmm−1Hmr][XmXr]=[bmbr−HrmHmm−1bm]\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行直接得到:
(Hrr−HrmHmm−1Hmr)Xr=br−HrmHmm−1bm\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
其含义为:此时可以不依赖 XmX_mXm 求解出 XrX_rXr,若我们只关心 XrX_rXr 的值,则可以把 XmX_mXm 从模型里删除。

2.2 从滤波角度理解边缘化

kalman滤波是此前已经熟悉的,从边缘化的 角度重新看一遍滤波器的推导,更有利于深入 理解。
运动模型与观测模型分别为:
xk=Ak−1xk−1+vk+wkyk=Ckxk+nk\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…Kk=1 \ldots Kk=1K状态量的求解,可以等效为如下模型
x^=arg⁡min⁡xJ(x)\hat{\mathbf{x}}=\arg \min _{\mathbf{x}} J(\mathbf{x}) x^=argxminJ(x)
其中
J(x)=∑k=0K(Jv,k(x)+Jy,k(x))Jv,k(x)={12(x0−xˇ0)TPˇ0−1(x0−xˇ0),k=012(xk−Ak−1xk−1−vk)T×Qk−1(xk−Ak−1xk−1−vk),k=1…KJy,k(x)=12(yk−Ckxk)TRk−1(yk−Ckxk),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ˇ0v1⋮vKy0y1⋮yK],x=[x0⋮xK]\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=x0xKH=[1−A01⋱⋱−AK−11C0C1⋱CK]W=[Pˇ0Q1⋱QKR0R1RK]\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=1A0C01C1AK11CKW=Pˇ0Q1QKR0R1RK此时,目标函数可以重新表示为
J(x)=12(z−Hx)TW−1(z−Hx)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)∂xT∣x^=−HTW−1(z−Hx^)=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
(HTW−1H)x^=HTW−1z\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,vk,yk}↦{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}由于马尔可夫性,仅与前一时刻有关,因此令
zk=[x^k−1vkyk]Hk=[1−Ak−11Ck]Wk=[P^k−1QkRk]\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则模型的解为
(HkTWk−1Hk)x^=HkTWk−1zk\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^k1x^k−1′\hat{\mathbf{x}}_{k-1}^{\prime}x^k1 有本质区别,下图可以明确展示
在这里插入图片描述
在此基础上,求解模型可以展开为
[P^k−1−1+Ak−1TQk−1Ak−1−Ak−1TQk−1−Qk−1Ak−1Qk−1+CkTRk−1Ck][x^k−1′x^k]=[P^k−1−1x^k−1−Ak−1TQk−1vkQk−1vk+CkTRk−1yk]\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}}_kx^k ,且不需求解 x^k−1′\hat{\mathbf{x}}_{k-1}^{\prime}x^k1
[10Qk−1Ak−1(P^k−1−1+Ak−1TQk−1Ak−1)−11]\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−1x^k=Pˇk−1(Ak−1x^k−1+vk)+CkTRk−1yk\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=Qk+Ak−1P^k−1Ak−1TP^k=(Pˇk−1+CkTRk−1Ck)−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其中
    rrr 是残差;
    JJJ 是残差关于状态量的雅可比;
    ∑\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 }} HJΣJδx=JΣr其中
    r=[rY0rY1rY2rL0rL1rM0rM1]\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=[∂r0∂δ0∂r1∂δx∂r2∂δx∂rL0∂δx∂rL1∂δx∂rM0∂δx∂rM1∂δx]=[J1J2J3J4J5J6J7]J⊤=[J1⊤J2⊤J3⊤J4⊤J5⊤J6⊤J7⊤]\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=J1J2J3J4J5J6J7J=[J1J2J3J4J5J6J7]矩阵乘法写成累加形式为:
    ∑i=17Ji⊤ΣiJiδx=−∑i=17Ji⊤Σiri\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,在加入新的帧之前,需要先边缘化掉老的帧,即下图方框中的变量。
    在这里插入图片描述用前述公式,可以表示为
    (Hrr−HrmHmm−1Hmr)δxr=br−HrmHmm−1bm\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矩阵。
    在这里插入图片描述
    上标 aaa 代表是第一步中的变量,包含Hessian矩阵的完整表达式为
    Hrraδxr=braH_{r r}^a \delta x_r=b_r^a Hrraδxr=bra第二步:挑出和要边缘化掉的量相关的因子,构建待边缘化的Hessian矩阵,并使用舒尔补做边缘化。
    在这里插入图片描述
    上标 bbb 代表是第二步中的变量,包含Hessian矩阵的完整表达式为
    [Hrrb−Hrmb(Hmmb)−1Hmrb]δxr=brb−Hrmb(Hmmb)−1bmb\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矩阵叠加的可视化如下:
    在这里插入图片描述
    对应的完整公式为
    Hrrδxr=brH_{r r} \delta x_r=b_r Hrrδxr=br其中
    Hrr=Hrra+Hrrb−Hrmb(Hmmb)−1Hmrbbr=bra+brb−Hrmb(Hmmb)−1bmb\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⁡X12{∥rP(X)∥2+∑m∈mLαα∈{p+1,⋯,j}∥rL(m,X)∥CLαm2+∑β∈{p,⋯,j−1}∥rB(zβ+1β,X)∥CBβ+1Bβ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} Xmin21rP(X)2+mmLαα{p+1,,j}rL(m,X)CLαm2+β{p,,j1}rB(zβ+1β,X)CBβ+1Bβ2其中
rP(X)\mathbf{r}_{\mathcal{P}}(\mathbf{X})rP(X) 是边缘化产生的先验因子对应的残差;
rL(m,X)\mathbf{r}_{\mathcal{L}}(m, \mathbf{X})rL(m,X) 是点云特征匹配对应的残差;
rB(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个变量: T0M0T1M1T2T_0 \quad M_0 \quad T_1 \quad M_1 T_2T0M0T1M1T2
    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 添加新帧

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

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

相关文章:

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

多传感器融合定位十四-基于图优化的定位方法1. 基于图优化的定位简介1.1 核心思路1.2 定位流程2. 边缘化原理及应用2.1 边缘化原理2.2 从滤波角度理解边缘化3. 基于kitti的实现原理3.1 基于地图定位的滑动窗口模型3.2 边缘化过程4. lio-mapping 介绍4.1 核心思想4.2 具体流程4.…...

PHP基于TCPDF第三方类生成PDF文件

最近在研发招聘的系统 遇到了这个问题 转换pdf 折腾了很久 分享一下PHP基于TCPDF第三方类生成PDF文件最近遇到一个需求&#xff0c;需要根据数据库的字段生成表格式的PDF文件并发送邮箱第一步、我们先去官网上面去下载tcpdf的类&#xff1a;http://www.tcpdf.org/或者是从githu…...

SpringCloud(19):Sentinel定义资源的方式

Sentinel除了基本的定义资源的方式之外,还有其他的定义资源的方式,具体如下: 抛出异常的方式定义资源返回布尔值方式定义资源异步调用支持注解方式定义资源主流框架的默认适配1 抛出异常的方式定义资源 Sentinel中的SphU包含了try-catch风格的API。用这种方式,当资源发生了…...

前端 ES6 之 Promise 实践应用与控制反转

Promise 主要是为解决程序异步处理而生的&#xff0c;在现在的前端应用中无处不在&#xff0c;已然成为前端开发中最重要的技能点之一。它不仅解决了以前回调函数地狱嵌套的痛点&#xff0c;更重要的是它提供了更完整、更强大的异步解决方案。 同时 Promise 也是前端面试中必不…...

LightGBM

目录 1.LightGBM的直方图算法(Histogram) 直方图做差加速 2.LightGBM得两大先进技术(GOSS&EFB) 2.1 单边梯度抽样算法(GOSS) 2.2 互斥特征捆绑算法(EFB) 3.LightGBM得生长策略(leaf-wise) 通过与xgboost对比&#xff0c;在这里列出lgb新提出的几个方面的技术 1.Ligh…...

Science:北京脑研究中心李莹实验室揭示性满足感的分子机制

短暂的社交经历&#xff08;例如&#xff0c;性经历&#xff09;可导致内部状态的长期变化并影响社会行为&#xff0c;如交配、攻击。例如&#xff0c;在成功交配射精后&#xff0c;许多物种迅速表现出对交配倾向的抑制有数小时、数天或更长时间&#xff0c;这种效应称为性满足…...

Element UI框架学习篇(三)

Element UI框架学习篇(三) 实现简单登录功能(不含记住密码) 1 准备工作 1.1 在zlz包下创建dto包,并创建userDTO类(传输对象) package com.zlz.dto;import lombok.Data;/* DTO 数据传输对象 用户表的传输对象 调用控制器传参使用 VO 控制器返回的视图对象 与页面对应 PO 数据…...

尚硅谷的尚融宝项目

先建立一个Maven springboot项目 进来先把src删掉&#xff0c;因为是一个父项目&#xff0c;我们删掉src之后&#xff0c;pom里配置的东西&#xff0c;也能给别的模块使用。 改一下springboot的版本号码 加入依赖和依赖管理&#xff1a; <properties><java.versi…...

12 Day:内存管理

前言&#xff1a;今天我们要完成我们操作系统的内存管理&#xff0c;以及一些数据结构和小组件的实现&#xff0c;在此之前大家需要了解我们前几天一些重要文件的内存地址存放在哪&#xff0c;以便我们更好的去编写内存管理模块 一&#xff0c;实现ASSERT断言 不知道大家有没有…...

linux基本功系列之lsof命令实战

文章目录前言一. lsof命令介绍二. 语法格式及常用选项三. 参考案例3.1 显示系统打开的文件3.2 查找某个文件相关的进程3.3 列出某个用户打开的文件信息3.4 列出某个程序进程所打开的文件信息3.5 查看某个进程号打开的文件3.6 列出所有的网络连接3.7 列出谁在使用某个端口3.8 恢…...

基础篇:02-SpringCloud概述

1.SpringCloud诞生 基于前面章节&#xff0c;我们深知微服务已成为当前开发的主流技术栈&#xff0c;但是如dubbo、zookeeper、nacos、rocketmq、rabbitmq、springboot、redis、es这般众多技术都只解决了一个或一类问题&#xff0c;微服务并没有一个统一的解决方案。开发人员或…...

【软件测试】软件测试工作上95%会遇到的问题,你遇到多少?

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 1、测试负责人要进行…...

4.5.4 LinkedList

文章目录1.特点2.常用方法3.练习:LinkedList测试1.特点 链表,两端效率高,底层就是链表实现的 List接口的实现类&#xff0c;底层的数据结构为链表&#xff0c;内存空间是不连续的 元素有下标&#xff0c;有序允许存放重复的元素在数据量较大的情况下&#xff0c;查询慢&am…...

Python之FileNotFoundError: [Errno 2] No such file or directory问题处理

错误信息&#xff1a;FileNotFoundError: [Errno 2] No such file or directory: ../AutoFrame/temp/report.xlsx相对于当前文件夹的路径&#xff0c;其实就是你写的py文件所在的文件夹路径&#xff01;python在对文件的操作时&#xff0c;需要特别注意文件地址的书写。文件的路…...

C语言中耳熟能详的printf与scanf

没有什么比时间更有说服力了&#xff0c;因为时间无需通知我们就可以改变一切了。---余华《活着》大家好&#xff0c;今天给大家分享的是C语言中的scanf与printf函数&#xff0c;一提起这两个函数&#xff0c;大家可能觉得这不就是打印和输入嘛&#xff1f;有什么可以说的&…...

【数据结构】复杂度讲解

目录 时间复杂度与空间复杂度&#xff1a;&#xff1a; 1.算法效率 2.时间复杂度 3.空间复杂度 4.常见时间复杂度以及复杂度OJ练习 时间复杂度与空间复杂度&#xff1a;&#xff1a; 什么是数据结构? 数据结构中是计算机存储,组织数据的方式,指相互之间存在一种或多种特定关…...

JAVA-线程池技术

目录 概念 什么是线程&#xff1f; 什么是线程池&#xff1f; 线程池出现背景 线程池原理图 JAVA提供线程池 线程池参数 如果本篇博客对您有一定的帮助&#xff0c;大家记得留言点赞收藏哦。 概念 什么是线程&#xff1f; 是操作系统能够进行运算调度的最小单位。&am…...

【C++】从0到1入门C++编程学习笔记 - 提高编程篇:STL常用算法(算术生成算法)

文章目录一、accumulate二、fill学习目标&#xff1a; 掌握常用的算术生成算法 注意&#xff1a; 算术生成算法属于小型算法&#xff0c;使用时包含的头文件为 #include <numeric> 算法简介&#xff1a; accumulate // 计算容器元素累计总和 fill // 向容器中添加元…...

【C++】static成员

&#x1f499;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;C 目录 概念 特性 出个题 概念 声明为static的类成员称为类的静态成员&#xff0c;用static修饰的成员变量&#xff0c;称之为静态成员变量&#xff1b; 用static修饰的成员函数&#xff0c;称之为静态…...

Python Scrapy 爬虫简单教程

1. Scrapy install 准备知识 pip 包管理Python 安装XpathCssWindows安装 Scrapy $>- pip install scrapy Linux安装 Scrapy $>- apt-get install python-scrapy 2. Scrapy 项目创建 在开始爬取之前&#xff0c;必须创建一个新的Scrapy项目。进入自定义的项目目录中&am…...

【DOCKER】容器概念基础

文章目录1.容器1.概念2.特点3.与虚拟机的对比2.docker1.概念2.命名空间3.核心概念3.命令1.镜像命令2.仓库命令1.容器 1.概念 1.不同的运行环境&#xff0c;底层架构是不同的&#xff0c;这就会导致测试环境运行好好的应用&#xff0c;到了生产环境就会出现bug&#xff08;就像…...

第九层(16):STL终章——常用集合算法

文章目录前情回顾常用集合算法set_intersectionset_unionset_difference最后一座石碑倒下&#xff0c;爬塔结束一点废话&#x1f389;welcome&#x1f389; ✒️博主介绍&#xff1a;一名大一的智能制造专业学生&#xff0c;在学习C/C的路上会越走越远&#xff0c;后面不定期更…...

一起学习用Verilog在FPGA上实现CNN----(六)SoftMax层设计

1 SoftMax层设计 1.1 softmax SoftMax函数的作用是输入归一化&#xff0c;计算各种类的概率&#xff0c;即计算0-9数字的概率&#xff0c;SoftMax层的原理图如图所示&#xff0c;输入和输出均为32位宽的10个分类&#xff0c;即32x10320 本项目softmax实现逻辑为&#xff1a; …...

pixhawk2.4.8-APM固件-MP地面站配置过程记录

目录一、硬件准备二、APM固件、MP地面站下载三、地面站配置1 刷固件2 机架选择3 加速度计校准4 指南针校准5 遥控器校准6 飞行模式7 紧急断电&无头模式8 基础参数设置9 电流计校准10 电调校准11 起飞前检查&#xff08;每一项都非常重要&#xff09;12 飞行经验四、遇到的问…...

【unity细节】关于资源商店(Package Maneger)无法下载资源问题的解决

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 秩沅 原创 收录于专栏&#xff1a;unity细节和bug ⭐关于资源商店为何下载不了的问题⭐ 文章目录⭐关于资源商店为何下载不了的问题…...

[Arxiv 2022] A Novel Plug-in Module for Fine-Grained Visual Classification

Contents MethodPlug-in ModuleLoss functionExperimentsReferencesMethod Plug-in Module Backbone:为了帮助模型抽取出不同尺度的特征,作者在 backbone 里加入了 FPNWeakly Supervised Selector:假设 backbone 的 i i...

RocketMQ Broker消息处理流程及部分源码解析

&#x1f34a; Java学习&#xff1a;Java从入门到精通总结 &#x1f34a; 深入浅出RocketMQ设计思想&#xff1a;深入浅出RocketMQ设计思想 &#x1f34a; 绝对不一样的职场干货&#xff1a;大厂最佳实践经验指南 &#x1f4c6; 最近更新&#xff1a;2023年2月10日 &#x…...

Java面试题:Java集合框架

文章目录一、Java集合框架二、Java集合特性三、各集合类的使用ArrayListLinkedListHashSetHashSet源码解析对源码进行总结HashSet可同步HashSet的使用HashMap四、Iterator迭代器五、遍历集合元素的若干方式参考文章&#xff1a;Hash详解参考文章&#xff1a;深入浅出学Java——…...

时间之间的比较与计算相差年、月、日、小时、分钟、毫秒、纳秒以及判断闰年--LocalDateTime

如何把String/Date转成LocalDateTime参考String、Date与LocalDate、LocalTime、LocalDateTime之间互转 String、Date、LocalDateTime、Calendar与时间戳之间互相转化参考String、Date、LocalDateTime、Calendar与时间戳之间互相转化 比较方法介绍 isBefore(ChronoLocalDateT…...

PyTorch学习笔记:nn.L1Loss——L1损失

PyTorch学习笔记&#xff1a;nn.L1Loss——L1损失 torch.nn.L1Loss(size_averageNone, reduceNone, reductionmean)功能&#xff1a;创建一个绝对值误差损失函数&#xff0c;即L1损失&#xff1a; l(x,y)L{l1,…,lN}T,ln∣xn−yn∣l(x,y)L\{l_1,\dots,l_N\}^T,l_n|x_n-y_n| l(…...

8x8x域名解析ip地址查询 1080p/北京seo做排名

输入n个整数&#xff0c;找出其中最小的K个数。例如输入4,5,1,6,2,7,3,8这8个数字&#xff0c;则最小的4个数字是1,2,3,4,。 基本思路&#xff1a;建立一个包含K个元素的大顶堆。 注&#xff1a;python中貌似只能直接建小顶堆。 # -*- coding:utf-8 -*- class Solution:def …...

重庆建工网/seo学校培训班

最近360、金山、可牛、遨游可谓打得一团火&#xff0c;毕竟在这么大竞争市场里面&#xff0c;分一块蛋糕可不是一件容易的事情&#xff0c;当中涉及到利益关系复杂&#xff0c;矛盾不断升级&#xff0c;同行里面究竟谁破坏了规矩&#xff0c;我们简单做一个陈述。 首先我们出场…...

内江市住房和城乡建设局网站电话号码/一份完整的电商运营方案

重要提示&#xff1a; 下一版本的 Microsoft SQL Server 将删除该功能。请不要在新的开发工作中使用该功能&#xff0c;并尽快修改当前还在使用该功能的应用程序。 改为使用链接服务器和链接服务器存储过程。 返回远程 SQL Server 数据库服务器在登录记录中显示的名称。 Transa…...

自己做的html网页怎么发布/seo标题优化步骤

西湖区附近上门维修电脑费用池故障、电池不充电、电池不放电、使用电池不能开机、电池供电时间缩短专业电脑精修 网络布线 安防安装专业维修&#xff1a;台式机 笔记本 网络维护 安防 网络布线 数据恢复 笔记本除尘 苹果系统安装 维修打印机 维修复印机专为电脑用户提供软硬件上…...

中国做的比较好的网站/seo站长博客

Semaphore简介Semaphore是并发包中提供的用于控制某资源同时被访问的个数操作系统的信号量是个很重要的概念&#xff0c;在进程控制方面都有应用。Java 并发库 的Semaphore 可以很轻松完成信号量控制&#xff0c;Semaphore可以控制某个资源可被同时访问的个数&#xff0c;通过 …...

wordpress5.1/外贸推广建站

C进阶-继承零、前言一、继承的概念和定义二、基类和派生类对象赋值转换三、继承中的作用域四、派生类的默认成员函数五、继承和友元六、继承和静态成员七、菱形继承和虚拟继承八、继承和组合九、继承相关面试题零、前言 从本章开始&#xff0c;我们已经达到了C的入门水平&#…...