Kalibr实战指南:从零完成双目相机与IMU的高精度联合标定

张开发
2026/4/15 2:41:13 15 分钟阅读

分享文章

Kalibr实战指南:从零完成双目相机与IMU的高精度联合标定
1. 为什么需要双目相机与IMU联合标定在机器人导航、自动驾驶等应用中多传感器融合是提升系统精度的关键。双目相机能提供丰富的视觉信息IMU惯性测量单元则能输出高频的运动数据。但要让它们协同工作首先需要解决一个基础问题确定相机与IMU之间的精确空间关系。想象一下如果IMU检测到设备向左倾斜但相机看到的画面却显示向右移动这种矛盾会导致系统无法正确判断实际运动状态。联合标定的核心目标就是建立两者坐标系之间的准确转换关系包括旋转和平移同时校准IMU的内参如噪声特性。实际项目中我遇到过因标定不准导致的定位漂移问题无人机在飞行中逐渐偏离预定轨迹最后发现是IMU与相机的外参存在毫米级误差。这也印证了标定精度对系统稳定性的关键影响。2. 环境准备与工具安装2.1 硬件与基础软件硬件需求支持ROS的双目相机如Intel RealSense D435i、MYNT EYE-S6轴IMU常见于上述相机模组标定板推荐AprilTag尺寸建议80x80cm以上性能足够的计算设备建议Ubuntu 18.04/20.04ROS安装sudo apt install ros-noetic-desktop-full echo source /opt/ros/noetic/setup.bash ~/.bashrc2.2 Kalibr与依赖项安装Kalibr是ETH Zurich开发的多传感器标定工具链安装步骤如下创建工作空间mkdir -p ~/kalibr_ws/src cd ~/kalibr_ws/src git clone https://github.com/ethz-asl/kalibr.git安装系统依赖sudo apt-get install python3-dev python3-pip \ libeigen3-dev libboost-all-dev libsuitesparse-dev pip3 install numpy scipy matplotlib pyyaml编译Kalibrcd ~/kalibr_ws catkin build -DCMAKE_BUILD_TYPERelease常见坑点如果遇到cv_bridge兼容性问题可尝试单独编译OpenCV 4.x并修改Kalibr的CMakeLists.txt。3. 双目相机标定实战3.1 数据采集技巧录制数据包时需注意以下要点运动模式绕X/Y/Z轴各旋转3次类似拧魔方动作沿三个方向平移运动保持标定板在视野内且占据1/3以上画面优化采集效率# 降低图像频率至4Hz原始频率可能导致数据冗余 rosrun topic_tools throttle messages /camera/left/image_raw 4.0 /left rosrun topic_tools throttle messages /camera/right/image_raw 4.0 /right # 录制数据包 rosbag record -O stereo_calib.bag /left /right实测建议在光线均匀的环境下操作避免反光或阴影影响标定板检测。我曾因实验室荧光灯频闪导致标定失败改用LED光源后解决。3.2 运行标定程序准备标定板配置文件aprilgrid.yamltarget_type: aprilgrid tagCols: 6 tagRows: 6 tagSize: 0.022 # 单位米 tagSpacing: 0.3 # 间距与tagSize的比例执行标定命令rosrun kalibr kalibr_calibrate_cameras \ --bag stereo_calib.bag \ --topics /left /right \ --models pinhole-radtan pinhole-radtan \ --target aprilgrid.yaml \ --show-extraction关键参数解析pinhole-radtan针孔相机模型径向切向畸变模型--show-extraction实时显示特征点检测情况3.3 结果验证标定完成后会生成camchain.yaml检查以下指标重投影误差应小于0.5像素优质数据可达0.2以下基线长度与实际测量值误差应小于1%畸变系数过大值如k10.5可能表明数据质量差我曾遇到基线标定误差达5%的情况后发现是相机支架轻微变形导致。改用刚性安装后误差降至0.3%。4. IMU单独标定4.1 使用imu_utils工具IMU标定主要获取噪声密度和随机游走参数安装工具链cd ~/kalibr_ws/src git clone https://github.com/gaowenliang/code_utils.git git clone https://github.com/gaowenliang/imu_utils.git catkin build静态数据采集# 保持IMU绝对静止2小时重要 rosbag record /imu -O imu_static.bag运行标定launch node pkgimu_utils typeimu_an nameimu_an outputscreen param nameimu_topic value/imu/ param nameimu_name valuemy_imu/ param namedata_save_path value$(find imu_utils)/data// param namemax_time_min value120/ /node /launch4.2 参数解读与校验输出文件my_imu.yaml包含关键参数gyroscope_noise_density: 1.23e-03 # 陀螺仪噪声密度 (rad/s/√Hz) gyroscope_random_walk: 6.45e-05 # 陀螺仪随机游走 (rad/s²/√Hz) accelerometer_noise_density: 2.11e-02 # 加速度计噪声密度 (m/s²/√Hz) accelerometer_random_walk: 3.33e-04 # 加速度计随机游走 (m/s³/√Hz)经验值参考消费级IMU如MPU6050噪声密度通常在1e-2量级工业级IMU如BMI088可达1e-3量级若实测值偏离规格书一个数量级需检查数据采集过程5. 联合标定关键步骤5.1 同步数据采集联合标定需要包含相机和IMU的同步数据rosbag record -O stereo_imu.bag \ /left /right /imu运动技巧在标定板前做8字形运动包含快速旋转激发陀螺仪响应总时长建议3-5分钟5.2 配置文件准备需整合前期标定结果camchain.yaml双目标定结果imu_params.yamlIMU标定结果标定板配置文件5.3 执行联合标定rosrun kalibr kalibr_calibrate_imu_camera \ --target aprilgrid.yaml \ --cam camchain.yaml \ --imu imu_params.yaml \ --bag stereo_imu.bag \ --timeoffset-padding 0.1典型问题处理报错Spline Coefficient Buffer Exceeded增加--timeoffset-padding值标定发散检查时间同步尝试--approx-sync 0.026. 结果分析与验证6.1 标定质量评估查看输出文件results-imucam.txtReprojection error (cam0): mean 0.15px Gyroscope error: mean 0.0002 rad/s Accelerometer error: mean 0.03 m/s²通过标准重投影误差 0.3pxIMU误差应小于标定噪声参数的3倍6.2 外参可视化使用tf工具查看坐标系关系import tf listener tf.TransformListener() print(listener.lookupTransform(cam0, imu0, rospy.Time(0)))实际案例某无人机项目中标定发现IMU的Y轴与相机Z轴存在89°夹角与硬件设计图纸一致验证了标定可靠性。7. 工程实践建议标定板制作使用哑光材质打印粘贴在平整刚性表面尺寸误差控制在0.1mm以内时间同步优化# 检查时间偏移 rostopic hz /cam0/image_raw rostopic hz /imu自动化脚本示例#!/usr/bin/env python3 import subprocess def run_calibration(): cmd rosrun kalibr kalibr_calibrate_imu_camera cmd --target april_6x6.yaml cmd --cam camchain.yaml cmd --imu imu.yaml cmd --bag data/stereo_imu.bag subprocess.call(cmd, shellTrue)在多次项目实践中我发现标定精度对后续的SLAM性能有决定性影响。曾有一个仓储机器人项目通过优化标定流程将定位误差从5cm降至1cm以内。这提醒我们标定不是一次性工作而应作为传感器系统的定期维护项。

更多文章