>
返回

[论文阅读]LINS: A Lidar-Inertial State Estimator for Robust and Efficient Navigation

LINS 使用迭代的 ESKF 对 IMU 和 Lidar 数据进行耦合,这里对这篇论文做简单的整理。

简介

LINS 提出一种框架融合 IMU 和 Lidar 信息对无人机的实时姿态进行估计。LINS 的特点有:

  • 实现了雷达和惯性里程计的紧耦合,相比于 LIO-Mapping 速度提升了一个数量级
  • 提出了一种以机器人为中心的迭代 ESKF 算法,并通过各种场景验证其可行性
  • 代码开源(参考了 LOAM 和 LeGO-LOAM 的代码)

相关工作

下面列举一些相关工作。

纯雷达方法:

  • LOAM
  • LeGO-LOAM

Lidar 和 IMU 进行松耦合方法

  • IMU-aided LOAM:原始的 LOAM 代码中有提供利用 IMU 进行相对位姿初始化的功能

Lidar 和 IMU 进行紧耦合方法

  • LIPS - Lips: Lidarinertial 3d plane slam
  • LIO-Mapping

激光惯性融合里程计和建图

系统总览

框架整体如下所示:

整体分为三个部分:

  • 特征提取:从原始点云中提取稳定的特征
  • 激光惯性里程计:对状态进行预测并使用迭代卡尔曼滤波进行更新
  • 建图:对初始的位姿估计进行修正,并将新的特征更新至全局地图中

特征提取

特征提取部分基本和 LeGO-LOAM 和 LOAM 一致,可以参考之前我对这两个框架的整理:

通过特征提取主要是将点云中的平面点(LeGO-LOAM 关注的平面点为地面点)和边缘点特征进行提取。

使用迭代 ESKF 融合 Lidar 和 IMU 信息进行状态估计

LIO 模块主要将相邻两关键帧提取的点云特征,以及这两帧点云之间的 IMU 测量信息进行融合,估计载体的相对位姿变换。融合过程中主要涉及以下几个坐标系:

  • $W$:世界坐标系
  • $b_k$:k 时刻的 IMU 坐标系(下面也会称为载体系)
  • $l_k$:k 时刻的 Lidar 坐标系

在前后两帧点云匹配时,局部坐标系被设为上一帧点云对应时刻的 IMU 坐标系。

系统状态以及优化变量

论文中关注相邻两帧的以下状态:

$$
\begin{aligned}
    \boldsymbol{x}^{b_k}_w :&= \begin{bmatrix}\boldsymbol{p}^{b_k}_w & \boldsymbol{q}^{b_k}_{w}  \end{bmatrix}\\
    \boldsymbol{x}^{b_{k}}_{b_{k+1}} &:= 
    \begin{bmatrix}
        \boldsymbol{p}^{b_k}_{b_{k+1}}&
        \boldsymbol{v}^{b_k}_{b_{k+1}}&
        \boldsymbol{q}^{b_k}_{b_{k+1}}&
        \boldsymbol{b}_{a}&
        \boldsymbol{b}_{g}&
        \boldsymbol{g}^{b_k}
    \end{bmatrix}
\end{aligned}
$$

这里论文关注的是,上一帧的位姿(包括位置和姿态),以及从当前到上帧的相对变换作为局部状态,包括:平移和旋转、加速度计和陀螺仪的零偏、以及载体坐标系下的重力加速度。论文中使用基于误差状态的卡尔曼滤波来对局部状态进行估计。

根据 ESKF 的思想,局部状态 $\boldsymbol{x}^{b_k}_{b_{k+1}}$ 可以分为两部分:先验 ${}^{-}\boldsymbol{x}^{b_k}_{b_{k+1}}$ 以及误差 $\delta\boldsymbol{x}$,因此定义局部状态 $\boldsymbol{x}^{b_k}_{b_{k+1}}$ 的误差向量如下所示:

$$
\delta\boldsymbol{x} = \begin{bmatrix}
    \delta\boldsymbol{p} &
    \delta\boldsymbol{v} &
    \delta\boldsymbol{\theta} &
    \delta\boldsymbol{b}_a &
    \delta\boldsymbol{b}_g &
    \delta\boldsymbol{g}
