第2章 机器人运动学基础:空间描述与变换
各位好,我是你们这门课的老朋友。今天咱们聊聊机器人运动学里最底层的那些事——空间描述、位置与姿态、齐次变换矩阵、旋转矩阵和欧拉角。说白了,就是怎么用数学告诉机器人:“你脑袋在哪儿,脸朝哪边”。
我刚开始做机器人那会儿,总觉得这些矩阵啊角啊太抽象。直到有一次调试六轴机械臂,因为欧拉角顺序搞反了,末端直接怼到工作台上……嗯,从那以后我再也不敢小看这些“基础”了。
2.1 空间描述与变换 —— 先搞清楚“在哪儿”
你想想看,要让机器人动,第一件事就是定义空间。我习惯把机器人工作空间想象成一个个坐标系:世界坐标系、基坐标系、工具坐标系……每个坐标系都对应一个“参考系”。
一个刚体在空间里有6个自由度:3个位置(x, y, z)+ 3个姿态(绕轴旋转)。位置好办,用矢量表示就行。但姿态呢?这就引出了旋转矩阵。
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 一点个人经验总结
运动学基础这块,说白了就是“坐标系思维”。你每写一个变换矩阵,都要问自己:这个矩阵把哪个坐标系变到了哪个坐标系? 我见过太多新手把变换方向搞反,结果机器人满世界乱跑。
另外,我建议你多动手画坐标系。纸上画一遍,胜过看十遍公式。我在白板上画了无数个坐标系箭头,现在闭着眼都能写出旋转矩阵。