3. 相机标定与手眼标定
在3D视觉引导定位与抓取项目中,相机标定与手眼标定是决定系统绝对定位精度的基石。如果标定环节存在偏差,后续的点云处理、位姿估计和机器人运动学解算都将被系统性误差污染。本节将深入剖析相机内参外参标定的数学模型、手眼标定的两种核心架构(Eye-in-Hand与Eye-to-Hand)的差异,并结合实际产线案例,给出从标定板设计到数据采集、方程求解、精度验证的完整闭环流程。
3.1 相机内参标定:从像素到物理世界的桥梁
3.1.1 核心原理:针孔模型与畸变补偿
3D视觉系统使用的工业相机(如Basler、海康、大恒)或3D结构光相机(如Ensenso、Photoneo)在出厂时虽有一定标定数据,但实际安装镜头后,由于C接口公差、镜头畸变、温度漂移等因素,必须进行现场标定。内参标定的核心是求解相机坐标系到图像坐标系的映射关系,包括焦距(fx, fy)、主点(cx, cy)以及径向畸变系数(k1, k2, k3)和切向畸变系数(p1, p2)。
对于3D视觉引导项目,内参标定的精度直接影响深度图与RGB图的融合质量。以结构光相机为例,若内参偏差超过0.5像素,在600mm工作距离下,Z方向深度误差可能放大至2-3mm,这对于精密装配(如轴承压装、螺丝锁付)是不可接受的。
3.1.2 标定板设计与数据采集规范
标定板的选择需根据相机视场角和工作距离确定。对于抓取场景(工作距离300-1000mm),推荐使用以下规格:
| 标定板类型 | 适用场景 | 推荐尺寸 | 特征点数量 |
|---|---|---|---|
| 棋盘格(7×9) | 标准工业相机 | 覆盖视场2/3以上 | 48个角点 |
| 圆点阵(11×9) | 3D结构光相机 | 圆形特征更易提取 | 99个圆心 |
| ChArUco板 | 大视场/多相机 | 支持部分遮挡 | 自适应 |
数据采集时需遵循"三不原则":不共面(避免所有标定板在同一平面)、不纯平移(每组位姿需包含旋转)、不贴边(标定板边缘需保留10%余量)。建议采集15-20组图像,覆盖视场中心和边缘区域。
3.1.3 内参求解与重投影误差验证
使用OpenCV的cv2.calibrateCamera()或Halcon的caltab_points()进行求解。以OpenCV为例,核心代码流程如下:
import cv2
import numpy as np
# 准备棋盘格角点世界坐标
pattern_size = (7, 9)
objp = np.zeros((pattern_size[0]*pattern_size[1], 3), np.float32)
objp[:, :2] = np.mgrid[0:pattern_size[0], 0:pattern_size[1]].T.reshape(-1, 2)
# 采集图像并提取角点
obj_points = [] # 世界坐标
img_points = [] # 图像坐标
for img in calibration_images:
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
ret, corners = cv2.findChessboardCorners(gray, pattern_size, None)
if ret:
corners_sub = cv2.cornerSubPix(gray, corners, (11,11), (-1,-1),
(cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001))
obj_points.append(objp)
img_points.append(corners_sub)
# 标定求解
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(
obj_points, img_points, gray.shape[::-1], None, None)
# 重投影误差评估
total_error = 0
for i in range(len(obj_points)):
imgpoints2, _ = cv2.projectPoints(obj_points[i], rvecs[i], tvecs[i], mtx, dist)
error = cv2.norm(img_points[i], imgpoints2, cv2.NORM_L2) / len(imgpoints2)
total_error += error
print(f"平均重投影误差: {total_error/len(obj_points):.4f} px")
重投影误差应小于0.1像素。若误差超过0.15像素,需检查标定板是否平整、图像是否模糊、采集位姿是否过于单一。
3.2 手眼标定:连接相机坐标系与机器人坐标系
3.2.1 Eye-in-Hand与Eye-to-Hand架构对比
手眼标定解决的是相机坐标系与机器人末端(或基座)坐标系之间的变换关系。两种架构在工程实现上有本质区别:
| 对比维度 | Eye-in-Hand(眼在手上) | Eye-to-Hand(眼在手外) |
|---|---|---|
| 相机安装位置 | 固定在机器人末端法兰 | 固定在工作空间上方或侧面 |
| 标定方程 | AX = XB(相机随动) | AX = YB(相机固定) |
| 标定板位置 | 固定在工作空间内 | 固定在机器人末端 |
| 优势 | 视野灵活,可近距离观察目标 | 视野稳定,不受机器人运动影响 |
| 劣势 | 标定结果受机器人绝对定位精度影响 | 存在遮挡风险,视野固定 |
| 典型应用 | 移动抓取、狭小空间作业 | 固定工位上下料、码垛 |
3.2.2 标定方程AX=XB的数学原理
以Eye-in-Hand为例,机器人末端从位姿A1运动到A2,相机从位姿B1运动到B2。由于相机与末端刚性连接,存在不变的手眼矩阵X满足:
A1 * X * B1 = A2 * X * B2
=> (A2⁻¹ * A1) * X = X * (B2 * B1⁻¹)
=> AX = XB
其中A为机器人末端位姿变换矩阵(从示教器读取),B为标定板在相机坐标系下的位姿(通过PnP求解)。求解X的方法包括Tsai两步法、Park-Martin方法以及基于李群优化的迭代方法。工程中推荐使用OpenCV的cv2.calibrateHandEye(),支持Tsai、Park、Horaud等多种算法。
3.2.3 实操流程与数据采集策略
以Eye-to-Hand标定为例,完整流程如下:
- 固定标定板:将标定板刚性固定在机器人末端,确保标定板平面与法兰面平行(误差<0.5°)。
- 示教器记录位姿:控制机器人运动到15-20个不同位姿,记录每个位姿的末端坐标(x, y, z, rx, ry, rz)。
- 相机采集图像:在每个位姿下采集标定板图像,提取角点并求解标定板在相机坐标系下的位姿。
- 数据配对:将机器人位姿与相机位姿按时间戳对齐,构成A和B矩阵序列。
- 求解手眼矩阵:调用
cv2.calibrateHandEye(),输入机器人末端位姿和标定板位姿。 - 精度验证:使用未参与标定的测试位姿,计算标定板中心在机器人基座坐标系下的投影误差。
3.3 案例拆解:3C装配线螺丝锁付工位的手眼标定实战
3.3.1 项目背景与约束
某3C电子厂需要实现手机中框的自动螺丝锁付,采用Eye-to-Hand架构,相机固定于工位上方500mm处。现场约束条件:
- 机器人:六轴协作机器人(重复定位精度±0.02mm)
- 相机:500万像素工业相机,配8mm镜头,视场400×300mm
- 目标精度:螺丝孔定位误差<0.3mm,角度误差<0.5°
- 节拍要求:单次定位时间<1.5s
3.3.2 标定实施与问题排查
初次标定后,验证发现螺丝孔中心投影误差达到1.2mm,远超0.3mm的工艺要求。通过逐步排查,发现以下问题:
| 排查项 | 检测方法 | 发现的问题 | 解决方案 |
|---|---|---|---|
| 相机内参 | 重投影误差 | 0.08px(合格) | 无需调整 |
| 标定板平面度 | 千分尺测量 | 标定板弯曲0.3mm | 更换陶瓷基板标定板 |
| 机器人位姿精度 | 激光跟踪仪抽检 | 第3、7组位姿偏差0.8mm | 剔除异常数据,重新采集 |
| 光照一致性 | 灰度直方图 | 边缘区域过曝 | 增加漫射板,降低光源亮度 |
重新标定后,验证误差降至0.18mm,满足工艺要求。复盘发现,标定板弯曲是主要误差源——普通玻璃基板在夹具夹持下产生形变,导致角点世界坐标与实际位置偏差。
3.4 常见误区与总结复盘
3.4.1 五大常见误区
- 误区一:标定板越大越好。标定板过大会超出相机景深范围,导致边缘角点模糊。正确做法是标定板尺寸使角点间距在图像中占20-30像素。
- 误区二:采集位姿越多越好。超过30组位姿后,求解精度提升有限,反而引入更多噪声。建议15-20组,且均匀覆盖工作空间。
- 误区三:忽略机器人DH参数误差。手眼标定结果中隐含了机器人运动学误差。若机器人末端负载变化较大,需重新标定。
- 误区四:使用同一组数据标定和验证。这会导致过拟合。必须预留20%的数据用于验证。
- 误区五:忽视温度影响。相机和机器人工作30分钟后,热漂移可能导致内参变化0.3%。建议开机预热30分钟后再标定。
3.4.2 标定质量评估指标体系
建立完整的标定质量评估体系,建议从以下三个层面验证:
| 评估层级 | 指标 | 合格标准 | 检测工具 |
|---|---|---|---|
| 相机内参 | 重投影误差 | <0.1px | OpenCV/Halcon |
| 手眼矩阵 | 旋转矩阵正交性 | |R·Rᵀ - I| < 1e-6 | Python脚本 |
| 系统级验证 | 空间点定位误差 | <0.5mm | 激光跟踪仪 |
相机标定与手眼标定是3D视觉引导项目中最基础也最关键的环节。通过本节的学习,应掌握内参标定的数据采集规范、手眼标定两种架构的数学原理与工程差异,并能独立完成从标定板设计、数据采集、方程求解到精度验证的完整闭环。在实际项目中,标定工作往往需要反复迭代,建议建立标准化的标定SOP文档,并定期(每月或每次产线调整后)重新标定,确保系统长期稳定运行。