1. 为什么需要Camera-IMU联合标定当你把手机横过来玩游戏时画面会跟着旋转当你走路时运动相机能拍出稳定的画面——这些看似简单的功能背后都离不开Camera摄像头和IMU惯性测量单元的默契配合。但这两个传感器天生就有代沟摄像头看到的是平面图像IMU感受到的是三维运动要让它们说同一种语言就需要联合标定这个翻译官。举个实际例子我们团队去年给扫地机器人做导航系统时发现直接使用摄像头和IMU的原始数据会导致定位漂移。测试时机器人明明走的是直线建图却出现了5°的偏差。后来发现是两者坐标系没对齐经过标定后误差降到了0.3°以内。这就像两个人跳舞如果步伐节奏不一致再好的舞姿也会变成互相踩脚。2. 标定的数学语言坐标系转换2.1 相机如何看世界相机的成像过程就像画家写生。假设我们要拍摄一个立方体物体在三维空间中的坐标(X,Y,Z)首先被投影到相机前方的虚拟平面这个平面上的坐标(u,v)会经历畸变——就像透过鱼眼镜头看东西会变形最后通过镜头内参相当于画家的比例尺转换成最终的像素坐标用代码表示就是def project_point(K, dist_coeffs, point_3d): # K是相机内参矩阵dist_coeffs是畸变系数 point_2d K (point_3d / point_3d[2]) # 透视除法 r2 point_2d[0]**2 point_2d[1]**2 distortion 1 dist_coeffs[0]*r2 dist_coeffs[1]*r2**2 point_2d[:2] * distortion return point_2d2.2 IMU的运动感知原理IMU就像人体内耳包含陀螺仪测量角速度单位度/秒加速度计测量线性加速度单位m/s²但实际IMU存在各种误差零偏误差静止时也会有微小输出尺度误差读数与实际值比例不准轴间干扰X轴运动会影响Y轴读数这些误差需要用数学模型修正真实角速度 (测量值 - 零偏) × 尺度因子 轴间耦合补偿3. Kalibr工具实战指南3.1 搭建标定环境建议使用Ubuntu 20.04系统按这个顺序安装依赖sudo apt-get install python3-dev python3-pip pip install numpy scipy matplotlib sudo apt-get install ros-noetic-kalibr # ROS用户专用标定道具推荐AprilTag标定板建议打印A3尺寸平稳的桌面避免振动干扰充足但柔和的照明避免反光3.2 数据采集技巧我们踩过的坑运动要慢而稳像打太极一样匀速移动设备轨迹要丰富包含上下左右倾斜和旋转时长控制在2-3分钟太短数据不足太长容易疲劳录制数据的命令示例rosbag record /cam/image_raw /imu/data -O calibration.bag3.3 标定流程详解时间对齐用kalibr_calibrate_imu_camera工具关键参数--timeoffset-padding 0.1初始估计# 初始猜测值示例 imu0: T_i_b: [[0,-1, 0, 0.05], [1, 0, 0,-0.01], [0, 0, 1, 0.1], [0, 0, 0, 1]]联合优化建议先跑快速模式检查数据质量最终优化使用--max-iterations 504. 标定结果验证与应用4.1 检查标定质量合格标定应满足重投影误差 0.5像素IMU加速度残差 0.1 m/s²角速度残差 0.01 rad/s我们项目中的bad case有一次标定板反光导致AprilTag检测异常解决方法是在标定板表面贴哑光膜4.2 在VIO系统中的使用将标定结果写入配置文件cam0: T_cam_imu: [[ 0.999, -0.005, 0.012, 0.021], [ 0.006, 0.998, -0.042, -0.015], [-0.011, 0.042, 0.999, 0.032], [ 0.000, 0.000, 0.000, 1.000]] time_offset: 0.00254.3 常见问题排查标定发散检查时间同步是否正确尝试减小运动幅度重投影误差大重新检查相机内参标定确认标定板检测是否准确IMU噪声异常检查设备是否接触不良尝试在磁干扰小的环境操作在实际项目中我们发现温度变化会影响IMU零偏。建议在设备工作温度范围内重新标定或者使用在线标定算法补偿。最近用Kalibr给工业AGV做标定时通过增加温度传感器采集环境数据将系统稳定性提高了40%。