FAST-LIO2 从 0 跑通教程
前言
前面已经跑通了 Mid-360S,接下来把 /livox/lidar 和 /livox/imu 接入 FAST-LIO2,实现实时激光惯性里程计和建图。
本文环境:
1 | Ubuntu 22.04 |
一、准备环境
加载 ROS 2 Humble:
1 | source /opt/ros/humble/setup.bash |
正常应输出:
1 | humble |
安装依赖:
1 | sudo apt update |
如果没有初始化过 rosdep:
1 | sudo rosdep init |
如果提示已经初始化过,忽略 sudo rosdep init 的报错,直接执行 rosdep update 即可。
二、确认 Mid-360S 数据正常
先加载 Livox 驱动环境:
1 | source /opt/ros/humble/setup.bash |
启动 Mid-360S:
1 | ros2 launch livox_ros_driver2 msg_MID360s_launch.py |
这里要注意:跑 FAST-LIO2 时要用 msg_MID360s_launch.py,不要用 rviz_MID360s_launch.py。前者发布的是 FAST-LIO2 需要的 Livox 自定义点云消息。
另开终端检查话题:
1 | source /opt/ros/humble/setup.bash |
应该能看到:
1 | /livox/lidar |
检查消息类型:
1 | ros2 topic info /livox/lidar |
推荐结果:
1 | /livox/lidar: livox_ros_driver2/msg/CustomMsg |
如果 /livox/lidar 是 sensor_msgs/msg/PointCloud2,说明启动方式不对,换回 msg_MID360s_launch.py。
三、下载并编译 FAST-LIO2
创建工作空间:
1 | mkdir -p ~/fastlio_ws/src |
下载 ROS2 版本:
1 | git clone https://github.com/Ericsii/FAST_LIO_ROS2.git --recursive |
编译:
1 | cd ~/fastlio_ws |
加载环境:
1 | source ~/fastlio_ws/install/setup.bash |
也可以写入 ~/.bashrc:
1 | echo 'source ~/livox_ws/install/setup.bash' >> ~/.bashrc |
四、检查配置文件
进入配置目录:
1 | cd ~/fastlio_ws/src/FAST_LIO_ROS2/config |
实际可以看到:
1 | avia.yaml horizon.yaml mid360.yaml ouster64.yaml velodyne.yaml |
Mid-360S 跑 FAST-LIO2 时直接使用仓库自带的 mid360.yaml 即可:
1 | Livox 驱动启动文件:msg_MID360s_launch.py |
打开配置:
1 | gedit mid360.yaml |
第一次跑通时,建议先保持默认参数,只确认下面几个关键项:
1 | common: |
其中最重要的是:
| 参数 | 说明 |
|---|---|
lid_topic |
点云话题,保持 /livox/lidar |
imu_topic |
IMU 话题,保持 /livox/imu |
lidar_type |
Livox 系列为 1 |
timestamp_unit |
默认 3,不要随意改 |
extrinsic_est_en |
默认 true,先让 FAST-LIO2 在线估计外参 |
后续如果已经有准确的雷达-IMU 外参,再把 extrinsic_est_en 改为 false,并填写自己的 extrinsic_T 和 extrinsic_R。
五、启动 FAST-LIO2
开两个终端。
终端 1:启动雷达
1 | source /opt/ros/humble/setup.bash |
终端 2:启动 FAST-LIO2
1 | source /opt/ros/humble/setup.bash |
若不设置rviz:=false,执行后 RViz2 会自动打开,不需要额外再运行 rviz2。
刚启动后先让雷达静止几秒,再缓慢移动。第一次测试建议在房间、走廊等有明显结构的环境中进行。
六、查看建图结果
RViz2 中重点看这些内容:
1 | Fixed Frame: camera_init |
如果 RViz2 中没有地图,先检查 FAST-LIO2 是否有输出:
1 | ros2 topic hz /Laser_map |
如果有频率,多半是 RViz2 的 Fixed Frame 或显示项没设对。
七、保存地图
配置中已经开启:
1 | pcd_save: |
先查看保存地图服务:
1 | ros2 service list | grep map |
如果看到 /map_save,调用:
1 | ros2 service call /map_save std_srvs/srv/Trigger |
这个 ROS2 版本的 /map_save 会按照配置文件里的 map_file_path 保存地图。mid360.yaml 默认是:
1 | map_file_path: "./test.pcd" |
这里的 ./test.pcd 是相对路径,实际会保存在启动 FAST-LIO2 时终端所在的目录。比如在 ~ 目录启动 FAST-LIO2,地图就是 ~/test.pcd。
建议改成绝对路径,避免保存后找不到文件:
1 | map_file_path: "/home/dreamer198/fastlio_ws/src/FAST_LIO_ROS2/PCD/test.pcd" |
重新启动 FAST-LIO2 后,再调用 /map_save,然后查看:
1 | ls -lh ~/fastlio_ws/src/FAST_LIO_ROS2/PCD |
查看 PCD 地图:
1 | pcl_viewer ~/fastlio_ws/src/FAST_LIO_ROS2/PCD/test.pcd |
八、录包测试
实机调试时可以录一段 bag,后面离线反复测试:
1 | mkdir -p ~/bags |
播放:
1 | ros2 bag play <bag目录> |
离线测试时,先启动 FAST-LIO2:
1 | source /opt/ros/humble/setup.bash |
再播放 bag:
1 | ros2 bag play ~/bags/<bag目录> |
九、常见问题
1. FAST-LIO2 没有点云输入
检查点云类型:
1 | ros2 topic info /livox/lidar |
应该是:
1 | livox_ros_driver2/msg/CustomMsg |
如果不是,重新用下面命令启动雷达:
1 | ros2 launch livox_ros_driver2 msg_MID360s_launch.py |
2. 找不到 livox_ros_driver2/msg/CustomMsg
编译或运行 FAST-LIO2 前,需要先加载 Livox 工作空间:
1 | source /opt/ros/humble/setup.bash |
如果是编译时报错:
1 | cd ~/fastlio_ws |
3. Jetson 通过 SSH 启动时报 RViz2 显示错误
如果在 Jetson 上通过 SSH 远程执行:
1 | ros2 launch fast_lio mapping.launch.py config_file:=mid360.yaml |
出现类似错误:
1 | qt.qpa.xcb: could not connect to display |
这说明当前 SSH 终端没有图形显示环境,RViz2 打不开。这个错误只影响 RViz2,不代表 FAST-LIO2 本身一定有问题。
mapping.launch.py 默认会启动 RViz2,如果 Jetson 是无屏幕运行,或者只是通过 SSH 远程跑算法,可以先关闭 RViz2:
1 | ros2 launch fast_lio mapping.launch.py config_file:=mid360.yaml rviz:=false |
然后在另一台带显示器的电脑上查看话题:
1 | ros2 topic list |
如果两台电脑配置了 ROS 2 多机通信,也可以在自己的主力电脑上单独打开 RViz2 来看 Jetson 发布的话题。
4. Jetson 运行时报 libusb_set_option
如果 FAST-LIO2 节点直接退出,并出现:
1 | /lib/aarch64-linux-gnu/libpcl_io.so.1.12: undefined symbol: libusb_set_option |
这通常不是 FAST-LIO2 参数问题,而是 PCL 加载 libusb 时发生了动态库版本冲突。常见原因是系统里同时存在多个 libusb-1.0.so,例如 /usr/local/lib 下的旧版本 libusb 覆盖了 Ubuntu apt 安装的版本,导致 /lib/aarch64-linux-gnu/libpcl_io.so.1.12 找不到 libusb_set_option 符号。
先检查 PCL 实际链接到了哪个 libusb:
1 | ldd /lib/aarch64-linux-gnu/libpcl_io.so.1.12 | grep usb |
再检查系统库里有没有这个符号:
1 | nm -D /lib/aarch64-linux-gnu/libusb-1.0.so.0 | grep libusb_set_option |
如果第二条命令能看到 libusb_set_option,说明系统自带的 libusb 是正常的,多半是运行时加载了别处的旧库。可以先用 LD_PRELOAD 临时指定系统库测试:
1 | LD_PRELOAD=/lib/aarch64-linux-gnu/libusb-1.0.so.0 \ |
如果这样能启动,说明就是 libusb 动态库冲突。接着检查是否存在 /usr/local/lib 里的旧库:
1 | ls -l /usr/local/lib | grep libusb |
如果确认 /usr/local/lib/libusb-1.0.so* 是旧版本残留,可以先备份再刷新动态库缓存:
1 | sudo mkdir -p /usr/local/lib/libusb_backup |
然后重新测试:
1 | ros2 launch fast_lio mapping.launch.py config_file:=mid360.yaml rviz:=false |
如果系统库本身缺失或损坏,可以重装相关包:
1 | sudo apt update |
建议处理顺序:
- 先加
rviz:=false,排除远程图形界面问题。 - 再用
ldd和nm检查libusb是否冲突。 - 用
LD_PRELOAD做临时验证。 - 确认后清理
/usr/local/lib里的旧libusb。
5. 地图漂移明显
先检查:
- 启动后是否静止了几秒。
- 是否在玻璃、空旷区域、长直走廊等退化场景。
/livox/lidar和/livox/imu是否稳定发布。mid360.yaml中的话题名是否正确。- 外参是否和实际安装差别很大。
第一次跑通建议先保持 mid360.yaml 默认参数。后续追求精度时,再重点处理时间同步、外参标定和安装刚性。
6. 编译内存不够
降低并行数:
1 | cd ~/fastlio_ws |
参考资料
- FAST-LIO2 官方仓库:https://github.com/hku-mars/FAST_LIO
- FAST-LIO2 ROS2 移植版本:https://github.com/Ericsii/FAST_LIO_ROS2
- livox_ros_driver2:https://github.com/Livox-SDK/livox_ros_driver2
- Livox-SDK2:https://github.com/Livox-SDK/Livox-SDK2
总结
Mid-360S 跑 FAST-LIO2 的核心流程:
1 | 启动 Mid-360S:msg_MID360s_launch.py |




