坐标系基础:世界坐标系、机器人基坐标系、工具坐标系、相机坐标系、像素坐标系

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

我刚开始接触这个领域时,觉得坐标系不就是几个箭头嘛,有什么好讲的?结果第一次在现场调试,相机抓到的位置和机器人实际抓取的位置差了十几毫米,我才意识到——坐标系变换没搞透,后面全是坑。

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

1. 世界坐标系(World Coordinate System)

世界坐标系是整个系统的“参考系”。你可以把它想象成一个固定的“大地基准”。

在实际项目中,我通常把世界坐标系定义在机器人底座的中心点,或者工作台的一个固定角点上。为什么?因为这样后续所有坐标变换都基于同一个“锚点”,不容易乱。

关键点:世界坐标系一旦选定,在整个标定过程中尽量不要动。动了,所有数据都得重来。

2. 机器人基坐标系(Robot Base Coordinate System)

机器人基坐标系固定在机器人底座上。它的原点通常在底座安装面的中心,Z轴向上。

我记得有一次,客户把机器人底座垫高了几毫米,没重新标定基坐标系,结果所有抓取点都偏了。嗯,这种“小改动”最容易忽略。

坐标系 原点位置 典型用途
世界坐标系 用户自定义(如工作台角点) 全局参考,统一所有设备
机器人基坐标系 机器人底座安装面中心 机器人运动学计算基准

3. 工具坐标系(Tool Coordinate System, TCP)

工具坐标系的原点就是工具中心点(TCP)。比如你装了一个夹爪,TCP就在夹爪的抓取中心;装了一个焊枪,TCP就在焊丝尖端。

我个人习惯在标定TCP时,至少做4个不同的姿态去碰一个固定尖点。这样算出来的TCP位置才准。我曾经见过有人只做3个点,结果Z轴偏了0.5mm,焊出来的焊缝全是歪的。

小技巧:TCP标定精度直接影响手眼标定结果。建议用“六点法”或“多点迭代法”,别偷懒。

4. 相机坐标系(Camera Coordinate System)

相机坐标系的原点在相机光心,Z轴沿光轴方向指向场景。说白了,就是相机“看世界”的方式。

这里有个容易混淆的点:相机坐标系是3D的,而像素坐标系是2D的。从3D到2D,中间有个“投影变换”,也就是内参矩阵在起作用。

5. 像素坐标系(Pixel Coordinate System)

像素坐标系就是图像上每个像素的位置,原点在图像左上角,u轴向右,v轴向下。单位是像素。

你想想看,相机拍到的是一张图片,图片上的点怎么对应到机器人能理解的3D空间?这就需要把像素坐标“反投影”到相机坐标系,再变换到机器人基坐标系。

注意:像素坐标系和图像坐标系(原点在图像中心)不同。很多初学者搞混这两个,导致内参标定出错。

6. 坐标系之间的变换关系

这五个坐标系不是孤立的。它们通过刚体变换(旋转+平移)连接在一起。

我画了一张图,帮你理清它们之间的关系:

坐标系变换关系图 坐标系变换关系图 世界坐标系 机器人基坐标系 工具坐标系 (TCP) 相机坐标系 像素坐标系 T_world_to_base T_world_to_cam T_base_to_tool 投影 (内参) 手眼标定核心: T_tool_to_cam 说明 红色虚线是手眼标定要解算的变换关系。其他变换可通过机器人运动学或标定获得。

7. 变换关系的数学表达

每个变换都是一个4x4的齐次变换矩阵,包含旋转矩阵R和平移向量t:

| R   t |
| 0   1 |

举个例子,从像素坐标系到机器人基坐标系的完整变换链:

P_base = T_world_to_base * T_cam_to_world * T_pixel_to_cam * p_pixel

其中:

  • T_pixel_to_cam:由相机内参决定(焦距、主点、畸变)
  • T_cam_to_world:相机外参,即相机在世界坐标系中的位姿
  • T_world_to_base:世界到机器人基的变换,通常固定
核心公式:手眼标定最终要解的就是 T_tool_to_cam(工具到相机的变换),或者 T_cam_to_tool(相机到工具的变换),取决于你是眼在手(Eye-in-Hand)还是眼在外(Eye-to-Hand)。

8. 避坑指南

  • 坐标系方向搞反:我曾经在项目中把旋转矩阵的符号弄反了,结果机器人直接往反方向抓,差点撞到工件。建议每次变换后都做一次“正反验证”。
  • 单位不统一:相机输出的是毫米,机器人用的是米,这种低级错误我见过不止一次。统一单位,或者代码里显式转换。
  • 忽略畸变:像素坐标直接反投影,不考虑镜头畸变,误差能到几个像素。对于高精度应用,必须做畸变校正。
我的习惯:每次标定完,我都会用一个已知位置的标定板做一次“闭环验证”。如果重投影误差超过0.5像素,或者机器人抓取偏差超过0.3mm,我就重新检查变换链。