第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 知识体系总览

下面这张图是我自己画的,把本章的知识结构梳理了一下。你看完应该能明白各个概念之间的关系。

空间描述与变换知识体系 刚体位姿 (6自由度) 位置 (x, y, z) 姿态 (3自由度) 旋转矩阵 (3×3) 欧拉角 (α, β, γ) 四元数 (w, x, y, z) ✅ 直观,无奇异性 ❌ 9个参数,冗余 ✅ 直观,3个参数 ❌ 万向锁问题 ✅ 无奇异性,插值平滑 ❌ 理解门槛高 齐次变换矩阵 (4×4) 齐次变换矩阵 = 旋转矩阵 + 平移向量,统一描述位姿

2.7 各表示方法的对比

为了让你看得更清楚,我整理了一个对比表。这是我做项目时经常参考的:

表示方法 参数数量 优点 缺点 适用场景
旋转矩阵 9 直观,无奇异性 冗余,需正交化 理论推导、坐标变换
欧拉角 3 最直观,参数少 万向锁,插值不平滑 人机交互、简单控制
四元数 4 无奇异性,插值平滑 理解困难 姿态估计、轨迹规划
齐次变换矩阵 16 统一描述位姿 参数多,计算量大 运动学、动力学

2.8 实际项目中的选择建议

说了这么多,你可能会问:那我到底该用哪种?

我的建议是:

  • 做理论推导:用旋转矩阵,因为数学性质好
  • 做人机交互:用欧拉角,因为操作员能理解
  • 做轨迹规划:用四元数,因为插值平滑
  • 做运动学:用齐次变换矩阵,因为统一方便

其实在实际工程中,我们经常需要在不同表示之间来回转换。比如我从传感器拿到的是四元数,但控制算法需要欧拉角,那就得转一下。

小技巧:我习惯在代码里定义一个统一的位姿结构体,包含位置和四元数。需要其他表示时,写几个转换函数就好。这样代码清晰,也不容易出错。

好了,这一章的内容就到这里。空间描述与变换是机器人学的基石,你把它吃透了,后面的运动学、动力学、轨迹规划都会轻松很多。

可可精品资料库