避坑实战: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 关键修改步骤

  1. 添加头文件:
#include <sensor_msgs/Imu.h>
  1. 注释掉原有的里程计部分代码。

  2. 添加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目录下,包含:

  1. result.txt - 外参变换矩阵
  2. result.ply - 点云可视化文件

使用CloudCompare或MeshLab查看ply文件,检查点云是否清晰、无重影。理想情况下,静态场景的点云应该完全重合。

6. 常见问题排查

6.1 标定失败的可能原因

  1. 数据质量问题

    • 运动不够充分
    • 环境特征不足
    • 传感器数据不同步
  2. 硬件问题

    • IMU未正确校准
    • 雷达安装不稳定
    • 设备供电不足
  3. 软件配置问题

    • 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分钟后再开始标定。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