第三节:传感器标定基础
聊到传感器融合,标定是绕不开的第一步。我见过不少团队,算法模型选得挺先进,结果一上路就崩——查来查去,原来是标定没做好。说白了,标定就是给传感器「配眼镜」,让它们看清这个世界,并且彼此对齐。
3.1 标定的目的与意义
为什么要标定?我直接说大白话:让传感器输出的数据真实反映物理世界。
你想想看,一个摄像头装在车上,它看到的像素坐标和真实世界的三维坐标之间,存在一个映射关系。这个关系如果不对,那后面的融合、感知、决策全是错的。标定就是把这个映射关系算出来。
具体来说,标定解决三个核心问题:
- 消除制造误差:镜头畸变、安装偏差、芯片偏移,这些出厂就有
- 统一坐标系:摄像头、激光雷达、毫米波雷达各说各话,得翻译成同一种语言
- 建立时空对齐:不同传感器的数据在时间和空间上要能对上号
核心观点:标定不是一次性的「做完就完」,而是贯穿传感器生命周期的工作。温度变化、振动、时间推移都会让标定参数漂移。
我在项目里遇到过一件事:一台测试车跑了三个月,突然发现障碍物检测偏差越来越大。排查了两天,最后发现是摄像头固定螺丝松了,外参变了。从那以后,我坚持在每次路测前做一次快速标定校验。
3.2 内参标定与外参标定
这两个概念很多人容易搞混。我习惯这么区分:内参是传感器自己的事,外参是传感器之间的事。
3.2.1 内参标定
内参标定,说白了就是搞清楚传感器「自己长什么样」。
对于摄像头,内参包括:
- 焦距(fx, fy)
- 主点偏移(cx, cy)
- 畸变系数(k1, k2, p1, p2, k3)
对于激光雷达,内参包括:
- 激光发射角
- 旋转轴偏移
- 各线束的垂直角度偏差
内参标定通常在生产环节完成,但使用过程中也需要定期校验。我见过一个案例:某款激光雷达用了半年后,测距精度从±2cm漂到了±5cm,重新标定内参后才恢复。
3.2.2 外参标定
外参解决的是「传感器A和传感器B之间的相对位置和姿态」。
举个例子:摄像头看到一辆车在像素坐标(500, 300)处,激光雷达在同一个时刻测到同一个点在(10m, 2m, 0.5m)处。这两个数据怎么对应起来?靠的就是外参——一个旋转矩阵R和一个平移向量t。
外参标定的常见方法:
- 目标物法:在共同视野内放置标定板,同时采集数据
- 自然特征法:利用道路上的车道线、路沿等特征
- 在线标定:车辆行驶过程中动态估计外参
我的经验:外参标定最怕「过拟合」。我曾经用一组数据把外参调得特别准,换一个场景就崩了。后来我学会了用多组不同距离、不同角度的数据做联合优化。
3.3 标定板设计
标定板是标定工作的「尺子」。选什么样的标定板,直接影响标定精度和效率。
3.3.1 棋盘格标定板
棋盘格是最经典的标定板,也是我入行时第一个接触的。
它的原理很简单:黑白相间的格子,角点清晰,容易检测。OpenCV的findChessboardCorners()函数就是专门干这个的。
设计棋盘格时要注意:
- 格子数量:建议7×10或9×12,太少角点不够,太多容易误检
- 格子大小:根据传感器距离和分辨率决定,一般30mm-100mm
- 材质:亚光打印纸最好,反光材料会引入噪声
// 棋盘格角点检测示例(C++)
cv::Mat image = cv::imread("calib_image.jpg");
cv::Size patternSize(9, 6); // 内角点数量
std::vector<cv::Point2f> corners;
bool found = cv::findChessboardCorners(image, patternSize, corners);
if (found) {
cv::drawChessboardCorners(image, patternSize, corners, found);
// 进一步做亚像素精化
cv::cornerSubPix(gray, corners, cv::Size(5,5), cv::Size(-1,-1),
cv::TermCriteria(cv::TermCriteria::EPS + cv::TermCriteria::COUNT, 30, 0.1));
}
避坑指南:我曾经用一张A4纸打印的棋盘格去标定长焦摄像头,结果角点检测总是失败。后来发现是格子太小,远距离时角点模糊成一团。记住:标定板尺寸要和传感器分辨率匹配。
3.3.2 AprilTag标定板
AprilTag是后来兴起的方案,比棋盘格更「聪明」。
它的每个Tag都自带ID,系统可以自动识别是哪个Tag、在什么位置、朝向如何。这意味着:
- 不需要人工指定角点顺序
- 部分遮挡也能工作
- 支持多Tag拼接,覆盖更大视野
AprilTag的设计参数:
| 参数 | 说明 | 推荐值 |
|---|---|---|
| Tag家族 | 编码方式 | Tag36h11(鲁棒性好) |
| Tag大小 | 单个Tag的边长 | 50mm-200mm |
| 间距 | Tag之间的间隔 | 0.5倍Tag大小 |
| 布局 | 行列数量 | 3×3 或 4×4 |
我个人习惯用AprilTag做多传感器联合标定。因为它的ID信息可以自动匹配不同传感器中的对应点,省去了手动选点的麻烦。
3.4 知识体系总览
下面这张图把本章的核心逻辑串起来了。你可以看到标定工作从「为什么做」到「怎么做」的完整链路。
从这张图可以看得很清楚:标定目的驱动了内参和外参两大方向,而标定板则是实现这些标定的具体工具。棋盘格和AprilTag各有优劣,选哪个取决于你的应用场景和精度要求。
我的建议:如果你是刚入门,先从棋盘格开始,把内参标定的流程跑通。等你对标定原理有了手感,再切换到AprilTag做多传感器联合标定。一步一个脚印,别贪多。
公众号:蓝海资料掘金营,微信deep3321