LIO-SAM源码解读:总体架构篇

本文详细解读了LIO-SAM(激光惯导SLAM)的源码,包括激光运动畸变校正、特征提取、IMU预积分和因子图优化四个核心部分。通过激光校正、特征匹配、因子图优化实现精确的定位与建图,同时涉及闭环检测以提高SLAM系统的鲁棒性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考文章链接:知乎 卢涛

关于LIO-SAM的论文解读,请查看 论文解读
本文旨在对源代码进行阅读学习,这里记录下来,希望可以帮到有需要的同学,如有错误的地方,请您批评指正。

目录

  1. LIO-SAM源码解读(一):ImageProjection
  2. LIO-SAM源码解读(二):FeatureExtraction
  3. LIO-SAM源码解读(三):TransformFusion 和 IMUPreintegration
  4. LIO-SAM源码解读(四):mapOptimization

整体流程

代码结构图
在这里插入图片描述

因子图
在这里插入图片描述

整体流程
在这里插入图片描述

1、激光运动畸变校正。利用当前帧起止时刻之间的IMU数据、IMU里程计数据计算预积分,得到每一时刻的激光点位姿,从而变换到初始时刻激光点坐标系下,实现校正。

2、提取特征。对经过运动畸变校正之后的当前帧激光点云,计算每个点的曲率,进而提取角点、平面点特征。

3、scan-to-map匹配。提取布局关键帧map的特征点,与当前帧特征点执行scan-to-map匹配,更新当前帧的位姿。

4、因子图优化。添加激光里程计因子、GPS因子、闭环因子,执行因子图优化,更新所有关键帧位姿。

5、闭环检测。在历史关键帧中找候选闭环匹配帧,执行scan-to-map匹配,得到位姿变换,构建闭环因子,加入到因子图中一并优化。

一、激光运动畸变校正(ImageProjection)

功能简介

1.利用当前激光帧起止时刻间的imu数据计算旋转增量,IMU里程计数据(来自ImuPreintegration)计算平移增量,进而对该帧激光每一时刻的激光点进行运动畸变校正(利用相对于激光帧起始时刻的位姿增量,变换当前激光点到起始时刻激光点的坐标系下,实现校正);

2.同时用IMU数据的姿态角(RPY,roll、pitch、yaw)、IMU里程计数据的的位姿,对当前帧激光位姿进行粗略初始化。

订阅

1.订阅原始IMU数据;

2.订阅IMU里程计数据,来自ImuPreintegration,表示每一时刻对应的位姿;

3.订阅原始激光点云数据。

发布

1.发布当前帧激光运动畸变校正之后的有效点云,用于rviz展示;

2.发布当前帧激光运动畸变校正之后的点云信息,包括点云数据、初始位姿、姿态角、有效点云数据等,发布给FeatureExtraction进行特征提取。

二、点云特征提取(FeatureExtraction)

功能简介

对经过运动畸变校正之后的当前帧激光点云,计算每个点的曲率,进而提取角点、平面点(用曲率的大小进行判定)。

订阅

订阅当前激光帧运动畸变校正后的点云信息,来自ImageProjection。

发布

1.发布当前激光帧提取特征之后的点云信息,包括的历史数据有:运动畸变校正,点云数据,初始位姿,姿态角,有效点云数据,角点点云,平面点点云等,发布给MapOptimization;

2.发布当前激光帧提取的角点点云,用于rviz展示;

3.发布当前激光帧提取的平面点点云,用于rviz展示。

三、IMU预积分(ImuPreintegration)

1.TransformFusion类

功能简介

主要功能是订阅激光里程计(来自MapOptimization)和IMU里程计,根据前一时刻激光里程计,和该时刻到当前时刻的IMU里程计变换增量,计算当前时刻IMU里程计;rviz展示IMU里程计轨迹(局部)。

订阅

1.订阅激光里程计,来自MapOptimization;

2.订阅imu里程计,来自ImuPreintegration。

发布

1.发布IMU里程计,用于rviz展示;

2.发布IMU里程计轨迹,仅展示最近一帧激光里程计时刻到当前时刻之间的轨迹。

2. ImuPreintegration类

功能简介

1.用激光里程计,两帧激光里程计之间的IMU预计分量构建因子图,优化当前帧的状态(包括位姿、速度、偏置);

2.以优化后的状态为基础,施加IMU预计分量,得到每一时刻的IMU里程计。

订阅

