第2章 机器人运动学基础:空间描述与变换

各位好,我是你们这门课的老朋友。今天咱们聊聊机器人运动学里最底层的那些事——空间描述、位置与姿态、齐次变换矩阵、旋转矩阵和欧拉角。说白了,就是怎么用数学告诉机器人:“你脑袋在哪儿,脸朝哪边”。

我刚开始做机器人那会儿,总觉得这些矩阵啊角啊太抽象。直到有一次调试六轴机械臂,因为欧拉角顺序搞反了,末端直接怼到工作台上……嗯,从那以后我再也不敢小看这些“基础”了。

机器人运动学基础 空间描述与变换 位置 + 姿态 旋转矩阵 正交矩阵 · 坐标旋转 齐次变换矩阵 4×4 位姿统一 欧拉角 ZYX / ZYZ · 万向锁 坐标系定义 链式变换

2.1 空间描述与变换 —— 先搞清楚“在哪儿”

你想想看,要让机器人动,第一件事就是定义空间。我习惯把机器人工作空间想象成一个个坐标系:世界坐标系、基坐标系、工具坐标系……每个坐标系都对应一个“参考系”。

一个刚体在空间里有6个自由度:3个位置(x, y, z)+ 3个姿态(绕轴旋转)。位置好办,用矢量表示就行。但姿态呢?这就引出了旋转矩阵。

核心思想: 任何两个坐标系之间的关系,都可以用一个 4×4 齐次变换矩阵 来描述。它把旋转和平移打包在一起,方便我们做链式运算。

2.2 位置与姿态表示

位置就是三维矢量 p = [x, y, z]ᵀ。姿态稍微麻烦点——我常用的是 旋转矩阵 R,它是一个3×3的正交矩阵,行列式为+1。

举个例子,绕Z轴旋转θ角的旋转矩阵长这样:

R_z(θ) = [ cosθ  -sinθ  0;
           sinθ   cosθ  0;
           0      0     1 ]

记住,旋转矩阵的每一列代表被旋转坐标系的基向量在原坐标系下的投影。我在项目里经常用这个性质来验证矩阵对不对——看看列向量是不是单位向量且两两正交。

我个人习惯在代码里用 numpy 或 Eigen 库处理旋转矩阵,手写容易出错。但调试时一定要打印出来看一眼,我曾经因为符号写反,让机器人转了180度……

2.3 齐次变换矩阵 —— 把旋转和平移装进一个“盒子”

齐次变换矩阵 T 是4×4的:

T = [ R   p;
      0ᵀ  1 ]

其中 R 是3×3旋转矩阵,p 是3×1平移矢量。用齐次坐标,我们可以把连续的坐标系变换写成矩阵乘法:T₁₃ = T₁₂ · T₂₃。这太方便了!

我记得在做一个七轴协作机器人项目时,运动学链足足有8个坐标系。要是没有齐次变换矩阵,光坐标转换就能把人绕晕。用矩阵连乘,代码又短又不容易出错。

变换类型矩阵形式说明
纯平移[[I, p], [0, 1]]单位旋转 + 平移
纯旋转[[R, 0], [0, 1]]原点重合
复合变换[[R, p], [0, 1]]最一般形式

2.4 旋转矩阵与欧拉角

旋转矩阵有9个元素,但自由度只有3。所以工程上更喜欢用 欧拉角 来表示姿态。常见的顺序有 ZYX(先绕Z,再绕Y,最后绕X)和 ZYZ。

但欧拉角有个臭名昭著的问题——万向锁。当第二个旋转角为±90°时,第一个和第三个旋转轴会重合,丢失一个自由度。我在调试一个五轴机床时遇到过,程序里用欧拉角插补,结果在奇异点附近末端乱跳……后来果断换成四元数。

避坑指南: 如果你做的是实时运动控制,尽量避免直接用欧拉角做插值。我建议内部运算用旋转矩阵或四元数,只在人机交互界面用欧拉角显示。我曾经因为偷懒直接用欧拉角做平滑,结果轨迹出现了不可控的抖动。

从旋转矩阵到欧拉角的转换公式(以ZYX为例):

β = atan2(-R₃₁, sqrt(R₁₁² + R₂₁²))
α = atan2(R₂₁/cosβ, R₁₁/cosβ)
γ = atan2(R₃₂/cosβ, R₃₃/cosβ)

注意处理 cosβ ≈ 0 的情况,那就是万向锁的数学表现。

2.5 一点个人经验总结

运动学基础这块,说白了就是“坐标系思维”。你每写一个变换矩阵,都要问自己:这个矩阵把哪个坐标系变到了哪个坐标系? 我见过太多新手把变换方向搞反,结果机器人满世界乱跑。

另外,我建议你多动手画坐标系。纸上画一遍,胜过看十遍公式。我在白板上画了无数个坐标系箭头,现在闭着眼都能写出旋转矩阵。

一句话记住本章: 位置用矢量,姿态用矩阵,变换用齐次,欧拉角慎用。