FASTLIO2_ROS2 在 Ubuntu 22.04 + ROS2 Humble 下配置指南
项目地址:https://github.com/liangheming/FASTLIO2_ROS2
一、先说结论
这个项目不是简单地把原始 FAST-LIO2 从 ROS1 搬到 ROS2。它在原始 FAST-LIO2 的基础上加了回环检测、重定位、地图优化三个大模块,相当于一个完整的 SLAM 方案了。
二、依赖一览
必须装的东西:
| Ubuntu 22.04 | 系统 |
| ROS2 Humble | ROS 版本 |
| PCL | 点云处理 |
| Eigen | 矩阵运算 |
| Sophus | 李群李代数 |
| GTSAM | 位姿图优化(回环用) |
| Livox-SDK2 + livox_ros_driver2 | 览沃激光雷达驱动 |
下面一步步来。
三、安装依赖
3.1 基础依赖
sudo apt update
sudo apt install libpcl-dev libeigen3-dev libboost-all-dev
3.2 编译 Sophus
注意版本,要用 1.22.10,而且要关掉 fmt 依赖,不然会报错。
git clone https://github.com/strasdat/Sophus.git
cd Sophus
git checkout 1.22.10
mkdir build && cd build
cmake .. -DSOPHUS_USE_BASIC_LOGGING=ON
make -j$(nproc)
sudo make install
-DSOPHUS_USE_BASIC_LOGGING=ON 这个参数必须加,不然新的 Sophus 依赖 fmt 库,编译会炸。
3.3 编译 GTSAM
回环检测和位姿图优化用的是 GTSAM。
git clone https://github.com/borglab/gtsam.git
cd gtsam
mkdir build && cd build
cmake .. -DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF
make -j$(nproc)
sudo make install
-DGTSAM_BUILD_WITH_MARCH_NATIVE=OFF 建议关掉,不然在某些机器上会有指令集不兼容的问题。
3.4 编译 Livox-SDK2
git clone https://github.com/Livox-SDK/Livox-SDK2.git
cd Livox-SDK2
mkdir build && cd build
cmake .. && make -j$(nproc)
sudo make install
sudo ldconfig
3.5 编译 livox_ros_driver2
这个不能直接用 colcon build,要用它自带的 build.sh 脚本。
mkdir -p ~/ws_livox/src
git clone https://github.com/Livox-SDK/livox_ros_driver2.git ~/ws_livox/src/livox_ros_driver2
cd ~/ws_livox/src/livox_ros_driver2
source /opt/ros/humble/setup.bash
./build.sh humble
编译完之后,记得 source:
cd ~/ws_livox
source install/setup.bash
建议加到 ~/.bashrc 里,省得每次都手动 source。
四、编译 FASTLIO2_ROS2
4.1 创建工作空间
mkdir -p ~/fastlio2_ws/src
cd ~/fastlio2_ws/src
git clone https://github.com/liangheming/FASTLIO2_ROS2.git
4.2 编译
cd ~/fastlio2_ws
source /opt/ros/humble/setup.bash
source ~/ws_livox/install/setup.bash
colcon build
编译通过就完事了。
五、跑起来
5.0 数据来源:实时驱动 vs 录包回放
Mid360 的数据有两种搞法,二选一:
方式一:实时驱动 Mid360
直接连雷达,让 Mid360 实时发数据,FAST-LIO 实时算。适合现场调试、实时建图。
# 启动 Mid360 驱动(发布 /livox/lidar 和 /livox/imu 两个话题)
source ~/ws_livox/install/setup.bash
ros2 launch livox_ros_driver2 msg_MID360_launch.py
驱动起来后,Mid360 会发布两个核心话题:
- /livox/lidar — 点云数据(CustomMsg 格式)
- /livox/imu — IMU 数据
确认一下话题有没有:
ros2 topic list
看到这俩话题就对了,然后直接启动下面的 FAST-LIO 节点就行。
方式二:先录 bag,再回放
先把数据录下来,回来再慢慢调参数、跑回环、跑优化。适合数据采集、算法调试。
录包(只录两个核心话题就够了,省空间):
source ~/ws_livox/install/setup.bash
ros2 launch livox_ros_driver2 msg_MID360_launch.py
另开一个终端录包:
ros2 bag record /livox/lidar /livox/imu -o mid360_data
录完 Ctrl+C 停。回放的时候:
ros2 bag play mid360_data
然后启动 FAST-LIO、PGO、HBA 什么的都行,想跑多少遍跑多少遍。
5.1 纯激光惯性里程计
source ~/fastlio2_ws/install/setup.bash
ros2 launch fastlio2 lio_launch.py
然后播放 bag:
ros2 bag play your_bag_file
5.2 里程计 + 回环
先启动回环节点:
ros2 launch pgo pgo_launch.py
ros2 bag play your_bag_file
保存地图:
ros2 service call /pgo/save_maps interface/srv/SaveMaps "{file_path: 'your_save_dir', save_patches: true}"
save_patches 设为 true,后面要用 HBA 优化地图的话需要这个。
5.3 重定位
启动重定位节点:
ros2 launch localizer localizer_launch.py
设置初始位姿:
ros2 service call /localizer/relocalize interface/srv/Relocalize "{pcd_path: 'your_map.pcd', x: 0.0, y: 0.0, z: 0.0, yaw: 0.0, pitch: 0.0, roll: 0.0}"
检查重定位结果:
ros2 service call /localizer/relocalize_check interface/srv/IsValid "{code: 0}"
5.4 一致性地图优化
小场景用 BLAM,大场景用 HBA。
ros2 launch hba hba_launch.py
调用优化服务:
ros2 service call /hba/refine_map interface/srv/RefineMap "{maps_path: 'your maps directory'}"
六、和原始 FAST-LIO2 的区别
原始 FAST-LIO2 仓库:https://github.com/hku-mars/FAST_LIO
6.1 总体对比
| ROS 版本 | ROS1 | ROS2 Humble |
| 核心功能 | 激光惯性里程计(LIO) | LIO + 回环 + 重定位 + 地图优化 |
| 回环检测 | 无 | 位置先验 + ICP 检测,GTSAM 位姿图优化 |
| 重定位 | 无 | 由粗到细两阶段 ICP |
| 地图优化 | 无 | BLAM(小场景)+ HBA(大场景) |
| 支持雷达 | Livox、Velodyne、Ouster 等 | 基本一致(基于同一套前端) |
6.2 具体说一下加了什么
1. 回环检测(PGO 节点)
- 原始 FAST-LIO2 是纯里程计,跑久了漂移是必然的
- 这个版本加了位置先验 + ICP 的回环检测
- 检测到回环后用 GTSAM 做位姿图优化,修正累积误差
2. 重定位(Localizer 节点)
- 原始 FAST-LIO2 没有重定位功能,每次都得重新开始
- 这个版本支持加载已有的 PCD 地图,通过两阶段 ICP 进行重定位
- 先粗配准再精配准,给定初始位姿后就能在已有地图上继续跑
3. 一致性地图优化(HBA/BLAM)
- 原始 FAST-LIO2 的地图就是 LIO 直接堆出来的,点云一致性一般
- 这个版本集成了 BLAM(小场景)和 HBA(大场景)两种地图优化方法
- 优化后的地图点云更规整,更适合后续使用
4. ROS2 重构
- 代码从 ROS1 重构到 ROS2 Humble
- launch 文件从 xml 改成了 python
- 消息类型、参数机制全部换成 ROS2 的
6.3 性能方面的坑
作者自己在 README 里说了:由于 ROS2 的 timer、subscriber、service 回调都跑在同一个线程里,电脑性能不行的时候会出现阻塞。建议把耗时的回调(比如主循环的 timerCB)单独放一个线程里。
这个问题在 ROS1 里其实也有,但 ROS2 的执行器模型默认是单线程的,更容易暴露出来。
七、常见坑
八、总结
这个项目本质上是把 FAST-LIO2 作为前端,然后在上面加了一套完整的 SLAM 后端。如果你只是需要一个激光惯性里程计,用原版 FAST-LIO2 也行;如果你需要回环、重定位、地图优化这些完整 SLAM 功能,这个 ROS2 版本值得一试。