\end{bmatrix}
$$

每一次对误差向量进行估计后,通过以下方式对先验估计进行修正:

$$
\begin{aligned}
\boldsymbol{x}^{b_k}_{b_{k+1}} &= {}^{-}\boldsymbol{x}^{b_k}_{b_{k+1}} \boxplus \delta\boldsymbol{x}
    &=\begin{bmatrix}
        {}^{-}\boldsymbol{p}^{b_k}_{b_{k+1}} + \delta\boldsymbol{p}\\
        {}^{-}\boldsymbol{v}^{b_k}_{b_{k+1}} + \delta\boldsymbol{v}\\
        {}^{-}\boldsymbol{q}^{b_k}_{b_{k+1}} \otimes \exp{(\delta\boldsymbol{\theta})}\\
        {}^{-}\boldsymbol{b}_{a} + \delta\boldsymbol{b}_a\\
        {}^{-}\boldsymbol{b}_{g} + \delta\boldsymbol{b}_g\\
        {}^{-}\boldsymbol{g}^{b_k} + \delta\boldsymbol{g}
    \end{bmatrix}
\end{aligned}
$$

其中,除了四元数的更新以外其他变量的更新都是普通的矩阵加法,四元数的更新首先将旋转向量的变化量(角增量)通过指数映射转换为四元数,如下所示:

$$
\begin{aligned}
    \exp{\boldsymbol{\psi}} &= (\boldsymbol{q}_0, \check{\boldsymbol{q}}) = 
        \begin{bmatrix}
        \cos{(||\boldsymbol{\psi}||/2)} & \sin{(||\boldsymbol{\psi}||/2)\frac{\boldsymbol{\psi}}{||\boldsymbol{\psi}||}}
        \end{bmatrix}\\
            &\approx\begin{bmatrix}
            1 & \boldsymbol{\psi} /2
        \end{bmatrix} \qquad ||\boldsymbol{\psi}||\approx0
\end{aligned}
$$

这里由于误差量通常接近 0,因此用近似的方式可以很简单将角增量映射至四元数,然后通过四元数的乘法即可完成更新。

误差状态传播

首先考虑连续时间下的误差传播模型(运动模型),误差传播模型如下所示,推导过程可以参考 基于 IMU 的惯性导航解算及误差分析

$$
\begin{aligned}
    \delta\dot{\boldsymbol{p}} &= \delta\boldsymbol{v}\\
    \dot{\delta\boldsymbol{v}}&=\boldsymbol{R}^{b_k}_t(\boldsymbol{n}_a -  \delta\boldsymbol{b}^a) -\boldsymbol{R}^{b_k}_t(\boldsymbol{a}_{m_t} - \boldsymbol{b}_a)^\wedge\delta\boldsymbol{\theta}- \delta\boldsymbol{g}^w\\
        \delta\dot{\boldsymbol{\theta}}&= -(\boldsymbol{\omega}_{m_t} - \boldsymbol{b}_g)^\wedge\delta\boldsymbol{\theta} + \boldsymbol{n}_g -  \delta\boldsymbol{b}_g\\
    \delta\dot{\boldsymbol{b}}_a &= \boldsymbol{n}_{b_a}\\
    \delta\dot{\boldsymbol{b}}_g &= \boldsymbol{n}_{b_g}\\
    \delta\dot{\boldsymbol{g}}^w &= \boldsymbol{0}
\end{aligned}
$$

上式中,$\boldsymbol{R}^{b_k}_t$ 为 t 时刻 IMU 系到 $b_k$ 对应时刻 IMU 系的旋转,$\boldsymbol{\omega}_{m_t}, \boldsymbol{a}_{m_t}$ 分别为 t 时刻 IMU 加速度计和陀螺仪的原始测量值。除此之外,上式中考虑的噪声有:加速度计和陀螺仪的测量白噪声(作用在加速度计和陀螺仪的测量值上)以及加速度计和陀螺仪的随机游走(左右在加速度计和陀螺仪的零偏上),即 $\boldsymbol{w} = [\boldsymbol{n}_a, \boldsymbol{n}_g, \boldsymbol{n}_{b_a}, \boldsymbol{n}_{b_g}]$。将上式中的状态值和噪声区分开,有:

