2. 坐标系基础

做手眼标定,说白了就是搞清楚几个坐标系之间的“亲戚关系”。

我刚开始接触这个领域时,觉得坐标系不就是几个箭头嘛,有什么好讲的?直到第一次在现场调标定,相机拍出来的点和机器人实际抓的位置差了十几毫米,我才意识到——坐标系搞不清楚,后面全是白干。

这一章,咱们就把五个核心坐标系掰开揉碎讲清楚。

2.1 五个坐标系,一个都不能少

先给个全景图。你想想看,一个典型的机器人视觉引导系统里,数据是怎么流动的?

  • 世界坐标系:整个场景的“参考”。通常选在车间地面某个固定点。
  • 机器人基坐标系:固定在机器人底座上。机器人自己认这个坐标系。
  • 工具坐标系:装在机器人末端,比如焊枪尖、夹爪中心。
  • 相机坐标系:以相机光心为原点,Z轴沿光轴方向。
  • 像素坐标系:图像上以像素为单位的二维坐标。

我习惯把它们分成两组:三维组(前四个)和二维组(最后一个)。标定的本质,就是打通这两组之间的变换通道。

核心认知:手眼标定要解决的,就是找到相机坐标系与机器人基坐标系(或工具坐标系)之间的固定变换关系。其他坐标系都是中间桥梁。

坐标系关系全景图 世界坐标系 机器人基坐标系 工具坐标系 相机坐标系 像素坐标系 标定核心:找到相机坐标系 ↔ 机器人基坐标系(或工具坐标系)的固定变换 世界坐标系作为全局参考,像素坐标系是最终测量入口

2.2 坐标系之间的变换关系

坐标系变换,说白了就是“把一个点从一个坐标系搬到另一个坐标系”。

数学上用一个 4×4 齐次变换矩阵 搞定。它长这样:

    | R11  R12  R13  Tx |
T = | R21  R22  R23  Ty |
    | R31  R32  R33  Tz |
    |  0    0    0    1  |

左上角 3×3 是旋转矩阵,右上角 3×1 是平移向量。我当年第一次手写这个矩阵时,把旋转和平移的顺序搞反了,结果标定出来的误差大得离谱。嗯,这个坑你们别踩。

2.3 关键变换链

在实际系统中,数据是这样流动的:

  1. 像素 → 相机:通过相机内参(焦距、主点、畸变系数)把像素坐标反投影到相机坐标系下的三维射线。
  2. 相机 → 工具:这就是手眼标定要解的 手眼矩阵(Eye-in-Hand 或 Eye-to-Hand)。
  3. 工具 → 基座:通过机器人正运动学,从关节角度算出工具坐标系在基坐标系下的位姿。
  4. 基座 → 世界:如果系统有外部参考,还需要一个世界到基座的变换。

我的经验:在搭建标定流程时,我习惯先把所有变换关系写成一张表,明确每个变换的“源”和“目标”。这样写代码时不容易乱。我曾经在一个项目里因为搞混了变换方向,多花了三天排查问题。

2.4 坐标系变换的“避坑”清单

常见问题 后果 我的建议
旋转顺序搞错 标定结果完全错误 统一用 ZYX 欧拉角或四元数
平移方向反了 抓取位置偏移几十毫米 用已知点验证变换方向
忽略畸变校正 边缘区域误差大 标定前先做相机内参标定
工具TCP未校准 手眼矩阵永远不对 先做工具标定,再做手眼标定

我曾经踩过的坑:有一次在产线上,标定结果时好时坏。排查了两天,最后发现是机器人工具坐标系没更新——换了一个夹爪,但TCP参数还是旧的。从那以后,我每次做手眼标定之前,都会先确认工具坐标系参数是最新的。

2.5 从像素到三维:完整的变换链

假设我们要把一个像素点 p(u, v) 映射到机器人基坐标系下的三维点 P_base:

P_base = T_base_tool * T_tool_cam * T_cam_pixel * p(u, v)

其中:

  • T_cam_pixel:相机内参矩阵的逆,把像素映射到相机坐标系下的归一化平面。
  • T_tool_cam:手眼矩阵,相机坐标系到工具坐标系的变换。
  • T_base_tool:机器人正运动学给出的工具到基座的变换。

你看,整个链条就是一连串矩阵乘法。我刚开始学的时候,觉得这公式挺吓人。后来发现,只要把每个矩阵的意义搞清楚,写代码就是几行的事。

关键提醒:矩阵乘法顺序不能乱!从右往左读,就是数据流动的方向。我见过有人把顺序写反了,结果标定出来的矩阵“看起来对”,但实际用起来全错。

2.6 小结

这一章我们讲了五个坐标系和它们之间的变换关系。说白了,手眼标定就是求解其中一个关键的变换矩阵——相机到工具(或相机到基座)的变换。

我个人觉得,坐标系这部分再怎么强调都不过分。你想想看,如果连坐标系都搞不清楚,后面那些优化算法、标定板设计,全都是空中楼阁。