0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

LINS算法的框架与代码分析

3D视觉工坊 来源:ICRA 2020 作者:ICRA 2020 2022-10-09 14:57 次阅读

作者:Chao Qin1 Haoyang Ye Christian E. Pranata, Jun Han, Shuyang Zhang, and Ming Liu

来源:ICRA 2020

摘要

LINS是以滤波为主的IMU、激光雷达紧耦合的激光SLAM算法。该算法的主要创新点就是用以 IESKF(即迭代误差卡尔曼)为框架,融合 IMU 与激光雷达。该算法于发表于 2020 年 ICRA, 由于网上已经有些同学对算法做了介绍,一些基础的知识本文不再赘述,本文将详细围绕以下两个问题介绍,希望对读者理解算法有所帮助: 1、LINS 是如何将激光观测融入滤波框架的? 2、滤波框架与优化框架有何不同?

算法框架

为了讲述通畅还是先介绍下 LINS 算法的主要框架,算法流程图如下:

38aeaae8-4335-11ed-96c9-dac502259ad0.png

结合代码不难发现,算法的特征提取、以及 Mapping 部分都是直接沿用了 Lego-Loam 算法的,不再赘述。算法的核心创新点为前端激光里程计部分,对应代码的 lins_fusion_node 节点。

39014780-4335-11ed-96c9-dac502259ad0.png

理论与代码分析

(一)LINS 是如何将激光观测引入滤波框架的?1、从代码中可以看出,LINS只是前端里程计部分采用了滤波框架(即 scan-to-scan 估计帧间位姿),而后端 scan-to-map部分仍然采用优化方式求解(即用 LM 方法求解位姿)。2、将点线/点面距离残差作为观测方程引入到代价函数中。根据论文公式 12,可以看到代价函数分为两个部分,前面是最小化误差状态(即最小化后验与后先验状态之差),后面的复合函数 f(x)表示点线/面距离,即最小化点线/面距离。也就是说把点线/面距离残差作为观测方程,有了观测方程,然后带入卡尔曼滤波相关公式即可求解。不过,作为一个创新点,作者采用了 IESKF,即迭代误差卡尔曼作为滤波框架。

394c56b2-4335-11ed-96c9-dac502259ad0.png

IESKF 与 ESKF 最大的区别就是,在做状态更新时是采用迭代求解的方式计算的,类似高斯牛顿等优化方法求解时需要多次迭代直到收敛。通过迭代的求解的方式,与 ESKF 相比可以得到更精确的解。对应论文公式 16。

396339a4-4335-11ed-96c9-dac502259ad0.png

3、LINS 代码实现。LINS 中滤波相关的核心部分在 include/StateEstimator.hpp 中的 performIESKF()函数中实现。

3986d54e-4335-11ed-96c9-dac502259ad0.png

代码中基本是按照论文中的公式 12-18 实现的,比较好读懂。代码中的 findCorrespondingSurfFeatures(), findCorrespondingCornerFeatures() 函数即为 costfunction 中的点面/线距离残差计算函数,基本沿用了loam的实现方式,其中jacobianCoffSurfs, jacobianCoffCorns 变量为点面/线距离残差关于点的雅可比矩阵,该过程在之前推送的文章《泡泡点云时空 LOAM 专题-3】LOAM 代价函数设计与雅可比求解详细推导(上)》有详细的推导,感兴趣的可以去看下。

39b20566-4335-11ed-96c9-dac502259ad0.png

代码中,Hk_为点面/线距离残差关于误差状态的雅可比矩阵,作者是用 BCH 近似求解的,其实含义上与 LOAM 算法在 Odometry,Mapping 部分最终求解得到的是一样的,都是点面/线距离关于误差状态的雅可比矩阵,只不过求解方式表达形式不同,LOAM 中姿态是用欧拉角表示的,LINS 是四元数。

3a028798-4335-11ed-96c9-dac502259ad0.png

performIESKF()函数的剩余部分就是论文中公式 15-18 的实现,比较易懂就不赘述了。 (二)滤波与优化有何不同 其实,讨论滤波框架与优化框架的不同是一个相对比较大的问题,为了更具体一些,我们仅就 LINS 算法使用的 IESKF 做的滤波的 LIO 前端与 LIO-SAM 等以高斯牛顿或LM优化为框架的 LIO 前端做对比(当然严格意义上来说,LIO-SAM 的前端其实只有预积分,省略了激光里程计,使用 scan-to-map 匹配校正 imu 零偏,但是不影响我们的分析过程)。 1、框架差异。从框架上说,LINS 使用的 IESKF 是将所有的状态一起放到滤波框架里估计,而以 LIO-SAM 为代表的算法前端,是预积分+scan-to-map 算法,其中 scan-to-map 模块使用 LM方法计算帧图位姿,得到计算出的位姿后,输入预积分模块校正imu 零偏。也就是说 imu 零偏的估计与激光匹配位姿计算是分开的,而 LINS 使用了 IESKF 将二者当作状态一起估计。 2、理论差异。其实在 1993 年的论文[2]中就已经证明了 IKF 的更新方程与 Gauss-Newton 理论上是等价的。详细的推导过程可以参考论文,为了方便理解,我们在这里做一个简化的推导。 参照 LINS 论文中公式 15-17

