坐标系基础:世界坐标系、机器人基坐标系、工具坐标系、相机坐标系、像素坐标系
做手眼标定,说白了就是搞清楚几个坐标系之间的“亲戚关系”。
我刚开始接触这个领域时,觉得坐标系不就是几个箭头嘛,有什么好讲的?结果第一次在现场调试,相机抓到的位置和机器人实际抓取的位置差了十几毫米,我才意识到——坐标系变换没搞透,后面全是坑。
这一章,咱们就把五个核心坐标系掰开揉碎讲清楚。
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,焊出来的焊缝全是歪的。
4. 相机坐标系(Camera Coordinate System)
相机坐标系的原点在相机光心,Z轴沿光轴方向指向场景。说白了,就是相机“看世界”的方式。
这里有个容易混淆的点:相机坐标系是3D的,而像素坐标系是2D的。从3D到2D,中间有个“投影变换”,也就是内参矩阵在起作用。
5. 像素坐标系(Pixel Coordinate System)
像素坐标系就是图像上每个像素的位置,原点在图像左上角,u轴向右,v轴向下。单位是像素。
你想想看,相机拍到的是一张图片,图片上的点怎么对应到机器人能理解的3D空间?这就需要把像素坐标“反投影”到相机坐标系,再变换到机器人基坐标系。
6. 坐标系之间的变换关系
这五个坐标系不是孤立的。它们通过刚体变换(旋转+平移)连接在一起。
我画了一张图,帮你理清它们之间的关系:
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:世界到机器人基的变换,通常固定
8. 避坑指南
- 坐标系方向搞反:我曾经在项目中把旋转矩阵的符号弄反了,结果机器人直接往反方向抓,差点撞到工件。建议每次变换后都做一次“正反验证”。
- 单位不统一:相机输出的是毫米,机器人用的是米,这种低级错误我见过不止一次。统一单位,或者代码里显式转换。
- 忽略畸变:像素坐标直接反投影,不考虑镜头畸变,误差能到几个像素。对于高精度应用,必须做畸变校正。