第二章 坐标系与变换:世界坐标系、工具坐标系、工件坐标系

各位同学,咱们今天聊点实在的。坐标系这东西,听起来像是数学课上的概念,但在多轴运动控制里,它就是你的“地图”和“指南针”。我见过太多工程师,程序写得飞起,结果机器人撞了工件,一查原因——坐标系搞错了。嗯,咱们今天就把这事彻底捋清楚。

2.1 为什么需要多个坐标系?

你想想看,一个六轴机器人,它的关节在动,末端在动,工件在动,甚至整个机器人底座都可能动。如果只用一套坐标系统,那计算量会爆炸,而且极容易出错。

所以,工业界约定俗成,用三套坐标系来分工:

  • 世界坐标系:固定在地面或基座上,是全局的“绝对参考”。
  • 工具坐标系:固定在机器人末端(比如焊枪尖、夹爪中心),是“手”的视角。
  • 工件坐标系:固定在工件上(比如工作台、夹具),是“活”的视角。

说白了,世界坐标系是“上帝视角”,工具坐标系是“手眼视角”,工件坐标系是“干活视角”。

核心原则:任何运动指令,最终都要换算到世界坐标系下执行。但编程时,我们通常用工具或工件坐标系来写,这样更直观、更灵活。

2.2 世界坐标系(World Coordinate System)

世界坐标系,也叫基坐标系。它通常定义在机器人的安装底座上,原点在底座中心,Z轴向上,X轴指向机器人前方。这个坐标系一旦设定,一般不轻易改动。

我在项目中遇到过一件事:有个客户把机器人挪了个位置,但程序里没更新世界坐标系的原点偏移,结果所有点位都偏了10厘米。嗯,从那以后,我每次换场地都会先标定一次世界坐标系。

世界坐标系的特点:

  • 固定不变,是所有其他坐标系的“根”
  • 用于定义机器人的安装位置和姿态
  • 在示教器上通常显示为 BASEWORLD

2.3 工具坐标系(Tool Coordinate System)

工具坐标系,顾名思义,是装在机器人末端执行器上的坐标系。它的原点通常在工具尖端(TCP,Tool Center Point),Z轴沿工具指向方向。

为什么要单独搞一个工具坐标系?因为换工具太频繁了。今天装焊枪,明天装夹爪,后天装摄像头。如果每次换工具都要重写所有点位,那工程师得累死。

工具坐标系的精髓在于:你只需要标定一次工具,然后所有点位自动适配

我的习惯:每次换工具后,第一件事就是做TCP标定。用四点法或六点法,把工具尖端的偏移量和姿态算出来。别偷懒,这一步省了,后面全是坑。

工具坐标系的常见标定方法:

方法 原理 精度 适用场景
四点法 让工具尖端对准一个固定点,从四个不同姿态逼近 中等 一般工具(焊枪、夹爪)
六点法 在四点法基础上,增加两个方向的对准 精密工具(摄像头、测量探头)
直接输入法 已知工具尺寸,直接输入偏移量 取决于输入精度 设计阶段或仿真

2.4 工件坐标系(Work Object Coordinate System)

工件坐标系,也叫用户坐标系。它定义在工件或工作台上。为什么要搞这个?因为工件的位置会变啊!

举个例子:你给一个汽车门板做焊接,今天这个门板放在左边,明天放在右边。如果直接用世界坐标系编程,那每次换位置都得重新示教所有点。但如果你用工件坐标系,只需要重新标定一下工件坐标系的原点,所有点位自动跟着跑。

我曾经在一个汽车焊装线上,用工件坐标系实现了“一键换型”。换一个车型,只需要重新标定三个点,整个程序自动适配。省了多少时间?嗯,至少省了两天的人工示教时间。

工件坐标系的标定通常用三点法:

  1. 原点:定义工件坐标系的原点位置
  2. X轴方向点:定义X轴的正方向
  3. XY平面内一点:定义Y轴的正方向(Z轴由右手定则确定)

注意:工件坐标系一旦建立,所有在该坐标系下编写的点位,都会随着工件坐标系的移动而自动更新。但如果你在程序里混用了不同坐标系下的点位,那结果就是——机器人会飞到莫名其妙的位置。我曾经见过一个新手,把世界坐标系下的点位和工件坐标系下的点位混在一起用,结果机器人差点撞到安全围栏。

2.5 齐次变换矩阵:平移+旋转的统一表达

好了,坐标系讲完了,那它们之间怎么转换?答案就是——齐次变换矩阵。

齐次变换矩阵,说白了就是一个4x4的矩阵,它把平移和旋转打包在一起。为什么是4x4?因为3x3只能做旋转,3x1只能做平移。把它们合在一起,再加一行0 0 0 1,就变成了4x4。

它的形式长这样:

| R11  R12  R13  Tx |
| R21  R22  R23  Ty |
| R31  R32  R33  Tz |
|  0    0    0    1  |

