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

各位同学,今天我们来啃一块硬骨头——运动学基础。说实话,我刚入行那会儿,觉得这些数学工具就是一堆公式堆砌,直到第一次在真机上调试机械臂,发现末端位置死活对不上,才意识到:坐标系搞错了,一切白搭

这一节,我们不讲虚的。直接上干货:刚体变换、旋转矩阵、欧拉角、四元数,还有那个万能的齐次变换矩阵。这些都是机械臂控制的“底层语言”,你写轨迹规划、做逆解、搞标定,都绕不开它们。

运动学基础(上)知识体系 刚体变换 旋转矩阵 3x3正交矩阵 欧拉角 ZYX / 万向锁 四元数 无万向锁 / 插值平滑 齐次变换矩阵 4x4 / 旋转+平移 应用:正运动学 / 逆运动学 / 标定

1. 刚体变换:机械臂运动的本质

什么叫刚体变换?说白了,就是一个物体在空间里又转又移,但形状大小不变。机械臂的每个连杆,就是典型的刚体。

刚体变换包含两部分:旋转平移。旋转决定朝向,平移决定位置。两者合起来,就唯一确定了连杆在空间中的位姿。

核心公式:

刚体变换 = 旋转 + 平移

数学表达:p' = R·p + t

其中 R 是旋转矩阵,t 是平移向量

我在项目中遇到过一个问题:两个工程师分别标定了相机和机械臂的坐标系,结果抓取位置总是偏几毫米。查了半天,发现是旋转矩阵的乘法顺序搞反了。记住:先旋转,后平移,顺序不能乱。

2. 旋转矩阵:最直观的旋转表达

旋转矩阵是个3x3的方阵,每一列代表旋转后的基向量在原坐标系下的投影。它有两个重要性质:

  • 正交性:RT·R = I,逆矩阵等于转置
  • 行列式为+1:保证是纯旋转,不含镜像

绕X、Y、Z轴旋转θ角的基本矩阵长这样:

// 绕X轴旋转
R_x(θ) = [1,    0,     0;
          0, cosθ, -sinθ;
          0, sinθ,  cosθ]

// 绕Y轴旋转
R_y(θ) = [ cosθ, 0, sinθ;
            0,    1,   0;
          -sinθ, 0, cosθ]

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

我的小技巧:写代码时,我习惯用右手定则来判断旋转方向。大拇指指向旋转轴正方向,四指弯曲方向就是正旋转。这样永远不会搞错正负号。

3. 欧拉角:直观但暗藏陷阱

欧拉角用三个角度来描述旋转,比如ZYX顺序:先绕Z轴转γ,再绕新Y轴转β,最后绕新X轴转α。这种表达很直观,但有个致命问题——万向锁

为什么会这样?当中间轴旋转到±90°时,第一个轴和第三个轴会共线,丢失一个自由度。你想想看,这时候你无论怎么调那两个角度,效果都一样。

我曾经踩过的坑:在写机械臂的示教器界面时,用了欧拉角来显示姿态。结果操作员在某个特殊姿态下,发现转动一个旋钮,机械臂纹丝不动。这就是万向锁在作怪。从那以后,我内部计算一律用四元数,只在显示时转成欧拉角。

常见的欧拉角约定有:

约定名称 旋转顺序 应用场景
ZYX 绕Z → 绕Y → 绕X 航空、机械臂
ZYZ 绕Z → 绕Y → 绕Z 机器人运动学
XYZ 绕X → 绕Y → 绕Z 部分工业应用

4. 四元数:工业界的首选

四元数是个超复数,形式为 q = w + xi + yj + zk,其中 w 是实部,x、y、z 是虚部。它用四个数表示旋转,没有万向锁问题,而且插值平滑。

我个人习惯用四元数做所有内部运算。原因有三:

  1. 无奇点:不会出现万向锁
  2. 插值平滑:用Slerp(球面线性插值)可以得到平滑的旋转过渡
  3. 计算高效:组合旋转只需乘法,比矩阵快

旋转矩阵和四元数的转换关系:

// 四元数 → 旋转矩阵
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²)]

// 旋转矩阵 → 四元数
w = sqrt(1 + R[0][0] + R[1][1] + R[2][2]) / 2
x = (R[2][1] - R[1][2]) / (4*w)
y = (R[0][2] - R[2][0]) / (4*w)
z = (R[1][0] - R[0][1]) / (4*w)

避坑指南:四元数要归一化!我见过太多人忘了这步,结果旋转越积越歪。每次更新四元数后,记得做 q = q / norm(q)。

5. 齐次变换矩阵:把旋转和平移统一起来

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

T = [R   t;
     0   1]

其中 R 是 3x3 旋转矩阵
     t 是 3x1 平移向量
     0 是 1x3 零向量

为什么要用齐次矩阵?因为你可以把多次变换连乘起来:T = T1 · T2 · T3 ... 这样写代码特别方便。

举个例子,机械臂从基座到末端执行器的变换:

T_0_n = T_0_1 · T_1_2 · T_2_3 · ... · T_(n-1)_n

每个 T 代表一个关节的变换。这就是正运动学的核心。

实际应用:在做手眼标定时,我们通常要解这样的方程:

AX = XB

其中A是机械臂的齐次变换,B是相机的齐次变换,X就是手眼矩阵。这个方程的解,就是相机和机械臂之间的固定变换关系。

嗯,到这里,运动学基础的上半部分就讲完了。这些工具看着简单,但用好了,整个机械臂的控制逻辑就清晰了。下一节我们继续聊运动学基础的下半部分,到时候会结合具体的机械臂模型来算正解和逆解。


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