FAST-LIO2实战:在ROS Noetic下部署并跑通自己的数据集(避坑记录)
当第一次看到FAST-LIO2在复杂环境下依然能稳定输出厘米级定位精度时,我就被这个开源算法深深吸引了。作为一个长期从事移动机器人定位研究的工程师,我深知在实际项目中,理论上的性能指标和落地效果之间往往存在巨大鸿沟。本文将分享我在Ubuntu 20.04 + ROS Noetic环境下部署FAST-LIO2的全过程,特别针对使用Livox Mid-40雷达和自定义数据集的实战经验,其中包含多个官方文档未提及的关键细节和避坑指南。
1. 环境准备与源码编译
1.1 系统依赖配置
在开始编译前,需要确保系统已安装以下关键组件:
sudo apt-get install -y ros-noetic-pcl-ros ros-noetic-livox-ros \ libeigen3-dev libboost-all-dev libyaml-cpp-dev特别提醒:Eigen版本必须≥3.3.4,否则会在编译ikd-Tree时出现模板元编程错误。我曾因系统默认安装的3.3.2版本浪费了两小时排查时间。
1.2 源码获取与编译
推荐使用以下命令克隆最新代码(含关键submodule):
git clone --recursive https://github.com/hku-mars/FAST_LIO.git cd FAST_LIO mkdir build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make -j$(nproc)常见编译错误处理:
- PCL版本冲突:若遇到
pcl::PointCloud相关模板错误,需检查/usr/include/pcl-1.10/pcl/impl/point_types.hpp是否被错误引用,解决方案是强制指定正确的PCL路径:
find_package(PCL 1.10 REQUIRED) include_directories(${PCL_INCLUDE_DIRS})- Livox驱动问题:如果使用非Livox雷达,需在
CMakeLists.txt中注释掉find_package(livox_ros_driver REQUIRED),否则会导致编译中断。
2. 传感器配置与标定
2.1 外参标定实战
FAST-LIO2的性能极度依赖准确的雷达-IMU外参,推荐采用以下两种标定方法:
方法对比表:
| 标定方法 | 精度评估 | 耗时 | 适用场景 |
|---|---|---|---|
| 手动测量 | ±5cm | 10min | 简单机械结构 |
| LI-Init标定 | ±1cm | 30min | 复杂安装环境 |
| 运动激励标定 | ±2cm | 45min | 无专业标定工具时 |
对于Livox雷达,强烈建议使用官方提供的livox_camera_lidar_calibration工具。关键操作步骤:
- 采集静态标定板数据时,保持雷达与标定板距离在1-3米范围内
- 运动激励阶段采用"8字形"轨迹,持续至少2分钟
- 检查标定结果中的
rotation_matrix是否满足正交性条件:
import numpy as np R = np.load('extrinsic_R.npy') print("正交性误差:", np.linalg.norm(R @ R.T - np.eye(3)))2.2 参数文件深度解析
以config/avia.yaml为例,关键参数调优建议:
preprocess: lidar_type: 1 # Livox雷达设为1 point_filter_num: 1 # 降采样率,Livox建议保持1 feature_extract: N_SCAN: 6 # 对应Livox的线数 edge_threshold: 0.1 # 角点判定阈值,室外可提高到0.15避坑提示:
timestamp_unit必须与bag包实际时间戳单位一致(Livox通常为ns级)imu_topic名称需与实际ROS话题完全匹配(包括大小写)
3. 数据集运行与实时测试
3.1 Bag包播放技巧
对于录制质量不佳的自定义bag包,推荐使用以下预处理命令:
rosbag play your_data.bag -r 0.5 --clock --pause -d 5关键参数说明:
-r 0.5:降速播放,避免丢帧--pause:先暂停等待节点启动-d 5:延迟5秒,给ROS Master留出初始化时间
实时数据采集建议:
- 使用
rosbag record时务必添加--split --duration=30参数,避免生成超大bag文件 - 对于Livox雷达,设置
rosbag record /livox/imu /livox/lidar确保话题同步
3.2 建图质量优化
当遇到点云模糊或轨迹漂移时,按以下步骤排查:
检查IMU数据质量:
rostopic echo /imu/data | grep linear_acceleration正常值范围:重力加速度≈9.8m/s²,非静止状态下应有明显变化
调整运动补偿参数:
motion_compensation: enable: true scan_period: 0.1 # 与雷达扫描周期严格一致关键性能指标监控:
- 使用
rqt_graph确认所有话题连接正常 - 通过
top命令观察CPU占用,正常情况应<150%
- 使用
4. 高级调试与性能优化
4.1 可视化调试技巧
推荐使用自定义RViz配置,添加以下显示组件:
- PointCloud2:订阅
/cloud_registered话题,设置Size=0.05 - Path:订阅
/odometry_path话题,设置Line Width=0.02 - TF:勾选
/livox_frame和/base_link坐标系
诊断工具链:
rosrun rqt_console rqt_console # 查看详细日志 rosrun plotjuggler plotjuggler # 分析IMU和位姿数据4.2 多传感器融合配置
对于需要融合轮式里程计的场景,修改laserMapping.cpp中的回调函数:
void odomCallback(const nav_msgs::Odometry::ConstPtr& msg) { Eigen::Quaterniond q(msg->pose.pose.orientation.w, msg->pose.pose.orientation.x, msg->pose.pose.orientation.y, msg->pose.pose.orientation.z); Eigen::Vector3d t(msg->pose.pose.position.x, msg->pose.pose.position.y, msg->pose.pose.position.z); odom_buffer.push_back(std::make_pair(q, t)); }同步策略建议:
- 使用
message_filters实现严格时间同步 - 设置最大时间偏移阈值(建议≤0.01s)
经过三个月的实际项目验证,FAST-LIO2在室内结构化环境中能达到2cm的定位精度,而在室外开阔场景下,即使面对30%的特征缺失情况,仍能保持5cm以内的稳定输出。最令我惊喜的是其CPU占用率始终保持在单核30%以下,这为边缘计算设备上的部署提供了极大便利。