ROS-3DSLAM(十六)lvi-sam项目总结

2021SC@SDUSC

学习内容概览

本次的项目lvi-sam主要分为两个大的模块:lidar模块和visual模块。我们小组学习先进行了lidar模块的学习,然后进行的visual模块。每个模块都分成了若干小的部分,分给每个组员主要负责,学习完成后进行组内交流。

我在lidar模块负责的部分是imuPreintegration(imu预积分)和mapOptmization(图优化);visual模块主要负责的是visual_loop(回环检测)。

imuPreintegration

imyPreintegration中主要的作用是将imu回传的数据进行 预积分处理

我对该节点的分析主要是通过它订阅的两个话题的回调函数展开的:


subImu      = nh.subscribe<sensor_msgs::Imu>  (imuTopic, 2000, &IMUPreintegration::imuHandler, this, ros::TransportHints().tcpNoDelay());

subOdometry = nh.subscribe<nav_msgs::Odometry>(PROJECT_NAME + "/lidar/mapping/odometry", 5, &IMUPreintegration::odometryHandler, this, ros::TransportHints().tcpNoDelay());

imuHandler:订阅 imu原始数据,用因子图优化的结果,施加两帧之间的 imu预计分量 ,预测每一时刻(imu频率)的imu里程计。

订阅 激光里程计,来自mapOptimization,用两帧之间的imu预计分量构建因子图,优化当前帧位姿(这个位姿仅用于更新每时刻的imu里程计,以及下一次因子图优化)。

可以理解为 两帧雷达帧之间有若干的imu帧,通过将这些imu进行预积分处理,进行之后的帧优化工作。

ROS-3DSLAM(十六)lvi-sam项目总结

发布了两个话题:都是关于imu里程计的信息。分别是里程计的信息和imu路径信息。

需要注意的是,接收到的原始imu数据和lidar激光帧都是在其原坐标系下的,在该节点实际参与计算时,需要将他们进行 坐标系统一

mapOptmization

mapOptmization的代码量比较大,但是当梳理清楚后可以发现该节点的所有工作都是围绕着对激光雷达帧的优化展开的。mapOptmization订阅了来自FeatureExtraction的当前激光帧点云信息,通过一系列步骤得到 优化后的激光帧:

  1. 对当前位姿进行初始化
  2. 如果是第一帧,用原始imu数据的RPY初始化当前帧位姿(旋转部分)。
  3. 如果是后续帧,用imu里程计计算两帧之间的增量位姿变换,作用于前一帧的激光位姿,得到当前帧的激光位姿。
  4. 提取局部 角点、平面点云集合,加入局部地图
  5. 对最近一帧的关键帧,搜索时空维度上相邻的关键帧集合,降采样一下
  6. 对关键帧集合中的每一帧,提取对应的角点、平面点,加入局部地图中
  7. 对第2步提取的当前激光帧角点、平面点集合 降采样
  8. scan-to-map优化当前帧位姿
  9. 判断当前帧是否为关键帧;设置当前帧为关键帧并执行 因子图优化
  10. 要求当 前帧特征点数量足够多,且匹配的点数够多,才执行优化
  11. 迭代30次(上限)优化
    1. 当前激光帧 角点寻找局部地图匹配点
    2. 更新当前帧位姿,将当前帧角点坐标变换到map系下,在局部地图中查找5个最近点,距离小于1m,且5个点构成直线(用距离中心点的协方差矩阵,特征值进行判断),则认为匹配上了
    3. 计算当前帧角点到平面的距离、垂线的单位向量,存储为角点参数
    4. 当前激光帧 平面点寻找局部地图匹配点
    5. 更新当前帧位姿,将当前帧平面点坐标变换到map系下,在局部地图中查找5个最近点,距离小于1m,且5个点构成平面(最小二乘拟合平面),则认为匹配上了。
    6. 计算当前帧平面点到平面的距离、垂线的单位向量,存储为平面点参数
    7. 提取当前帧中与局部地图匹配上了的角点、平面点,加入同一集合
    8. 对匹配特征点计算Jacobian矩阵,观测值为特征点到直线、平面的距离,构建高斯牛顿方程, 迭代优化当前帧位姿,存transformTobeMapped
  12. 用imu原始RPY数据与scan-to-map优化后的位姿进行加权融合,更新当前帧位姿的roll,pitch,约束z坐标
  13. 更新因子图中历史关键帧的位姿,更新里程计轨迹(可以理解为用当前帧来优化历史帧)
  14. 计算当前帧与前一帧位姿变换,如果变化太小,不设为关键帧,反之设为关键帧
  15. 添加激光里程计因子、GPS因子、闭环因子
  16. 执行因子图优化
  17. 得到当前帧优化后的位姿,位姿协方差
  18. 添加cloudKeyPoses3D,cloudKeyPoses6D,更新transformTobeMapped,添加当前关键帧的角点、平面点集合
  19. 发布激光里程计
  20. 发布里程计、点云、轨迹

