第2章 坐标系与位姿描述:关节空间与笛卡尔空间、齐次变换矩阵、欧拉角与四元数

各位工程师朋友,大家好。欢迎来到《轨迹规划与插补协同调试》的第二讲。

今天我们要聊的,是机器人运动学里最基础、也最绕不开的一块内容——坐标系与位姿描述。说白了,就是回答三个问题:机器人在哪儿?它朝着哪个方向?我怎么用数学把它说清楚?

我个人习惯把这一章叫做“翻译官”章节。为什么?因为机器人控制器、伺服驱动器、视觉系统、上位机,它们各自说各自的语言。关节角度是一种语言,笛卡尔坐标是另一种语言。你要让它们协同工作,就得先学会翻译。

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

先讲个我自己的经历。几年前调试一台六轴机器人,做码垛程序。我在笛卡尔空间里规划了一条直线轨迹,看着挺漂亮。结果一跑起来,机器人第六轴在中间突然反转了180度。现场所有人都懵了。

后来一查,问题出在哪儿?我规划的是笛卡尔空间的直线,但控制器在关节空间里做插补。两个空间之间的映射不是一一对应的,同一个笛卡尔点可能对应多组关节角度。这就是典型的“空间混淆”。

核心概念速览:

  • 关节空间:用每个关节的角度值(或位移值)来描述机器人的状态。维度等于关节数。例如六轴机器人:[θ1, θ2, θ3, θ4, θ5, θ6]。
  • 笛卡尔空间:用工具末端在三维空间中的位置和姿态来描述。通常用 [x, y, z, rx, ry, rz] 表示。

你想想看,关节空间的好处是什么?简单、无歧义。一组关节角度唯一确定一个机器人形态。但坏处也很明显——你很难直观地想象末端走了什么路径。笛卡尔空间正好相反,直观、好理解,但存在多解问题。

对比维度 关节空间 笛卡尔空间
描述对象 各关节角度/位置 末端位姿 (位置+姿态)
直观性 差,无法直接想象末端路径 好,符合人类直觉
唯一性 唯一(不考虑奇异位形) 不唯一(逆解多解)
插补计算 简单,直接对角度插值 复杂,需实时逆解
典型应用 点到点运动、避障路径 直线/圆弧加工、焊缝跟踪

实战建议:我一般这样选——如果只是让机器人从A点走到B点,中间没有严格的路径约束,用关节空间插补,又快又稳。但如果要沿着一条焊缝或者胶线走,必须用笛卡尔空间,哪怕计算量大一些。

2.2 齐次变换矩阵:位姿的“身份证”

好,现在我们知道要在两个空间之间来回切换。那用什么工具来切换?齐次变换矩阵。

说白了,齐次变换矩阵就是一个4x4的方阵,它把旋转和平移打包在一起。我习惯把它看作机器人的“身份证”——拿着这个矩阵,你就能知道末端坐标系相对于基坐标系的位置和朝向。

// 齐次变换矩阵的标准形式
// [R   p]
// [0   1]

// 其中 R 是 3x3 旋转矩阵,p 是 3x1 平移向量

// 示例:绕Z轴旋转90度,再沿X轴平移100mm
T = | 0  -1   0  100 |
    | 1   0   0    0 |
    | 0   0   1    0 |
    | 0   0   0    1 |

嗯,这里要注意一个细节。齐次变换矩阵的乘法不满足交换律。先旋转再平移,和先平移再旋转,结果完全不同。我在带新人时,经常让他们用手边的笔和本子比划一下——先转个角度再挪位置,和先挪位置再转角度,最后笔尖的位置确实不一样。

我曾经踩过的坑:有一次写手眼标定程序,把变换矩阵的乘法顺序搞反了。结果机器人抓取工件时,每次都偏了20多毫米。查了两天才发现是 T_cam_to_base * T_obj_to_cam 写成了 T_obj_to_cam * T_cam_to_base。顺序错了,整个位姿就全歪了。

2.3 欧拉角:直观但暗藏陷阱

欧拉角可能是大家最熟悉的姿态表示法。毕竟,谁还没用过 [roll, pitch, yaw] 呢?

