保姆级教程:在Ubuntu 20.04上搞定浙大lidar_IMU_calib(从编译到避坑)
保姆级教程:在Ubuntu 20.04上搞定浙大lidar_IMU_calib(从编译到避坑)
当激光雷达(LiDAR)和惯性测量单元(IMU)需要协同工作时,标定这两个传感器之间的外参是必不可少的步骤。浙大开源项目lidar_IMU_calib提供了一种无需特定标定目标的解决方案,特别适合实际应用场景。本文将带你从零开始,在Ubuntu 20.04系统上完成整个标定流程,包括环境准备、源码编译、常见问题解决以及实际标定操作。
1. 环境准备与依赖安装
在开始之前,确保你的Ubuntu 20.04系统已经安装了ROS Noetic。如果没有安装,可以通过以下命令完成基础环境配置:
sudo sh -c 'echo "deb http://packages.ros.org/ros/ubuntu $(lsb_release -sc) main" > /etc/apt/sources.list.d/ros-latest.list' sudo apt install curl curl -s https://raw.githubusercontent.com/ros/rosdistro/master/ros.asc | sudo apt-key add - sudo apt update sudo apt install ros-noetic-desktop-full echo "source /opt/ros/noetic/setup.bash" >> ~/.bashrc source ~/.bashrc接下来安装必要的依赖项:
sudo apt-get install -y git cmake libeigen3-dev libboost-all-dev libpcl-dev python3-catkin-tools特别需要注意的是,Pangolin库的安装可能会遇到问题。建议从源码编译安装最新版本:
git clone https://github.com/stevenlovegrove/Pangolin.git cd Pangolin mkdir build && cd build cmake .. make -j$(nproc) sudo make install2. 项目编译与配置
创建工作空间并获取源码:
mkdir -p ~/catkin_li_calib/src cd ~/catkin_li_calib/src catkin_init_workspace git clone https://github.com/APRIL-ZJU/lidar_IMU_calib安装子模块依赖:
wstool init wstool merge lidar_IMU_calib/depend_pack.rosinstall wstool update cd lidar_imu_calib ./build_submodules.sh在编译主项目前,需要对CMakeLists.txt做一些调整:
- 注释掉PANGOLIN_DIR的指定路径
- 确保Eigen3和Boost被正确找到
- 检查PCL版本是否为1.10
修改完成后,进行编译:
cd ../.. catkin_make -DCMAKE_BUILD_TYPE=Release source ./devel/setup.bash提示:如果遇到Python相关错误,可能是因为系统默认Python版本与项目要求不符。可以通过修改CMakeLists.txt中的Python相关配置来解决。
3. 雷达型号适配与源码修改
原项目默认支持Velodyne VLP-16雷达,如果你的设备是其他型号(如RS-Helios5515),需要进行以下修改:
- 在
include/utils/vlp_common.h中添加新雷达的配置参数 - 更新
dataset_reader.h中的雷达类型枚举 - 修改
src/ui/calib_helper.cpp中的相关处理逻辑
主要修改内容包括:
- 雷达的水平/垂直角度分辨率
- 扫描线数量
- 有效距离范围
- 点云话题名称
修改完成后,需要重新编译项目:
catkin_make4. 数据采集与准备
高质量的数据采集是成功标定的关键。以下是一些实用建议:
- 环境选择:室内空间至少5×5米,有丰富几何特征(如墙角、家具等)
- 运动模式:
- 包含各个轴向的旋转运动
- 线性运动速度控制在0.5-1m/s
- 避免剧烈震动和急停
- 持续时间:建议采集3-5分钟数据
录制数据包的命令:
rosbag record -O calibration_data.bag /imu/data /lidar_points注意:确保IMU和LiDAR的时间同步问题。如果设备支持硬件同步最好,否则需要在后期处理中进行时间对齐。
5. 标定执行与参数调整
准备好启动文件licalib_gui.launch,主要参数配置如下:
<arg name="topic_imu" default="/imu/data" /> <arg name="path_bag" default="$(find li_calib)/data/calibration_data.bag" /> <arg name="bag_start" default="0" /> <arg name="bag_durr" default="300" /> <arg name="scan4map" default="15" /> <arg name="lidar_model" default="RS_Helios5515" /> <arg name="ndtResolution" default="0.5" />启动标定程序:
roslaunch li_calib licalib_gui.launch常见问题及解决方案:
优化迭代卡在0次:
- 修改
thirdparty/Kontiki/kontiki/sensors/constant_bias_imu.h - 在
LockGyroscopeBias和LockAccelerometerBias函数中添加return true
- 修改
Pangolin相关错误:
- 检查
LD_LIBRARY_PATH是否包含Pangolin库路径 - 确认系统Python版本与链接库一致
- 检查
点云显示异常:
- 检查雷达型号配置是否正确
- 确认点云话题名称匹配
6. 结果验证与应用
标定完成后,程序会输出以下关键参数:
- P_LinI:LiDAR在IMU坐标系下的平移向量
- euler_LtoI:LiDAR到IMU的欧拉角(可转换为旋转矩阵)
验证标定质量的实用方法:
- 重投影误差检查:观察优化过程中误差的收敛情况
- 运动一致性测试:比较IMU积分轨迹与LiDAR定位结果
- 闭环检测:在相同起点和终点检查位姿一致性
将标定结果应用到你的SLAM系统时,记得考虑以下因素:
- 时间同步补偿
- 传感器噪声特性
- 温度变化对IMU偏置的影响
7. 高级技巧与性能优化
对于追求更高标定精度的用户,可以考虑以下进阶方法:
多段数据联合标定:
- 采集不同运动模式的数据集
- 使用加权优化方法合并结果
在线标定策略:
- 实现标定参数的实时微调
- 结合SLAM系统进行联合优化
自动参数调优:
- 使用网格搜索法优化NDT分辨率
- 自适应调整优化权重
性能优化建议:
# 在启动时添加性能优化参数 roslaunch li_calib licalib_gui.launch ndtResolution:=0.3 scan4map:=20关键参数对性能的影响:
| 参数 | 推荐值 | 影响 |
|---|---|---|
| ndtResolution | 0.3-0.5 | 值越小精度越高但计算量越大 |
| scan4map | 15-30 | 控制用于建图的扫描次数 |
| bag_durr | 120-300 | 标定使用的数据时长(秒) |
8. 实际项目中的经验分享
在多次实际标定过程中,我发现以下几个要点特别值得注意:
- IMU预热:至少让IMU工作10分钟后再开始采集数据,确保偏置稳定
- 环境多样性:在多个不同环境中采集数据可以提高标定鲁棒性
- 运动充分性:包含丰富的旋转运动对估计旋转外参特别重要
- 数据分段:将长时间数据分成几段分别标定,检查结果一致性
一个典型的工作流程:
- 早晨开始工作时先启动IMU预热
- 在不同环境中采集3组数据(各5分钟)
- 分别进行标定并比较结果
- 取中值或加权平均作为最终标定参数
- 在实际应用中持续监控标定质量
对于时间敏感的应用,可以考虑以下优化:
# 快速标定模式(精度稍低但速度快) roslaunch li_calib licalib_gui.launch ndtResolution:=1.0 scan4map:=10 bag_durr:=120