2. 坐标系基础:世界坐标系、相机坐标系、机器人基坐标系、工具坐标系、用户坐标系的定义与转换关系

在 Eye-to-Hand 标定与点云配准任务中,坐标系是连接传感器感知与机器人运动的数学桥梁。任何一个空间点,在不同坐标系下都有不同的坐标表示;只有通过刚体变换(旋转 + 平移)才能在坐标系之间自由转换。本章系统定义五种核心坐标系,并给出它们之间的转换关系与数学表达。

2.1 五种坐标系的定义

坐标系名称 英文缩写 定义与原点 典型用途
世界坐标系 World / W 固定在场景中的参考系,原点通常选在机器人底座或场景中心 全局地图、多传感器融合、位置基准
相机坐标系 Camera / C 原点在相机光心,Z 轴沿光轴指向场景前方 点云生成、视觉测量、图像到3D映射
机器人基坐标系 Base / B 固定在机器人安装底座,通常由机器人厂商定义 机器人运动学计算、关节角度到笛卡尔位姿
工具坐标系 Tool / T 原点在机器人末端执行器(如夹爪、焊枪)的 TCP(工具中心点) 抓取、焊接、装配等末端操作
用户坐标系 User / U 用户自定义的工作参考系,可附着在工作台、夹具或工件上 简化编程、工件对齐、重复性任务
关键概念: 世界坐标系是全局锚点,相机坐标系是感知入口,机器人基坐标系是运动根节点,工具坐标系是操作末端,用户坐标系是任务参考。Eye-to-Hand 标定的核心就是求解相机坐标系到机器人基坐标系的变换关系。

2.2 坐标系之间的转换关系

所有坐标系之间的转换均采用 4×4 齐次变换矩阵 表示,形式为:

T = [ R   t ]
    [ 0   1 ]

其中:
R — 3×3 旋转矩阵
t — 3×1 平移向量
0 — 1×3 零行向量

一个空间点 P 在坐标系 A 下的齐次坐标 PA 转换到坐标系 B 下的齐次坐标 PB:

PB = TB←A · PA

其中 TB←A 表示从 A 到 B 的变换矩阵。

2.3 核心变换链

在 Eye-to-Hand 系统中,最关键的变换链如下:

  1. 相机 → 世界:TW←C,由标定获得,将相机坐标系下的点云转换到世界坐标系。
  2. 世界 → 机器人基:TB←W,通常由系统安装确定,或通过外部测量获得。
  3. 机器人基 → 工具:TT←B,由机器人正向运动学实时计算,随关节角度变化。
  4. 用户 → 世界:TW←U,用户自定义,用于简化工件坐标编程。

完整的视觉引导抓取变换链为:

PT = TT←B · TB←W · TW←C · PC

即:相机看到的点 PC,先转到世界坐标系,再转到机器人基坐标系,最后转到工具坐标系,得到机器人末端执行器需要到达的位置。

实战要点: Eye-to-Hand 标定直接求解 TB←C(相机到机器人基),等价于 TB←W · TW←C。实际应用中常将世界坐标系与机器人基坐标系重合,简化计算。

2.4 坐标系转换关系总览

坐标系转换关系总览 世界坐标系 W 相机坐标系 C 机器人基坐标系 B 工具坐标系 T 用户坐标系 U TW←C TB←W TT←B TW←U 说明: • 实线箭头表示标准变换方向,逆箭头方向取逆矩阵即可。 • Eye-to-Hand 标定直接求解 TB←C = TB←W · TW←C。

2.5 变换矩阵的数学性质

性质 数学表达 说明
逆变换 TA←B = (TB←A)-1 从 B 到 A 的变换等于从 A 到 B 的变换的逆矩阵
链式法则 TC←A = TC←B · TB←A 多步变换可依次右乘合成
可逆性 T-1 = [ RT -RTt ; 0 1 ] 旋转矩阵的逆等于其转置,平移部分需重新计算
刚体保形 det(R) = 1, RTR = I 变换不改变点间距离和物体形状

2.6 坐标系转换的代码实现示例

以下 Python 代码使用 NumPy 实现齐次变换矩阵的构建与坐标转换:

import numpy as np

def build_transform(R, t):
    """由旋转矩阵 R (3x3) 和平移向量 t (3,) 构建 4x4 齐次变换矩阵"""
    T = np.eye(4)
    T[:3, :3] = R
    T[:3, 3] = t
    return T

def transform_point(T, point):
    """将点 (3,) 从源坐标系转换到目标坐标系"""
    p_h = np.append(point, 1.0)          # 转为齐次坐标
    p_trans = T @ p_h                     # 矩阵乘法
    return p_trans[:3]                    # 返回非齐次坐标

def inverse_transform(T):
    """计算齐次变换矩阵的逆"""
    R = T[:3, :3]
    t = T[:3, 3]
    R_inv = R.T
    t_inv = -R_inv @ t
    T_inv = np.eye(4)
    T_inv[:3, :3] = R_inv
    T_inv[:3, 3] = t_inv
    return T_inv

# 示例:从相机到机器人基的变换
R_cam_to_base = np.eye(3)                # 假设无旋转
t_cam_to_base = np.array([0.5, 0.0, 0.3])  # 平移 0.5m x, 0.3m z
T_base_from_cam = build_transform(R_cam_to_base, t_cam_to_base)

# 相机坐标系下的一个点
point_cam = np.array([0.1, -0.2, 0.5])

# 转换到机器人基坐标系
point_base = transform_point(T_base_from_cam, point_cam)
print("点在机器人基坐标系下的坐标:", point_base)
常见错误: 变换矩阵的乘法顺序不可交换。TB←A · PA 表示先应用旋转再平移,顺序错误会导致完全不同的结果。始终牢记:右乘当前点,左乘新变换。

2.7 坐标系选择实战建议

  • 世界坐标系:建议与机器人基坐标系重合,减少一次变换,提高标定稳定性。
  • 相机坐标系:保持与相机硬件一致,不要随意旋转,否则点云投影会出错。
  • 工具坐标系:TCP 标定精度直接影响抓取成功率,建议使用四点法或六点法精确标定。
  • 用户坐标系:在工件位置固定且批量生产时使用,可大幅简化路径编程。
  • 坐标系命名:在代码中统一使用 T_source_target 或 T_target_from_source 命名规范,避免混淆。
Eye-to-Hand 标定中的坐标系变换链 相机 C 世界 W 机器人基 B 工具 T TW←C TB←W TT←B Eye-to-Hand 标定目标:TB←C = TB←W · TW←C 通常令世界坐标系与机器人基坐标系重合,则 TB←W = I,标定简化为 TB←C = TW←C

2.8 坐标系转换的常见问题与避坑

问题 现象 解决方案
变换矩阵顺序错误 点云位置严重偏移或镜像 检查乘法顺序:Ttarget←source · Psource
旋转矩阵非正交 物体变形、距离失真 使用 SVD 正交化或四元数表示旋转
平移向量单位不一致 点云与机器人位置差一个数量级 统一使用米(m)或毫米(mm),并在代码中显式标注
坐标系手性不一致 点云左右或上下颠倒 确认所有坐标系均为右手系,Z 轴方向一致
TCP 标定误差 抓取点重复性差 使用多点标定法,取平均或最小二乘优化
调试技巧: 在标定完成后,将一个已知点(如标定板角点)从相机坐标系转换到机器人基坐标系,然后手动移动机器人末端到该点,观察误差。如果误差在 1-2mm 以内,说明坐标系转换正确。