4. 机器人视觉引导坐标系基础

在机器人视觉引导系统中,一个抓取动作能否准确完成,本质上取决于一件事:视觉系统“看到”的目标位置,能否被正确换算成机器人“理解”的运动位置。这个换算过程不是一步完成的,而是沿着一条明确的坐标链逐级传递。理解这条链上每个坐标系的作用、单位、方向约定以及它们之间的转换关系,是后续标定、手眼标定和抓取程序编写的基础。

五个坐标系各自的角色

先明确本节涉及的五个坐标系,它们分别回答不同的问题:

  • 像素坐标 (u, v):图像上的行列位置,单位是像素。它回答“目标在图像的哪个位置”,原点通常在图像左上角,u 向右增大,v 向下增大。
  • 相机坐标 (Xc, Yc, Zc):以相机光心为原点的三维坐标,单位通常是毫米。Zc 沿光轴指向被摄物,Xc、Yc 与图像平面平行。它回答“目标在相机前方多远、偏左偏右多少”。
  • 机器人坐标 (Xr, Yr, Zr):机器人基座坐标系,是机器人运动的绝对参考。它回答“目标在机器人工作空间的哪个位置”。
  • 工具坐标 (Xt, Yt, Zt):固定在末端执行器(夹爪、吸盘)上的坐标系,原点通常在工具中心点 TCP。它回答“工具以什么姿态去接触目标”。
  • 工件坐标 (Xw, Yw, Zw):建立在工件或托盘上的坐标系,随工件摆放位置变化。它回答“目标相对于工件本身在哪里”,便于批量抓取时复用同一套点位。

这五个坐标系并非孤立,而是通过一系列变换串联起来。视觉给出像素坐标,经相机内参和位姿换算到相机坐标,再经手眼关系换算到机器人坐标,最后结合工具坐标和工件坐标生成机器人可执行的目标位姿。

视觉引导坐标转换链 像素坐标 (u, v) 单位: pixel 图像左上角为原点 相机坐标 (Xc, Yc, Zc) 单位: mm 光心为原点, Zc沿光轴 机器人坐标 (Xr, Yr, Zr) 单位: mm 基座为原点, 绝对参考 工具坐标 (Xt, Yt, Zt) 单位: mm TCP为原点, 随末端运动 内参 手眼 TCP 工件坐标 (Xw, Yw, Zw) 单位: mm 建立在工件/托盘上, 随摆放位置变化, 便于批量复用点位 工件标定 转换关系说明 像素→相机:利用相机内参 (焦距、主点、畸变系数) 将 (u,v) 反投影为相机坐标下的射线方向。 相机→机器人:通过手眼标定矩阵 (眼在手/眼在外) 将相机坐标变换到机器人基座坐标。 机器人→工具:由机器人正运动学与 TCP 参数决定,将目标位姿转换为末端工具可达位姿。 工件坐标:作为中间参考,使同一工件上多个目标点可共用一套相对坐标,减少重复示教。

从像素到相机:内参与反投影

相机成像遵循针孔模型。设相机内参矩阵为 K,包含焦距 fx、fy 和主点 cx、cy,则像素坐标与相机坐标的关系为:

u = fx * (Xc / Zc) + cx
v = fy * (Yc / Zc) + cy

反过来,如果已知像素坐标 (u, v) 和该点的深度 Zc,就可以求出相机坐标:

Xc = (u - cx) * Zc / fx
Yc = (v - cy) * Zc / fy
Zc = 深度值

这里的关键是深度 Zc。2D 视觉只能给出 (u, v),无法直接得到 Zc。因此实际工程中通常有两种做法:一是使用 3D 相机或激光位移传感器直接获取 Zc;二是假设目标在已知平面上(如工作台面),通过平面约束反算 Zc。KEYENCE XG-X 系列配合 3D 相机时,可直接输出包含深度信息的三维点云,省去平面假设带来的误差。

从相机到机器人:手眼标定的作用

相机坐标到机器人坐标的转换由一个 4×4 齐次变换矩阵完成,这个矩阵就是手眼标定矩阵 T_cam_to_robot。它包含旋转部分 R(3×3)和平移部分 t(3×1):

P_robot = R * P_camera + t

其中 P_camera = [Xc, Yc, Zc]^T,P_robot = [Xr, Yr, Zr]^T。手眼标定分为两种安装方式:

  • 眼在手 (Eye-in-Hand):相机安装在机器人末端,随机器人一起运动。此时相机坐标与工具坐标有固定关系,标定的是相机到末端的变换。
  • 眼在外 (Eye-to-Hand):相机固定在支架上,不随机器人运动。此时标定的是相机到机器人基座的固定变换。

