1. 项目概述
在计算机视觉和机器人定位导航领域,相机与IMU的联合标定一直是影响系统精度的关键环节。我最近完成了一个工业级视觉惯性系统的标定项目,需要同时处理单目/双目相机内参标定、相机与IMU之间的外参标定,以及时间同步校准。这个看似基础的工作,在实际操作中却藏着不少"坑",今天就把我的实战经验完整分享给大家。
这个技术主要解决三个核心问题:第一,消除相机镜头畸变对视觉测量的影响;第二,建立相机与IMU之间的精确空间转换关系;第三,补偿两者之间的时间戳偏差。这三个问题不解决,后续的视觉惯性里程计(VIO)或SLAM算法精度会大打折扣。根据我的实测数据,良好的标定可以将VIO的轨迹误差降低60%以上。
2. 核心设备选型与准备
2.1 相机选择考量
单目相机标定相对简单,适合计算资源有限的场景。我常用的配置是全局快门相机(如FLIR BFS-U3-04S2M)搭配广角镜头(视场角90°左右),分辨率建议不低于640×480。双目系统我推荐使用硬件同步的相机对(如ZED系列),基线距离根据应用场景选择:室内10-15cm,室外20-30cm为宜。
重要提示:千万不要用消费级摄像头做标定!它们的自动曝光和自动对焦会引入额外变量,导致标定结果不稳定。我吃过这个亏,标定板图像忽明忽暗,重投影误差波动超过20%。
2.2 IMU选型建议
MEMS级IMU(如BMI088)成本低但噪声大,需要更长的标定时间。工业级IMU(Xsens MTi系列)虽然贵3-5倍,但标定效率能提升50%以上。关键指标要看:
- 陀螺仪零偏稳定性:<10°/h为佳
- 加速度计噪声密度:<100μg/√Hz
- 输出频率:≥200Hz
2.3 标定板制作
我习惯用AprilTag棋盘混合标定板,尺寸建议A3以上。棋盘格间距要精确测量(误差<0.1mm),推荐使用激光切割亚克力板。一个实用技巧:在标定板背面加装LED补光灯,这样在暗光环境下也能获得高对比度图像。
3. 单目相机标定实战
3.1 数据采集要点
采集时要用"八字形"运动轨迹覆盖相机整个视场,每个视角保持2-3秒静止。我通常采集50-100组图像,确保标定板出现在图像的不同区域。特别注意:
- 标定板要占图像1/3到1/2面积
- 棋盘格要有明显倾斜角度(30°-60°)
- 避免纯旋转运动,要有平移分量
3.2 OpenCV标定参数详解
使用cv::calibrateCamera时的关键参数设置:
cpp复制double rms = calibrateCamera(
objectPoints, imagePoints, imageSize,
cameraMatrix, distCoeffs,
rvecs, tvecs,
CALIB_FIX_K3 | CALIB_FIX_PRINCIPAL_POINT // 固定第三阶径向畸变和主点
);
经验值参考:
- 重投影误差应<0.3像素
- 焦距(fx,fy)差异<5%为正常
- 切向畸变系数(p1,p2)绝对值应<0.01
3.3 标定结果验证技巧
我常用的验证方法:
- 用标定参数去畸变后,直线应保持笔直
- 在新位置拍摄标定板,计算重投影误差
- 检查标定板深度估计是否合理(双目系统)
4. 双目相机标定进阶
4.1 立体标定特殊处理
双目标定除了单目参数外,还需要估计:
- 基线长度(单位mm)
- 右相机相对于左相机的旋转矩阵R和平移向量T
- 极线约束参数
关键代码段:
cpp复制stereoCalibrate(
objectPoints, imagePoints1, imagePoints2,
cameraMatrix1, distCoeffs1,
cameraMatrix2, distCoeffs2,
imageSize, R, T, E, F,
CALIB_FIX_INTRINSIC // 固定已标定的内参
);
4.2 双目对齐质量评估
我总结的验收标准:
- 极线误差<0.5像素
- 视差图在标定板区域应连续平滑
- 实际测量距离与标定板真实距离误差<1%(在2m范围内)
5. IMU本征标定
5.1 静态标定法
将IMU静止放置至少2小时,采集数据计算:
- 加速度计零偏:均值减去重力
- 陀螺仪零偏:直接取均值
- 温度补偿模型(如果需要)
5.2 动态标定技巧
使用转台进行多轴旋转,标定:
- 尺度因子误差
- 轴间不对准误差
- 陀螺仪G敏感性
我设计的六位置标定法流程:
- 设备朝上静止30s
- 设备朝下静止30s
- 绕X轴慢速旋转360°
- 绕Y轴慢速旋转360°
- 绕Z轴慢速旋转360°
- 任意方向晃动30s
6. 相机-IMU联合标定
6.1 空间标定原理
估计相机到IMU的变换矩阵T_ci = [R|t],核心方程:
code复制ω_c = R_ci * ω_i // 角速度关系
a_c = R_ci * (a_i + [ω_i]× * t_ci) // 加速度关系
其中[ω_i]×是角速度的斜对称矩阵。
6.2 Kalibr工具链实战
推荐使用ETHZ开发的Kalibr工具:
bash复制kalibr_calibrate_imu_camera \
--target aprilgrid.yaml \
--cam camchain.yaml \
--imu imu.yaml \
--bag dynamic.bag \
--timeoffset-padding 0.1
关键参数说明:
- timeoffset-padding:时间戳补偿范围
- max-iterations:建议设为200
- reporj-thresh:重投影阈值(默认3px)
6.3 时间标定方案
时间同步误差要控制在1ms以内,我采用的方案:
- 硬件同步:使用FPGA产生触发信号
- 软件补偿:估计相机和IMU时钟的漂移率
- 运动激励:需要充分的加速度和角速度变化
7. 标定结果验证体系
7.1 定量评估指标
我建立的评估表格:
| 指标 | 单目相机 | 双目相机 | IMU | 联合标定 |
|---|---|---|---|---|
| 重投影误差(px) | <0.3 | <0.5 | - | <0.8 |
| 零偏稳定性 | - | - | <0.01m/s² | <0.015m/s² |
| 重复性(%) | <1 | <2 | <3 | <5 |
7.2 实际场景测试
必须进行的实地验证:
- 手持设备走矩形轨迹,检查闭环误差
- 快速旋转测试陀螺仪对齐质量
- 振动环境测试加速度计标定效果
8. 常见问题排查指南
8.1 标定发散问题
现象:重投影误差>2px或参数异常
解决方法:
- 检查标定板角点检测是否准确
- 确认图像没有运动模糊
- 尝试减小标定板倾斜角度
8.2 IMU噪声过大
现象:标定结果不稳定
应对措施:
- 延长数据采集时间(至少10分钟)
- 增加温度补偿模块
- 使用Allan方差分析噪声特性
8.3 时间同步异常
现象:轨迹出现"双影"
调试步骤:
- 检查硬件触发信号是否稳定
- 验证时间戳对齐算法
- 调整运动激励模式
9. 工程优化经验
9.1 自动化标定流程
我开发的自动化脚本包含:
- 数据质量检查模块
- 参数合理性验证
- 结果可视化报告生成
9.2 标定环境控制
重要但易忽视的细节:
- 温度保持恒定(±2°C)
- 避免强磁场干扰
- 使用防震平台减少振动
9.3 长期稳定性维护
建议每3个月或遇到以下情况时重新标定:
- 设备受到强烈冲击
- 工作温度范围变化>15°C
- 镜头焦距调整后
经过这个项目的锤炼,我最大的体会是:标定不是一次性工作,而是一个需要持续优化的过程。现在我的标定流程已经从最初的8小时缩短到2小时,精度还提升了30%。关键是要建立完整的验证体系,不能只看标定时的指标,更要关注实际应用中的表现。