2. 坐标系基础:世界坐标系、机器人基坐标系、工具坐标系、相机坐标系、标定板坐标系定义与变换关系
在 Eye-to-Hand 标定中,所有测量与运动都建立在多个坐标系之间的精确变换之上。理解每个坐标系的定义、物理附着对象以及它们之间的变换链,是标定成功的前提。本章将系统定义五个核心坐标系,并给出它们之间的数学变换关系。
2.1 五大坐标系定义
| 坐标系名称 | 符号 | 物理附着对象 | 原点位置 | 轴方向约定 |
|---|---|---|---|---|
| 世界坐标系 | {W} | 固定于工作空间(地面或基座平台) | 用户自定义,通常为机器人安装点或工作台角点 | Z 轴竖直向上,X/Y 轴水平 |
| 机器人基坐标系 | {B} | 机器人底座安装面 | 机器人底座中心 | Z 轴竖直向上,X 轴指向机器人前方 |
| 工具坐标系 | {T} | 机器人末端执行器(夹爪、焊枪、吸盘等) | 工具中心点 (TCP) | Z 轴沿工具伸出方向 |
| 相机坐标系 | {C} | 固定安装的相机(Eye-to-Hand 配置) | 相机光心 | Z 轴沿光轴指向场景,X/Y 轴平行于像平面 |
| 标定板坐标系 | {P} | 标定板(棋盘格或圆点阵列板) | 标定板左上角或中心 | Z 轴垂直于板面,X/Y 轴沿棋盘格行列方向 |
关键约定:所有坐标系均遵循右手定则。机器人基坐标系 {B} 与世界坐标系 {W} 之间通常存在一个固定的旋转平移关系,该关系在机器人安装时通过测量或标定获得。
2.2 坐标系变换关系总览
Eye-to-Hand 标定的核心是求解相机坐标系 {C} 到机器人基坐标系 {B} 的变换矩阵 BCT。该变换一旦确定,相机检测到的物体位置即可转换到机器人运动空间。下图展示了五个坐标系之间的完整变换链:
2.3 变换矩阵与齐次坐标
所有坐标系之间的变换均使用 4×4 齐次变换矩阵 表示,包含旋转分量 R(3×3)和平移分量 t(3×1):
| R11 R12 R13 tx |
T = | R21 R22 R23 ty |
| R31 R32 R33 tz |
| 0 0 0 1 |
齐次坐标点 P = [x, y, z, 1]T 通过左乘变换矩阵实现坐标系转换:
AP = ABT · BP
重要性质:变换矩阵可逆,逆矩阵 BAT = (ABT)-1 表示反向变换。变换矩阵的乘法满足结合律但不满足交换律,顺序至关重要。
2.4 关键变换链详解
在 Eye-to-Hand 标定过程中,以下变换链构成闭环约束,是求解目标变换 BCT 的核心方程:
- 机器人基坐标系 → 工具坐标系(BTT):由机器人正向运动学计算得出,依赖于关节角度 q 和机器人 DH 参数。该变换在每次机器人运动时实时更新。
- 工具坐标系 → 标定板坐标系(TPT):当标定板固定在机器人末端时,该变换为固定值,可通过工具标定或设计图纸获得。在 Eye-to-Hand 配置中,标定板通常固定在机器人末端。
- 相机坐标系 → 标定板坐标系(CPT):通过相机拍摄标定板图像,利用 PnP 算法求解。该变换在每次拍摄时重新计算,是标定过程中的观测值。
- 机器人基坐标系 → 相机坐标系(BCT):待求解的目标变换,在标定过程中保持不变(相机固定安装)。
2.5 闭环方程与标定原理
对于机器人运动到第 i 个位姿,存在以下闭环关系:
BCT · CPTi = BTTi · TPT
其中:
- BCT —— 未知,待求解(固定值)
- CPTi —— 第 i 次拍摄的观测值(相机外参)
- BTTi —— 第 i 次拍摄的机器人位姿(运动学计算)
- TPT —— 已知固定值(工具到标定板)
通过采集多组(N ≥ 3)不同位姿下的观测数据,构建超定方程组,即可求解 BCT。常用的求解方法包括 Tsai-Lenz 两步法 和 非线性优化法,将在后续章节详细展开。
常见误区:初学者容易混淆 CPT 和 PCT 的方向。请牢记:变换矩阵的下标表示“从哪个坐标系到哪个坐标系”,CPT 表示将标定板坐标系 {P} 中的点变换到相机坐标系 {C} 中。
2.6 坐标系变换的工程实现
在实际编程中,通常使用机器人库(如 robotics-toolbox、KDL)或线性代数库(如 Eigen、NumPy)来管理变换矩阵。以下是一个典型的 Python 伪代码片段,展示如何构建闭环方程:
import numpy as np
# 定义齐次变换矩阵类
class Transform:
def __init__(self, R=np.eye(3), t=np.zeros(3)):
self.T = np.eye(4)
self.T[:3, :3] = R
self.T[:3, 3] = t
def __mul__(self, other):
return Transform.from_matrix(self.T @ other.T)
@staticmethod
def from_matrix(mat):
result = Transform()
result.T = mat
return result
# 标定数据:假设已采集 N 组数据
N = 10
B_T_T_list = [] # 机器人位姿列表
C_P_T_list = [] # 相机外参列表
T_P_T = Transform() # 工具到标定板的固定变换
# 构建方程:B_C_T * C_P_T_i = B_T_T_i * T_P_T
# 对于每组数据,整理为 AX = XB 形式
for i in range(N):
A_i = B_T_T_list[i] * T_P_T
B_i = C_P_T_list[i]
# 求解 A_i * X = X * B_i
# 具体求解算法见后续章节
2.7 坐标系变换的精度影响因素
| 影响因素 | 影响环节 | 典型误差量级 | 缓解措施 |
|---|---|---|---|
| 机器人运动学参数误差 | BTT | 0.1~1 mm | 机器人标定、使用高精度机器人 |
| 相机内参标定误差 | CPT | 0.1~0.5 像素 | 多视角标定、高分辨率相机 |
| 标定板制造误差 | TPT | 0.01~0.1 mm | 使用陶瓷或玻璃基板、激光刻蚀 |
| 标定板安装偏差 | TPT | 0.1~0.5 mm | 精密夹具、工具标定 |
| 图像特征提取误差 | CPT | 0.1~0.3 像素 | 亚像素角点检测、滤波 |
工程建议:在采集标定数据时,尽量让机器人运动到工作空间的不同区域,并改变末端姿态(俯仰、偏转),使标定板在相机视野中覆盖不同位置和角度。这有助于提高求解的数值稳定性和精度。