传感器标定技术:内参标定与外参标定
说到传感器融合,标定是绕不开的第一道坎。我见过太多团队,算法模型调得漂漂亮亮,一上实车就崩,最后查来查去——标定参数是错的。说白了,标定就是给传感器「配眼镜」,度数不对,后面全是白费力气。
这一章咱们聊聊内参标定和外参标定。内参是传感器自己的「脾气」,外参是传感器之间的「关系」。嗯,先讲内参。
内参标定:IMU六面法
IMU(惯性测量单元)这东西,出厂时每个轴都有偏差。你把它放平了,它告诉你倾斜了0.5度——这就是零偏。还有尺度因子、交叉耦合,都得标。
六面法是我个人最常用的方法。为什么叫六面法?因为你要把IMU分别朝六个方向静置:X轴朝上、X轴朝下、Y轴朝上、Y轴朝下、Z轴朝上、Z轴朝下。每个方向采集几十秒数据,取平均。
核心原理很简单:地球重力是已知的(约9.8 m/s²),每个方向上的理论加速度值就是[0, 0, g]或者[0, 0, -g]这种。实际测量值和理论值之间的差异,就是你要补偿的参数。
标定模型(简化版):
a_meas = S * (a_true + b) + n
其中S是尺度因子矩阵,b是零偏向量,n是噪声。六面法可以解出S和b。
我在项目里遇到过一个问题:IMU装在电路板上,电路板本身有轻微形变。六面法标出来的参数,换一个安装位置就不准了。后来我加了一步——先做温度补偿,再做六面法。效果好了不少。
避坑指南:我曾经用六面法标定一个低成本IMU,发现Z轴数据总是偏大。查了半天,原来是桌面上有个小磁铁干扰了加速度计。标定环境一定要干净,远离磁场源。
内参标定:相机棋盘格
相机内参标定,说白了就是搞清楚镜头畸变和焦距。最经典的方法就是棋盘格标定——打印一张棋盘格,拍个十几张不同角度的照片,然后用OpenCV的calibrateCamera()搞定。
为什么用棋盘格?因为角点检测稳定。你想想看,黑白交界的角点,亚像素精度都能做到0.1像素以内。我习惯用7×10的棋盘格,格子大小30mm,打印出来贴在硬纸板上。
标定步骤很简单:
- 拍10-20张照片,覆盖视野各个区域
- 检测角点,提取像素坐标
- 输入已知的物理坐标(棋盘格尺寸)
- 求解内参矩阵和畸变系数
这里有个坑——照片不能都在同一个角度拍。我见过有人拍了20张,全是正对着棋盘格的,结果标出来的畸变参数完全不对。要旋转、倾斜、远近都拍一些。
注意:棋盘格不要有折痕,不要反光。我吃过这个亏——一张旧棋盘格,折痕处的角点检测总是偏移,标出来的焦距差了2%。
外参标定:手眼标定
手眼标定,解决的是「机械臂末端和相机之间的位姿关系」。说白了,就是相机装在机械臂上,你要知道相机坐标系相对于机械臂末端坐标系的变换矩阵。
公式很简单:AX = XB。A是机械臂末端的运动,B是相机看到的运动,X就是你要找的手眼矩阵。解这个方程,至少需要两组非平行的运动。
我常用的方法是Tsai两步法:先解旋转,再解平移。OpenCV里有calibrateHandEye(),直接调用就行。但要注意——输入数据要足够好。机械臂的运动精度、标定板的角点检测精度,都会影响结果。
实战经验:我建议至少采集15组运动数据。每组运动包含两个位姿:起始位姿和终止位姿。运动幅度要大一些,旋转角度至少30度,平移距离至少100mm。小幅度运动解出来的X,误差会很大。
外参标定:激光-相机联合标定
激光雷达和相机,一个给深度,一个给纹理。但要把它们的数据融合,得先知道它们之间的位姿关系。这就是激光-相机联合标定。
方法有很多,我讲一个最实用的:用棋盘格做标定物。激光雷达扫到棋盘格上,会得到一些点云;相机拍到棋盘格,会得到角点。通过棋盘格在两种传感器中的观测,可以解出外参。
具体流程:
- 把棋盘格放在激光雷达和相机的共同视野内
- 激光雷达采集点云,提取棋盘格平面上的点
- 相机采集图像,提取棋盘格角点
- 用PnP或优化方法求解外参
这里有个关键点——激光雷达的点云要能清晰看到棋盘格边缘。我遇到过激光雷达分辨率太低,棋盘格边缘模糊的情况。后来换了大棋盘格(1m×1m),效果才好转。
小技巧:标定前,先把激光雷达和相机的时间戳对齐。我习惯用硬件触发同步,实在不行就用软件插值。时间不同步,标出来的外参是错的。
标定工具与流程
工具方面,我推荐几个:
- Kalibr:ETH Zurich出品,支持多相机、IMU、激光雷达联合标定。功能强大,但配置复杂。
- OpenCV:相机标定的标配,简单好用。
- lidar_camera_calibration:一个ROS包,专门做激光-相机标定,上手快。
- MATLAB标定工具箱:图形化界面,适合快速验证。
标定流程我一般这么走:
- 先标内参(IMU六面法、相机棋盘格)
- 再标外参(手眼标定或激光-相机联合标定)
- 最后做验证——用标定结果投影点云到图像上,看看对齐效果
验证这一步很重要。我习惯把激光点云投影到图像上,如果边缘对齐误差在2个像素以内,就算合格。超过5个像素,就得重新标。
最后提醒:标定不是一劳永逸的。传感器安装位置变了、温度变化大了、甚至螺丝松了,都得重新标。我建议每次项目启动前,先做一次标定验证。
好了,标定技术就聊到这儿。下一章咱们讲数据同步——时间戳对齐和硬件触发,这也是个容易翻车的地方。