$$
\delta\dot{\boldsymbol{x}} = \boldsymbol{F}_t\delta\boldsymbol{x} + \boldsymbol{G}_t\boldsymbol{w}_t
$$

其中,

$$
\begin{aligned}
    \boldsymbol{F}_t &= \begin{bmatrix}
        \boldsymbol{0} & \boldsymbol{I} & \boldsymbol{0} &\boldsymbol{0} &\boldsymbol{0} &\boldsymbol{0} \\
        \boldsymbol{0} & \boldsymbol{0} & -\boldsymbol{R}^{b_k}_t(\boldsymbol{a}_{m_t} - \boldsymbol{b}_a)^\wedge &-\boldsymbol{R}^{b_k}_t &\boldsymbol{0} & -\boldsymbol{I} \\
        \boldsymbol{0} & \boldsymbol{0} & -(\boldsymbol{\omega}_{m_t} - \boldsymbol{b}_g)^\wedge &\boldsymbol{0} &-\boldsymbol{I} &\boldsymbol{0} \\
        \boldsymbol{0} & \boldsymbol{0} & \boldsymbol{0} &\boldsymbol{0} &\boldsymbol{0} &\boldsymbol{0} \\
        \boldsymbol{0} & \boldsymbol{0} & \boldsymbol{0} &\boldsymbol{0} &\boldsymbol{0} &\boldsymbol{0} \\
        \boldsymbol{0} & \boldsymbol{0} & \boldsymbol{0} &\boldsymbol{0} &\boldsymbol{0} &\boldsymbol{0}
    \end{bmatrix}\\
    \boldsymbol{G}_t &= \begin{bmatrix}
        \boldsymbol{0} & \boldsymbol{0} & \boldsymbol{0} & \boldsymbol{0} \\
        \boldsymbol{R}^{b_k}_t & \boldsymbol{0} & \boldsymbol{0} & \boldsymbol{0} \\
        \boldsymbol{0} & \boldsymbol{I} & \boldsymbol{0} & \boldsymbol{0} \\
        \boldsymbol{0} & \boldsymbol{0} & \boldsymbol{I} & \boldsymbol{0} \\
        \boldsymbol{0} & \boldsymbol{0} & \boldsymbol{0} & \boldsymbol{I} \\
        \boldsymbol{0} & \boldsymbol{0} & \boldsymbol{0} & \boldsymbol{0} \\
    \end{bmatrix}
\end{aligned}
$$

这里我的推导结果和作者有点不一样,不确定是哪里有问题,但是至少作者在重力加速度变化量的变量应该笔误了。

接下来对传播模型进行离散化,离散后的公式如下所示:

$$
\begin{aligned}
    \delta\boldsymbol{x}_{t_{\tau}} &= (\boldsymbol{I} + \boldsymbol{F}_{t_{\tau}}\Delta t)\delta\boldsymbol{x}_{t_{\tau - 1}}\\
    \boldsymbol{P}_{t_{\tau}} &= (\boldsymbol{I} + \boldsymbol{F}_{t_{\tau}}\Delta t)\boldsymbol{P}_{t_{\tau - 1}}(\boldsymbol{I} + \boldsymbol{F}_{t_{\tau}}\Delta t)^T + (\boldsymbol{G}_{t_{\tau}}\Delta t)\boldsymbol{Q}(\boldsymbol{G}_{t_{\tau}}\Delta t)^T
\end{aligned}
$$

上式中,$\Delta t = t_{\tau} - t_{\tau - 1}$ 是 IMU 测量采样周期,$\boldsymbol{Q}$ 是事先设定的噪声协方差。

此外还需要对 IMU 测量数据进行解算,计算出两时刻间状态相对变化的先验估计 ${}^{-}\boldsymbol{x}^{b_k}_{b_{k+1}}$,可以参考:基于 IMU 的惯性导航解算及误差分析

误差状态更新

上述误差传播过程不是新的内容,而这篇论文主要的创新点则在误差卡尔曼滤波的更新环节,这里作者采用采用了迭代卡尔曼滤波的思路,将更新环节视为一个优化问题,优化的残差为:实际的观测值和理论观测值之间的残差、以及误差状态,即求解以下问题:

