用LIO-SAM跑通第一份实时激光雷达惯性里程计:30分钟的完整路径
【免费下载链接】LIO-SAMLIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping项目地址: https://gitcode.com/GitHub_Trending/li/LIO-SAM
机器人带激光雷达在户外行走,需要实时拿到它的六自由度位姿。LIO-SAM的做法是把激光点云与9轴IMU放进两张因子图里融合,里程计层按IMU频率输出。本文跑通这条最短路径。
能力边界:9轴IMU前提与双因子图架构
- 能做:激光里程计与IMU的紧耦合融合,地图层还可以挂GPS因子。系统维护两张因子图:
imuPreintegration.cpp是里程计层,负责估计IMU偏置,周期性重置以在IMU频率下保持实时;mapOptimization.cpp是地图层,对激光里程计因子做全局优化,官方实测运行速度可达实时的10倍。
不能做:不支持6轴IMU,roll/pitch初始化依赖9轴姿态,GPS航向初始化也依赖yaw;Ouster内置的6轴IMU无法使用,必须外接9轴IMU。Livox Horizon这类固态激光雷达只是最小适配,未做充分测试。主仓库是ROS1实现(Kinetic/Melodic测试过),ROS2在另一个分支。
依赖什么:点云必须带时间通道(扫描内的相对时间,10Hz旋转时应在0~0.1s之间)和环号,点类型定义在 src/imageProjection.cpp 开头;IMU建议不低于200Hz(作者的设备是500Hz);优化核心是GTSAM 4.0。
最小运行环境搭建
先装依赖。图优化求解器GTSAM 4.0必须从官方PPA装,自行源码编译新版会直接让mapOptimization崩溃;另外三个ROS包一个不能少:
sudo apt-get install -y ros-melodic-navigation \ ros-melodic-robot-localization ros-melodic-robot-state-publisher sudo add-apt-repository ppa:borglab/gtsam-release-4.0 sudo apt-get install -y libgtsam-dev libgtsam-unstable-dev然后把仓库克隆进工作空间编译。这个包除了GTSAM没有别的第三方依赖,一次catkin_make就能过:
mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone https://gitcode.com/GitHub_Trending/li/LIO-SAM cd ~/catkin_ws catkin_make最后用示例walking数据集(唯一能用默认参数直接跑的bag)起节点、放包,播放速率3用来检验实时性是否达标:
roslaunch lio_sam run.launch # 另开终端 rosbag play your-bag.bag -r 3启动后RViz会自动弹出,确认 "Map (cloud)" 在持续累积、激光云轨迹连续不跳变,就算通过。
直接影响结果的三个参数:外参、downsampleRate、numberOfCores
extrinsicRot/extrinsicRPY→ 默认是 config/params.yaml 里作者设备的占位矩阵 → 符号错则重力方向反了,启动即上下跳变;传感器的加速度与姿态坐标系不一致时两个矩阵必须不同 → 你的硬件安装方式与作者设备(Microstrain 3DM-GX5-25)不同时必改。downsampleRate→ 默认1,不降采样 → 从1改到4,每帧点数从16×1800=28800降到16×450=7200,特征提取与scan-to-map计算量降为约1/4;室内地图过稀再调回1 → CPU占用飙升或建图帧率掉的时候动它。numberOfCores→ 默认4 → 改到8能加快周边地图优化,上限是物理核心数,双核机器保持4或以下;建图频率还受mappingProcessInterval(默认0.15s,约6.7Hz)钳制 → 点云量增大(64线以上)时动它。
踩坑实录:轨迹跳变与Z字形的三个高频问题
我放了自己的数据bag,base_link在RViz里立刻上下跳动。排查后发现根因是外参矩阵符号:重力读数方向反了。按激光雷达坐标系约定(x前、y左、z上)把extrinsicRot对应行翻号后,轨迹恢复平稳。
第二个问题,轨迹在直路上走出Z字形。点云与IMU格式都核对过,最后查到时间戳:雷达驱动的time通道给的是绝对时间,不是扫描内相对时间(10Hz旋转时应为0~0.1s)。换成相对时间版本后,Z字消失。
第三个,用Ouster的同学注意:它的内置IMU只有6轴,LIO-SAM无法用它初始化roll/pitch,姿态从第一帧就是错的。我换成外接9轴IMU固定在传感器上,问题才消失。
调优实验:一次回环播放速度调整记录
改动前:loopClosureEnableFlag: true,bag播放速率-r 3,ICP式回环跟不上,闭合后轨迹出现跳变。改动后:播放速率改-r 1,同一段1分钟bag的墙钟时间从20秒变为60秒。变化:回环修正平滑,可用Garden数据集复验这个设置。
下一步
这里的回环是从LeGO-LOAM改的ICP实现,召回率要求更高时可以去换ScanContext方案;建图结果用/lio_sam/save_map服务导出,分辨率参数传0.2得到PCD文件。先用示例数据集跑一遍,确认RViz中轨迹连续、地图不漂移,再接入自己的传感器数据。
【免费下载链接】LIO-SAMLIO-SAM: Tightly-coupled Lidar Inertial Odometry via Smoothing and Mapping项目地址: https://gitcode.com/GitHub_Trending/li/LIO-SAM
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考