坐标系基础:机器人基坐标系、工具坐标系、用户坐标系、相机坐标系、像素坐标系、世界坐标系
做手眼标定,说白了就是搞清楚「机器人的手」和「相机的眼」之间到底是个什么位置关系。而这一切的起点,就是坐标系。
我刚开始接触这个领域时,觉得坐标系这东西太基础了,不就是几个箭头嘛。结果第一次做标定,数据怎么都对不上,折腾了两天才发现——我把工具坐标系和用户坐标系搞混了。嗯,从那以后我再也不敢小看坐标系了。
机器人基坐标系(Base Frame)
这是机器人的「根」。所有关节的运动,最终都要换算到这个坐标系下来理解。
- 位置:通常固定在机器人底座中心,Z轴竖直向上
- 作用:描述机器人末端在空间中的绝对位置
- 特点:一旦安装好,这个坐标系就固定了,不会随机器人运动而改变
我个人习惯:在调试阶段,先把所有点位都记录在基坐标系下。这样即使后面换了工具或工件,也能快速回溯问题。
工具坐标系(Tool Frame)
你想想看,机器人末端装了个焊枪,或者装了个夹爪。那「末端」到底指哪里?是法兰盘中心?还是焊枪尖?
工具坐标系就是干这个用的。它定义在机器人末端执行器上,通常把原点设在工具的工作点(TCP,Tool Center Point)。
避坑指南:我曾经遇到过一台机器人,TCP标定差了2毫米。结果焊接轨迹全偏了,焊出来的工件全是废品。后来我养成了一个习惯——每次换工具,必须重新标定TCP,哪怕只是换了个螺丝。
标定TCP的方法有很多,最常用的是「四点法」:让机器人以四种不同的姿态,让工具尖端触碰同一个固定点。通过这四组数据,就能算出TCP相对于法兰盘的位置。
用户坐标系(User Frame)
这个坐标系,说白了就是「方便你干活」的坐标系。
比如你有个工作台,台面是斜的。如果你用基坐标系去编程,每个点位都要算半天。但如果你在台面上定义一个用户坐标系,让Z轴垂直于台面,那编程就简单多了——直接沿着台面走就行。
| 坐标系 | 典型应用场景 |
|---|---|
| 基坐标系 | 全局路径规划、多机器人协同 |
| 工具坐标系 | 焊接、涂胶、抓取 |
| 用户坐标系 | 工作台加工、传送带跟踪 |
相机坐标系(Camera Frame)
相机坐标系是视觉系统的「本地坐标系」。它的原点在相机光心,Z轴沿着光轴方向指向场景。
这里有个容易混淆的点:相机坐标系是三维的,而像素坐标系是二维的。从三维到二维,中间有个投影变换。
注意:相机内参标定不准确,后面所有的手眼标定结果都是错的。我见过太多人花大量时间调手眼标定算法,结果发现是内参出了问题。先标内参,再标外参,这个顺序不能乱。
像素坐标系(Pixel Frame)
这就是你看到的图像。原点在图像左上角,u轴向右,v轴向下。
像素坐标系和相机坐标系之间的转换,靠的是相机内参矩阵:
// 相机内参矩阵示例
// fx, fy 是焦距(像素单位)
// cx, cy 是主点坐标
[ fx 0 cx ]
[ 0 fy cy ]
[ 0 0 1 ]
为什么会有这个矩阵?因为相机把三维世界投影到二维图像上时,会丢失深度信息。而内参矩阵就是描述这个投影过程的数学模型。
世界坐标系(World Frame)
世界坐标系是一个「绝对参考系」。你可以把它定义在任何地方——比如车间的地面中心,或者某个固定柱子的角落。
在实际项目中,世界坐标系通常和机器人基坐标系重合。但如果你有多个机器人,或者有移动平台,那就需要一个独立的世界坐标系来统一所有设备的位置。
我建议:在项目开始时,先花半小时把世界坐标系定好。别嫌麻烦,后面能省你三天时间。
坐标系之间的变换关系
搞清楚了每个坐标系是什么,接下来就是它们之间的变换。说白了,就是从一个坐标系到另一个坐标系的平移和旋转。
变换矩阵是4x4的齐次矩阵:
// 齐次变换矩阵
[ R t ]
[ 0 1 ]
// 其中 R 是3x3旋转矩阵
// t 是3x1平移向量
举个例子:从相机坐标系到机器人基坐标系的变换,就是我们手眼标定最终要求的东西。
知识体系总览
下面这张图,是我自己总结的坐标系关系图。你看一眼就能明白整个体系是怎么串起来的:
实际项目中的坐标系选择策略
说了这么多理论,来点实际的。我在做项目时,一般按这个流程来:
- 先定世界坐标系:选一个稳定、好测量的位置
- 标定机器人基坐标系:用激光跟踪仪或标准块确认
- 标定工具坐标系:四点法或六点法,精度要求高就用六点法
- 定义用户坐标系:根据工件位置,三点法搞定
- 标定相机内参:棋盘格标定板,拍20张以上
- 手眼标定:求解相机到基坐标系的变换
一个小技巧:标定过程中,每一步都记录下变换矩阵。万一后面发现数据不对,可以回溯到某一步重新标,不用从头再来。
坐标系这东西,看着简单,但实际用起来坑不少。我见过有人把工具坐标系和用户坐标系搞反,结果机器人撞了工件。也见过有人相机内参没标好,手眼标定怎么算都不收敛。
嗯,说到底,坐标系就是一套「定位语言」。你把这个语言搞通了,手眼标定就成功了一半。