本节把 DH 流水线放到工业机器人最常见的结构上跑一遍,一共九种——七种是课程重点,两种是教材补充(2.9.2、2.9.9)。目标不是背结果,而是看清两件事:参数表里的 0 从哪来;「球形腕旋转块 = ZYZ 欧拉角」这类结构性发现,又是如何为逆运动学铺路的。对应的录播片段为 1:13:00–1:35:10。
怎么读这一节:九张参数表都是 2.8.2 四步流水线(定轴线 → 放系 → 判关系 → 填表)在不同骨架上的重复。建议对每个结构先遮住表格,问三个问题——轴线两两什么关系?原点放在哪?α 怎么判号?——再对表验证;发现自己填出的符号与书上一致时,DH 法才算真正学会。
零位约定(原书开篇)
各结构的正运动学,都以「DH 建图下关节变量全为零」的那个位姿作为参考。它与机器人实际编程中使用的零参考值(零位标定值)可以不同;要让两者对上,就得对传感器读数加一个常值漂移。录播 1:12:51,老师结合「每个关节转多少、它会到哪」强调了这一点。
开始逐节填表之前,先看下面这张总览图:本节各位主角的「关节签名」一目了然。只要看清每种构形的 R / P 排列,从 2.9.1 起的 DH 表就不再是一堆数字,而是对这幅骨架的逐段描述。
五种常见构形的关节配置(本教程绘,对照原书图 1.9–1.13 与 2.9 节各 DH 表):圆 = 转动关节、双箭头 = 移动关节。关节签名 R / P 的排列决定了1.2 节的五种工作空间轮廓,也决定了 DH 表里哪些列是变量。
这是最简单的构形:三个关节的转轴全部平行,都沿 z0。把所有 xi 都取在连杆方向上,整个机构便落在 (x0,y0) 平面内;于是 di=αi=0 对全表成立,而关节变量就是相邻两条 xi 轴之间的夹角。录播 1:13:43 逐列填出了这张表。
| 连杆 i | ai | αi | di | ϑi |
| 1 | a1 | 0 | 0 | ϑ1 |
| 2 | a2 | 0 | 0 | ϑ2 |
| 3 | a3 | 0 | 0 | ϑ3 |
三行参数完全同构;代入 Aii−1:从建系几何直接读出两步分解 的通式(取 αi=0,di=0),得到的关节变换自然也完全相同(原书式 2.62):
Aii−1(ϑi)=cisi00−sici000010aiciaisi01,i=1,2,3,
三者依次连乘,得(原书式 2.63):
T30(q)=A10A21A32=c123s12300−s123c123000010a1c1+a2c12+a3c123a1s1+a2s12+a3s12301
(其中 s12=sin(ϑ1+ϑ2),其余类推。)结构性观察(原书)有两点:其一,z30=[0 0 1]T 与 z0 一致(三轴全平行),所以三个关节只决定末端在平面内的位置;其二,x30 的方向(接近向量)与末端执行器的约定不一致,需要补一个常值变换
Te3=00−10010010000001.
这个例子也为 2.12.2 的逆解(取 xe=[px py ϕ]T)预先铺好了路。
这一节做一个变化:把平面臂的第二、三杆改成平行四边形。前两个关节分别把连杆 1′ 与连杆 1′′ 接到连杆 0 上,由此构成一个闭链——正好用 2.8.3 讲过的方法(闭链的 DH 处理)来处理:选关节 4 为断开关节,建系后即得下面的 DH 参数表(原书表 2.2):
| 连杆 i | ai | αi | di | ϑi |
| 1′ | a1′ | 0 | 0 | ϑ1′ |
| 2′ | a2′ | 0 | 0 | ϑ2′ |
| 3′ | a3′ | 0 | 0 | ϑ3′ |
| 1′′ | a1′′ | 0 | 0 | ϑ1′′ |
| 4 | a4 | 0 | 0 | 0 |
由平行四边形的几何关系可得 a1′=a3′、a2′=a1′′。约束方程进一步给出(原书式 2.64 前):
ϑ2′=ϑ1′′−ϑ1′,ϑ3′=π−ϑ2′=π−ϑ1′′+ϑ1′.
于是关节变量向量只剩 q=[ϑ1′ ϑ1′′]T——注意,两个驱动关节都装在基座上。把 ϑ2′,ϑ3′ 的两式代入后,沿 1′2′3′ 分支连乘,再补上末杆的常值变换 A43′,就得到正运动学(原书式 2.64):
T40(q)=A3′0(q)A43′=−c1′−s1′00s1′−c1′000010a1′′c1′′−a4c1′a1′′s1′′−a4s1′01
这里有一个值得注意的细节:a1′ 的两项贡献 a1′[c1′ s1′]T 与 a3′[c123′ s123′]T 恰好相消(后者 =−a1′[c1′ s1′]T,因为 a3′=a1′、ϑ1′+ϑ2′+ϑ3′=π+ϑ1′)。也就是说,连杆 1′ 的长度根本不进末端位置——位置只由 a1′′ 与 a4 决定。
观察 2.9.2.A · 与两连杆平面臂等价
把上式与 2.9.1 的两连杆结果一比即可看出:平行四边形臂与两连杆平面臂在运动学意义上等价(原书)。但两者有一个本质区别——平行四边形的两个驱动关节都安装在基座上(执行器不必随臂运动),这极大简化了动力学模型(原书 §7.3.3);1.4.2 的 ABB IRB 4400 正是用这种结构来提高刚度与承载的。
(注:约束方程不能分别反解出 ϑ2′ 与 ϑ3′ 的值——两者被同一条约束绑定在一起,真正的独立变量只有 q=[ϑ1′ ϑ1′′]T 这两个。)
这是第一个引入移动关节的结构:两转动 + 一移动(伸缩)。三个 ai 全为零,原因就在轴间关系里——z0 与 z1 相交(a1=0)、z1 与 z2 相交(a2=0)、z2∥z3(a3=0)。接下来要留意符号:z0→z1 沿 x0 转的是负向 π/2,故 α1=−π/2——录播 1:21:17 演示了这个判号过程,并提醒「正负号容易错」。
α 判号的固定动作:右手拧螺丝(本编补充,配 [2.8.2](sec2-8.md#sec-2.8.2) 例解③)
- 找到 xi(公垂线方向,已由建系规则定好);
- 右手握住这根「螺丝刀」,拇指指向 xi 正方向;
- 看四指卷曲的方向:zi−1 拧向 zi 顺着四指为正,逆着为负。
对照两个肩部几何完全相同的结构即可看出符号的全部来源:拟人臂取 z1=−y0,从 z0 拧到 z1 顺着四指,α1=+π/2;球形臂取 z1=+y0,拧向相反,α1=−π/2。同一个几何、两种 z1 选法,符号正好互为相反数——参数表是「选系的结果」,这正是建系自由度(不唯一的五种情形)的体现,而不是谁对谁错。
| 连杆 i | ai | αi | di | ϑi |
| 1 | 0 | −π/2 | 0 | ϑ1 |
| 2 | 0 | π/2 | d2 | ϑ2 |
| 3 | 0 | 0 | d3 | 0 |
注意第三关节是移动型:它的变量 d3 进 d 列,而 ϑ3=0(常数)。代入通式得三个 Ai(原书 §2.9.3),再连乘(原书式 2.65):
T30=c1c2s1c2−s20−s1c100c1s2s1s2c20c1s2d3−s1d2s1s2d3+c1d2c2d31,q=[ϑ1 ϑ2 d3]T.
结构性观察(录播 1:23:34;原书):移动关节 d3 不影响旋转块——伸缩不改变姿态;单位向量 y30=[−s1 c1 0]T 的方向仅由第一关节决定——第二关节的转轴 z1 恰与 y3 平行,绕它转动不会改变 y3 的指向。作为对比,z30=[c1s2 s1s2 c2]T 就同时依赖两个转角。另外,与平面臂不同,此结构 Te3=I,无需补常值变换。
三个都是转动关节,几何上相当于「把两连杆平面臂绕肩轴转出平面」:o0 取在 z0∩z1(d1=0),z1∥z2,x、y 的取法与平面臂一致(录播 1:26:52 带着填表)。这张表不用背——它就是 2.8.2 例解分步建出来的那张表,建系全过程(四格分镜 + 交互实验)见该节。
| 连杆 i | ai | αi | di | ϑi |
| 1 | 0 | π/2 | 0 | ϑ1 |
| 2 | a2 | 0 | 0 | ϑ2 |
| 3 | a3 | 0 | 0 | ϑ3 |
连乘(原书式 2.66):
T30=c1c23s1c23s230−c1s23−s1s23c230s1−c100c1(a2c2+a3c23)s1(a2c2+a3c23)a2s2+a3s231.
这里 z3 与 z2 一致,坐标系 3 与末端执行器的约定不一致,同样需要补一个适当的常值变换(与平面臂是同一类收尾)。拟人臂的逆运动学(2.12.5)将给出 4 组解——肩左 / 右 × 肘上 / 下。
这是一种三转动轴交于一点的腕,正是 1.2.3 解耦原理的运动学落点。它的关节变量从 4 开始编号——因为腕要装在 3 自由度臂之后(录播 1:29:06:「腕从四开始,四五六」)。三轴共点,所以 a4=a5=d5=0,只留下工具长度 d6:
| 连杆 i | ai | αi | di | ϑi |
| 4 | 0 | −π/2 | 0 | ϑ4 |
| 5 | 0 | π/2 | 0 | ϑ5 |
| 6 | 0 | 0 | d6 | ϑ6 |
把三个 Ai 连乘(原书式 2.67)。本节最重要的发现就在结果里:旋转块 R63 与 ZYZ 合成矩阵(式 2.18)完全一致——(ϑ4,ϑ5,ϑ6) 恰是相对系 3 的 ZYZ 角。这正是 2.12.6「腕逆解 = ZYZ 反解」的全部伏笔。
斯坦福机械手就是球形臂 + 球形腕,而且两者的坐标系 3 一致——接口对齐,可以直接连乘(原书式 2.68–2.69;录播 1:30:39:「把这两个乘起来」):
T60=T30T63=[n600s600a600p601],
其中位置部分
p60=c1s2d3−s1d2+(c1(c2c4s5+s2c5)−s1s4s5)d6s1s2d3+c1d2+(s1(c2c4s5+s2c5)+c1s4s5)d6c2d3+(−s2c4s5+c2c5)d6.
把上式与单一球形臂的位置比较:多出的项全部来自「末端原点沿 a60 方向外移 d6」——若 d6=0,两者位置向量相同(原书)。这一点对 2.12.2 节的解耦逆解至关重要。
方向部分见原书式 2.69。下面 n60 的转录以英文原版为准——课堂幻灯片右缘被平台工具栏遮挡,被挡住的下标已与原书逐项核对补齐:
n60=c1(c2(c4c5c6−s4s6)−s2s5c6)−s1(s4c5c6+c4s6)s1(c2(c4c5c6−s4s6)−s2s5c6)+c1(s4c5c6+c4s6)−s2(c4c5c6−s4s6)−c2s5c6
(此式可以由 n60=R30⋅ZYZ 矩阵的首列直接复核:ZYZ 首列第三分量为 −s5c6;s60 与 a60 的对应表达式见原书式 2.69。)
拟人臂的坐标系 3 与球形腕的坐标系 3 不一致(x3 相差 π/2、原点相差 a3),因此不能直接连乘。出路有两条:插入常值变换把接口对齐,或者整体重建系(原书走的是这条路)。按后者重建,参数表为
| 连杆 i | ai | αi | di | ϑi |
| 1 | 0 | π/2 | 0 | ϑ1 |
| 2 | a2 | 0 | 0 | ϑ2 |
| 3 | 0 | π/2 | 0 | ϑ3 |
| 4 | 0 | −π/2 | d4 | ϑ4 |
| 5 | 0 | π/2 | 0 | ϑ5 |
| 6 | 0 | 0 | d6 | ϑ6 |
(注意第 3、4 行与前面两个单一结构的表都不同:原拟人臂的 a3 消失了,它化入 d4 的参考方向;α3 也变为 π/2。)连乘得到位置(原书式 2.70–2.71)
p60=a2c1c2+d4c1s23+d6(c1(c23c4s5+s23c5)+s1s4s5)a2s1c2+d4s1s23+d6(s1(c23c4s5+s23c5)−c1s4s5)a2s2−d4c23+d6(s23c4s5−c23c5)
令 d6=0,就得到腕心位置——它是 2.12.3 解耦求逆的抓手。录播 1:32:25 有一句忠告:「这里有很多正负号……不复杂,但要细心」。
这是一台七自由度机械手,属于本质冗余(见 2.10.3),腕部有两种构型。它的 DH 参数表如下(原书表 2.7)——αi=π/2(i=1,…,6)、α7=0,全表 ai=0:
| 连杆 i | ai | αi | di | ϑi |
| 1 | 0 | π/2 | 0 | ϑ1 |
| 2 | 0 | π/2 | 0 | ϑ2 |
| 3 | 0 | π/2 | d3 | ϑ3 |
| 4 | 0 | π/2 | 0 | ϑ4 |
| 5 | 0 | π/2 | d5 | ϑ5 |
| 6 | 0 | π/2 | 0 | ϑ6 |
| 7 | 0 | 0 | d7 | ϑ7 |
通用关节变换
Aii−1=cisi000010si−ci0000di1(i=1,…,6),A76=c7s700−s7c700001000d71.
连乘结果(原书式 2.72–2.76)冗长,但没有新东西——录播 1:33:52 的说法是:「多少个关节都能算……就比较长而已,方法是一样的」。若换上另一种腕,即 α7=π/2 型(原书),参数表第 7 行随之改变——特别地,此时 d7=0、a7=0——而且还要补一个常值变换(接近向量与 x7 共线)。
所谓「类人」,指运动学结构与人体上半身相似:躯干 + 双臂 + 类人手 + 头部(甚至还包括视觉系统)。以原书图 1.33 的类人机器人为例:双臂各由一台 7 自由度的 DLR 机械手 构成,躯干按拟人臂(3 自由度)建模,共约 17 个自由度。
两条结构性要点(原书):
- 有一个「非自由度」的可变关节:在躯干末端执行器与两臂基座之间,有一个保持「胸部」始终竖直的连接装置,它用躯干末端更远处的一个关节来表示;其参数 ϑ4 不构成自由度,而是由躯干关节补偿
ϑ4=−ϑ2−ϑ3⟹Tt3=c23−s2300s23c230000100001;
- 左右臂是两个并行的树状分支(图 2.28):两条链的正运动学分别建立(原书式 2.78–2.79)
Trh0=T30Tt3TrtTrhr,Tlh0=T30Tt3TltTlhl
式中 Tt3 就是上面的关节 4 补偿变换(系 4 与躯干系 t 重合);Trt,Tlt 是把躯干末端接到两臂基座的常值变换,其元素取决于安装角 β 与原点间距;Trhr,Tlhl 则是 DLR 机械手的正运动学。若手腕换成另一种构型,需相应修改 DH 参数表第 7 行(原书习题 2.14)。
为什么类人结构如此建模
躯干与双臂构成两个独立的树,而不是一条长链。这样一来,左右臂的运动学就可以分别计算——各自与躯干链首尾相接即可,无需对 17 个关节做统一连乘。这也是多臂 / 双臂机器人正运动学的通用做法:把结构画成树,在每个分支上跑 DH 流水线,再用常值变换把分支接到主干上。
默写点 · 合上书再写(主动回忆)
不看正文与速查卡,先自己写出下面几条,再展开核对。写不出来,就说明这一节还没「拿走」。
- 平面臂的 DH 表为什么几乎全是 0?
- 球形腕的旋转块为什么等于 ZYZ 矩阵?
- 什么情况下不能把两个 DH 表直接连乘?
核对
三轴平行 ⇒ 所有 αi=0;把坐标系原点选在关节轴上 ⇒ 多数 di=0、ai 只剩杆长。这不是巧合,而是「能零则零」原则的兑现。
球腕三个转动关节依次绕 z、y′、z′′(当前轴),正是 ZYZ 的定义;所以腕的姿态部分可以直接套 ZYZ 反解——这是读正运动学结果时要留下的「结构红利」。
接口不齐时不能直接连乘:前一段的输出坐标系必须与后一段的输入坐标系定义一致(如带腕拟人臂的臂系与腕系),否则要整体重建系或插入常值变换。
九种结构排在一起看,差异与共性都更清楚。表中每一行都来自前面某一小节,可以对照回读。
| 结构 | 自由度 | 关节类型序列 | 一句话特征 |
| 三连杆平面臂 | 3 | R–R–R | 全平行轴 → di,αi 全零;z3∥z0 |
| 平行四边形臂(补充) | 2 | 闭链(1′2′3′ + 4) | 化归开链后与两连杆平面臂等价;两驱动关节都在基座 |
| 球形臂 | 3 | R–R–P | z 轴两两相交 → ai 全零;d3 不进旋转块 |
| 拟人臂 | 3 | R–R–R | 平面臂立起来;α1=π/2;逆解有 4 支 |
| 球形腕 | 3 | R–R–R | 三轴共点;旋转块 = ZYZ 矩阵 |
| 斯坦福 | 6 | R–R–P ⊕ R–R–R | 接口一致 → 直接连乘 |
| 带腕拟人臂 | 6 | R–R–R ⊕ R–R–R | 接口不一致 → 整体重建系 |
| DLR | 7 | R×7 | 本质冗余;αi 高度统一 |
| 类人机械手(补充) | ~17 | 躯干 3 + 双臂各 7 | 两个树状分支并行;躯干含一个「非自由度」补偿关节 |
整节的内容可以压成两句:
- 一个发现:球形腕的 (ϑ4,ϑ5,ϑ6) 就是 ZYZ 欧拉角——正运动学里的一次结构观察,直接变成了逆运动学算法。
- 一条纪律:先判接口(两段的坐标系 3 是否一致),再决定是「连乘」还是「重建系」。
常见错误清单 · 自查三条
- α 的正负凭感觉——必须做「从 zi−1 绕 xi 转到 zi」的动作,用手比划方向(球形臂 α1=−π/2 的教训,录播 1:21:17);
- 忘记零位约定与编程零位之间的常值漂移(零位约定,就在本节开头);
- 对带腕拟人臂强行做 T臂T腕 相乘——接口不齐,结果错了还很难察觉;正确的动作是整体重建系,或插入常值变换。