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 系统中,最关键的变换链如下:
- 相机 → 世界:TW←C,由标定获得,将相机坐标系下的点云转换到世界坐标系。
- 世界 → 机器人基:TB←W,通常由系统安装确定,或通过外部测量获得。
- 机器人基 → 工具:TT←B,由机器人正向运动学实时计算,随关节角度变化。
- 用户 → 世界:TW←U,用户自定义,用于简化工件坐标编程。
完整的视觉引导抓取变换链为:
PT = TT←B · TB←W · TW←C · PC
即:相机看到的点 PC,先转到世界坐标系,再转到机器人基坐标系,最后转到工具坐标系,得到机器人末端执行器需要到达的位置。
实战要点: Eye-to-Hand 标定直接求解 TB←C(相机到机器人基),等价于 TB←W · TW←C。实际应用中常将世界坐标系与机器人基坐标系重合,简化计算。
2.4 坐标系转换关系总览
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命名规范,避免混淆。
2.8 坐标系转换的常见问题与避坑
| 问题 | 现象 | 解决方案 |
|---|---|---|
| 变换矩阵顺序错误 | 点云位置严重偏移或镜像 | 检查乘法顺序:Ttarget←source · Psource |
| 旋转矩阵非正交 | 物体变形、距离失真 | 使用 SVD 正交化或四元数表示旋转 |
| 平移向量单位不一致 | 点云与机器人位置差一个数量级 | 统一使用米(m)或毫米(mm),并在代码中显式标注 |
| 坐标系手性不一致 | 点云左右或上下颠倒 | 确认所有坐标系均为右手系,Z 轴方向一致 |
| TCP 标定误差 | 抓取点重复性差 | 使用多点标定法,取平均或最小二乘优化 |
调试技巧: 在标定完成后,将一个已知点(如标定板角点)从相机坐标系转换到机器人基坐标系,然后手动移动机器人末端到该点,观察误差。如果误差在 1-2mm 以内,说明坐标系转换正确。