避坑指南:在Ubuntu 16.04 + ROS Kinetic下,用lidar_align搞定RoboSense 16线与Xsens MTi-G700的IMU外参标定
避坑实战:RoboSense 16线雷达与Xsens MTi-G700 IMU在ROS Kinetic下的标定全流程
当你在Ubuntu 16.04和ROS Kinetic环境下尝试用lidar_align工具标定RoboSense 16线激光雷达与Xsens MTi-G700 IMU的外参时,可能会遇到一系列令人头疼的问题。本文将带你一步步解决这些"坑",从环境准备到最终标定完成,提供一份详尽的实战指南。
1. 环境准备与依赖安装
在开始之前,确保你的系统已经安装了Ubuntu 16.04和ROS Kinetic完整版。ROS Kinetic对Ubuntu 16.04的支持是最稳定的,这也是我们选择这个组合的原因。
首先安装必要的依赖库:
sudo apt-get update
sudo apt-get install -y libnlopt-dev ros-kinetic-pcl-ros ros-kinetic-tf2 ros-kinetic-tf2-ros
注意:在安装libnlopt-dev时,如果遇到版本冲突问题,可以尝试先卸载旧版本再安装。
对于RoboSense 16线雷达,你需要确保已经正确安装了官方驱动。Xsens MTi-G700的ROS驱动可以通过以下命令安装:
sudo apt-get install ros-kinetic-xsens-driver
验证设备连接是否正常:
- 雷达测试:
rostopic echo /rslidar_points - IMU测试:
rostopic echo /imu/data
2. lidar_align的安装与编译问题解决
从ETH Zurich的仓库克隆lidar_align源码:
mkdir -p ~/lidar_align_ws/src
cd ~/lidar_align_ws/src
git clone https://github.com/ethz-asl/lidar_align.git
移动NLOPT配置文件:
mv src/lidar_align/NLOPTConfig.cmake ../
2.1 解决LZ4编译冲突
编译时最常见的错误是LZ4冲突,表现为:
error: conflicting declaration 'typedef struct LZ4_stream_t LZ4_stream_t'
解决方法如下:
sudo mv /usr/include/flann/ext/lz4.h /usr/include/flann/ext/lz4.h.bak
sudo mv /usr/include/flann/ext/lz4hc.h /usr/include/flann/ext/lz4.h.bak
sudo ln -s /usr/include/lz4.h /usr/include/flann/ext/lz4.h
sudo ln -s /usr/include/lz4hc.h /usr/include/flann/ext/lz4hc.h
然后重新编译:
cd ~/lidar_align_ws
catkin_make
3. IMU接口适配与源码修改
lidar_align原本设计用于标定激光雷达与里程计,我们需要修改它以支持IMU数据。主要修改在loader.cpp文件中。
3.1 关键修改步骤
- 添加头文件:
#include <sensor_msgs/Imu.h>
-
注释掉原有的里程计部分代码。
-
添加IMU数据处理代码:
types.push_back(std::string("sensor_msgs/Imu"));
rosbag::View view(bag, rosbag::TypeQuery(types));
size_t imu_num = 0;
double shiftX=0,shiftY=0,shiftZ=0,velX=0,velY=0,velZ=0;
ros::Time time;
double timeDiff,lastShiftX,lastShiftY,lastShiftZ;
for (const rosbag::MessageInstance& m : view){
std::cout <<"Loading imu: \e[1m"<< imu_num++<<"\e[0m from ros bag"<<'\r'<< std::flush;
sensor_msgs::Imu imu=*(m.instantiate<sensor_msgs::Imu>());
Timestamp stamp = imu.header.stamp.sec * 1000000ll +imu.header.stamp.nsec / 1000ll;
if(imu_num==1){
time=imu.header.stamp;
Transform T(Transform::Translation(0,0,0),Transform::Rotation(1,0,0,0));
odom->addTransformData(stamp, T);
}
else{
timeDiff=(imu.header.stamp-time).toSec();
time=imu.header.stamp;
velX=velX+imu.linear_acceleration.x*timeDiff;
velY=velX+imu.linear_acceleration.y*timeDiff;
velZ=velZ+(imu.linear_acceleration.z-9.801)*timeDiff;
lastShiftX=shiftX;
lastShiftY=shiftY;
lastShiftZ=shiftZ;
shiftX=lastShiftX+velX*timeDiff+imu.linear_acceleration.x*timeDiff*timeDiff/2;
shiftY=lastShiftY+velY*timeDiff+imu.linear_acceleration.y*timeDiff*timeDiff/2;
shiftZ=lastShiftZ+velZ*timeDiff+(imu.linear_acceleration.z-9.801)*timeDiff*timeDiff/2;
Transform T(Transform::Translation(shiftX,shiftY,shiftZ),
Transform::Rotation(imu.orientation.w, imu.orientation.x,
imu.orientation.y, imu.orientation.z));
odom->addTransformData(stamp, T);
}
}
修改完成后,重新编译工作空间:
cd ~/lidar_align_ws
catkin_make
4. 数据采集技巧与最佳实践
高质量的数据采集是成功标定的关键。以下是针对RoboSense和Xsens设备的数据采集建议:
4.1 采集环境选择
- 选择开阔、有丰富几何特征的室内或室外环境
- 避免大面积平面(如空旷的走廊或广场)
- 确保地面平整,无明显坡度变化
4.2 运动模式设计
| 运动类型 | 持续时间 | 说明 |
|---|---|---|
| 缓慢直线运动 | 30秒 | 保持匀速,速度约0.5m/s |
| 旋转运动 | 30秒 | 原地缓慢旋转360度 |
| 8字形运动 | 60秒 | 中等速度画8字形轨迹 |
| 静止 | 10秒 | 设备完全静止 |
4.3 数据录制命令
mkdir -p ~/calib_data
cd ~/calib_data
rosbag record -O lidar_imu_calib.bag /rslidar_points /imu/data
提示:录制时间控制在2-3分钟为宜,过短的数据可能导致标定失败,过长则增加计算时间。
5. 标定执行与结果分析
5.1 修改launch文件
编辑lidar_align.launch文件,更新bag文件路径:
<param name="bag_file" value="/home/username/calib_data/lidar_imu_calib.bag" />
<param name="topic" value="/rslidar_points" />
5.2 执行标定
cd ~/lidar_align_ws
source devel/setup.bash
roslaunch lidar_align lidar_align.launch
标定过程通常需要20-30分钟,取决于数据量和硬件性能。你可以在终端看到类似如下的进度信息:
[ INFO] [1620000000.000000000]: Processing scan 125 of 356
[ INFO] [1620000000.500000000]: Current error: 0.0234
5.3 结果验证
标定完成后,结果会保存在~/lidar_align_ws/src/lidar_align/results目录下,包含:
result.txt- 外参变换矩阵result.ply- 点云可视化文件
使用CloudCompare或MeshLab查看ply文件,检查点云是否清晰、无重影。理想情况下,静态场景的点云应该完全重合。
6. 常见问题排查
6.1 标定失败的可能原因
-
数据质量问题
- 运动不够充分
- 环境特征不足
- 传感器数据不同步
-
硬件问题
- IMU未正确校准
- 雷达安装不稳定
- 设备供电不足
-
软件配置问题
- ROS时间同步问题
- TF树配置错误
- 话题名称不匹配
6.2 错误解决方案
问题: "No transform data found in bag file"
解决:
- 检查bag文件是否包含IMU数据
- 确认话题名称是否正确
- 验证源码修改是否完整
问题: "Point cloud is too sparse"
解决:
- 检查雷达连接是否正常
- 尝试降低雷达的扫描频率
- 增加数据采集时间
问题: "Optimization failed to converge"
解决:
- 重新采集数据,增加运动多样性
- 尝试调整lidar_align的参数
- 检查IMU数据是否包含有效的方向信息
在实际项目中,我发现最关键的环节是数据采集。一次在仓库环境中,由于墙面过于光滑,导致标定结果不理想。后来我们添加了一些临时障碍物,问题就解决了。另一个经验是,IMU的温度稳定性对结果影响很大,建议在设备运行30分钟后再开始标定。
更多推荐
所有评论(0)