其中imuPreintegration订阅的激光里程计话题就是该节点发布的。

  • 在这里mapOptmization节点发布的优化后的激光雷达帧被imuPreintegration节点订阅,然后通过自身计算的imu预积分进一步优化激光雷达帧位姿,从而将imu里程计和激光里程计相融合。
  • 注意:mapOptmization节点发布的信息同时被多个节点所订阅,我会在后面的节点数据流向中作详细的分析。

visual_odometry/visual_loop

该节点位于视觉部分。视觉部分主要分为三个节点,loop节点的作用是进行回环检测。

该节点主要订阅来自视觉部分的另一个节点estimator发布的话题,包括关键帧的位姿、位置和 图像信息,根据这些信息,通过回环检测算法(词袋模型),检测闭环,从而优化全局位姿。

该节点在初始化的时候会将项目中的数据集加载到程序中(config下的brief开头的文件)。这些数据集是词袋模型中的字典集,使用的描述子是BRIEF描述子。

之后会开启一个并行的线程,用来接收新的关键帧,并对他进行处理,判断是否形成闭环。

该节点发布的信息主要是回环检测优化过后的关键帧的相关信息。

节点间交互

首先看一下整个项目的rqt_graph图:

ROS-3DSLAM(十六)lvi-sam项目总结

我分析的部分的节点数据流向总的来说并不复杂。

; imuPreintegtration

可以看到 imuPreintegtration有2条入边,3条出边。

ROS-3DSLAM(十六)lvi-sam项目总结

首先是imuPreintegtration节点,接收来着imu的原始数据和mapOptmization的数据,如何处理在上面的总结中都有提到,这里能体现出项目的 雷达-惯导融合;而对于订阅该节点发布的话题的节点,通过在后续visual部分学习后,和同学进行交流后知道,被视觉部分的feature和odometry部分订阅,用来作雷达-视觉融合后的imu优化位姿;另一个则是被rvzi订阅,用来图像显示。

ROS-3DSLAM(十六)lvi-sam项目总结

mapOptmization

ROS-3DSLAM(十六)lvi-sam项目总结

mapOptmization订阅的话题包括点云信息和关键帧信息,这也与要优化的内容相匹配;而订阅该节点发布话题的节点较多,总结下来都是那些需要关键帧来做处理的节点。

; visual_odometry/visual_loop

在这里插入图片描述

以visual_loop节点为中心,可以看到之前的mapOptmization订阅的关键帧信息,正是通过视觉部分回环检测后的关键帧信息,这里较好的体现出了 视觉-雷达-惯导融合的部分:lidar部分的mapOptmization节点,用imu预积分的结果来优化从visual部分传来的关键帧数据。

该节点订阅的消息则很好判断:视觉里程计提供关键帧信息;imageProjection提供图片信息。

总结

在本次课程的总体学习中,我感觉除了对整个liv-sam项目的学习外,我还有很多其他收获:

  • 阅读分析长代码的能力有了很大的提升。
  • 对c++的一些深层次的语法的应用有了认识,如共享指针、重定义等等。
  • 对linux系统和ROS系统的使用也得到了锻炼,尤其是在我们安装测试lvi-sam项目的时候,确实花费了一些功夫,但也从中总结了很多经验教训。
  • 除了lvi-sam外,我还在本学期自学了其他SLAM的相关知识,以《SLAM14讲》书籍为线索,配合网上的各种博客教程,让我对整个SLAM有了更加全面、系统的学习,为日后在无人驾驶导航方面的继续深入学习打下了基础。
  • 这次可能也让我认识到了团队的力量,队员之间合理分工、互相学习,就会发挥出1+1>2的能力

