4. 3D相机选型与标定
3D机器视觉引导机器人抓取系统的精度与稳定性,根本上取决于两个环节:相机选型是否匹配实际工况,以及标定是否严谨可靠。选型决定了“看得清、看得准”的上限,而标定则决定了从图像坐标到机器人坐标的映射精度。本章围绕3D相机的内参、外参、手眼标定两种典型构型(Eye-in-Hand与Eye-to-Hand)、标定板选择及完整标定流程展开,帮助工程师建立从硬件选型到系统标定的完整知识闭环。
4.1 相机内参:从像素到空间坐标的桥梁
核心原理:相机内参描述了3D空间点在相机坐标系下的坐标与其在图像传感器上像素坐标之间的映射关系。对于3D相机(如结构光、ToF、双目视觉),内参不仅包含传统的2D内参矩阵(焦距、主点、畸变),还包含深度方向的误差模型。内参矩阵通常表示为:
K = [fx 0 cx
0 fy cy
0 0 1]
其中fx、fy为归一化焦距(单位:像素),cx、cy为主点坐标。对于3D相机,还需要额外标定深度误差随距离变化的曲线,通常用多项式或查找表描述。
标定方法:常用的内参标定方法包括张正友标定法(适用于2D平面靶标)和基于立体标定块的三维标定法。张正友法通过采集不同姿态下棋盘格或圆点阵列的图像,利用单应性矩阵约束求解内参。对于3D相机,还需要采集不同距离下的标定板图像,建立深度误差模型。
| 内参参数 | 物理含义 | 典型值范围 | 标定方法 |
|---|---|---|---|
| fx, fy | 焦距(像素单位) | 500~3000 px | 张正友法 / 立体靶标 |
| cx, cy | 主点坐标 | 图像中心附近 | 张正友法 |
| k1, k2, p1, p2 | 径向/切向畸变 | -0.5 ~ 0.5 | 非线性优化 |
| 深度误差模型 | 深度测量偏差 vs 距离 | ±0.1% ~ ±1% 量程 | 多距离采集拟合 |
4.2 相机外参与手眼标定:Eye-in-Hand vs Eye-to-Hand
核心原理:外参描述了相机坐标系与机器人坐标系之间的变换关系。根据相机安装位置的不同,手眼标定分为两种构型:
- Eye-in-Hand(眼在手上):相机固定在机器人末端法兰上,随机械臂运动。标定目标是求解相机坐标系到机器人末端坐标系的变换矩阵(记为
X)。 - Eye-to-Hand(眼在手外):相机固定在外部支架或环境中,不随机械臂运动。标定目标是求解相机坐标系到机器人基座坐标系的变换矩阵(记为
X)。
两种构型的核心方程均为AX = XB形式,其中A为机器人末端位姿变化,B为标定板在相机坐标系下的位姿变化。通过采集多组(至少3组,建议8~15组)不同位姿下的数据,利用Tsai-Lenz或Park-Martin算法求解。
| 对比维度 | Eye-in-Hand | Eye-to-Hand |
|---|---|---|
| 相机安装位置 | 机器人末端法兰 | 外部固定支架 |
| 标定目标 | 相机→末端变换 | 相机→基座变换 |
| 视野灵活性 | 高,可随机械臂调整视角 | 固定,视野范围受限 |
| 标定板放置 | 固定在工作空间内 | 固定在机器人末端 |
| 典型应用 | 近距离精细抓取、装配 | 大范围分拣、码垛 |
| 标定复杂度 | 中等,需考虑末端负载 | 较低,一次标定长期使用 |
4.3 标定板选择与标定流程
标定板类型:标定板是标定流程中的基准参照物,其精度直接影响标定结果。常用标定板包括:
- 棋盘格标定板:角点检测精度高,适用于2D内参标定和手眼标定。建议使用7×10或9×12格,方格尺寸10~30mm。
- 圆点阵列板:圆心提取抗噪能力强,适合3D相机(特别是结构光相机)的深度标定。圆点直径建议5~15mm,间距为直径的2~3倍。
- Charuco板:结合棋盘格与ArUco编码,支持部分遮挡下的鲁棒检测,适合视野受限场景。
- 3D立体标定块:包含多个不共面的标定面,用于一次性标定相机内参和外参,适合深度相机出厂标定。
标准标定流程:
- 准备工作:固定相机或机器人,确保标定板表面平整、无反射。记录机器人型号、相机型号、工作距离范围。
- 采集标定数据:对于Eye-in-Hand,将标定板固定在工作空间内,控制机器人运动到8~15个不同位姿(包含平移和旋转变化),每个位姿下采集标定板图像并记录机器人末端位姿。对于Eye-to-Hand,将标定板固定在机器人末端,同样采集多组数据。
- 特征提取:对标定板图像进行角点或圆心检测,输出亚像素级特征点坐标。
- 求解内参:使用OpenCV或厂商SDK进行内参标定,输出内参矩阵和畸变系数。
- 求解手眼矩阵:利用
AX = XB方程求解手眼变换矩阵。检查重投影误差,通常要求小于0.5像素。 - 验证与优化:使用验证集(未参与标定的数据)计算抓取精度。如果误差超差,检查数据质量、增加采集组数或重新标定。
# 伪代码示例:手眼标定数据采集
for i in range(15):
robot.move_to(pose[i]) # 移动机器人到预设位姿
image = camera.capture() # 采集标定板图像
board_pose = detect_board(image) # 检测标定板位姿
gripper_pose = robot.get_pose() # 读取机器人末端位姿
data.append((gripper_pose, board_pose))
# 求解 AX = XB
X = solve_hand_eye(data, method='tsai_lenz')
AX = XB方程会退化,导致求解结果不稳定。建议每个位姿至少包含绕两个轴的旋转变化(如俯仰和偏航各15°以上),并确保标定板在相机视野中占比超过30%。
4.4 实战案例:Eye-in-Hand标定在精密装配中的应用
背景与约束:某3C电子装配线需要引导六轴机器人完成手机摄像头模组的精密装配,要求抓取定位精度±0.3mm。相机选用某品牌结构光3D相机,工作距离200mm,视野范围80×60mm。机器人重复定位精度±0.02mm。初始采用Eye-to-Hand构型,但实际抓取精度仅达到±0.8mm,无法满足要求。
问题分析:经排查,Eye-to-Hand构型下,相机固定于设备支架上,由于设备振动和热胀冷缩,相机与机器人基座的相对位置发生漂移,导致标定矩阵失效。此外,装配工位存在遮挡,固定视角无法完整观察抓取区域。
方案调整:改为Eye-in-Hand构型,将相机安装在机器人末端法兰上。重新执行标定流程:
- 将Charuco标定板(12×9格,方格15mm)固定在工作台面上。
- 规划15个标定位姿,覆盖工作空间内的不同高度和角度,每个位姿包含至少20°的旋转变化。
- 采集图像并记录机器人末端位姿,使用OpenCV的
calibrateCameraCharuco和solveHandEye函数求解。 - 标定结果重投影误差0.32像素,手眼矩阵平移分量标准差0.05mm。
结果对比:切换为Eye-in-Hand后,实际抓取精度提升至±0.25mm,满足工艺要求。同时,机械臂可主动调整视角避开遮挡,装配成功率从92%提升至99.5%。
复盘经验:对于高精度装配场景,Eye-in-Hand构型具有天然优势——相机与末端相对固定,不受外部环境漂移影响。但需注意相机重量对机器人负载的影响,以及随动电缆的寿命管理。标定数据采集时,建议使用自动标定程序,减少人工操作引入的误差。