前言

前面已经跑通了 Mid-360S,接下来把 /livox/lidar/livox/imu 接入 FAST-LIO2,实现实时激光惯性里程计和建图。

本文环境:

1
2
3
4
Ubuntu 22.04
ROS 2 Humble
Livox Mid-360S
FAST_LIO_ROS2

一、准备环境

加载 ROS 2 Humble:

1
2
source /opt/ros/humble/setup.bash
echo $ROS_DISTRO

正常应输出:

1
humble

安装依赖:

1
2
3
4
5
6
7
8
9
10
11
sudo apt update
sudo apt install -y \
git \
cmake \
build-essential \
python3-colcon-common-extensions \
python3-rosdep \
libpcl-dev \
libeigen3-dev \
ros-humble-pcl-ros \
ros-humble-rviz2

如果没有初始化过 rosdep

1
2
sudo rosdep init
rosdep update

如果提示已经初始化过,忽略 sudo rosdep init 的报错,直接执行 rosdep update 即可。

二、确认 Mid-360S 数据正常

先加载 Livox 驱动环境:

1
2
source /opt/ros/humble/setup.bash
source ~/livox_ws/install/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
2
3
source /opt/ros/humble/setup.bash
source ~/livox_ws/install/setup.bash
ros2 topic list

应该能看到:

1
2
/livox/lidar
/livox/imu

检查消息类型:

1
2
ros2 topic info /livox/lidar
ros2 topic info /livox/imu

推荐结果:

1
2
/livox/lidar: livox_ros_driver2/msg/CustomMsg
/livox/imu: sensor_msgs/msg/Imu

如果 /livox/lidarsensor_msgs/msg/PointCloud2,说明启动方式不对,换回 msg_MID360s_launch.py

三、下载并编译 FAST-LIO2

创建工作空间:

1
2
mkdir -p ~/fastlio_ws/src
cd ~/fastlio_ws/src

下载 ROS2 版本:

1
git clone https://github.com/Ericsii/FAST_LIO_ROS2.git --recursive

编译:

1
2
3
4
5
cd ~/fastlio_ws
source /opt/ros/humble/setup.bash
source ~/livox_ws/install/setup.bash
rosdep install --from-paths src --ignore-src -y
colcon build --symlink-install

加载环境:

1
source ~/fastlio_ws/install/setup.bash

也可以写入 ~/.bashrc

1
2
3
echo 'source ~/livox_ws/install/setup.bash' >> ~/.bashrc
echo 'source ~/fastlio_ws/install/setup.bash' >> ~/.bashrc
source ~/.bashrc

四、检查配置文件

进入配置目录:

1
2
cd ~/fastlio_ws/src/FAST_LIO_ROS2/config
ls

实际可以看到:

1
avia.yaml  horizon.yaml  mid360.yaml  ouster64.yaml  velodyne.yaml

Mid-360S 跑 FAST-LIO2 时直接使用仓库自带的 mid360.yaml 即可:

1
2
Livox 驱动启动文件:msg_MID360s_launch.py
FAST-LIO2 配置文件:mid360.yaml

打开配置:

1
gedit mid360.yaml

第一次跑通时,建议先保持默认参数,只确认下面几个关键项:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
common:
lid_topic: "/livox/lidar"
imu_topic: "/livox/imu"
time_sync_en: false

preprocess:
lidar_type: 1
scan_line: 4
blind: 0.5
timestamp_unit: 3
scan_rate: 10

mapping:
fov_degree: 360.0
det_range: 100.0
extrinsic_est_en: true

publish:
map_en: true
scan_publish_en: true
dense_publish_en: false

pcd_save:
pcd_save_en: true
interval: -1

其中最重要的是:

参数 说明
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_Textrinsic_R

五、启动 FAST-LIO2

开两个终端。

终端 1:启动雷达

1
2
3
source /opt/ros/humble/setup.bash
source ~/livox_ws/install/setup.bash
ros2 launch livox_ros_driver2 msg_MID360s_launch.py

终端 2:启动 FAST-LIO2

1
2
3
4
source /opt/ros/humble/setup.bash
source ~/livox_ws/install/setup.bash
source ~/fastlio_ws/install/setup.bash
ros2 launch fast_lio mapping.launch.py config_file:=mid360.yaml rviz:=false

若不设置rviz:=false,执行后 RViz2 会自动打开,不需要额外再运行 rviz2

