资讯动态

30分钟跑通LIO-SAM激光惯性里程计:安装、数据到排错的完整指南

发布时间:2026/10/17 6:42:04 来源:尧图企业网站定制
30分钟跑通LIO-SAM激光惯性里程计安装、数据到排错的完整指南【免费下载链接】LIO-SAMLIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping项目地址: https://gitcode.com/GitHub_Trending/li/LIO-SAM激光惯性SLAM的难点常常不在算法本身而在环境、数据格式和IMU外参这三件事上。LIO-SAMTightly-coupled Lidar Inertial Odometry via Smoothing and Mapping就是一个典型源码只有 4 个 .cpp 文件但装不对 GTSAM 版本、点云缺time字段、外参符号写反任何一种都会让轨迹变成锯齿。下面按先跑起来、再调参数的顺序把从裸机到出图的全流程走一遍每个环节都给出验证方法方便你卡住时知道卡在哪一步。读完之后你可以做到用原生 ROS 或 Docker 两条路径之一装好 LIO-SAM并能验证编译成功用官方示例数据回放在 Rviz 里看到实时轨迹与全局地图为自己的雷达velodyne / ouster / livox切换传感器配置看懂并正确填写extrinsicRot与extrinsicRPY两个外参矩阵面对 Z 字轨迹、上下跳变、进程崩溃、GPS 无输出这四种症状直接定位到原因1 先看效果LIO-SAM 实时建图演示LIO-SAM 在 Livox Horizon 数据上的激光惯性里程计演示轨迹播放的同时全局地图持续生长效果如上Rviz 里同时有两条信息源——随机器人移动的点云地图以及不断闭合修正的全局轨迹。它能在最高 10 倍实时速度下运行核心是系统里同时维护两张因子图mapOptimizationsrc/mapOptmization.cpp全程持续维护优化激光雷达里程计因子与 GPS 因子负责全局地图imuPreintegrationsrc/imuPreintegration.cpp周期性重置对 IMU 做预积分并估计 IMU 偏置按 IMU 频率输出实时里程计LIO-SAM 系统架构imageProjection 做点云去畸变双因子图分别负责全局建图与 IMU 频率下的实时定位2 安装前先排雷四个最常见的坑正式装环境之前把下面四条先记住能省掉后面大量排查时间。雷区 1GTSAM 版本必须走指定 PPA。因子图求解依赖 GTSAMGeorgia Tech 的平滑与建图优化库。用发行版自带的或手动编译的其他版本mapOptimization进程大概率直接崩溃。正确来源只有一个ppa:borglab/gtsam-release-4.0。雷区 2只认 9 轴 IMU。和 LOAM 一样LIO-SAM 用 IMU 的 roll/pitch 初始化姿态、yaw 配合 GPS 初始化航向6 轴 IMU 无法提供完整姿态。特别注意 Ouster 系列自带的是 6 轴 IMU必须外挂一个 9 轴的。雷区 3点云必须带time和ring两个字段。点云去畸变把一帧内不同时刻采到的点修正到同一时刻的位姿靠time字段给出每个点在扫描内的相对时间——10Hz 的雷达扫一圈 0.1 秒所以这个字段取值应在 00.1 之间ring字段标明点属于哪个激光通道用于把点排进矩阵。新版 Velodyne 驱动直接输出这两个字段换用其他雷达时可能要在 src/imageProjection.cpp 顶部改字段名。雷区 4外参有两个而且可能不一样。params.yaml里extrinsicRot和extrinsicRPY看起来重复原因是不少 IMU 的加速度计和姿态解算输出的坐标系不一致作者用的 Microstrain 3DM-GX5-25 就是这种。如果你的 IMU 两者坐标系相同两个矩阵填一样的值即可。3 环境准备两条路线任选官方在 ROS Kinetic 和 Melodic 上做过测试Noetic 需要社区额外处理新机器上装 ROS Melodic 最稳。路线 A原生编译先装三个 ROS 功能包再装 GTSAMsudo apt-get install -y ros-melodic-navigation sudo apt-get install -y ros-melodic-robot-localization sudo apt-get install -y ros-melodic-robot-state-publisher sudo add-apt-repository ppa:borglab/gtsam-release-4.0 sudo apt install libgtsam-dev libgtsam-unstable-dev然后拉代码并编译cd ~/catkin_ws/src git clone https://gitcode.com/GitHub_Trending/li/LIO-SAM cd .. catkin_make最后把两行 source 写进~/.bashrcsource /opt/ros/melodic/setup.bash source ~/catkin_ws/devel/setup.bash怎么算成功重新开终端执行rosrun lio_sam imageProjection看到等待点云一类的报错而不是找不到命令说明库和可执行文件都就位了。路线 BDocker 容器不想污染系统环境的走容器仓库根目录自带 Dockerfile基于osrf/ros:kinetic-desktop-full-xenial依赖和编译步骤已经全部写好docker build -t liosam-kinetic-xenial .构建完成后启动容器挂载本地时间、时区和 X11 以便显示 Rvizdocker run --init -it -d \ -v /etc/localtime:/etc/localtime:ro \ -v /etc/timezone:/etc/timezone:ro \ -v /tmp/.X11-unix:/tmp/.X11-unix \ -e DISPLAY$DISPLAY \ liosam-kinetic-xenial \ bash怎么算成功docker exec -it 容器名 bash进入容器rosrun lio_sam imageProjection能正常启动并等待输入。4 首次运行用示例数据验证安装编译通过不等于装好了——数据链路话题名、字段名、外参才是重灾区。先跑一遍官方示例数据确认整条链路通了再碰自己的数据。README 的 Sample datasets 一节提供了几组示例包其中 walking / park / garden 三组按默认配置就能跑rotation / campus 两组需要改话题名和外参见第 5 节。以其中任意一组的 bag 为例roslaunch lio_sam run.launch另开终端回放3 倍速rosbag play your-bag.bag -r 3怎么算成功Rviz 中Map (cloud)随移动持续增长、轨迹连成线命令行里odometry/imu话题按 IMU 频率稳定输出可用rosrun rqt_graph rqt_graph或rostopic hz odometry/imu确认。如果轨迹正常说明安装、话题、外参三者全部对齐。验证通过后可以用服务把当前地图存成 PCD 文件rosservice call /lio_sam/save_map 0.2 /Downloads/LOAM/参数顺序是 [服务名] [点云分辨率] [保存路径]分辨率 0.2 米适合户外场景。5 参数调优config/params.yaml 导读全部配置集中在 config/params.yaml按改哪个组来读它。数据源话题名对齐pointCloudTopic: points_raw imuTopic: imu_raw这两个值必须和你 bag / 驱动实际发布的话题一致。官方 rotation、campus 两组数据发布的是imu_correct且数据已经按 ROS REP105 对齐此时要把imuTopic改成imu_correct并把下面两个外参矩阵都改成单位阵。传感器类型换雷达时改这里sensor: velodyne # velodyne 或 ouster 或 livox N_SCAN: 16 # 通道数 Horizon_SCAN: 1800 # 水平分辨率 downsampleRate: 1 # 点太密时加大如 64线改 4常用组合16 线 Velodyne 是 16/1800Ouster OS1-128 是 128/1024Livox Horizon 是 6/4000。点云过密导致降速时优先调大downsampleRate而不是动其他参数。IMU 外参最关键也最容易错extrinsicTrans: [0.0, 0.0, 0.0] # IMU 相对雷达的平移 extrinsicRot: [...] # 加速度/陀螺数据从 IMU 系到雷达系的旋转 extrinsicRPY: [...] # 姿态角数据用的旋转可能与上一项不同LIO-SAM 内部按雷达坐标系REP105x 向前、y 向左、z 向上工作IMU 原始数据要经过这两个矩阵变换过来。默认值对应的是作者的 Microstrain 3DM-GX5-25你的设备大概率要重新标定——标定时把加速度、姿态两套外参分开确认填完后按下一节的调试方法验证。性能与节奏numberOfCores建图优化用的 CPU 核数按机器实际调整mappingProcessInterval建图频率秒调大省 CPU 但地图更新变慢odometrySurfLeafSize/mappingCornerLeafSize/mappingSurfLeafSize体素滤波粒度注释里已标注户外/室内两套默认值回环检测把loopClosureEnableFlag设为true后回环基于 ICP 在历史关键帧子图上求解频率由loopClosureFrequency控制。回环生效后要在 Rviz 里取消勾选Map (cloud)、勾选Map (global)才能看到修正后的全局地图前者只是点云堆叠位姿修正后不会更新。ICP 较慢开回环测试时建议把回放速度降到-r 1。Ouster OS1-128 雷达接入 LIO-SAM 时自带 6 轴 IMU 不可用需外挂 9 轴 IMU6 接入自己的数据示例包跑通后换成自己的采集数据时只核对两类东西。点云侧确认驱动输出的点云包含扫描内相对时间和通道号两个字段且命名与代码一致。Ouster 用户额外注意驱动 launch 文件里把timestamp_mode设为TIME_FROM_PTP_1588点云才会带 ROS 格式时间戳。IMU 侧频率上 200Hz 是推荐下限500Hz 最佳——系统精度对 IMU 数据质量非常敏感。外参配好后做一次人工验证把 src/imageProjection.cpp 中imuHandler()里的 debug 打印打开手持设备做俯仰、横滚、转弯动作观察输出的加速度和角速度方向是否与动作一致。LIO-SAM 的 IMU 数据变换链IMU 系经外参旋转到雷达系REP105加速度与姿态角分别使用 extrinsicRot 与 extrinsicRPY用 KITTI 车载数据的话仓库提供了 config/doc/kitti2bag/ 下的 python 脚本把 raw 数据转成 bag对应参数KITTI 的 64 线、外参等见 README 的 KITTI 小节。7 排错速查按症状找原因症状最可能原因处理动作轨迹 Z 字、来回抖动雷达与 IMU 时间戳未对齐检查采集时的时间同步机制确认两者时钟同源一启动 base_link 就上下跳IMU 外参符号错重力方向反了核对extrinsicRot/extrinsicRPY用 debug 打印验证静止时加速度应为 9.8 左右mapOptimization进程崩溃GTSAM 版本不对卸载现有版本严格按第 3 节的 PPA 重装GPS 里程计无输出坐标系 tf 断链确认imu_frame_id、gps_frame_id到base_link的变换可用参考 robot_localization 的传感器数据准备文档开了回环但地图不修正看错了可视化层或 ICP 没跑起来Rviz 切到Map (global)回放降到-r 1观察8 接下来做什么把自己雷达和 IMU 的真实话题名、通道数、外参填进 config/params.yaml录一小段 30 秒 bag 回放验证再跑长数据。如果要上车载或做精度评估用 config/doc/kitti2bag/ 的脚本把 KITTI raw 数据批量转成 bag 对比效果。算法与因子图设计的完整推导在仓库内的 paper.pdfIROS 2020遇到第 7 节表格之外的异常时结合两张因子图的数据流定位通常比逐行读代码更快。【免费下载链接】LIO-SAMLIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping项目地址: https://gitcode.com/GitHub_Trending/li/LIO-SAM创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