但我要说,欧拉角是个“双刃剑”。直观是真直观,但坑也是真多。

  • 万向锁(Gimbal Lock):当pitch角达到±90°时,roll和yaw的旋转轴重合,丢失一个自由度。我记得有一次做五轴机床的后处理,程序在某个角度附近突然乱跳,就是万向锁在作怪。
  • 多值性:同一个姿态可以用多组欧拉角表示。比如 [30°, 0°, 0°] 和 [-150°, 180°, 180°] 可能对应同一个姿态。
  • 插补不平滑:在两个姿态之间做线性插值时,欧拉角的变化路径可能不是最短路径。
欧拉角类型 旋转顺序 常见应用场景
ZYX (RPY) 绕Z→绕Y→绕X 工业机器人、船舶、车辆
ZYZ 绕Z→绕Y→绕Z 部分机器人运动学教材
XYZ 绕X→绕Y→绕Z 航空航天、无人机

我的个人习惯:在调试阶段,用欧拉角来观察和手动示教,因为直观。但在正式的轨迹规划代码里,我尽量不用欧拉角做插补,而是转成四元数或者旋转矩阵来处理。这样可以避免很多奇奇怪怪的姿态跳变。

2.4 四元数:平滑插补的利器

说到四元数,很多工程师第一反应是“数学太复杂,不想碰”。我刚开始也这么觉得。但后来被欧拉角坑了几次之后,老老实实把四元数捡起来学了。

四元数本质上是一个超复数:q = w + xi + yj + zk,其中 w 是实部,(x, y, z) 是虚部。它用四个参数表示三维空间中的旋转,没有万向锁问题,而且插补非常平滑。

// 四元数表示绕单位向量 (nx, ny, nz) 旋转角度 θ
q = [cos(θ/2), nx*sin(θ/2), ny*sin(θ/2), nz*sin(θ/2)]

// 球面线性插补 (SLERP) —— 两个姿态之间的平滑过渡
// q(t) = (sin((1-t)*Ω) / sin(Ω)) * q1 + (sin(t*Ω) / sin(Ω)) * q2
// 其中 Ω 是 q1 和 q2 之间的夹角

为什么说四元数适合做插补?因为它在四维单位球面上做插值,路径是测地线,也就是最短路径。你想想看,两个姿态之间,四元数SLERP走的是“最直”的那条路,而欧拉角线性插值可能绕个大弯。

实战对比:

  • 欧拉角插补:姿态变化可能不平滑,遇到万向锁会“卡住”或“跳变”。
  • 四元数SLERP:姿态变化均匀、平滑,无奇点,适合连续轨迹。
  • 旋转矩阵插补:计算量大,且插值后的矩阵需要重新正交化,否则会变形。

我曾经踩过的坑:有一次做视觉引导抓取,目标姿态变化很大。我用欧拉角做了线性插补,结果机器人末端在中间某个位置突然反转了180度,差点撞到夹具。后来换成四元数SLERP,问题立刻解决。从那以后,凡是涉及大角度姿态变化的轨迹,我第一反应就是用四元数。

2.5 知识体系总览

说了这么多,我们来画一张图,把这一章的核心逻辑串起来。

坐标系与位姿描述知识体系 关节空间 (Joint Space) 笛卡尔空间 (Cartesian Space) 正运动学 逆运动学 齐次变换矩阵 4x4矩阵,旋转+平移 欧拉角 直观,但有万向锁 四元数 无奇点,适合插补 正/逆运动学计算 轨迹插补与平滑 手眼标定与位姿变换 核心原则 关节空间做规划(简单高效),笛卡尔空间做约束(路径精确) 姿态插补优先使用四元数SLERP,避免欧拉角万向锁

这张图把这一章的核心逻辑串起来了。从上往下看:关节空间和笛卡尔空间通过正/逆运动学相互映射;位姿描述有三种主流方法——齐次变换矩阵、欧拉角、四元数;最终落到三个典型应用场景上。

我个人建议,初学者先把齐次变换矩阵练熟,这是基本功。然后理解欧拉角的优缺点,知道它什么时候会出问题。最后,一定要掌握四元数的基本用法,尤其是SLERP插补。因为在实际的轨迹规划项目中,四元数几乎是姿态插补的“标准答案”。