空间刚体运动基础:坐标系与变换、旋转矩阵、欧拉角、四元数、齐次变换矩阵

各位同学好,我是你们这门课的主讲工程师。今天咱们来聊聊并联机器人运动学里最基础、也最绕不开的一块内容——空间刚体运动。说白了,就是研究一个刚体在三维空间里怎么动、怎么转、怎么描述它的位置和姿态。

我刚开始做机器人仿真那会儿,觉得这玩意儿不就是高中数学里的坐标系嘛,有啥好学的?结果第一次做六自由度并联平台的位姿解算,就栽了个大跟头——坐标系没对齐,算出来的驱动杆长度全是错的。嗯,从那以后我再也不敢小看这部分内容了。

核心思想:描述一个刚体的运动,需要同时知道它的位置(平移)和姿态(旋转)。位置用坐标向量,姿态用旋转矩阵、欧拉角或四元数。把平移和旋转合在一起,就是齐次变换矩阵。

1. 坐标系与变换

先说说坐标系。三维空间里,我们通常用右手坐标系。你伸出右手,拇指是X轴,食指是Y轴,中指是Z轴——这就是右手系。我个人习惯在仿真里统一用右手系,省得后面算叉积时搞混方向。

坐标系变换分两种:

  • 平移变换:坐标系原点移动,方向不变。比如把基坐标系的原点挪到动平台中心。
  • 旋转变换:坐标系方向改变,原点不动。比如动平台绕基坐标系的Z轴转了30度。

实际项目中,平移和旋转往往是同时发生的。举个例子,并联机器人的动平台相对于基座,既有位置偏移,又有姿态倾斜。这时候就需要把平移和旋转组合起来处理。

2. 旋转矩阵

旋转矩阵是描述姿态最直观的方式。它是一个3x3的正交矩阵,行列式为+1。说白了,就是一组单位正交基向量,表示旋转后的坐标系各轴在原坐标系下的投影。

我记得有一次做Stewart平台的运动学正解,用旋转矩阵表示姿态,结果矩阵元素太多,算起来特别慢。后来我换成了四元数,速度一下就上来了。但旋转矩阵有个好处——直观,调试时一眼就能看出问题。

常见的旋转矩阵有绕X轴、Y轴、Z轴旋转的三种基本形式:

// 绕Z轴旋转θ角
R_z(θ) = [cosθ  -sinθ  0]
         [sinθ   cosθ  0]
         [0      0     1]

// 绕X轴旋转φ角
R_x(φ) = [1   0      0   ]
         [0   cosφ  -sinφ]
         [0   sinφ   cosφ]

// 绕Y轴旋转ψ角
R_y(ψ) = [cosψ  0   sinψ]
         [0     1   0   ]
         [-sinψ 0   cosψ]

个人经验:实际编程时,我建议用库函数(比如Eigen或NumPy)来生成旋转矩阵,别手写三角函数。我曾经手写过一个绕Y轴的矩阵,把sin和cos的符号搞反了,查了整整两天bug。

3. 欧拉角

欧拉角是用三个角度来描述旋转。常见的顺序有ZYX、ZYZ、XYZ等。你想想看,为什么需要顺序?因为旋转不满足交换律——先绕X轴转30度再绕Y轴转60度,和先绕Y轴转60度再绕X轴转30度,结果完全不同。

欧拉角最大的问题是万向锁。当第二个旋转角达到±90度时,第一个和第三个旋转轴会重合,丢失一个自由度。我在做并联机器人轨迹规划时遇到过这个问题——动平台姿态接近奇异点,欧拉角突然跳变,导致电机指令乱跳。

所以我的建议是:

  • 人机交互时用欧拉角(直观,好理解)
  • 内部计算时用旋转矩阵或四元数(避免万向锁)

4. 四元数

四元数是个好东西。它用四个数表示旋转:一个实部和三个虚部。写成 q = w + xi + yj + zk,其中 w 是实部,x、y、z 是虚部。单位四元数(模长为1)对应一个旋转。

四元数的优势很明显:

  • 没有万向锁问题
  • 插值平滑(球面线性插值SLERP)
  • 计算效率高(比旋转矩阵少乘加运算)

我在做高速并联机器人时,动平台每秒要更新上千次姿态。用四元数做姿态插值,CPU占用率比用旋转矩阵低了将近30%。

四元数和旋转矩阵可以互相转换。比如从四元数到旋转矩阵:

R = [1-2(y²+z²)   2(xy-wz)     2(xz+wy)   ]
    [2(xy+wz)     1-2(x²+z²)   2(yz-wx)   ]
    [2(xz-wy)     2(yz+wx)     1-2(x²+y²) ]

避坑指南:我曾经在代码里直接用四元数做加法来插值,结果旋转路径走了个大圆弧,完全不对。记住,四元数插值要用SLERP,不是线性插值。四元数加法不保持单位长度,需要归一化。

5. 齐次变换矩阵

齐次变换矩阵把平移和旋转统一到一个4x4矩阵里。形式如下:

T = [R   t]
    [0   1]

其中 R 是3x3旋转矩阵,t 是3x1平移向量,最后一行是 [0 0 0 1]。

为什么要用齐次变换矩阵?因为可以用一个矩阵乘法完成坐标变换。比如点 p 在坐标系A中的坐标是 p_A,要转换到坐标系B中,只需要 T_B_A * p_A 就行。连续变换就是矩阵连乘,非常方便。

我习惯在仿真代码里把所有坐标系之间的变换关系都存成齐次变换矩阵。这样不管是正解还是逆解,只需要查表取矩阵,然后乘一下就行。代码结构清晰,不容易出错。

6. 知识体系总览

下面这张图是我自己总结的,把本章的核心逻辑串起来了。你仔细看看,应该能理解各个概念之间的关系。

空间刚体运动描述 平移 旋转 位置向量 (x, y, z) 姿态描述 旋转矩阵 (3x3) 欧拉角 (α, β, γ) 四元数 (w, x, y, z) 齐次变换矩阵 (4x4) 平移 + 旋转 → 完整描述刚体位姿

从这张图可以看得很清楚:刚体运动描述分平移和旋转两大块。平移就是位置向量,旋转有三种主流表示方式。最后,平移和旋转合在一起,就是齐次变换矩阵。实际做仿真时,我一般先用欧拉角或四元数算姿态,再转成齐次变换矩阵做坐标变换。

我的建议:刚开始学的时候,先把旋转矩阵和齐次变换矩阵搞熟。这两个是基础中的基础。欧拉角和四元数可以后面再深入。但如果你要做高速或高精度控制,四元数一定要掌握——它真的比旋转矩阵好用太多。

好了,这一章的内容就到这里。记住,坐标系和变换是并联机器人运动学的基石。后面讲运动学正解、逆解、雅可比矩阵,全都离不开这些基础概念。把这一章吃透了,后面的路就好走了。


公众号:蓝海资料掘金营,微信deep3321