3、坐标系与变换:关节空间与笛卡尔空间、齐次变换矩阵、正逆运动学基础

各位工程师朋友,咱们今天聊点硬核的。坐标系与变换,说白了就是机器人怎么“知道”自己手在哪儿、胳膊在哪儿。

我刚开始做运动控制时,总觉得这玩意儿太理论。直到有一次,我写的轨迹在仿真里跑得飞起,一上真机,机械臂直接往工作台上撞。查了两天,最后发现是坐标系搞反了。嗯,从那以后,我再也不敢小看这个章节了。

3.1 两个世界的对话:关节空间 vs 笛卡尔空间

你想想看,机器人有两个“脑子”。一个管每个关节转多少度,这叫关节空间。另一个管末端在三维空间里走到哪个点、摆成什么姿势,这叫笛卡尔空间(也叫操作空间)。

这两个空间,就像一个人的“肌肉角度”和“手指位置”。你不可能直接跟肌肉说“你收缩30%”,你只会说“我要够到那杯水”。

核心区别一句话:

  • 关节空间:控制的是每个轴的角度(θ₁, θ₂, θ₃, ...),单位是度或弧度。适合做单轴运动、回零、点动。
  • 笛卡尔空间:控制的是末端的位置(x, y, z)和姿态(α, β, γ),单位是毫米和度。适合做直线、圆弧、空间轨迹。

我在项目里见过不少新手,直接在关节空间里规划直线轨迹。结果末端走的路径歪七扭八,还容易撞到周边设备。记住:要直线,必须用笛卡尔空间。

特性 关节空间 笛卡尔空间
控制对象 每个关节角度 末端位姿
直观性 不直观,不知道末端在哪 直观,直接对应工作空间
奇异性 无奇异问题 存在奇异点,速度可能突变
计算量 小,无三角函数逆解 大,需要实时逆运动学
典型应用 点位运动、回零、示教 直线/圆弧插补、涂胶、焊接

3.2 齐次变换矩阵:把旋转和平移装进一个盒子里

为什么需要齐次变换矩阵?因为一个坐标系相对于另一个坐标系,既有旋转又有平移。你总不能每次计算都分开算旋转矩阵再加个平移向量吧?太麻烦了。

齐次变换矩阵长这样:

    | R   t |
T = |       |
    | 0   1 |

其中 R 是 3×3 的旋转矩阵,t 是 3×1 的平移向量。最后一行是 [0 0 0 1],固定不变。

我个人习惯把齐次变换矩阵想象成一个“坐标转换器”。你输入一个点在当前坐标系下的坐标,它帮你算出在另一个坐标系下的坐标。就这么简单。

实用技巧: 在代码里,我通常用 4×4 的数组来存齐次变换矩阵。比如在 C++ 里:

double T[4][4] = {
    {R00, R01, R02, tx},
    {R10, R11, R12, ty},
    {R20, R21, R22, tz},
    {0.0, 0.0, 0.0, 1.0}
};

这样写,矩阵乘法直接用循环搞定,代码可读性也高。

齐次变换矩阵的乘法有个重要性质:顺序不可交换。先旋转再平移,和先平移再旋转,结果完全不同。我在调试一个六轴机器人时,就因为搞反了变换顺序,末端位置差了十几毫米。找了一下午才发现。

3.3 正运动学:给角度,算位置

正运动学,说白了就是“已知每个关节的角度,求末端在哪儿”。这是最基础、最确定的问题。你给一组角度,它就给你一个唯一的位姿。

对于串联机器人,正运动学就是不断地做齐次变换矩阵的连乘:

T_0n = T_01 * T_12 * T_23 * ... * T_(n-1)n

其中 T_01 是从基座到关节1的变换,T_12 是从关节1到关节2的变换,依此类推。最终 T_0n 就是末端相对于基座的位姿。

我建议你写代码时,先写一个通用的“DH参数转齐次变换矩阵”的函数。然后正运动学就是一个循环连乘。这样代码复用性极高,换机器人型号只需要改 DH 参数表。

DH参数表(Denavit-Hartenberg)示例:

关节 i αi-1 (连杆扭转) ai-1 (连杆长度) di (连杆偏距) θi (关节角)
1 0 0 0.3 θ₁
2 -90° 0.2 0 θ₂
3 0 0.4 0 θ₃

每个关节的 θᵢ 是变量,其他参数由机械结构决定。

3.4 逆运动学:给位置,算角度

逆运动学就难多了。已知末端位姿,求每个关节的角度。这玩意儿有多难?

  • 多解性:同一个末端位姿,可能有多种关节角度组合。比如肘部朝上还是朝下。
  • 无解性:目标点超出了机器人的工作范围,怎么算都没解。
  • 奇异性:在某些位姿下,关节速度会突变,甚至趋于无穷大。

逆运动学的解法主要有两种:

  1. 解析法(封闭解):通过几何关系直接推导出公式。速度快,但只适用于特定构型的机器人(比如后三个关节轴线交于一点的六轴机器人)。
  2. 数值法(迭代法):用雅可比矩阵迭代逼近。通用性强,但计算量大,且可能不收敛。

避坑指南: 我曾经在一个焊接项目里,用了数值法做逆运动学。结果在奇异点附近,迭代死活不收敛,末端抖得像筛糠一样。后来我改成解析法 + 奇异点附近特殊处理,问题才解决。

所以我的建议是:能用解析法,就别用数值法。实在要用数值法,一定要加收敛判断和奇异点检测。

3.5 知识体系总览

下面这张图,把本章的核心逻辑串起来了。你一看就明白:

坐标系与变换知识体系 坐标系与变换:知识体系总览 关节空间(角度) 笛卡尔空间(位姿) 正运动学 逆运动学 齐次变换矩阵 T 旋转矩阵 R (3×3) + 平移向量 t (3×1) + [0 0 0 1] 最后一行 轨迹规划 插补计算 碰撞检测 核心逻辑:关节空间 ↔ 齐次变换矩阵 ↔ 笛卡尔空间 正运动学唯一确定,逆运动学存在多解、无解、奇异问题

3.6 实战中的坐标系管理

在实际项目中,坐标系远不止基座和末端。还有工具坐标系、工件坐标系、用户坐标系……我见过最夸张的一个项目,用了7个坐标系嵌套。

我的管理原则很简单:

  • 统一基准:所有坐标系最终都换算到基座坐标系下。
  • 命名规范:T_base_tool、T_base_workpiece,一看就懂。
  • 标定验证:每次换工具或工件,必须重新标定坐标系。别偷懒。

一个小技巧: 在调试阶段,我会在示教器上手动走几个已知点。比如让末端走到工件坐标系的原点,然后看正运动学算出来的位置是不是 (0,0,0)。如果不是,说明坐标系变换有问题。这个方法帮我抓出过至少5个标定错误。

好了,坐标系与变换就聊到这儿。记住:关节空间是底层,笛卡尔空间是上层,齐次变换矩阵是桥梁。正运动学是基础,逆运动学是挑战。把这些搞明白,后面的轨迹规划才能玩得转。