2. 坐标系与变换:机器人基坐标系、工具坐标系、相机坐标系、标定板坐标系,齐次变换矩阵

做手眼标定,说白了就是搞清楚几个坐标系之间的相对位置关系。我刚开始接触这个领域时,觉得坐标系概念太抽象,直到在产线上被一个0.5毫米的偏差折磨了三天……嗯,从那以后我再也不敢轻视坐标系了。

2.1 四个核心坐标系

手眼标定涉及四个坐标系。它们就像舞台上的四个演员,你得知道谁站在哪、面朝哪。

坐标系 符号 位置 作用
机器人基坐标系 {B} 机器人底座中心 机器人运动的全局参考
工具坐标系 {T} 机器人末端法兰或工具尖端 描述工具的位置和姿态
相机坐标系 {C} 相机光心 视觉测量的参考系
标定板坐标系 {P} 标定板角点或中心 提供已知空间点阵

关键认知:标定的本质就是求解这些坐标系之间的变换矩阵。你想想看,机器人要抓一个物体,它得知道物体在基坐标系下的坐标,而物体位置又是相机看到的——这中间就需要一串变换链。

2.2 齐次变换矩阵

齐次变换矩阵是连接坐标系的数学工具。它长这样:

    ┌             ┐
    │ R   t │
T = │       │
    │ 0   1 │
    └             ┘

其中 R 是 3×3 旋转矩阵,t 是 3×1 平移向量。我个人习惯把齐次变换矩阵看作「坐标转换器」——把一个点从坐标系 A 转换到坐标系 B。

我的小技巧:写代码时,我习惯用 4×4 矩阵存储所有变换关系。虽然多了一行一维,但矩阵乘法可以直接串联变换,不用单独处理旋转和平移。这在标定算法里能省不少事。

2.3 变换链:从像素到机器人关节

一个典型的视觉引导抓取流程,变换链是这样的:

  1. 像素坐标 → 相机坐标:通过相机内参矩阵
  2. 相机坐标 → 标定板坐标:通过外参矩阵(即相机相对于标定板的位姿)
  3. 标定板坐标 → 机器人基坐标:通过机器人正向运动学
  4. 机器人基坐标 → 工具坐标:通过工具中心点(TCP)标定

我曾经在一个项目中,忽略了标定板坐标系的原点定义,结果抓取偏差一直收敛不了。后来发现标定板坐标系的原点默认在左上角,而我用的算法假设原点在中心……嗯,这种细节最坑人。

手眼标定变换链 像素坐标 (u,v) 相机坐标 {C} 标定板坐标 {P} 基坐标 {B} 工具坐标 {T} 内参矩阵 K 外参矩阵 (C→P) 正向运动学 (P→B) TCP 标定 (B→T)

2.4 坐标系变换的数学表达

假设我们有一个点 p,它在标定板坐标系下的坐标为 pP。要把它转换到机器人基坐标系下,需要经过:

p_B = T_B_P * p_P

其中 T_B_P 是标定板到基坐标系的齐次变换矩阵。这个矩阵通常通过机器人正向运动学得到——机器人读取当前关节角,然后计算出末端位姿。

避坑指南:我曾经在项目中直接用机器人示教器上显示的位姿数据,没注意单位是毫米还是米。结果标定出来的矩阵全是错的。建议统一使用毫米,因为大多数工业机器人和标定板的物理尺寸都以毫米为单位。

2.5 手眼标定的两种经典构型

根据相机安装位置,手眼标定分为两种:

  • 眼在手上(Eye-in-Hand):相机固定在机器人末端,随工具一起运动。标定求解的是 相机到工具 的变换。
  • 眼在手外(Eye-to-Hand):相机固定在工作空间上方,不随机器人运动。标定求解的是 相机到机器人基座 的变换。

我个人更常用眼在手上的构型,因为视野更灵活,但标定算法稍微复杂一点。眼在手外适合大范围静态场景,比如传送带上的工件定位。

2.6 齐次变换矩阵的逆

标定过程中经常需要求变换矩阵的逆。比如已知 T_C_P(相机到标定板),想求 T_P_C(标定板到相机):

T_P_C = inv(T_C_P)

其中:
R_P_C = R_C_P^T
t_P_C = -R_C_P^T * t_C_P

嗯,这里要注意:旋转矩阵的逆就是它的转置,但平移向量不能直接取负,得先旋转再取负。我见过不少新手在这里翻车。

我的习惯:写标定代码时,我会单独写一个 inverse_transform(T) 函数,而不是手动计算。这样既减少出错,代码也更容易维护。

2.7 本章小结

坐标系和齐次变换矩阵是手眼标定的数学基础。你需要记住:

  • 四个坐标系:基坐标 {B}、工具坐标 {T}、相机坐标 {C}、标定板坐标 {P}
  • 齐次变换矩阵是 4×4 的「坐标转换器」
  • 变换链从像素到机器人关节,每一步都有对应的矩阵
  • 眼在手上和眼在手外,求解的目标不同
  • 求逆矩阵时,旋转矩阵转置,平移向量先旋转再取负