左上角3x3是旋转矩阵,右上角3x1是平移向量。就这么简单。

为什么叫“齐次”?因为它在数学上把点和向量统一成了同一种表达方式。一个点用 [x, y, z, 1]^T 表示,一个向量用 [x, y, z, 0]^T 表示。这样,平移和旋转就可以用同一个矩阵乘法搞定。

2.6 齐次变换矩阵的计算

咱们来看一个实际例子。假设工具坐标系相对于世界坐标系有一个平移 (100, 200, 300) 毫米,然后绕Z轴旋转了30度。那么齐次变换矩阵怎么算?

先算旋转部分。绕Z轴旋转30度,旋转矩阵是:

| cos30°  -sin30°  0 |
| sin30°   cos30°  0 |
|   0        0      1 |

代入数值(cos30°≈0.866,sin30°=0.5):

| 0.866  -0.5  0 |
| 0.5    0.866 0 |
| 0      0     1 |

然后加上平移部分,得到完整的齐次变换矩阵:

| 0.866  -0.5  0  100 |
| 0.5    0.866 0  200 |
| 0      0     1  300 |
| 0      0     0   1  |

现在,如果工具坐标系下有一个点 P_tool = (50, 0, 100),它在世界坐标系下的坐标是多少?直接做矩阵乘法:

P_world = T * P_tool

| 0.866  -0.5  0  100 |   | 50 |
| 0.5    0.866 0  200 | * | 0  |
| 0      0     1  300 |   | 100|
| 0      0     0   1  |   | 1  |

= (0.866*50 + (-0.5)*0 + 0*100 + 100,
   0.5*50 + 0.866*0 + 0*100 + 200,
   0*50 + 0*100 + 1*100 + 300,
   1)

= (143.3, 225, 400)

嗯,算出来世界坐标是 (143.3, 225, 400) 毫米。你看,一个矩阵乘法,平移和旋转全搞定了。

关键点:齐次变换矩阵的乘法顺序很重要。先旋转后平移,还是先平移后旋转?答案是:矩阵乘法是从右往左读的。如果你写 T = T_translation * T_rotation,那就是先旋转后平移。反过来,就是先平移后旋转。这个顺序搞反了,结果天差地别。

2.7 坐标系变换的链式法则

在实际系统中,坐标系之间是链式连接的。比如:

世界坐标系 → 机器人底座 → 机器人关节1 → ... → 机器人关节6 → 工具坐标系 → 工件坐标系

每一级之间都有一个齐次变换矩阵。要计算工具坐标系下的点在世界坐标系下的位置,只需要把这些矩阵依次乘起来:

T_world_to_tool = T_world_to_base * T_base_to_j1 * ... * T_j6_to_tool

这就是所谓的“链式法则”。你想想看,机器人控制器每秒都在做这种计算,而且是在几十个坐标系之间来回切换。没有齐次变换矩阵,这事根本没法干。

我个人习惯,在调试时会把整个变换链打印出来,检查每个环节的矩阵是否正确。有一次我发现某个关节的编码器零点偏了0.1度,就是通过矩阵链反推出来的。嗯,这种排查方法,比对着机械图纸找问题快多了。

2.8 本章知识体系

下面这张图,把本章的核心逻辑串起来了:

坐标系与变换知识体系 世界坐标系 工具坐标系 工件坐标系 齐次变换矩阵 (4x4) 平移 + 旋转 = 统一表达 链式法则:T_total = T1 * T2 * T3 * ... * Tn 坐标系之间通过矩阵乘法串联 TCP标定 工件对位 轨迹规划

2.9 避坑指南

最后,分享几个我踩过的坑:

  • 坐标系混淆:我曾经在调试时,把工具坐标系下的点位当成世界坐标系下的点位直接下发,结果机器人末端直接怼到了工作台上。从那以后,我每次写点位都会在注释里标明坐标系。
  • 矩阵乘法顺序:齐次变换矩阵的乘法不满足交换律。先平移后旋转,和先旋转后平移,结果完全不同。我建议你写代码时,把每一步的中间结果打印出来,肉眼检查一遍。
  • 单位统一:毫米还是米?度还是弧度?这个一定要统一。我见过一个项目,因为单位不统一,机器人走出来的轨迹歪了30度。查了三天,最后发现是角度单位搞错了。
  • 标定精度:工具坐标系和工件坐标系的标定精度,直接决定了机器人的绝对定位精度。别指望用肉眼瞄一下就能标定准。用激光跟踪仪或者千分表,精度能提高一个数量级。

我的建议:在项目初期,花半天时间把坐标系标定好。这半天时间,后面能给你省下几天甚至几周的调试时间。别急着写程序,先把“地图”画准了。

好了,坐标系与变换就讲到这里。记住一句话:坐标系是机器人的世界观,齐次变换矩阵是它的语言。掌握了这两样,多轴运动控制你就入门了。


公众号:蓝海资料掘金营,微信deep3321