3a390796-4335-11ed-96c9-dac502259ad0.png

当我们使用 Gauss-Newton 求解待估状态时,通常用到的公式是:

3a941424-4335-11ed-96c9-dac502259ad0.png

其实从方程的形式上,怎么看这个方程也与 LINS 中的公式 16 差别挺大。下面我们尝试尽量直白的解释下 Gauss-Newton 与 IESKF 更新方程的等价性。 对于一些刚接触SLAM的同学来说,可能有一个疑问是Gauss-Newton 求解时很少用到协方差矩阵,但是卡尔曼的更新方程中的卡尔曼增益是需要计算协方差矩阵的,如何理解? 其实 Gauss-Newton 只是一个公式,当我们设计误差函数时带有协方差矩阵,那么 Gauss-Newton 求解过程中就会有协方差矩阵的计算,实际上论文[2]中也正是通过这种方式证明的等价性。由于我们实际在用 Gauss-Newton 求解时基本不考虑协方差矩阵(指点云匹配求解位姿时),为了更好的理解,我们假设噪声相关的矩阵都为单位矩阵,那么 LINS 论文中的公式 15 变为:

3aa78b26-4335-11ed-96c9-dac502259ad0.png

那么公式 16 变为

3ac59b3e-4335-11ed-96c9-dac502259ad0.png

到这一步可以看到跟 Gauss-Newton 的方程不一致。这个时候要借助一个重要的公式实现转换,即 matrix inversion lemma,即矩阵求逆引理,即如果 A,C 为非奇异矩阵,那么有

3add292a-4335-11ed-96c9-dac502259ad0.png

那么公式 16 可以变为:

3af0b9ea-4335-11ed-96c9-dac502259ad0.png

到这里,其实我们看这个形式跟优化的方法已经很像了,但是跟标准的高斯牛顿求解方程还是不一致。现在我们定义如下观测方程:

3b0c8080-4335-11ed-96c9-dac502259ad0.png

则其对应的雅可比矩阵为,

3b231e6c-4335-11ed-96c9-dac502259ad0.png

因此,

3b3c0166-4335-11ed-96c9-dac502259ad0.png

可以看到此时方程出现了我们熟悉的高斯牛顿的公式。因为滤波的框架里面其实是同时考虑状态方程与观测方程,因此使用最小二乘的框架构建的时候需要构建成如上形式。 个人的观点是,如果单从最终的公式来看,使用高斯牛顿求解两帧点云的相对位姿,与 LINS 中使用 IESKF 求解结果并不完全相等,因为求解出来的状态更新方程并不是完全一样,但是从理论上说,IESKF 的更新方程可以统一到最小二乘的框架里,因此效果上二者应该是近似的。

算法效果

38774fe4-4335-11ed-96c9-dac502259ad0.png

3b7b9150-4335-11ed-96c9-dac502259ad0.png

根据论文提供的实验结果,如果考虑前端+后端的整体处理效果,算法在公园与林间场景表现较好,但是在城区以及港口效果不及 LIOM。如果只考虑前端激光里程计,算法在除了港口场景外都是最优的,毕竟论文的主要贡献在前端。

总结

本文通过理论分析与代码对比介绍了 LINS 算法,其中主要介绍了 LINS 如何使用滤波框架做激光 SLAM,以及优化与滤波的区别。主要是把前端激光里程计部分改为了滤波框架,并且引入了 IMU 做紧耦合。同时,我们也推导了滤波的更新方程其实可以由高斯牛顿法推导而来。希望对读者有所帮助,如果错误烦请指出。

审核编辑:郭婷

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 激光雷达
    +关注

    关注

    961

    文章

    3661

    浏览量

    186763

原文标题:LINS算法与代码解析

