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 逆运动学:给位置,算角度
逆运动学就难多了。已知末端位姿,求每个关节的角度。这玩意儿有多难?
- 多解性:同一个末端位姿,可能有多种关节角度组合。比如肘部朝上还是朝下。
- 无解性:目标点超出了机器人的工作范围,怎么算都没解。
- 奇异性:在某些位姿下,关节速度会突变,甚至趋于无穷大。
逆运动学的解法主要有两种:
- 解析法(封闭解):通过几何关系直接推导出公式。速度快,但只适用于特定构型的机器人(比如后三个关节轴线交于一点的六轴机器人)。
- 数值法(迭代法):用雅可比矩阵迭代逼近。通用性强,但计算量大,且可能不收敛。
避坑指南: 我曾经在一个焊接项目里,用了数值法做逆运动学。结果在奇异点附近,迭代死活不收敛,末端抖得像筛糠一样。后来我改成解析法 + 奇异点附近特殊处理,问题才解决。
所以我的建议是:能用解析法,就别用数值法。实在要用数值法,一定要加收敛判断和奇异点检测。
3.5 知识体系总览
下面这张图,把本章的核心逻辑串起来了。你一看就明白:
3.6 实战中的坐标系管理
在实际项目中,坐标系远不止基座和末端。还有工具坐标系、工件坐标系、用户坐标系……我见过最夸张的一个项目,用了7个坐标系嵌套。
我的管理原则很简单:
- 统一基准:所有坐标系最终都换算到基座坐标系下。
- 命名规范:T_base_tool、T_base_workpiece,一看就懂。
- 标定验证:每次换工具或工件,必须重新标定坐标系。别偷懒。
一个小技巧: 在调试阶段,我会在示教器上手动走几个已知点。比如让末端走到工件坐标系的原点,然后看正运动学算出来的位置是不是 (0,0,0)。如果不是,说明坐标系变换有问题。这个方法帮我抓出过至少5个标定错误。
好了,坐标系与变换就聊到这儿。记住:关节空间是底层,笛卡尔空间是上层,齐次变换矩阵是桥梁。正运动学是基础,逆运动学是挑战。把这些搞明白,后面的轨迹规划才能玩得转。