Original: https://blog.csdn.net/qq_38170211/article/details/122182138
Author: handsome_hhh
Title: ROS-3DSLAM(十六)lvi-sam项目总结

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/598218/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 超分之EDSR

    这篇文章是SRResnet的升级版——EDSR,其对网络结构进行了优化(去除了BN层),省下来的空间可以用于提升模型的size来增强表现力。此外,作者提出了一种基于EDSR且适用于…

    人工智能 2023年7月26日
    078
  • pandas—数据选择的常见用法

    使用pandas时,经常会对某行、某列、满足条件的数据进行统计计算。以下总结了pandas数据选择的常见方法,包括loc、iloc等方法的使用。首先读取数据: df = pd.re…

    人工智能 2023年7月7日
    0112
  • Java——面向对象初阶

    1.什么是面向对象 面向对象程序设计(Object-Oriented Programming,OOP)是当今的主流程序设计范型,在面向对象世界里,一切皆为对象,面向对象是解决问题的…

    人工智能 2023年6月28日
    078
  • 机器学习之分类算法

    ### 回答1: B’educoder 机器学习_KNN算法’是指在 _机器学习_中,使用KNN(K-最近邻)算法进行数据分类或回归的过程。它通过计算每个样…

    人工智能 2023年7月3日
    053
  • Pandas处理时间类型数据

    时间序列数据描述 数据分析的分析对象不仅仅限于数值型和类别型两种,常用的数据类型还包括了时间类型.通过时间类型数据能够获取东岸对应的年月日和星期等信息.但时间类型数据在读入Pyth…

    人工智能 2023年7月6日
    097
  • PReLu

    1. 摘要 在R e L u ReLu R e L u的基础上作者提出了P R e L u PReLu P R e L u,在几乎没有增加额外参数的前提下既可以提升模型的拟合能力,…

    人工智能 2023年6月16日
    092
  • MXNe

    问题介绍 MXNet是一种深度学习框架,用于构建、训练和部署神经网络模型。在使用MXNet时,我们可能会遇到MXNet中某个计算函数或操作不正常的情况。我们需要进行MXNet的调试…

    人工智能 2023年12月31日
    040
  • 几个代码画出漂亮的词云图,python最简单的词云图教程(建议收藏)

    在开始编写程序之前,我们先了解一下词云图的作用,我们拿到一篇文章,想得到一些关键词,但文章篇幅很大,无法短时间得到关键词,这时我们可以通过程序将文章中的每个词组识别出来,统计每个词…

    人工智能 2023年7月4日
    085
  • 池化层如何帮助网络实现平移不变性(translatio

    问题介绍 在深度学习中,卷积神经网络(Convolutional Neural Networks, CNN)是一种常用的架构,广泛应用于计算机视觉任务中。然而,CNN的一个重要挑战…

    人工智能 2024年1月4日
    042
  • 八行代码实现图像分类-神一样的Mathematica

    引言 图像分类一直是神经网络的重要应用,热度居高不下,但是其相对复杂的代码量以及复杂的调试让很多小白望而却步。 其实,Mathematica里面内置的 Classify功能可以极其…

    人工智能 2023年7月2日
    084
  • 【Python数据分析与可视化】期末复习笔记整理(不挂科)

    大 _数据分析_与应用 _期末_考试 一,单项选择题,每小题1分,20小题共计20分 1、当前大数据技术的基础是由()首先提出的。 [单选题] * A、微软 B、百度 C、谷歌(正…

    人工智能 2023年7月17日
    084
  • Paddlenlp之UIE关系抽取模型【高管关系抽取为例】

    NLP专栏简介:数据增强、智能标注、意图识别算法|多分类算法、文本信息抽取、多模态信息抽取、可解释性分析、性能调优、模型压缩算法等 专栏详细介绍:NLP专栏简介:数据增强、智能标注…

    人工智能 2023年6月1日
    069
  • 6款支持中文语音识别开源软件的简单使用

    文章目录 前言 一、PaddleSpeech * 1.1 安装 1.2 运行 1.3 更多功能 二、ASRT * 2.1 安装 2.2 运行 三、MASR * 3.1 安装 3.2…

    人工智能 2023年6月24日
    088
  • 机器学习10—多元线性回归模型

    多元线性回归模型statsmodelsols 前言 * 什么是多元线性回归分析预测法 一、多元线性回归 二、多元线性回归模型求解 * 2.1最小二乘法实现参数估计—估计自变量X的系…

    人工智能 2023年6月15日
    0106
  • 【微机接口】中断系统:中断响应和处理的过程

    CPU获得中断类型码方式: (1)非屏蔽硬件中断请求,CPU内部会自动产生中断类型码2 (2)可屏蔽硬件中断请求,当CPU处于开中断状态时,由外部中断控制器将相应的中断类型码送给C…

    人工智能 2023年6月29日
    0103
  • 电视剧里的代码真能运行吗?

    大家好,欢迎来到 Crossin的编程教室 ! 前几天,后台老有小伙伴留言”爱心代码”。这不是Crossin很早之前发过的内容嘛,怎么最近突然又被人翻出来了…

    人工智能 2023年7月31日
    079
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球