4、标定板设计:棋盘格与AprilTag、圆形标定板(Calibao)、多传感器通用标定板设计原则
标定板这东西,说白了就是给传感器看的「尺子」。你想想看,传感器要校准,总得有个已知尺寸的参照物吧?我这些年经手过的项目,从单目相机到激光雷达,从热成像到事件相机,几乎每个系统都离不开一块靠谱的标定板。
但问题来了——不同传感器对「参照物」的要求完全不一样。相机喜欢高对比度的角点,激光雷达需要高反射率的特征,深度相机又怕反光太强。嗯,这里面的门道,我今天跟你好好聊聊。
4.1 棋盘格标定板:经典但别踩坑
棋盘格,最经典的标定工具。我刚开始做视觉SLAM那会儿,用的就是A4纸打印的棋盘格。便宜、简单、角点检测算法成熟,OpenCV里直接调findChessboardCorners就行。
但棋盘格有个致命问题——方向模糊性。你拍一张棋盘格照片,旋转180度后,角点坐标完全一样。这就导致标定结果可能整体偏转180度,尤其在多相机系统中,外参直接崩掉。
怎么解决?我建议用非对称棋盘格,比如一边是偶数格,一边是奇数格。或者干脆在棋盘格角落加一个标记点,用来指示方向。
另一个要注意的是棋盘格尺寸。我个人的经验是:
- 室内标定:格子边长20-30mm,7×9或8×11格
- 室外远距离:格子边长50-100mm,格数少一些
- 微距/小视场:格子边长5-10mm,用高精度玻璃基板
打印棋盘格时,记得用哑光纸。亮面纸反光严重,尤其在强光下,角点检测会飘。我见过有人用相纸打印,结果标定出来的内参误差大了三倍。
4.2 AprilTag:鲁棒性更强的选择
AprilTag是密歇根大学搞出来的视觉基准标记系统。说白了,就是给每个标记一个「身份证号」。你拍到一个AprilTag,不仅能知道它的角点位置,还能知道它是几号标记、朝向哪个方向。
这比棋盘格强在哪?
- 单帧可用:一个AprilTag就能解算位姿,棋盘格至少需要拍到完整图案
- 方向唯一:每个Tag有编码,不存在180度歧义
- 部分遮挡也能用:只要检测到足够多的码元,就能恢复ID和位姿
AprilTag有不同家族(family),比如Tag16h5、Tag25h9、Tag36h11。数字代表码元数量和最小汉明距离。我一般用Tag36h11,鲁棒性最好,误检率极低。
生成AprilTag的代码很简单,用官方库就行:
# 安装AprilTag库
pip install apriltag
# 生成Tag图像
from apriltag import apriltag
import cv2
import numpy as np
# 生成Tag36h11家族的ID为0的Tag
tag = apriltag("tag36h11", 0)
tag_image = tag.generate(tag_size=200) # 200x200像素
cv2.imwrite("tag36h11_0.png", tag_image)
打印AprilTag时,注意黑色边框要完整。我见过有人为了省纸,把Tag的白色边框裁掉了,结果检测率直接掉到50%以下。白色边框是解码的必要区域,千万别动。
4.3 圆形标定板(Calibao):高精度之选
圆形标定板,也叫Calibao(Calibration Board的简称)。它用圆形图案代替棋盘格的角点,检测的是圆心位置。
为什么用圆?因为圆心的亚像素定位精度比角点高。角点检测受图像梯度影响大,而圆心的椭圆拟合可以做到0.1像素甚至更高精度。我在做高精度工业相机标定时,棋盘格标出来的重投影误差0.3像素,换成圆形标定板直接降到0.08像素。
但圆形标定板也有坑——透视畸变。你拍一个圆,在图像上变成椭圆,圆心位置会偏移。这个偏移量跟圆的半径、相机视角有关。好在OpenCV的findCirclesGrid函数已经做了补偿,但前提是圆的半径要准确输入。
| 标定板类型 | 精度 | 鲁棒性 | 适用场景 |
|---|---|---|---|
| 棋盘格 | 中等(0.3-0.5像素) | 高(角点检测成熟) | 通用标定、快速验证 |
| AprilTag | 中等(0.3-0.5像素) | 极高(抗遮挡、方向唯一) | 多传感器、部分遮挡场景 |
| 圆形标定板 | 高(0.05-0.15像素) | 中等(受光照影响大) | 高精度标定、工业视觉 |
圆形标定板的布局也有讲究。我建议用非对称排列,比如行和列的圆数量不同,或者圆的大小交替变化。这样能避免方向歧义,也方便自动检测时确定坐标系。
4.4 多传感器通用标定板设计原则
好了,前面聊了三种标定板,各有优劣。但实际项目中,我们往往需要同时标定多个传感器——相机+激光雷达+IMU+深度相机。这时候就需要一块「通用标定板」,让所有传感器都能看到共同的特征。
我总结了几条设计原则,都是血泪换来的:
- 多模态特征共存:板子上同时要有视觉特征(棋盘格/AprilTag)和几何特征(平面、边缘)。激光雷达看不到图案,但能扫到平面和边缘。
- 高反射率差异:激光雷达需要反射率差异来区分特征。我一般用黑色哑光背景+白色高反射材料做图案。这样激光雷达点云中,白色区域的反射率明显高于黑色区域。
- 尺寸适中:板子太小,远距离看不清;板子太大,近距离拍不全。我一般按「最近工作距离下,板子占图像面积的1/4到1/3」来设计。
- 刚性背板:板子必须平整,不能弯曲。我见过有人用泡沫板做标定板,结果稍微一弯,标定出来的外参全是错的。建议用铝合金板或亚克力板做基底。
- 可拆卸设计:不同传感器可能需要不同的特征。我习惯把AprilTag和棋盘格做成可替换的模块,插在同一个背板上。
我推荐的一种通用标定板方案:
- 基底:3mm厚铝合金板,表面喷黑色哑光漆
- 视觉特征:中心贴一个Tag36h11的AprilTag(边长50mm)
- 几何特征:板子四角贴白色高反射陶瓷片(直径20mm)
- 辅助特征:板子边缘贴反光条,用于激光雷达检测边界
这样一块板子,相机能看到AprilTag,激光雷达能扫到陶瓷片和边缘,深度相机能看到平面。所有传感器都能找到共同参考点。
嗯,最后说一句。标定板设计没有「万能方案」,关键是根据你的传感器组合和工作距离来定制。我每次做新项目,都会先画一块板子,打印出来试拍几张,看看检测效果,再调整尺寸和布局。迭代个两三次,基本就能找到最优解。
你想想看,标定板是传感器融合的第一步。这一步走稳了,后面的联合标定、数据融合才能顺风顺水。别在这上面省功夫。