无论哪种方式,标定的本质都是让机器人末端去触碰若干个已知点,同时记录相机看到的对应像素坐标,通过求解方程组得到变换矩阵。标定点数量一般不少于 9 组,分布要覆盖整个工作视野,避免集中在某一区域导致外推误差增大。

工具坐标与工件坐标的工程意义

工具坐标的原点是 TCP(Tool Center Point),即夹爪或吸盘的实际作用点。机器人运动指令中的目标位置,通常指的是 TCP 要到达的位置,而不是法兰盘中心。因此必须准确设置 TCP 参数,包括 X、Y、Z 偏移量和姿态角。如果 TCP 设置偏差 2 mm,抓取时就会整体偏移 2 mm,对于小零件抓取这是不可接受的。

工件坐标则解决“批量一致性”问题。假设一个托盘上摆放了 20 个零件,每个零件在托盘上的相对位置是固定的。如果直接使用机器人坐标逐个示教,需要记录 20 组绝对坐标;而如果建立工件坐标,只需记录每个零件相对于工件原点的偏移量,再通过工件坐标到机器人坐标的变换一次性生成所有目标点。当托盘整体移动时,只需重新标定工件坐标原点,20 个点位自动跟随更新。

在实际项目中,建议优先建立工件坐标。即使当前只抓取一个零件,工件坐标也能让程序结构更清晰:视觉给出的是“工件坐标系下的偏移”,机器人负责“从工件坐标换算到自身坐标”,两者职责分离,调试时更容易定位问题出在视觉侧还是机器人侧。

完整转换链的数值示例

下面用一个假设的示例串联整条链,帮助理解每一步的输入输出。假设相机内参 fx = 1200、fy = 1200、cx = 640、cy = 360,目标像素坐标为 (800, 400),深度 Zc = 500 mm。

第一步,像素到相机:

Xc = (800 - 640) * 500 / 1200 = 66.67 mm
Yc = (400 - 360) * 500 / 1200 = 16.67 mm
Zc = 500 mm

第二步,假设手眼标定矩阵的旋转为单位矩阵,平移 t = [300, 100, 200](单位 mm),则相机到机器人:

Xr = 66.67 + 300 = 366.67 mm
Yr = 16.67 + 100 = 116.67 mm
Zr = 500 + 200 = 700 mm

第三步,假设工具坐标 TCP 偏移为 [0, 0, 150](即工具尖端比法兰盘低 150 mm),则机器人需要到达的法兰位置为:

X_flange = 366.67 mm
Y_flange = 116.67 mm
Z_flange = 700 - 150 = 550 mm

以上数值均为教学示例,实际项目中旋转矩阵通常不是单位矩阵,需要完整参与运算。但通过这个简化示例可以看到:像素坐标经过内参、手眼矩阵、TCP 偏移三次变换后,才成为机器人可执行的位置指令。任何一步的参数错误,都会导致最终抓取偏差。

常见问题与检查要点

当抓取出现偏移时,可以按坐标链的顺序逐级排查:

  • 像素坐标是否正确:检查视觉工具是否稳定识别目标,像素坐标是否跳动。可在图像上叠加十字标记观察重复性。
  • 深度值是否准确:2D 相机假设平面时,若目标高度变化,Zc 误差会直接放大为 Xc、Yc 误差。可用已知高度的标准块验证。
  • 手眼标定是否覆盖工作区:标定点应分布在工作视野的四个角和中心,避免只在一小块区域标定后在大范围使用。
  • TCP 是否准确:用尖点触碰法验证 TCP,观察机器人末端尖点是否与示教点重合。
  • 工件坐标是否随动:托盘移动后是否重新标定工件原点,或者是否使用了视觉重新定位工件坐标。
坐标系的方向约定必须在项目开始时统一确认。例如机器人坐标的 Z 轴是向上还是向下,相机坐标的 Zc 是朝向目标还是背离目标,不同品牌和不同配置可能不同。一旦约定混乱,旋转矩阵的正负号就会出错,表现为抓取位置在某个方向上反向偏移。建议在程序注释中明确记录每个坐标系的轴向定义。

掌握这五个坐标系的转换关系后,后续的手眼标定实操、视觉引导抓取程序编写、以及多目标定位都会变得有章可循。核心思路始终是:视觉负责在图像中找到目标,标定矩阵负责把目标位置翻译到机器人世界,工具坐标和工件坐标负责让这个位置真正可执行、可复用。