文章出处:【微信号:3D视觉工坊,微信公众号:3D视觉工坊】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    [资料分享]+Android框架揭秘

    `[资料分享]+Android框架揭秘一、看威武霸气的封面作者:(韩)金泰延等 二、读读简介,看看适合你吗? 《android框架揭秘》通过对android系统源代码分析,主要介绍
    发表于 09-26 09:47

    基于SCADE Vision的主动学习框架

    基于SCADE Vision的主动学习框架Ansys SCADE Vision-感知算法鲁棒性分析测试工具
    发表于 02-05 06:31

    瑞芯微rv1126 SDK代码基础分析---rkmedia框架分析

    瑞芯微rv1126 SDK代码基础分析---rkmedia框架分析谁知道啊?能否告知一下呢http://blgxb.qiuyi.cn/gxb/http://blgxb.qiuyi.cn
    发表于 07-16 15:49

    MapReduce框架下的Skyline结果优化算法_马学森

    MapReduce框架下的Skyline结果优化算法_马学森
    发表于 03-19 11:41 0次下载

    基于等角紧框架的稀疏信号重构算法

    在1993年,Mallat和Zhang在研究了小波分析后,提出将信号在过完备原子库上进行分解,然后根据信号本身特点自适应的选取,从而得到信号的稀疏表示。但与之发展起来的重构算法具有的高计算复杂度使其
    发表于 12-12 11:00 0次下载
    基于等角紧<b class='flag-5'>框架</b>的稀疏信号重构<b class='flag-5'>算法</b>

    WIFI指纹定位算法的基本框架

    的基本框架,并将K均值算法、近邻传播算法、自适应传播算法应用到Wi-Fi指纹定位;然后以一个实验室为例,分析室内POI划分与空间区域的关系,
    发表于 12-23 09:43 0次下载
    WIFI指纹定位<b class='flag-5'>算法</b>的基本<b class='flag-5'>框架</b>

    多项式插值算法框架

    多项式近似理论为图像的多项式插值算法提出一个统一的理论框架。密切多项式近似的理论框架包括采样点数目、密切阶数和导数近似规则三个部分,它既可以用于分析现有的多项式插值
    发表于 01-05 13:55 0次下载

    TouchGFX代码框架以及如何添加用户代码

    1. 摘要 本文档主要介绍,TouchGFX代码框架以及如何添加用户代码。 2. 准备工作 可以正常运行的TouchGFX工程 3. 代码结构 TouchGFX的
    的头像 发表于 01-18 11:28 2327次阅读
    TouchGFX<b class='flag-5'>代码</b><b class='flag-5'>框架</b>以及如何添加用户<b class='flag-5'>代码</b>

    在单片机中使用的RTOS代码框架

    在这次开发中,也是遇到了很多的问题,主要的感想是关于代码框架。在单片机开发中,特别是使用了RTOS的时候,一个良好的代码框架真的是相当的必要的。
    的头像 发表于 02-10 14:21 740次阅读

    10种聚类算法和Python代码1

    分享一篇关于聚类的文章: **10种聚类算法和Python代码** 。文末提供`jupyter notebook`的完整代码获取方式。 聚类或聚类分析
    的头像 发表于 02-20 13:57 546次阅读
    10种聚类<b class='flag-5'>算法</b>和Python<b class='flag-5'>代码</b>1

    10种聚类算法和Python代码2

    分享一篇关于聚类的文章: **10种聚类算法和Python代码** 。文末提供`jupyter notebook`的完整代码获取方式。 聚类或聚类分析
    的头像 发表于 02-20 13:57 689次阅读
    10种聚类<b class='flag-5'>算法</b>和Python<b class='flag-5'>代码</b>2

    10种聚类算法和Python代码3

    分享一篇关于聚类的文章: **10种聚类算法和Python代码** 。文末提供`jupyter notebook`的完整代码获取方式。 聚类或聚类分析
    的头像 发表于 02-20 13:57 851次阅读
    10种聚类<b class='flag-5'>算法</b>和Python<b class='flag-5'>代码</b>3

    10种聚类算法和Python代码4

    分享一篇关于聚类的文章: **10种聚类算法和Python代码** 。文末提供`jupyter notebook`的完整代码获取方式。 聚类或聚类分析
    的头像 发表于 02-20 13:57 1000次阅读
    10种聚类<b class='flag-5'>算法</b>和Python<b class='flag-5'>代码</b>4

    [源代码]Python算法详解

    [源代码]Python算法详解[源代码]Python算法详解
    发表于 06-06 17:50 0次下载

    Linux Led子系统代码框架分析

    代码框架分析 led-class.c (led 子系统框架的入口) 维护 LED 子系统的所有 LED 设备,为 LED 设备提供注册操作函数: led_classdev_regist
    的头像 发表于 07-20 10:36 419次阅读