刚启动后先让雷达静止几秒,再缓慢移动。第一次测试建议在房间、走廊等有明显结构的环境中进行。

六、查看建图结果

RViz2 中重点看这些内容:

1
2
3
4
5
Fixed Frame: camera_init
PointCloud2: /Laser_map
PointCloud2: /cloud_registered
Odometry: /Odometry
Path: /path

如果 RViz2 中没有地图,先检查 FAST-LIO2 是否有输出:

1
2
ros2 topic hz /Laser_map
ros2 topic hz /Odometry

如果有频率,多半是 RViz2 的 Fixed Frame 或显示项没设对。

七、保存地图

配置中已经开启:

1
2
3
pcd_save:
pcd_save_en: true
interval: -1

先查看保存地图服务:

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
2
3
mkdir -p ~/bags
cd ~/bags
ros2 bag record /livox/lidar /livox/imu

播放:

1
ros2 bag play <bag目录>

离线测试时,先启动 FAST-LIO2:

1
2
3
4
source /opt/ros/humble/setup.bash
source ~/livox_ws/install/setup.bash
source ~/fastlio_ws/install/setup.bash
ros2 launch fast_lio mapping.launch.py config_file:=mid360.yaml

再播放 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
2
3
source /opt/ros/humble/setup.bash
source ~/livox_ws/install/setup.bash
source ~/fastlio_ws/install/setup.bash

如果是编译时报错:

1
2
3
4
cd ~/fastlio_ws
source /opt/ros/humble/setup.bash
source ~/livox_ws/install/setup.bash
colcon build --symlink-install

3. Jetson 通过 SSH 启动时报 RViz2 显示错误

如果在 Jetson 上通过 SSH 远程执行:

1
ros2 launch fast_lio mapping.launch.py config_file:=mid360.yaml

出现类似错误:

1
2
qt.qpa.xcb: could not connect to display
Could not load the Qt platform plugin "xcb"

这说明当前 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
2
3
ros2 topic list
ros2 topic hz /Odometry
ros2 topic hz /Laser_map

如果两台电脑配置了 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
2
LD_PRELOAD=/lib/aarch64-linux-gnu/libusb-1.0.so.0 \
ros2 launch fast_lio mapping.launch.py config_file:=mid360.yaml rviz:=false

如果这样能启动,说明就是 libusb 动态库冲突。接着检查是否存在 /usr/local/lib 里的旧库:

1
2
ls -l /usr/local/lib | grep libusb
ldconfig -p | grep libusb

如果确认 /usr/local/lib/libusb-1.0.so* 是旧版本残留,可以先备份再刷新动态库缓存:

1
2
3
sudo mkdir -p /usr/local/lib/libusb_backup
sudo mv /usr/local/lib/libusb-1.0.so* /usr/local/lib/libusb_backup/
sudo ldconfig

然后重新测试:

1
ros2 launch fast_lio mapping.launch.py config_file:=mid360.yaml rviz:=false

如果系统库本身缺失或损坏,可以重装相关包:

1
2
sudo apt update
sudo apt install --reinstall -y libusb-1.0-0 libusb-1.0-0-dev libpcl-dev ros-humble-pcl-ros

建议处理顺序:

  1. 先加 rviz:=false,排除远程图形界面问题。
  2. 再用 lddnm 检查 libusb 是否冲突。
  3. LD_PRELOAD 做临时验证。
  4. 确认后清理 /usr/local/lib 里的旧 libusb

5. 地图漂移明显

先检查:

  • 启动后是否静止了几秒。
  • 是否在玻璃、空旷区域、长直走廊等退化场景。
  • /livox/lidar/livox/imu 是否稳定发布。
  • mid360.yaml 中的话题名是否正确。
  • 外参是否和实际安装差别很大。

第一次跑通建议先保持 mid360.yaml 默认参数。后续追求精度时,再重点处理时间同步、外参标定和安装刚性。

6. 编译内存不够

降低并行数:

1
2
cd ~/fastlio_ws
colcon build --symlink-install --parallel-workers 2

参考资料

总结

Mid-360S 跑 FAST-LIO2 的核心流程:

1
2
3
4
5
启动 Mid-360S:msg_MID360s_launch.py
编译 FAST_LIO_ROS2
使用配置文件:mid360.yaml
启动 FAST-LIO2:ros2 launch fast_lio mapping.launch.py config_file:=mid360.yaml
RViz2 查看 /Laser_map、/Odometry、/path