$$
\arg\min_{\delta\boldsymbol{\theta}}(||\delta\boldsymbol{x}||_{\boldsymbol{P}_k^{-1}} + ||f({}^{-}\boldsymbol{x}^{b_k}_{b_{k+1}}\boxplus\delta\boldsymbol{x})||_{(\boldsymbol{J}_k\boldsymbol{M}_k\boldsymbol{J}_k^T)^{-1}}
$$

上式尝试最小化两个变量:

  • $||\delta\boldsymbol{x}||_{\boldsymbol{P}_k^{-1}}$$\delta\boldsymbol{x}$ 和先验估计之间的马氏距离,协方差为 $\delta\boldsymbol{x}$ 的协方差矩阵
  • $||f({}^{-}\boldsymbol{x}^{b_k}_{b_{k+1}}\boxplus\delta\boldsymbol{x})||_{(\boldsymbol{J}_k\boldsymbol{M}_k\boldsymbol{J}_k^T)^{-1}}$ 为更新后的状态计算出的理论测量值和实际测量值的马氏距离,权重为测量噪声协方差 $\boldsymbol{M}_k$ 经由测量模型对噪声的雅可比 $\boldsymbol{J}_k$ 进行扩散。

由于这里观测是一系列特征点(包括平面特征和角点特征),因此观测模型如下所示:

$$
f_i(\boldsymbol{x}^{b_k}_{b_{k+1}}) =\left\{
\begin{aligned}
    &\frac{|(\hat{\boldsymbol{p}}^{l_k}_i-\boldsymbol{p}_a^{l_k})\times(\hat{\boldsymbol{p}}^{l_k}_i-\boldsymbol{p}_b^{l_k})|}{|\boldsymbol{p}_a^{l_k} - \boldsymbol{p}_b^{l_k}|} &\qquad\qquad \text{if} \boldsymbol{p}_i^{l_{k+1}} \in \mathbb{F}_e\\
    &\frac{|(\hat{\boldsymbol{p}}^{l_k}_i-\boldsymbol{p}_a^{l_k})^T(\boldsymbol{p}_a^{l_k}-\boldsymbol{p}_b^{l_k})\times(\boldsymbol{p}_a^{l_k}-\boldsymbol{p}_c^{l_k})|}{|(\boldsymbol{p}_a^{l_k}-\boldsymbol{p}_b^{l_k})\times(\boldsymbol{p}_a^{l_k}-\boldsymbol{p}_c^{l_k})|} &\qquad\qquad \text{if} \boldsymbol{p}_i^{l_{k+1}} \in \mathbb{F}_p\\
\end{aligned}
\right.
$$

上述模型中:

  • 如果 $\boldsymbol{p}_i^{l_{k+1}}$ 是角点(边缘特征),将其利用 $\boldsymbol{x}^{b_k}_{b_{k+1}}$ 投影至上一时刻坐标系得到 $\hat{\boldsymbol{p}}^{l_k}_i$ 中并进行特征误差的计算,大致思路是计算该点到上一时刻对应边缘线(两个点 $\boldsymbol{p}_a^{l_k}, \boldsymbol{p}_b^{l_k}$ 组成)的距离
  • 如果 $\boldsymbol{p}_i^{l_{k+1}}$ 是平面点(面特征),将其利用 $\boldsymbol{x}^{b_k}_{b_{k+1}}$ 投影至上一时刻坐标系得到 $\hat{\boldsymbol{p}}^{l_k}_i$ 并进行特征误差的计算,大致思路是计算该点到上一时刻对应平面(三个点 $\boldsymbol{p}_a^{l_k}, \boldsymbol{p}_b^{l_k}, \boldsymbol{p}_c^{l_k}$ 组成)的距离。特征误差计算可以参考:[论文阅读]LOAM: Lidar Odometry and Mapping in Real-time

由于坐标点是在雷达系下的,因此利用位姿相对变化进行转换时还需要引入 IMU 和雷达之间的外参(外参线下标定),转换关系如下所示:

$$
\hat{\boldsymbol{p}}^{l_k}_i = {\boldsymbol{R}^b_l}^T(\boldsymbol{R}^{b_k}_{b_{k+1}}(\boldsymbol{R}^b_l\boldsymbol{p}_i^{l_{k+1}}+ \boldsymbol{p}_l^b)+\boldsymbol{p}^{b_k}_{b_{k+1}}-\boldsymbol{p}^b_l)
$$

了解了观测误差之后,接下来就是使用卡尔曼滤波的更新环节对这两个误差进行最小化:

$$
\begin{aligned}
    \boldsymbol{K}_{k, j} &= \boldsymbol{P}_k\boldsymbol{H}^T_{k, j}(\boldsymbol{H}_{k,j}\boldsymbol{P}_k\boldsymbol{H}^T_{k, j} + \boldsymbol{J}^{k,j}\boldsymbol{M}_k\boldsymbol{J}^T_{k,j})^{-1}\\
    \Delta\boldsymbol{x}_j &= \boldsymbol{K}_{k,j}(\boldsymbol{H}_{k,j}\delta\boldsymbol{x}_j - f({}^{-}\boldsymbol{x}^{b_k}_{b_{k+1}}\boxplus\delta\boldsymbol{x}))\\
    \delta\boldsymbol{x}_{j+1} &= \delta\boldsymbol{x}_j + \Delta\boldsymbol{x}_j
\end{aligned}
$$

上面三个式子描述了误差状态的迭代更新环节,$j$ 表示当前迭代次数,$\boldsymbol{H}_{k,j}$ 为观测模型对状态的雅可比矩阵。这里作者提到,在每一次对误差向量进行更新后,都会重新提取特征来进一步减小误差,误差重新提取后再接着计算新的 $\boldsymbol{H}_{k,j}, \boldsymbol{J}^{k,j}, \boldsymbol{K}_{k, j}$

当误差状态收敛之后,用其对先验估计进行修正得到 $\boldsymbol{x}^{b_k}_{b_{k+1}}$ 的后验估计。并以此对当前时刻点云进行去畸变。最后,使用以下测量值,进行一相邻时刻状态变化 $\boldsymbol{x}^{b_{k+1}}_{b_{k+2}}$的初始化:

$$
\boldsymbol{x}^{b_{k+1}}_{b_{k+2}} = \begin{bmatrix}
    \boldsymbol{0} & \boldsymbol{v}^{b_{k+1}}_{b_{k+1}} & \boldsymbol{q}_0 & \boldsymbol{b}_a & \boldsymbol{b}_g & \boldsymbol{g}^{b_{k+1}}
\end{bmatrix}
$$

上式中,$\boldsymbol{v}^{b_{k+1}}_{b_{k+1}}, \boldsymbol{g}^{b_{k+1}}$ 可以由当前时刻的速度/重力加速度 $\boldsymbol{v}^{b_{k}}_{b_{k+1}}, \boldsymbol{g}^{b_{k}}$和当前状态后验估计中 $\boldsymbol{R}^{b_{k+1}}_{b_k}$,同时协方差矩阵也继承下来。而相对位置和姿态误差以及相关的协方差矩阵被重置。

全局位姿更新

每当误差向量更新完成后,需要对载体的世界坐标系下的位姿进行更新,如下所示:

$$
\boldsymbol{x}^{b_{k+1}}_w =
\begin{bmatrix}
    \boldsymbol{p}^{b_{k+1}}_w\\
    \boldsymbol{q}^{b_{k+1}}_w\\
\end{bmatrix} =
\begin{bmatrix}
    \boldsymbol{R}^{b_{k+1}}_{b_k}(\boldsymbol{p}^{b_k}_w - \boldsymbol{p}^{b_k}_{b_{k+1}})\\
    \boldsymbol{q}^{b_{k+1}}_{b_k}\otimes\boldsymbol{q}^{b_k}_w
\end{bmatrix}
$$

卡尔曼滤波初始化

论文中作者对卡尔曼滤波初始化的操作有:

  • 标定 IMU 加速度计的零偏以及 Lidar 和 IMU 之间的外参,陀螺仪零偏使用静置一段时间内测量值的平均值来表示
  • 初始化姿态(roll 和 pitch)由移动前加速度计测量值校正后的值来计算得到
  • 初始重力加速度通过使用初始的 roll 和 pitch 将导航系的重力加速度转换至局部坐标系得到

实验

TODO

结论

TODO

Built with Hugo
Theme Stack designed by Jimmy