2. 运动学基础:刚体在三维空间中的位姿描述
各位同学,欢迎来到第二章。这一章的内容,说白了就是机械臂运动的“语言基础”。你想想看,机械臂要抓东西,首先得知道自己的手在哪儿、朝哪个方向吧?这就涉及到刚体在三维空间里的位姿描述了。
我个人习惯把这一章看作是整个运动学的“地基”。地基不牢,后面学逆解、轨迹规划都会很吃力。我在项目里见过不少新手,代码写得很漂亮,但一调试发现机械臂撞了——原因就是位姿描述搞混了。嗯,咱们今天就把这个地基夯实。
2.1 刚体位姿:位置 + 姿态
刚体在空间里有6个自由度:3个平移(位置) + 3个旋转(姿态)。位置好理解,就是(x, y, z)坐标。姿态呢?就是它“朝哪看”、“怎么转”。
核心概念:位姿 = 位置 + 姿态。位置用矢量描述,姿态用旋转矩阵或四元数描述。
举个例子,我手里拿着一个扳手,它的位置是手抓的地方,姿态是扳手头朝上还是朝下。机械臂的末端执行器也一样,既要告诉它“去哪儿”,也要告诉它“怎么放”。
2.2 旋转矩阵:姿态的“身份证”
旋转矩阵是一个3×3的正交矩阵,行列式为+1。它描述了从一个坐标系到另一个坐标系的旋转变换。
我记得刚入行时,总觉得旋转矩阵太“重”——9个元素,但真正独立的只有3个。不过它的好处是直观,而且可以连续左乘实现多次旋转。
// 绕Z轴旋转θ角的旋转矩阵
R_z(θ) = [
[cosθ, -sinθ, 0],
[sinθ, cosθ, 0],
[0, 0, 1]
]
绕X轴和Y轴的类似,这里不展开了。你想想看,三个基本旋转矩阵组合起来,就能描述任意姿态。
我的小技巧:在实际项目中,我很少手动写旋转矩阵,而是用库函数。但理解它的几何意义很重要——每一列其实就是原坐标系轴在目标坐标系中的投影。
2.3 齐次变换矩阵:位置 + 姿态一把抓
旋转矩阵只能描述姿态,那位置怎么办?齐次变换矩阵就是来解决这个问题的。它是一个4×4矩阵,左上角3×3是旋转矩阵,右上角3×1是平移向量,最后一行是[0 0 0 1]。
T = [
[R(3×3), p(3×1)],
[0 0 0, 1 ]
]
为什么要加这一行?说白了就是为了把旋转和平移统一成一个矩阵乘法。这样,连续变换就可以用矩阵连乘来表示,非常优雅。
我曾经在一个焊接机器人项目里,需要把工具坐标系转换到基坐标系。用齐次变换矩阵,一次乘法搞定。如果分开算,容易出错不说,代码也啰嗦。
2.4 欧拉角:最直观,但小心“万向锁”
欧拉角用三个角度来描述姿态,比如Z-Y-X顺序。每个角度绕一个轴转,很符合人的直觉。
| 欧拉角顺序 | 常见应用 | 特点 |
|---|---|---|
| Z-Y-X | 工业机器人 | 固定轴顺序,直观 |
| Z-X-Z | 航空航天 | 避免某些奇异性 |
| X-Y-Z | 移动机器人 | 滚转-俯仰-偏航 |
避坑指南:我曾经在调试一个六轴机械臂时,用了欧拉角做插值,结果在某个姿态附近机械臂突然“抽搐”了一下。后来才发现是万向锁——当第二个旋转角接近±90°时,第一个和第三个旋转轴重合,丢失了一个自由度。从那以后,涉及插值的场景我优先用四元数。
2.5 四元数:插值的王者
四元数是一个超复数,形式为 q = w + xi + yj + zk,其中 w 是实部,(x, y, z) 是虚部。它用4个参数表示旋转,没有奇异性,而且插值平滑。
我个人习惯用四元数做姿态插值,尤其是球面线性插值(SLERP)。你想想看,两个姿态之间走最短路径,四元数天然支持。
// 四元数球面线性插值(SLERP)
q(t) = (sin((1-t)θ) / sinθ) * q1 + (sin(tθ) / sinθ) * q2
// 其中 θ 是 q1 和 q2 之间的夹角
我的建议:在代码里,尽量用四元数做内部计算,只在用户界面或调试时转成欧拉角。这样既避免了万向锁,又方便人理解。
2.6 知识体系总览
下面这张图总结了本章的核心知识点和它们之间的关系。你可以把它当作一张“地图”,随时回来查阅。
2.7 三种姿态表示法的对比
在实际项目中,选哪种表示法取决于场景。我整理了一个对比表,方便你快速决策。
| 特性 | 旋转矩阵 | 欧拉角 | 四元数 |
|---|---|---|---|
| 参数数量 | 9 | 3 | 4 |
| 奇异性 | 无 | 有(万向锁) | 无 |
| 插值平滑性 | 差 | 差 | 好(SLERP) |
| 直观性 | 差 | 好 | 差 |
| 计算效率 | 中等 | 高 | 高 |
| 存储开销 | 大 | 小 | 小 |
实战建议:我个人在写运动学库时,内部统一用四元数 + 位置矢量,对外接口提供欧拉角版本。这样既保证了计算稳定性,又方便用户调试。你可以在自己的项目里也试试这个模式。
好了,这一章的内容就到这里。记住,位姿描述是机械臂运动学的“语言”,后面所有的正解、逆解、轨迹规划都建立在这个基础上。把这一章吃透,后面的路会顺畅很多。