第2章 空间描述与变换:位置与姿态表示
各位同学好,我是你们的老朋友。今天咱们来聊聊机器人学里最基础、也最绕不开的一块内容——空间描述与变换。
说实话,我刚开始做机器人时,觉得这玩意儿不就是坐标嘛,有啥好学的?结果第一次写机械臂控制程序,就因为姿态表示搞混了,差点让六轴臂撞上自己。嗯,从那以后我再也不敢小看这个章节了。
2.1 位置与姿态:机器人的"身份证"
机器人要动,首先得知道"我在哪"、"我朝哪"。这就是位置和姿态的问题。
位置很好理解,就是三维空间里的一个点。我们用三个坐标 (x, y, z) 来表示。比如我的机械臂末端,相对于基座的位置是 (0.5m, 0.3m, 0.2m)。
姿态就有点意思了。它描述的是物体"朝向"哪里。比如一个摄像头,是正对着你,还是斜着看?
我个人习惯把姿态想象成:你手里拿着一把螺丝刀,螺丝刀尖指向的方向就是姿态的一部分,但还不够——你还可以绕着螺丝刀自身旋转。所以姿态需要三个自由度来描述。
核心概念:位置 + 姿态 = 位姿。一个刚体在空间中的完整状态,需要6个自由度来描述(3个位置 + 3个姿态)。
2.2 旋转矩阵:最直观,但最啰嗦
旋转矩阵是描述姿态最直接的方式。它是一个 3×3 的正交矩阵,行列式为 +1。
说白了,旋转矩阵就是告诉你:原来坐标系里的一个向量,在新坐标系里长什么样。
// 绕Z轴旋转θ角的旋转矩阵
R_z(θ) = [
[cosθ, -sinθ, 0],
[sinθ, cosθ, 0],
[0, 0, 1]
]
我在项目中遇到过一个问题:用旋转矩阵做连续旋转时,数值误差会累积。你想想看,每次旋转都乘一个矩阵,乘了几百次后,矩阵可能就不再是正交的了。这时候机器人末端的位置会漂移。
避坑指南:我曾经在写轨迹插补时,忘了对旋转矩阵做正交化处理。结果机械臂走圆弧越走越偏。后来我养成了一个习惯——每做10次矩阵乘法,就强制做一次 Gram-Schmidt 正交化。
2.3 欧拉角:直观但小心"万向锁"
欧拉角用三个角度来描述姿态,比如 (α, β, γ)。常见的顺序有 ZYX、ZYZ 等。
为什么会有不同顺序?因为旋转不满足交换律。你先绕X轴转90度,再绕Y轴转90度,和反过来转,结果完全不同。
欧拉角最大的优点是直观。你给一个操作员说"绕Z轴转30度",他马上能理解。但欧拉角有个臭名昭著的问题——万向锁。
万向锁:当第二个旋转角为 ±90° 时,第一个和第三个旋转轴会重合,导致丢失一个自由度。这时候你无法唯一地表示某些姿态。
我记得有一次调试一个云台,用欧拉角做姿态控制。云台转到某个角度时突然卡住了,怎么调都不动。查了半天,原来是万向锁在作怪。从那以后,我在做连续旋转控制时,再也不敢只用欧拉角了。
2.4 四元数:计算友好,但理解费劲
四元数,说白了就是一个超复数。它由四个数组成:q = w + xi + yj + zk,其中 w 是实部,x、y、z 是虚部。
为什么用四元数?因为它没有万向锁,而且插值平滑。做轨迹规划时,四元数的球面线性插值(SLERP)比欧拉角插值自然得多。
// 四元数乘法(用于组合旋转)
q1 * q2 = (w1*w2 - x1*x2 - y1*y2 - z1*z2) +
(w1*x2 + x1*w2 + y1*z2 - z1*y2)i +
(w1*y2 - x1*z2 + y1*w2 + z1*x2)j +
(w1*z2 + x1*y2 - y1*x2 + z1*w2)k
我建议初学者先别纠结四元数的几何意义,把它当成一个"黑盒"工具就好。你只需要知道:
- 单位四元数表示旋转
- 四元数乘法对应旋转组合
- 四元数共轭对应逆旋转
个人经验:我在做无人机姿态估计时,用四元数做卡尔曼滤波的状态量。因为四元数没有奇异性,而且更新方程是线性的(在微小角度假设下)。效果比欧拉角好太多了。
2.5 齐次变换矩阵:把旋转和平移打包
齐次变换矩阵是一个 4×4 的矩阵,把旋转和平移整合在一起。它的形式是:
T = [
[R, t],
[0, 1]
]
// 其中 R 是 3×3 旋转矩阵,t 是 3×1 平移向量
为什么要引入齐次坐标?因为这样可以用一个矩阵乘法同时完成旋转和平移。否则你得先旋转再平移,写两行代码。
齐次变换矩阵的逆矩阵也很好求:
T_inv = [
[R^T, -R^T * t],
[0, 1 ]
]
这个性质在机器人运动学里太常用了。比如你要把工具坐标系下的点转换到基坐标系下,就是乘一个变换矩阵的事。
2.6 知识体系总览
下面这张图是我自己画的,把本章的知识结构梳理了一下。你看完应该能明白各个概念之间的关系。
2.7 各表示方法的对比
为了让你看得更清楚,我整理了一个对比表。这是我做项目时经常参考的:
| 表示方法 | 参数数量 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| 旋转矩阵 | 9 | 直观,无奇异性 | 冗余,需正交化 | 理论推导、坐标变换 |
| 欧拉角 | 3 | 最直观,参数少 | 万向锁,插值不平滑 | 人机交互、简单控制 |
| 四元数 | 4 | 无奇异性,插值平滑 | 理解困难 | 姿态估计、轨迹规划 |
| 齐次变换矩阵 | 16 | 统一描述位姿 | 参数多,计算量大 | 运动学、动力学 |
2.8 实际项目中的选择建议
说了这么多,你可能会问:那我到底该用哪种?
我的建议是:
- 做理论推导:用旋转矩阵,因为数学性质好
- 做人机交互:用欧拉角,因为操作员能理解
- 做轨迹规划:用四元数,因为插值平滑
- 做运动学:用齐次变换矩阵,因为统一方便
其实在实际工程中,我们经常需要在不同表示之间来回转换。比如我从传感器拿到的是四元数,但控制算法需要欧拉角,那就得转一下。
小技巧:我习惯在代码里定义一个统一的位姿结构体,包含位置和四元数。需要其他表示时,写几个转换函数就好。这样代码清晰,也不容易出错。
好了,这一章的内容就到这里。空间描述与变换是机器人学的基石,你把它吃透了,后面的运动学、动力学、轨迹规划都会轻松很多。
可可精品资料库