运动学基础(上):刚体变换、旋转矩阵、欧拉角与四元数、齐次变换矩阵
各位同学,今天我们来啃一块硬骨头——运动学基础。说实话,我刚入行那会儿,觉得这些数学工具就是一堆公式堆砌,直到第一次在真机上调试机械臂,发现末端位置死活对不上,才意识到:坐标系搞错了,一切白搭。
这一节,我们不讲虚的。直接上干货:刚体变换、旋转矩阵、欧拉角、四元数,还有那个万能的齐次变换矩阵。这些都是机械臂控制的“底层语言”,你写轨迹规划、做逆解、搞标定,都绕不开它们。
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 是虚部。它用四个数表示旋转,没有万向锁问题,而且插值平滑。
我个人习惯用四元数做所有内部运算。原因有三:
- 无奇点:不会出现万向锁
- 插值平滑:用Slerp(球面线性插值)可以得到平滑的旋转过渡
- 计算高效:组合旋转只需乘法,比矩阵快
旋转矩阵和四元数的转换关系:
// 四元数 → 旋转矩阵
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