3. 坐标系与变换:世界坐标系、关节坐标系、工具坐标系,齐次变换矩阵

做多轴协调控制,绕不开坐标系。说白了,你让机器人往东走,它得知道「东」是哪个方向。我见过不少新手,一上来就调PID参数,结果机器人乱跑,最后发现是坐标系定义错了。嗯,今天咱们就把这事彻底捋清楚。

3.1 三种核心坐标系

实际项目中,我们打交道最多的就三种坐标系。我习惯把它们比作「地图」、「身体」和「手」。

3.1.1 世界坐标系

世界坐标系是绝对参考系。它固定在地面或机架上,是所有运动的最终基准。你想想看,如果每个轴都按自己的「想法」动,那机器人肯定散架。世界坐标系就是那个「统一思想」的东西。

  • 原点:通常设在机器人底座中心或工作台一角。
  • 用途:规划全局路径、定义工件位置。
  • 特点:一旦设定,一般不轻易改动。
我的习惯: 我会把世界坐标系的原点设在机器人底座安装面的中心,Z轴垂直向上。这样后续做正逆解时,数学关系最简洁。

3.1.2 关节坐标系

关节坐标系是每个电机自己的「小世界」。它只关心一件事:我这个关节转了多少度。

  • 表示方式:通常用角度值(度或弧度)。
  • 特点:每个轴独立,互不干扰。
  • 坑点:关节坐标下做直线运动?不行。因为关节动一点,末端可能画个弧。
我曾经踩过的坑: 有一次调试六轴机器人,我直接在关节空间下发直线插补指令。结果末端走的路径完全不对,还差点撞到夹具。后来才意识到——关节空间只适合做点到点运动,想做直线必须用世界坐标系。

3.1.3 工具坐标系

工具坐标系是附着在末端执行器上的。比如焊枪尖、夹爪中心、摄像头焦点。它让控制指令变得直观——你说「往前移10mm」,是工具往前,不是机器人底座往前。

  • 原点:工具末端(TCP,Tool Center Point)。
  • 方向:通常Z轴指向工具工作方向。
  • 标定:需要做TCP标定,否则精度全废。
核心观点: 工具坐标系是连接「机器人想做什么」和「机器人实际做什么」的桥梁。没有它,你写的轨迹全是空中楼阁。

3.2 齐次变换矩阵

坐标系之间怎么转换?靠矩阵。但普通的3x3旋转矩阵只能描述姿态,不能描述位置。所以我们需要齐次变换矩阵——4x4的矩阵,把旋转和平移打包在一起。

3.2.1 矩阵结构

一个齐次变换矩阵长这样:

| R11  R12  R13  Tx |
| R21  R22  R23  Ty |
| R31  R32  R33  Tz |
|  0    0    0    1  |
  • 左上3x3:旋转矩阵R,描述姿态。
  • 右上3x1:平移向量T,描述位置。
  • 最后一行:固定为[0 0 0 1],保持齐次性。

3.2.2 为什么用4x4?

你想想看,如果只用3x3矩阵,旋转可以乘,但平移得单独加。连续变换时,又要乘又要加,代码写起来很啰嗦。齐次矩阵把两者统一成乘法,简洁又高效。

我个人建议: 在代码里统一用4x4矩阵表示位姿。哪怕你只做平移,也写成齐次形式。这样后续扩展旋转时,不用重构代码。

3.2.3 变换的链式法则

假设我们要从世界坐标系变换到工具坐标系:

T_world_to_tool = T_world_to_base * T_base_to_flange * T_flange_to_tool

每个T都是一个4x4齐次矩阵。乘法的顺序不能乱——先乘离得近的,再乘离得远的。我刚开始做时,顺序搞反过,结果机器人跑到了完全相反的方向。

3.3 坐标系变换实战

光讲理论不行,咱们看个实际例子。假设你有一个SCARA机器人,需要从传送带上抓取工件。

3.3.1 定义坐标系

坐标系 原点位置 说明
世界坐标系 机器人底座中心 绝对参考
关节坐标系 各关节轴心 电机控制用
工具坐标系 吸盘中心 抓取点
工件坐标系 工件中心 目标位置

3.3.2 变换流程

  1. 视觉系统检测到工件在世界坐标系下的位姿:T_world_to_part。
  2. 机器人当前工具位姿:T_world_to_tool。
  3. 计算工具需要移动到的目标位姿:T_tool_to_target = inv(T_world_to_tool) * T_world_to_part。
  4. 将目标位姿转换到关节空间,下发电机执行。
关键点: 第3步用了逆矩阵。inv(T_world_to_tool) 表示「从工具坐标系看世界」,这是手眼标定中最常用的操作。

3.4 知识体系结构图

下面这张图总结了本章的核心逻辑。我画图时习惯把「变换」放在中间,因为它是连接所有坐标系的纽带。

坐标系与变换知识体系 世界坐标系 关节坐标系 工具坐标系 齐次变换矩阵 4x4 旋转+平移 应用:正逆解、轨迹规划、手眼标定 绝对基准 电机控制 末端执行

3.5 避坑指南与经验总结

  • 坐标系一定要先定义再编程。 我见过有人写到一半才想起来「哦,我忘了设原点」,结果全部重来。
  • 齐次矩阵乘法顺序不能错。 左乘和右乘结果完全不同。建议统一用列向量左乘矩阵的约定。
  • 工具坐标系标定要定期做。 尤其是更换夹具后,TCP位置变了,不标定的话精度直接崩。
  • 调试时打印变换矩阵。 我习惯在每个关键变换后打印矩阵,肉眼检查数值是否合理。比如平移量是不是毫米级,旋转矩阵行列式是不是1。
我曾经犯过的错: 有一次做多轴同步,我用了两个不同的库计算变换矩阵。一个用弧度,一个用度。结果两个轴的角度差了57倍,差点把减速机打坏。从那以后,我所有代码统一用弧度,并且在接口处加断言检查。

好了,坐标系和变换就聊这么多。你想想看,其实核心就三件事:知道自己在哪(世界坐标系),知道关节怎么动(关节坐标系),知道工具怎么用(工具坐标系)。中间用齐次矩阵搭桥。搞懂了这些,后面的正逆解和轨迹规划就是水到渠成的事。