4、视觉传感器与标定:相机模型、内参外参、手眼标定(eye-in-hand/eye-to-hand)、标定工具与流程
视觉引导机械臂抓取的核心前提,是让机器人系统准确理解“图像中的像素点”与“三维空间中的物理点”之间的映射关系。这一映射关系由相机内参(描述相机光学与成像特性)和外参(描述相机在机器人世界中的位姿)共同决定。若标定不准确,后续的目标检测、坐标转换、抓取规划都将产生系统性偏差。本章将系统讲解相机成像模型、内参外参的物理意义、手眼标定的两种典型构型(eye-in-hand与eye-to-hand),并给出工程中可落地的标定流程与工具链。
4.1 相机成像模型与内参外参
4.1.1 核心原理:从三维世界到二维像素
视觉引导抓取的第一步,是理解相机如何将三维空间中的点投影到二维图像平面。最常用的模型是针孔相机模型,它假设光线通过光心(光学中心)投影到成像平面。设空间中一点 P 在世界坐标系下的坐标为 (Xw, Yw, Zw),经过外参矩阵 [R|t] 变换到相机坐标系 (Xc, Yc, Zc),再通过内参矩阵 K 投影到像素坐标系 (u, v)。整个过程的数学表达式为:
Zc * [u, v, 1]^T = K * [R|t] * [Xw, Yw, Zw, 1]^T
其中内参矩阵 K 包含焦距 fx、fy(单位:像素)和主点坐标 cx、cy(单位:像素)。fx = f / dx,fy = f / dy,dx、dy 为单个像素的物理尺寸。外参矩阵由旋转矩阵 R(3x3)和平移向量 t(3x1)组成,描述了相机坐标系相对于世界坐标系的位姿。此外,实际镜头存在畸变,主要包括径向畸变(k1, k2, k3)和切向畸变(p1, p2),需要在标定后对图像进行校正。
4.1.2 标定板与角点检测
标定内参的标准方法是使用已知尺寸的标定板(棋盘格或圆点阵),从不同角度拍摄 15~20 张图像。OpenCV 的 findChessboardCorners() 函数可自动检测棋盘格角点,然后通过 calibrateCamera() 求解内参和畸变系数。标定板应占据图像面积的 20%~80%,并覆盖图像的边缘和中心区域,以保证畸变模型的可观测性。
| 参数 | 物理含义 | 典型值(500万像素相机) | 影响 |
|---|---|---|---|
| fx, fy | 焦距(像素) | 1400~1800 | 决定视场角与放大倍率 |
| cx, cy | 主点坐标 | 图像中心附近 | 偏差大会导致坐标偏移 |
| k1, k2, k3 | 径向畸变系数 | ±0.1 以内 | 桶形/枕形畸变 |
| p1, p2 | 切向畸变系数 | ±0.01 以内 | 镜头与传感器不平行 |
| 重投影误差 | 像素误差均值 | < 0.15 px | 整体标定质量指标 |
4.1.3 案例拆解:内参标定中的常见问题
某机器人工作站使用海康威视 MV-CA050-10GC 相机(500万像素,靶面 2/3"),镜头焦距 12mm。初次标定时,操作员只拍摄了 8 张标定板图像,且标定板始终位于画面中央。标定结果重投影误差为 0.35px,导致后续抓取时目标中心偏移约 3mm。分析发现:图像数量不足且未覆盖画面边缘,导致畸变系数估计不准。改进措施:重新采集 20 张图像,标定板分别位于左上、右上、左下、右下、中心五个区域,并倾斜 15°~30° 拍摄。重标定后重投影误差降至 0.08px,抓取精度提升至 ±1mm 以内。
4.2 手眼标定:eye-in-hand 与 eye-to-hand
4.2.1 两种构型的原理与差异
手眼标定解决的是相机坐标系与机械臂坐标系之间的变换关系。根据相机安装位置,分为两种构型:
- eye-in-hand(眼在手上):相机固定在机械臂末端法兰上,随机械臂一起运动。标定时,标定板固定在工作台上,机械臂运动到多个位姿拍摄标定板。求解的是相机坐标系到机械臂末端坐标系的变换矩阵
X = T_cam2end。 - eye-to-hand(眼在手外):相机固定在工作台上方或侧面,不随机械臂运动。标定时,标定板固定在机械臂末端,机械臂运动到多个位姿。求解的是相机坐标系到机械臂基座坐标系的变换矩阵
X = T_cam2base。
两种构型的数学本质都是求解齐次变换方程 AX = XB,其中 A 为机械臂末端位姿变化(由机器人控制器读取),B 为标定板在相机坐标系下的位姿变化(由视觉算法计算)。常用求解方法包括 Tsai-Lenz 法、Park-Martin 法和 Daniilidis 法(基于四元数/对偶四元数)。
4.2.2 标定流程与操作步骤
- 准备阶段:固定相机(eye-to-hand)或固定标定板(eye-in-hand),确保机械臂运动范围内无遮挡。
- 数据采集:控制机械臂运动 15~20 个不同位姿,每个位姿下记录:机械臂末端位姿(从控制器读取,通常为 4x4 齐次矩阵)和标定板图像(用于计算标定板在相机坐标系下的位姿)。
- 位姿求解:使用 OpenCV 的
solvePnP()计算标定板位姿,得到 B 矩阵序列。 - 手眼标定计算:调用
cv2.calibrateHandEye()(OpenCV 4.x 支持),输入 A 序列和 B 序列,输出 X 矩阵。 - 精度验证:将标定板放置在机械臂工作空间内多个位置,用视觉识别标定板中心坐标,与机械臂实际位姿对比,计算位置误差和姿态误差。
4.2.3 案例拆解:eye-to-hand 标定实战
某汽车零部件装配线,使用六轴机械臂(ABB IRB 1200)进行螺丝抓取。相机安装在机械臂正上方 800mm 处,采用 eye-to-hand 构型。初始标定后,视觉引导抓取时出现 X 方向偏差 5mm、Y 方向偏差 2mm 的问题。排查过程:
- 检查内参标定:重投影误差 0.12px,正常。
- 检查机械臂末端位姿读取:确认控制器输出的位姿为工具坐标系下的值,且工具中心点(TCP)已校准。
- 检查手眼标定数据:发现采集的 12 组位姿中,有 6 组机械臂末端姿态几乎相同(仅平移变化),导致旋转分量约束不足。
重新采集 20 组数据,每组位姿包含明显的姿态变化(俯仰角变化 20°~40°,偏航角变化 15°~30°)。标定后,X 方向偏差降至 0.8mm,Y 方向偏差降至 0.5mm,满足装配要求。复盘经验:手眼标定的精度不仅取决于算法,更取决于数据采集的质量——位姿多样性是决定标定结果鲁棒性的关键因素。
4.3 标定工具与自动化流程
4.3.1 常用标定工具对比
| 工具 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| OpenCV + Python | 内参标定、手眼标定 | 开源免费、算法全面、社区活跃 | 需要编写代码、调试门槛较高 |
| MATLAB Camera Calibrator | 内参标定 | 图形化界面、自动剔除异常图像 | 商业授权、手眼标定需额外工具箱 |
| ROS camera_calibration | 内参标定(ROS环境) | 与ROS集成、支持实时标定 | 依赖ROS版本、标定板类型有限 |
| easy_handeye(ROS包) | 手眼标定 | 自动化流程、支持多种机械臂 | 需配置ROS通信、对新手不友好 |
| Halcon Calibration | 工业级标定 | 高精度、支持多种畸变模型 | 商业授权、价格较高 |
4.3.2 自动化标定流程设计
在批量部署机器人工作站时,手动标定效率低且一致性差。建议设计半自动标定流程:
- 机械臂按预设轨迹自动运动到 N 个位姿,每个位姿停留 1~2 秒。
- 相机自动采集图像并触发角点检测,若检测失败则自动调整位姿重新采集。
- 所有数据采集完成后,自动执行内参标定和手眼标定。
- 输出标定报告(含重投影误差、手眼变换矩阵、验证精度),并自动保存至配置文件。
该流程可将标定时间从 30 分钟缩短至 5 分钟,且减少人为操作误差。对于 eye-in-hand 构型,机械臂运动轨迹应避免标定板超出相机视野;对于 eye-to-hand 构型,应避免机械臂遮挡标定板。
- 内参重投影误差 < 0.15px
- 手眼标定验证:在 5 个不同位置放置标定板,视觉计算坐标与机械臂实际坐标误差 < 2mm
- 姿态误差 < 1°(对于抓取任务通常足够)
- 重复标定两次,结果差异 < 5%
4.3.3 常见误区与总结复盘
- 误区一:忽略畸变校正。直接使用未校正的图像进行手眼标定,会导致标定板角点位置偏差,进而影响手眼矩阵精度。正确做法是先完成内参标定和畸变校正,再采集手眼标定数据。
- 误区二:机械臂位姿读取错误。部分机器人控制器输出的位姿是相对于基座的,但有些是相对于工具坐标系的。务必确认读取的位姿与视觉计算的位姿在同一坐标系定义下。
- 误区三:标定板尺寸测量不准。棋盘格边长误差 0.1mm 会导致手眼标定平移误差放大数倍。建议使用高精度标定板(精度 ±0.01mm),并用游标卡尺复核。
- 误区四:忽略机械臂定位精度。手眼标定依赖机械臂的位姿读数,如果机械臂本身定位精度差(如 > 1mm),标定结果也会受限。此时可考虑使用外部测量设备(如激光跟踪仪)辅助标定。
总结:视觉传感器标定是机器人视觉抓取系统的“地基工程”。内参标定解决“看得准”的问题,手眼标定解决“找得对”的问题。在实际项目中,建议先使用 OpenCV 完成内参标定,再根据构型选择 eye-in-hand 或 eye-to-hand 进行手眼标定,最后通过多位置验证确保精度达标。标定不是一次性工作——当相机受到碰撞、镜头重新调焦、机械臂维护后,都需要重新标定。建立标定记录和定期复检机制,是保障长期稳定运行的关键。