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 知识体系总览

下面这张图总结了本章的核心知识点和它们之间的关系。你可以把它当作一张“地图”,随时回来查阅。

刚体位姿描述知识体系 刚体位姿 (6-DOF) 位置矢量 (x,y,z) 姿态描述 旋转矩阵 欧拉角 四元数 齐次变换矩阵 (4×4) 💡 核心关系 位置矢量 + 旋转矩阵 → 齐次变换矩阵(统一描述位姿) 欧拉角 ↔ 旋转矩阵 ↔ 四元数(可互相转换,各有优劣)

2.7 三种姿态表示法的对比

在实际项目中,选哪种表示法取决于场景。我整理了一个对比表,方便你快速决策。

特性 旋转矩阵 欧拉角 四元数
参数数量 9 3 4
奇异性 无 有(万向锁) 无
插值平滑性 差 差 好(SLERP)
直观性 差 好 差
计算效率 中等 高 高
存储开销 大 小 小

实战建议:我个人在写运动学库时,内部统一用四元数 + 位置矢量,对外接口提供欧拉角版本。这样既保证了计算稳定性,又方便用户调试。你可以在自己的项目里也试试这个模式。

好了,这一章的内容就到这里。记住,位姿描述是机械臂运动学的“语言”,后面所有的正解、逆解、轨迹规划都建立在这个基础上。把这一章吃透,后面的路会顺畅很多。