1. 位姿是什么:位置 + 姿态 = 6 个自由度
机械臂末端在空间里的完整状态叫位姿(Pose),拆两半:
- 位置(Position):末端坐标系原点在基坐标系下的三维坐标 (x, y, z)——3 个自由度;
- 姿态(Orientation):末端坐标系相对基坐标系"转了多少"——3 个自由度(绕谁转、转多少)。
合起来 6 自由度。光有位置不够:末端到了同一点,工具朝向可以完全不同(抓杯子和抓杯把);光有姿态也不够——同一朝向可以在不同位置。所以控制器里的"目标点"永远是位置 + 姿态的完整描述。
正运动学(FK)是逆运动学(IK)、轨迹规划、动力学、奇异分析的共同输入——所有上层都问"末端现在哪、朝哪"。把 FK 算对,后面才有得谈。
2. 数学地基:旋转矩阵与齐次变换矩阵
两个坐标系之间的刚体变换 = 旋转 + 平移:
链式法则(关键):从基坐标系到末端,经过一串中间坐标系,总变换就是逐级矩阵左乘:
这就是正运动学的全部骨架——剩下的事就是"怎么写出每一级 T"。D-H 参数法就是干这个的。
3. 姿态表示法:旋转矩阵 / 欧拉角 / 四元数
同一姿态三种记法,各有各的用场:
| 表示法 | 形式 | 优点 | 缺点 |
|---|---|---|---|
| 旋转矩阵 | 3×3 正交阵 | 计算直接、链式连乘方便 | 9 个数冗余,不直观 |
| 欧拉角 (ZYX) | (α, β, γ) | 人可读、示教器显示用 | 顺序依赖、万向锁(β=±90° 丢自由度) |
| 四元数 | (w, x, y, z) | 无万向锁、插值平滑、紧凑 | 不直观、需归一化 |
ZYX 欧拉角约定(工业机械臂最常用,即 RPY 滚转-俯仰-偏航):
四元数到旋转矩阵(单位四元数 w²+x²+y²+z²=1):
位姿计算的工程结论:内部运算用矩阵/四元数(稳),对外显示用欧拉角(可读)——所以第 6 节要从矩阵"提"回欧拉角。
4. 正运动学:D-H 参数法四步建系
D-H(Denavit-Hartenberg)把相邻连杆的变换压缩成 4 个参数:
| 参数 | 含义 | 变量类型 |
|---|---|---|
| θᵢ(theta) | 绕 zᵢ₋₁ 轴从 xᵢ₋₁ 转到 xᵢ 的角度 | 旋转关节 = 关节变量 |
| dᵢ(d) | 沿 zᵢ₋₁ 轴平移的距离 | 棱柱关节 = 关节变量 |
| aᵢ(a) | 沿 xᵢ 轴平移的距离(连杆长度) | 常量(结构) |
| αᵢ(alpha) | 绕 xᵢ 轴从 zᵢ₋₁ 转到 zᵢ 的角度(连杆扭角) | 常量(结构) |
相邻连杆变换矩阵(标准 DH):
拿到 DH 表(厂商手册里给的就是这张表),末端位姿就是机械连乘:T_0n = A₁·A₂·…·Aₙ。正运动学本身没有任何魔法——查表、代公式、连乘。
5. 实例:6 轴机械臂 DH 表与逐关节连乘
以常见 6R 垂直关节构型(UR5 类)为例,标准 DH 表(单位:mm/deg,示意参数):
| 关节 i | θᵢ(变量) | dᵢ | aᵢ | αᵢ |
|---|---|---|---|---|
| 1 | θ₁ | d₁ = 89.2 | a₁ = 0 | α₁ = 90° |
| 2 | θ₂ | d₂ = 0 | a₂ = -425 | α₂ = 0° |
| 3 | θ₃ | d₃ = 0 | a₃ = -392.25 | α₃ = 0° |
| 4 | θ₄ | d₄ = 109.15 | a₄ = 0 | α₄ = 90° |
| 5 | θ₅ | d₅ = 94.65 | a₅ = 0 | α₅ = -90° |
| 6 | θ₆ | d₆ = 82.3 | a₆ = 0 | α₆ = 0° |
注意 α₁=90° 和 α₅=-90° 两个扭角——它们让关节 2/3 的转轴从"垂直"翻到"水平",这是 6R 构型能全向到达的关键。DH 表里的符号(a₂=-425 负值)是构型约定的结果,照表代公式即可,不要"顺手改正"。
6. 从矩阵到人可读:提取 ZYX 欧拉角
连乘得到的是 3×3 矩阵,但示教器/调试器要显示 (α, β, γ)。提取公式(ZYX 约定,R 的第 2 行第 1 列起手):
三个工程坑:
- 必须用 atan2 不要 atan:atan(y/x) 分不清象限((-1,-1) 和 (1,1) 都会给 45°),位姿错 180° 就是这么来的;
- 提取公式和正运动学必须同一约定:ZYX 还是 XYZ、先乘哪个,手册说哪个就用哪个,混用结果全错;
- 万向锁不是 bug 是几何事实:β→±90° 时偏航和滚转共轴,任何表示法都会丢信息——轨迹规划时绕开奇异区即可。
7. 逆运动学:一句话定位
正运动学是"关节角 → 位姿"(唯一、直接);逆运动学是"位姿 → 关节角"(多解、复杂)。解法两类:
- 解析法:利用构型几何(Pieper 准则:后三轴交于一点,多数 6 轴商用臂满足)直接解出闭式表达式——快、解可分类;
- 数值法:雅可比迭代(阻尼最小二乘),通用但慢、依赖初值。
IK 的输入正是 FK 的输出(位姿矩阵)——所以本文的 T_06 表达是 IK 解算的起点。IK 多解需要按"关节限位 / 最小动作 / 避障"选一组,那是另一篇的事。
8. 工具坐标系与基坐标系:法兰 → TCP
控制器报的末端位姿通常是法兰盘(第 6 轴)的位姿,但实际干活的是工具(TCP)——夹爪尖、焊枪口、吸盘面。两者差一个固定偏移:
这就是为什么同一台臂、换个工具,目标位姿全要重算——换的是中间的 T_flange_TCP。视觉抓取的"相机→基座→TCP"标定链,本质就是这些矩阵的级联求逆。
9. 可编译 C 代码:DH 连乘 + 欧拉角提取
完整可编译的正运动学骨架(标准 DH,6 轴):
这段代码就是工业 FK 库的骨架——加个"多组关节角循环"就是轨迹点批量计算,加个 T_flange_TCP 左乘就是 TCP 位姿。
10. 交互演示:平面 3 关节位姿计算器
拖三个关节角滑块,看末端位置和姿态实时变化——这就是正运动学:关节角进,位姿出。连杆长 L₁=250 / L₂=200 / L₃=120(示意),姿态角 φ = θ₁+θ₂+θ₃:
- 红色箭头 = 末端姿态方向,φ = θ₁+θ₂+θ₃;读数同时给笛卡尔坐标与姿态角——同一套 FK 公式在 3 关节平面版和 6 轴空间版的差别只是"矩阵多乘几级"。
- 试试 θ₂ 从 -60° 拉到 -150°:末端从"够得着"变"折回来",位置坐标连续变化——正运动学永远有唯一解,这正是它比逆运动学好验证的原因。
11. 常见坑与工程建议
| 坑 | 后果 | 对策 |
|---|---|---|
| atan 代替 atan2 | 姿态错 180°(象限丢失) | 统一 atan2(y, x),永远不用 atan(y/x) |
| 欧拉角顺序混用 | ZYX 和 XYZ 结果全错 | 正运动学、提取、示教器三者同一约定 |
| 标准 DH vs 修正 DH 混用 | 参数对不上,末端乱飞 | 手册用哪种就跟哪种,查表不猜 |
| 角度单位混用 | 度数当弧度,位置错几倍 | DH 表用弧度;显示用度;入口处统一转换 |
| 四元数没归一化 | 矩阵不正交,累积漂移 | 每次运算后 w²+x²+y²+z² 归一化 |
| 万向锁附近取欧拉角 | 角度跳变、插值异常 | 内部用四元数;轨迹避开奇异区 |
| 忘了 TCP 偏移 | 报的位姿和实际工具尖不符 | T_base_TCP = T_base_flange × T_flange_TCP(第 8 节) |
两条捷径:① 零位自检——全部关节角置 0,按几何直觉估算末端坐标(如第 5 节 DH 表零位时 z = d₁+d₄+d₅+d₆),对不上就是 DH 表或符号问题;② 与示教器对照——实际臂摆几个姿态,对比读数。第 5 节表格 + 第 9 节代码可以直接当测试基准。
一句话收尾:正运动学 = DH 表 + 齐次变换连乘 + 姿态提取——没有高深数学,全是"查表、代公式、守约定"。算对位姿,机械臂控制的万里长征就迈出了第一步。