LIO-SAM 完整指南:激光雷达惯性里程计与建图系统如何从零跑通 LIO-SAM 完整指南激光雷达惯性里程计与建图系统如何从零跑通【免费下载链接】LIO-SAMLIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping项目地址: https://gitcode.com/GitHub_Trending/li/LIO-SAMLIO-SAM 是一个基于 ROS 的紧耦合激光雷达惯性里程计与建图SLAM系统它把激光雷达的点云扫描和 IMU惯性测量单元一种测量加速度与角速度的传感器数据放进同一套因子图优化框架里联合求解从而在机器人、手持设备甚至步行场景中输出实时、低漂移的位姿轨迹和全局地图。如果你手头有 Velodyne、Ouster 或 Livox 系列激光雷达加一块 9 轴 IMU并希望在一个开源框架里同时拿到里程计 建图 回环校正这个项目值得作为第一选择。一、先判断 LIO-SAM 适不适合你的传感器组合在写任何一行配置之前先用三条标准自查硬件不符合的话换方案或换传感器比调参更有效激光雷达目前支持机械式雷达Velodyne 类以及 Ouster、Livox Horizon。Livox 这类固态雷达的支持是在机械雷达代码基础上做的最小改动官方也提示测试覆盖不算充分用于正式场景前建议先验证精度。IMU 必须是 9 轴LIO-SAM 依赖磁力计提供的航向来初始化 yaw 角6 轴 IMU 无法直接运行Ouster 内置的 6 轴 IMU 就不可用需要外挂 9 轴 IMU。IMU 频率官方建议使用 200Hz 以上的 IMU作者自测用的是 500Hz 的 Microstrain 3DM-GX5-25。IMU 是里程计在两次点云帧之间补全运动的依据频率太低会直接拉低精度。满足这三点再看运行形态LIO-SAM 的 ROS1 版本在 Kinetic/Melodic 上测试最充分节点以独立可执行程序方式运行官方演示中能跑快于实时 10 倍的速度对 CPU 的占用主要取决于numberOfCores配置普通工作站即可承载。图中展示的就是 LIO-SAM 的双图结构一路 IMU 预积分因子图按 IMU 频率高频更新、定期重置负责实时的里程计输出另一路地图优化因子图贯穿整个运行周期融合激光雷达里程计因子以及可选的 GPS 因子负责全局一致地图。理解两个因子图分工是读懂后面所有行为频率、延迟、精度的钥匙。二、从源码到跑通最快的一条路准备依赖。核心依赖是 GTSAM佐治亚理工的平滑与建图优化库负责因子图的数值求解版本要对官方指定 GTSAM 4.0。ROS 侧需要 navigation、robot-localization、robot-state-publisher 三个功能包sudo apt-get install -y ros-kinetic-navigation sudo apt-get install -y ros-kinetic-robot-localization sudo apt-get install -y ros-kinetic-robot-state-publisher sudo add-apt-repository ppa:borglab/gtsam-release-4.0 sudo apt install libgtsam-dev libgtsam-unstable-dev编译。把源码放进 catkin 工作空间即可仓库地址为https://gitcode.com/GitHub_Trending/li/LIO-SAMcd ~/catkin_ws/src git clone https://gitcode.com/GitHub_Trending/li/LIO-SAM cd .. catkin_make不想折腾系统环境的话仓库自带 Dockerfile基于 ROS Kineticdocker build -t liosam-kinetic-xenial .构建后直接起容器依赖全部预装。启动与验证。整个系统由一个 launch 文件拉起它会加载 config/params.yaml 并依次启动 LOAM 四节点、robot state publisher、GPS 模块和 Rvizroslaunch lio_sam run.launch rosbag play your-bag.bag -r 3数据方面仓库 README 提供了步行、公园、花园等用默认配置即可运行的样本数据集跑通官方数据集是接入自己硬件前的必做步骤——如果连默认数据都跑不对先别怀疑自己的硬件。Rviz 里按顺序确认三件事IMU 预积分节点的里程计话题odometry/imu有连续输出、点云在Map (cloud)中随位姿正确去畸变deskew即利用点内时间戳把整帧扫描摆正实现位于 src/imageProjection.cpp、轨迹平滑无跳变。三、数据格式的两个硬性要求与 IMU 外参标定LIO-SAM 对输入数据有两处必须满足的要求绝大多数上手失败都出在这里而不是算法本身。点云必须带点级时间戳和环号。时间戳是相对于本帧扫描起始的相对时间10Hz 雷达下范围在 0~0.1s去畸变函数deskewPoint()靠它逐点修正运动环号ring number则决定点如何排进 N_SCAN × Horizon_SCAN 的范围图矩阵。Velodyne 官方驱动默认满足这两点换用其他雷达时需要在imageProjection.cpp头部改字段名并确认时间语义。只支持机械雷达的逐点时间假设是 Livox 支持需要定制驱动的根本原因。IMU 外参必须给对。LIO-SAM 会把 IMU 原始数据变换到雷达坐标系ROS REP-105 约定x 前、y 左、z 上变换参数写在 config/params.yaml 的extrinsicRot与extrinsicRPY两个字段里。之所以要两组外参部分 IMU 的加速度计与姿态解算各自使用不同的坐标系两组值可能相同也可能不同需按芯片手册分别确定。另外注意姿态量q_wbIMU 到世界的旋转需要换算成算法要求的q_wl雷达到世界配置时填的是雷达到 IMU 的旋转q_lb这一步方向填反就会出姿态奇异。官方强烈建议跑数据前先打开imageProjection.cpp中imuHandler()里的调试输出手动晃动传感器确认变换后的加速度、角速度读数与真实运动一一对应。这 5 分钟的验证能省掉后面大量的轨迹排查时间。四、params.yaml 里真正值得动的参数config/params.yaml 约百行但需要按场景修改的核心只有几组。按换传感器和调性能两类来看换传感器必改组。sensor选择雷达类型N_SCAN垂直线数与Horizon_SCAN水平点数必须与硬件一致否则范围图错位、特征提取失效传感器sensorN_SCANHorizon_SCANVelodyne VLP-16/32/64velodyne16/32/641800Ouster OS1-64/128ouster64/128512/1024/2048Livox Horizonlivox64000另需edgeFeatureMinValidNum: 1性能与密度调节组。downsampleRate用于在点数过多时抽取子集如 64 线雷达设为 4 等价于 16 线负载numberOfCores控制地图优化的并行线程数多核工作站可适当调高mappingProcessInterval默认 0.15s限制建图频率是精度与 CPU 之间的旋钮odometrySurfLeafSize、mappingCornerLeafSize等体素尺寸则影响地图细节默认注释里区分了室内外取值。以 Ouster 为例除配置外还有两个硬件层前提驱动timestamp_mode需设为TIME_FROM_PTP_1588以获得 ROS 格式时间戳且必须外挂 9 轴 IMU内置 6 轴 IMU 不可用。Ouster 一代与二代的点云坐标定义可能不同遇到坐标系异常先查这一点。五、三种典型故障的排查顺序官方 Issues 里反复出现的问题高度集中按下表从最可能查起基本可以覆盖 90% 的异常症状最可能原因检查动作轨迹 Z 字形抖动雷达与 IMU 时间戳未对齐核对两路数据的时间戳来源与驱动时钟设置播放即上下跳动IMU 外参错误如重力方向反了回到第三节先做 IMU 调试输出验证mapOptimization 崩溃GTSAM 版本不符确认安装的是 GTSAM 4.0 官方仓库版本GPS 里程计无输出tf 坐标系缺失检查imu_frame_id、gps_frame_id到base_link的变换是否可用排查顺序本身有讲究先验数据格式第三节再验外参最后才考虑算法参数。反过来调edgeThreshold、surfThreshold去修一个外参错误是没有出口的。六、进阶能力GPS 融合、回环检测与地图导出跑通基础里程计后LIO-SAM 还有三个常被忽略的实用功能GPS 融合把gpsTopic指到实际的 GNSS 里程计话题如odometry/gpsGPS 因子会进入全局因子图持续纠正长距离漂移。gpsCovThreshold与poseCovThreshold分别控制按协方差丢弃坏 GPS 值和调整因子注入频率。注意 GPS 路径下 yaw 初始化依赖 IMU 航向需保持useImuHeadingInitialization: true。回环检测loopClosureEnableFlag打开后系统对历史关键帧做 ICP 对齐并加回环约束实现源自 LeGO-LOAM属概念验证级。验证时在 Rviz 里切换到Map (global)查看校正效果回放速率建议降到-r 1。若需要生产级回环官方推荐另接 ScanContext 方案。地图导出调用/lio_sam/save_map服务可将地图存为 PCD 文件服务定义见 srv/save_map.srvrosservice call /lio_sam/save_map 0.2 ~/Downloads/LOAM/工程上的其他入口KITTI 原始数据转 bag 的脚本在 config/doc/kitti2bag/四个核心节点的源码分别对应投影去畸变 src/imageProjection.cpp、特征提取 src/featureExtraction.cpp、地图优化 src/mapOptmization.cpp 与 IMU 预积分 src/imuPreintegration.cpp论文原文IROS 2020存放在 config/doc/paper.pdf引用时请使用其中的 BibTeX。结语LIO-SAM 的使用门槛不在算法而在数据点级时间戳、环号、9 轴 IMU、正确的两组外参把这四件事做对剩下的就是 params.yaml 里十几个参数级别的调优。建议的路径是先用 Docker 或源码方式跑通官方默认数据集 → 按第三节验证自己的数据格式与外参 → 再用第四节的传感器对照表接入实机。ROS2 用户可关注仓库的 ros2 分支6 轴 IMU 需求则可以考虑社区衍生的 liorf 等变体。【免费下载链接】LIO-SAMLIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping项目地址: https://gitcode.com/GitHub_Trending/li/LIO-SAM创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考