1.订阅IMU原始数据,以因子图优化后的激光里程计为基础,施加两帧之间的IMU预计分量,预测每一时刻(IMU频率)的IMU里程计;

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

发布

1.发布imu里程计;

四、因子图优化(MapOptimization)

功能简介

1.scan-to-map匹配:提取当前激光帧特征点(角点、平面点),局部关键帧map的特征点,执行scan-to-map迭代优化,更新当前帧位姿;

2.关键帧因子图优化:关键帧加入因子图,添加激光里程计因子、GPS因子、闭环因子,执行因子图优化,更新所有关键帧位姿;

3.闭环检测:在历史关键帧中找距离相近,时间相隔较远的帧设为匹配帧,匹配帧周围提取局部关键帧map,同样执行scan-to-map匹配,得到位姿变换,构建闭环因子数据,加入因子图优化。

订阅

1.订阅当前激光帧点云信息,来自FeatureExtraction;

2.订阅GPS里程计;

3.订阅来自外部闭环检测程序提供的闭环数据,本程序没有提供,这里实际没用上。

发布

1.发布历史关键帧里程计;

2.发布局部关键帧map的特征点云;

3.发布激光里程计,rviz中表现为坐标轴;

4.发布激光里程计;

5.发布激光里程计路径,rviz中表现为载体的运行轨迹;

6.发布地图保存服务;

7.发布闭环匹配局部关键帧map;

8.发布当前关键帧经过闭环优化后的位姿变换之后的特征点云;

9.发布闭环边,rviz中表现为闭环帧之间的连线;

10.发布局部map的降采样平面点集合;

11.发布历史帧(累加的)的角点、平面点降采样集合;

12.发布当前帧原始点云配准之后的点云。

<think>嗯,用户问的是关于LIO-SAM的问题。首先,我需要回忆一下LIO-SAM的基本信息。LIO-SAM是结合激光雷达和IMU的SLAM算法,对吧?用户可能想了解如何正确使用它,或者遇到编译问题怎么办。 根据提供的引用,引用[3]提到编译问题,用户删除了工作空间中的gtsam,然后重新安装解决了问题。所以编译问题可能和gtsam的安装位置有关,需要提醒用户注意这点。另外,引用[1]和[2]涉及IMU数据的录制和odom数据的处理,说明IMU在LIO-SAM中的重要性,可能需要指导用户正确采集IMU数据,确保静止录制,并处理odom信息。 用户可能的问题包括安装配置、数据采集、参数调整等。比如,安装时要注意gtsam的版本和安装位置,数据采集时要按照指引正确录制IMU数据,避免误差。参数调整方面,可能需要根据具体传感器调整配置文件中的参数,比如激光雷达和IMU的话题名称,以及噪声参数。 另外,引用[4]提到LIO-SAM的稳定性较好,因为加入了IMU,回环检测减少漂移。所以用户可能关心LIO-SAM的优势,或者与其他SLAM算法的比较。需要强调IMU的作用和回环检测的重要性。 用户的问题可能还涉及实际应用中的问题,比如如何处理数据队列,确保IMU和odom数据同步,或者如何处理编译错误。需要分步骤解答,确保结构清晰,引用相关文献支持回答。</think>### LIO-SAM 解析 LIO-SAM(Lidar-Inertial Odometry and Mapping)是一种融合激光雷达(LiDAR)和惯性测量单元(IMU)的紧耦合SLAM框架,通过优化传感器数据实现高精度定位与建图。以下是关键实现要点: 1. **传感器数据同步与预处理** - IMU数据需严格校准,录制时需保持设备静止2小时以减少初始误差[^1]。 - 激光雷达点云通过时间戳对齐,并与IMU数据进行时空同步,例如: ```cpp // 从ROS消息中提取位姿信息 float p_x = odomMsg->pose.pose.position.x; float r_w = odomMsg->pose.pose.orientation.w; // 四元数表示姿态[^2] ``` 2. **因子图优化框架** - 使用GTSAM库构建因子图,融合IMU预积分、激光里程计、GPS等约束。若编译失败,需检查GTSAM安装路径是否冲突,建议在系统根目录编译[^3]。 3. **回环检测与全局优化** - 通过Scan Context描述子实现高效回环检测,结合IMU数据减少累计漂移[^4]。 ```cpp // 示例:IMU数据队列处理 if (!imuQueue.empty()) { sensor_msgs::Imu imuMsg = imuQueue.front(); // 预积分计算... } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JaydenQ

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值