运动学基础(一):空间刚体运动描述、旋转矩阵与齐次变换矩阵、欧拉角与四元数

各位同学,大家好。今天我们来聊聊机器人控制里最基础、也最绕不开的一块内容——空间刚体运动的描述。说实话,我刚开始做并联机器人那会儿,觉得这玩意儿不就是个坐标变换嘛,有啥难的?结果第一次调机,末端执行器死活对不准目标点,折腾了两天才发现是旋转顺序搞反了。嗯,从那以后,我再也不敢小看这些基础概念了。

这一节,我们不讲虚的,直接上干货。你想想看,并联机器人跟串联机器人最大的区别是什么?串联机器人像人的手臂,关节串联,运动学好算;并联机器人像蜘蛛腿,多个支链同时驱动,耦合性极强。所以,描述它的运动,必须有一套统一、严谨的数学语言。

核心思想: 刚体在三维空间中的运动 = 平移 + 旋转。平移好办,一个三维向量搞定。旋转才是真正让人头疼的地方。

1. 旋转矩阵:最直观,但最啰嗦

旋转矩阵,说白了就是一个3x3的正交矩阵,行列式为+1。它描述了一个坐标系相对于另一个坐标系的姿态。

我个人习惯把旋转矩阵理解为“基向量的投影”。什么意思呢?假设世界坐标系是{A},机器人末端坐标系是{B}。那么旋转矩阵 ARB 的每一列,其实就是{B}的基向量在{A}下的坐标。

# 举个简单的例子:绕Z轴旋转θ角
R_z(θ) = [[cosθ, -sinθ, 0],
          [sinθ,  cosθ, 0],
          [0,      0,    1]]

我在项目中遇到过一个问题:用旋转矩阵做连续旋转时,矩阵会越乘越复杂,而且容易产生数值误差。更麻烦的是,它不直观——你看着一堆数字,很难想象出机器人到底转成了什么姿势。

我的小技巧: 调试时,如果发现旋转矩阵的列向量模长不是1,或者列向量之间不正交,那一定是代码里某个地方乘错了。赶紧检查,别犹豫。

2. 齐次变换矩阵:把平移和旋转打包

旋转矩阵只处理旋转,平移还得单独加个向量。这在实际计算中很烦人,因为你要同时维护一个3x3矩阵和一个3x1向量。于是,齐次变换矩阵登场了。

它是个4x4的矩阵,结构很简单:左上角是旋转矩阵,右边是平移向量,最后一行是[0, 0, 0, 1]。

T = [[R, t],
     [0, 1]]

# 例如:先绕Z轴转30°,再沿X轴移动5个单位
T = [[cos30, -sin30, 0, 5],
     [sin30,  cos30, 0, 0],
     [0,       0,     1, 0],
     [0,       0,     0, 1]]

有了齐次变换矩阵,我们就可以把连续的坐标变换写成矩阵乘法。比如,从基座到末端,中间经过好几个关节,那就把这些关节的变换矩阵乘起来:T_末端 = T_1 * T_2 * ... * T_n。

注意: 矩阵乘法不满足交换律!左乘和右乘代表不同的变换顺序。我曾经在写并联机器人正解时,把左乘和右乘搞反了,结果算出来的末端位置差了十万八千里。记住:左乘是相对于固定坐标系变换,右乘是相对于当前坐标系变换。

3. 欧拉角:直观,但有坑

欧拉角用三个角度来描述旋转,比如滚转、俯仰、偏航。这很符合人类的直觉——你想想看,描述一架飞机的姿态,说“它偏航了30°,俯仰了20°”,多清楚。

但是,欧拉角有个著名的毛病:万向锁。当第二个旋转角达到±90°时,第一个和第三个旋转轴会重合,导致丢失一个自由度。我在做并联机器人姿态规划时,就踩过这个坑。当时末端执行器要做一个大角度翻转,结果在某个中间位置突然卡住了,怎么算都算不过去。查了半天,发现是欧拉角遇到了万向锁。

避坑指南: 如果你用欧拉角做插值或规划,一定要检查中间角度是否接近奇异点。如果接近,要么换一种旋转顺序,要么改用四元数。

4. 四元数:计算友好,理解不易

四元数,说白了就是一个超复数,由一个实部和三个虚部组成:q = w + xi + yj + zk。它用四个参数来描述旋转,没有万向锁问题,而且插值平滑。

我个人非常推荐在控制算法里用四元数。为什么?因为旋转矩阵有9个参数,但只有3个自由度,冗余信息太多;欧拉角有奇点;而四元数只有4个参数,约束条件也简单(模长为1),计算效率高。

# 四元数表示绕单位向量 (x,y,z) 旋转 θ 角
q = [cos(θ/2), x*sin(θ/2), y*sin(θ/2), z*sin(θ/2)]

# 两个四元数相乘,表示旋转的复合
q_result = q1 * q2  # 注意:四元数乘法也不满足交换律

我记得有一次,需要让并联机器人的末端走一个平滑的螺旋轨迹。如果用欧拉角插值,中间姿态会抖动;用旋转矩阵插值,计算量太大。最后用四元数的球面线性插值(SLERP),效果非常完美,轨迹平滑得像丝一样。

实用建议: 在代码里,我习惯把四元数归一化放在每个运算步骤之后。因为浮点数运算会引入误差,导致四元数模长偏离1,进而影响旋转的准确性。归一化就是除以模长,很简单,但很管用。

5. 知识体系总览

说了这么多,我们来梳理一下。下面这张图,是我自己总结的刚体运动描述方法的选择逻辑。

刚体运动描述方法选择逻辑 刚体运动描述 平移 (3个参数) 旋转 (3个自由度) 旋转矩阵 (9参数) 欧拉角 (3参数) 四元数 (4参数) 直观,但冗余、计算慢 直观,但有万向锁 无奇点,插值平滑 控制算法推荐使用

从这张图可以看出来,没有一种方法是完美的。旋转矩阵直观但冗余,欧拉角直观但有奇点,四元数计算友好但不够直观。我的建议是:在数学推导和理论分析时用旋转矩阵,在用户交互和参数标定时用欧拉角,在控制算法和轨迹规划时用四元数。

6. 总结

好了,这一节的内容就到这里。我们讲了四种描述刚体运动的方法:平移向量、旋转矩阵、齐次变换矩阵、欧拉角和四元数。每一种都有它的适用场景和坑点。

最后送大家一句话:搞机器人控制,数学基础一定要扎实。别像我当年那样,等到调机出问题了才回头补课。把这些概念吃透了,后面的动力学、控制算法才能走得顺。

课后小练习: 写一个Python函数,输入一个欧拉角(滚转、俯仰、偏航),输出对应的四元数。然后验证一下:绕X轴转90°,再绕Y轴转90°,跟先绕Y轴转90°再绕X轴转90°,结果一样吗?为什么?


专注资料整理