2. 数学基础回顾(上):刚体运动描述、旋转矩阵、欧拉角

做机器人仿真,说白了就是跟空间里的位置和姿态打交道。你想想看,一个机械臂要抓杯子,它得先知道杯子在哪,自己的手爪朝哪个方向。这些信息,全靠数学来描述。

我个人习惯把这一章叫做「地基」。地基打不牢,后面建高楼肯定歪。我记得刚入行那会儿,觉得旋转矩阵不就是个3x3的表格嘛,有啥好学的?结果第一次做逆解算,算出来的角度死活不对,折腾了两天...后来才发现是旋转顺序搞反了。嗯,从那以后我再也不敢小看这些基础了。

核心要点: 刚体在三维空间中的运动 = 位置(平移)+ 姿态(旋转)。位置用三维向量搞定,姿态才是真正的难点。

2.1 刚体运动的基本概念

什么叫刚体?就是不会变形的物体。机械臂的连杆、机器人的基座,我们都当成刚体处理。刚体在空间里有6个自由度——3个平移自由度(x, y, z),3个旋转自由度(绕x, y, z轴转)。

描述刚体运动,我们需要两个东西:

  • 位置:用一个三维向量 p = [x, y, z]^T 表示
  • 姿态:用旋转矩阵 R 或欧拉角表示

把位置和姿态合在一起,就构成了刚体的位姿。我在项目中经常用一个4x4的齐次变换矩阵来同时表示这两者,后面会详细讲。

刚体运动描述 位置 (平移) 三维向量 p = [x,y,z]^T 姿态 (旋转) 旋转矩阵 欧拉角 四元数 6自由度:3平移 + 3旋转

2.2 旋转矩阵

旋转矩阵是描述姿态最直接的方式。它是一个3x3的正交矩阵,行列式为+1。说白了,就是一组标准正交基,告诉你刚体的三个轴在参考坐标系里指向哪。

绕x轴旋转θ角的旋转矩阵长这样:

R_x(θ) = [1      0       0    ]
         [0   cosθ   -sinθ   ]
         [0   sinθ    cosθ   ]

绕y轴和z轴类似:

R_y(θ) = [ cosθ   0   sinθ   ]
         [ 0      1   0      ]
         [-sinθ   0   cosθ   ]

R_z(θ) = [cosθ  -sinθ   0    ]
         [sinθ   cosθ   0    ]
         [0      0      1    ]
我的小技巧: 记不住正负号?用右手定则。拇指指向旋转轴正方向,四指弯曲的方向就是正角度方向。我在写代码时经常用这个来验证。

旋转矩阵有两个重要性质:

  • 正交性:R^T = R^{-1},即转置等于逆。这意味着求逆特别快。
  • 组合性:连续旋转可以用矩阵乘法表示。R_total = R_2 · R_1

注意!矩阵乘法不满足交换律。R_2 · R_1 和 R_1 · R_2 结果不同。我曾经在调试一个六轴机器人时,把旋转顺序搞反了,结果末端执行器直接飞到天花板上去...嗯,从那以后我每次写旋转都会先确认顺序。

2.3 欧拉角

旋转矩阵虽然数学上很漂亮,但9个参数太冗余了。人眼一看,根本不知道这个矩阵对应什么姿态。欧拉角就直观多了——用三个角度来描述旋转。

常见的欧拉角约定有:

  • ZYX顺序(也叫RPY角):先绕z轴转(偏航yaw),再绕y轴转(俯仰pitch),最后绕x轴转(横滚roll)。这是机器人领域最常用的。
  • ZYZ顺序:常用于理论推导。

从欧拉角到旋转矩阵的转换(ZYX顺序):

R = R_z(yaw) · R_y(pitch) · R_x(roll)

展开后:

R = [cos(y)cos(p)  cos(y)sin(p)sin(r)-sin(y)cos(r)  cos(y)sin(p)cos(r)+sin(y)sin(r)]
    [sin(y)cos(p)  sin(y)sin(p)sin(r)+cos(y)cos(r)  sin(y)sin(p)cos(r)-cos(y)sin(r)]
    [-sin(p)       cos(p)sin(r)                      cos(p)cos(r)                   ]

其中 y = yaw, p = pitch, r = roll。

⚠️ 万向锁问题: 当pitch = ±90°时,yaw和roll的旋转轴会重合,导致丢失一个自由度。这是欧拉角的天生缺陷。我在做飞行器仿真时遇到过这个问题,后来改用四元数才解决。

从旋转矩阵反算欧拉角:

pitch = asin(-R[2][0])
yaw   = atan2(R[1][0], R[0][0])
roll  = atan2(R[2][1], R[2][2])

注意atan2函数,它能处理四个象限的角度,比atan安全得多。

2.4 实际应用中的选择

表示方法 优点 缺点 我常用的场景
旋转矩阵 数学性质好,无奇点 9个参数冗余 底层计算、坐标变换
欧拉角 直观,易理解 有万向锁,插值困难 人机交互、示教器显示
四元数 无奇点,插值平滑 不够直观 姿态控制、轨迹规划

我个人习惯是:在代码内部用旋转矩阵或四元数做计算,只在界面上显示给用户看时才转成欧拉角。这样既保证了计算稳定性,又照顾了人的直观感受。

避坑指南: 我曾经在项目中直接用了欧拉角做插值,结果机械臂在运动过程中突然翻了个跟头。后来查资料才发现,欧拉角插值会导致路径不可预测。正确的做法是用四元数的球面线性插值(SLERP)。

好了,这一章的内容就这些。旋转矩阵和欧拉角是描述刚体姿态的两把刷子,各有各的脾气。下一章我们会继续聊齐次变换矩阵和四元数,把整个数学工具箱补齐。


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