Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

2.8 正运动学与 Denavit–Hartenberg 法

旋转、合成、角度表示、齐次变换——这些积木已经备齐,本节就来回答运动学的第一个主问题:给定关节变量,求末端位姿。两连杆的情形靠几何直觉就能算出来(原书例 2.4);可一旦面对真实机械手,我们需要的是一套系统化、参数最少的算法,这就是 Denavit–Hartenberg(DH)法。本节对应录播 0:39:43–1:13:00(其中 0:47:16–0:52:47 为课间)。

DH 四参数:四个数写清一根连杆 相邻关节轴之间的相对位姿,只需要 a、α、d、θ 四个数。 ROBOTICS · DH PARAMETERS / 13 ATLAS / R-13 DH 四参数:四个数写清一根连杆 相邻关节轴之间的相对位姿,只需要 a、α、d、θ 四个数。 J₁J₂TCPz₁a₁α₁d₂θ₂DH 四参数aᵢ₋₁ 沿 x 的连杆长度αᵢ₋₁ 绕 x 的扭转角dᵢ 沿 z 的偏置θᵢ 绕 z 的关节角Tᵢ = Rot_z(θᵢ) Trans_z(dᵢ) Trans_x(aᵢ₋₁) Rot_x(αᵢ₋₁)四个数确定一个连杆坐标系。
图解读图:DH 把「两根相邻关节轴之间的相对位姿」压缩成四个数:沿 x 平移 a、绕 x 转 α、沿 z 平移 d、绕 z 转 θ。转动关节只有 θ 是变量;四个参数排成一张表,整条机械臂的几何就写完了。

2.8.1 开链:编号约定、正运动学方程与递归

连杆—关节编号

定义 2.8.1 · 开链机械手的编号

开链机械手由 n+1n+1 个连杆(刚体)经 nn 个关节串联而成:连杆 0 固定在基座上,末端连杆上装有末端执行器;关节 ii 则把连杆 i−1i-1 与连杆 ii 连接起来。关节只有两类(原书图 2.12):转动型(revolute,符号 →圆柱铰)和移动型(prismatic,符号 →方块滑轨)。

录播 0:40:51 老师用讲台打比方:杆 0 就是基座(「讲台就是固定的」),从它开始依次长出关节 1、杆 1……直到关节 nn、杆 nn。换句话说,关节 ii 的前一根是杆 i−1i-1,后一根是杆 ii;于是 nn 自由度开链 = nn 个关节 + n+1n+1 根杆。

正运动学问题与末端执行器坐标系

定义 2.8.2 · 正运动学方程

正运动学(direct kinematics)回答的是:已知关节变量向量 q=[q1 ⋯ qn]T\boldsymbol q=[q_1\ \cdots\ q_n]^T(转动关节 qi=ϑiq_i=\vartheta_i,移动关节 qi=diq_i=d_i),求末端执行器的位姿。取基坐标系 Ob-xbybzbO_b\text{-}x_by_bz_b 与末端执行器坐标系,这一位姿可以写成齐次变换(原书式 2.48)

Teb(q)=[ne(q)se(q)ae(q)pe(q)0001],T_e^b(\boldsymbol q)=\begin{bmatrix}\boldsymbol n_e(\boldsymbol q) & \boldsymbol s_e(\boldsymbol q) & \boldsymbol a_e(\boldsymbol q) & \boldsymbol p_e(\boldsymbol q)\\ 0&0&0&1\end{bmatrix},

式中 pe\boldsymbol p_e 是末端坐标系原点的位置;ae\boldsymbol a_e 为接近向量(approach,指向抓取 / 工作方向),se\boldsymbol s_e 落在钳口滑动平面内、且与 ae\boldsymbol a_e 垂直;ne=se×ae\boldsymbol n_e=\boldsymbol s_e\times\boldsymbol a_e 则保证 (ne,se,ae)(\boldsymbol n_e,\boldsymbol s_e,\boldsymbol a_e) 构成右手系。

(图中同时给出了原书例 2.4:两连杆平面臂用三角法直接写出 TebT_e^b,其中 s12=sin⁡(ϑ1+ϑ2)s_{12}=\sin(\vartheta_1+\vartheta_2),其余依此类推。)

例 2.4(原书)· 几何法与它的天花板

对两连杆平面臂(关节角 ϑ1,ϑ2\vartheta_1,\vartheta_2,杆长 a1,a2a_1,a_2),末端位置可以看成两段投影之和:先是 a1a_1 的投影,再加上 a2a_2 在「已抬起 ϑ1\vartheta_1 的方向」上的投影(录播 0:44:00–0:44:57,老师逐项指认「ne\boldsymbol n_e 垂直于臂平面所以是 [0,0,1][0,0,1]、pe\boldsymbol p_e 就是 [a1c1+a2c12, a1s1+a2s12, 0]T[a_1c_1+a_2c_{12},\ a_1s_1+a_2s_{12},\ 0]^T」),于是得

Teb=[0s12c12a1c1+a2c120−c12s12a1s1+a2s1210000001].T_e^b=\begin{bmatrix}0 & s_{12} & c_{12} & a_1c_1+a_2c_{12}\\ 0 & -c_{12} & s_{12} & a_1s_1+a_2s_{12}\\ 1&0&0&0\\ 0&0&0&1\end{bmatrix}.

几何法的天花板(原书 + 录播 0:45:03:「如果多了之后……那就不好算了」):这类算法依赖变量的选取和几何直觉,结构一复杂、关节一多就不再直观。

开链的递归结构

原理 2.8.A · 正运动学的连乘(原书式 2.50–2.51)

从连杆 0 到连杆 nn,给每一根杆都固连一个坐标系,则坐标系 nn 相对坐标系 00 的位姿为

Tn0(q)=A10(q1) A21(q2)⋯Ann−1(qn),T_n^0(\boldsymbol q)=A_1^0(q_1)\,A_2^1(q_2)\cdots A_n^{n-1}(q_n),

其中每个 Aii−1(qi)A_i^{i-1}(q_i) 都只是单个关节变量的函数。至于末端执行器的位姿,只需再串接两个(典型情况下的)常值变换:

Teb(q)=Tb0 Tn0(q) Ten.T_e^b(\boldsymbol q)=T_b^0\,T_n^0(\boldsymbol q)\,T_e^n .

结构决定算法:先描述相邻两杆的相对关系,再沿链递归合成(原书)。于是问题只剩一个——相邻坐标系究竟怎么建才算规范?

2.8.2 Denavit–Hartenberg 法:动机与建系规则

为什么需要 DH:6 → 4 的账(录播 0:46:41–0:47:16、0:53:22–0:53:59)

随意建两个坐标系、再去描述它们的相对位姿,需要 3+3=63+3=6 个量(原点 3 个 + 姿态 3 个)。但相邻两坐标系被同一根刚性杆钉死,彼此并不独立——「你可能直观想象可能有 5 个参数」;DH 建系法则证明,只要 4 个参数就足以完整描述任意相邻关系,「参数是最少,而且最方便、很直观」。省下来的那部分自由度,全部来自建系规则对坐标系的「对齐」。

先把「系到底挂在哪」说透:看守模型(本编补充)

四条规则里最容易卡住读者的,是「ziz_i 沿关节 i+1i+1 的轴」这个编号错位——下标 ii 配不上关节 ii,对着图找半天才发觉配错了对。这里把挂靠关系一次说透,之后再看四条规则就只是操作细节。

DH 约定只有一句话:杆 ii 上固连坐标系 ii,其 zz 轴放在关节 i+1i+1 的轴线上。把下标换个方向读,更顺口——

坐标系 i−1i-1 是「看守关节 ii」的坐标系:它的 zz 轴 zi−1z_{i-1} 与关节 ii 的轴线重合。

要找的东西 去哪里找
关节 ii 的轴线 就是 zi−1z_{i-1}(看守它的那根轴)
杆 ii 的固连系 系 ii(原点 oio_i 落在关节 i+1i+1 的轴线上)
关节 ii 的运动 绕 / 沿 zi−1z_{i-1}:转 ϑi\vartheta_i 或移 did_i
Aii−1A_i^{i-1} 里的变量 只有关节 ii 的那一个(「3 常 1 变」的出处)

为什么这样挂:zi−1z_{i-1} 与关节 ii 的轴对齐后,关节 ii 转动或伸缩时,杆 ii(连同系 ii)相对杆 i−1i-1(连同系 i−1i-1)的运动就纯粹是绕 / 沿 zi−1z_{i-1},一个参数即可装进矩阵;若 zz 轴随手乱放,描述同一段运动就要好几个参数——「6 压到 4」的第一笔节省正来自这里。

一句话防混:本教程与原书用标准 DH(ziz_i 沿关节 i+1i+1);Craig《机器人学导论》用改进 DH(ziz_i 沿关节 ii)。两套各自自洽,混用必错(勘误 E2.4)。

DH 建系四规则(原书 §2.8.2,录播 0:54:05–0:58:00)

约定:轴 ii 指关节 ii 的轴线。操作永远从「定轴」开始——先把所有轴线画成贯穿直线,看清它们两两之间的关系(相交?平行?还是异面?),再逐系落位。给系 ii 落位时依次回答三问(zz 放哪、原点放哪、xx 指哪),yy 自动补齐:

  1. ziz_i 放哪:沿轴 i+1i+1(看守模型:系 i−1i-1 才是看守关节 ii 的那个系);
  2. 原点 oio_i 放哪:取 zi−1z_{i-1} 与 ziz_i 的公垂线和 ziz_i 的交点(垂足 oi′o_i' 则是公垂线与 zi−1z_{i-1} 的交点);
  3. xix_i 指哪:沿公垂线,由关节 ii 指向关节 i+1i+1;
  4. yiy_i:右手系补齐(不引入参数)。

两类特殊轴对的处理(建系时最常遇到,动作先背下来):

  • 平行轴对(下文例解④的轴2、轴3):公垂线有无穷多条,取穿过前一原点 oi−1o_{i-1} 的那一条 ⇒di=0\Rightarrow d_i=0;
  • 相交轴对(例解③的轴1、轴2):公垂线退化为交点本身 ⇒ai=0\Rightarrow a_i=0,xix_i 取同时垂直于两轴的任一方向(选定后 αi\alpha_i 的正负也就定了)。

规则是抽象的,必须在一台真实结构上走一遍才能落地。下面选一台三维的三转动拟人臂(肩回转 + 肩俯仰 + 肘俯仰)做例解——平面两连杆太退化(αi\alpha_i、did_i 全为 0,公垂线从头到尾没真正「干过活」),而拟人臂同时含有「相交轴对」与「平行轴对」,四条规则全部用得上。

例解 · 在拟人臂上四步建系(本编补充,逐格对照下图)

结构:关节1轴线竖直(过肩点),关节2轴线水平(过肩点),关节3轴线与关节2平行(过肘点)。记住这三句话,参数表其实已经定了一半。

① 定轴线(格一)。 先不建任何坐标系,把三根轴线画成贯穿直线,然后问:它们两两什么关系?——轴1 与轴2 相交于肩点;轴2 与轴3 平行。后面每个参数都从这两句话里读出来。

② 放系 0(格二)。 z0z_0 沿关节1轴线(竖直;沿轴的正方向任选,定下不再变);o0o_0 本可取在轴线上任一点,按「能零则零」取在轴1与轴2的交点(肩心),垂足 o1′=o0o_1'=o_0,下一行 d1d_1 直接为 0;x0x_0 水平任选(习惯取零位时上臂的指向)。系 0 从此固连在基座上。

③ 放系 1(格三)。 z1z_1 沿关节2轴线。轴1、轴2 相交 ⇒a1=0\Rightarrow a_1=0;x1x_1 必须同时垂直于两条轴 ⇒\Rightarrow 沿水平(臂平面内垂直于两轴的那个方向),指向零位上臂。判 α1\alpha_1 的动作:把 x1x_1 当螺丝柄,看从 z0z_0 拧向 z1z_1 是不是右手旋进方向——是,转角 +π/2+\pi/2,故 α1=π/2\alpha_1=\pi/2(符号错误大多栽在这里,务必动手比划)。y1y_1 右手补齐后恰好竖直向上、与 z0z_0 同向——这正是「两轴扭了 90°」的直接可视化。

④ 放系 2、3(格四)。 z2z_2 沿关节3轴线,与 z1z_1 平行 ⇒α2=0\Rightarrow\alpha_2=0;这对平行轴的公垂线就是上臂本身 ⇒a2=\Rightarrow a_2= 上臂长,x2x_2 沿上臂指向肘部,o2o_2 取垂足(肘点,穿过 o1o_1 的那条公垂线)⇒d2=0\Rightarrow d_2=0。系 3 同理:z3z_3 取与 z2z_2 平行(末端系约定),公垂线 == 前臂 ⇒a3=\Rightarrow a_3= 前臂长,d3=0d_3=0。剩下的 ϑ1,ϑ2,ϑ3\vartheta_1,\vartheta_2,\vartheta_3 就是三个关节变量——分别是 x0x_0 到 x1x_1 绕 z0z_0、x1x_1 到 x2x_2 绕 z1z_1、x2x_2 到 x3x_3 绕 z2z_2 的转角。

填表时逐格「问一句」,每个数都有来历:

连杆 ii aia_i αi\alpha_i did_i ϑi\vartheta_i 填这格时问自己
1 0 π/2\pi/2 0 ϑ1\vartheta_1 轴1、轴2 相交 ⇒a1=0\Rightarrow a_1=0;从 z0z_0 绕 x1x_1 转到 z1z_1 是 +π/2+\pi/2
2 a2a_2 0 0 ϑ2\vartheta_2 轴2、轴3 平行 ⇒α2=0\Rightarrow\alpha_2=0;公垂线 == 上臂 ⇒a2\Rightarrow a_2
3 a3a_3 0 0 ϑ3\vartheta_3 z2∥z3⇒α3=0z_2\parallel z_3\Rightarrow\alpha_3=0;公垂线 == 前臂 ⇒a3\Rightarrow a_3

这张表与 2.9.4 逐字相同——2.9 的九张参数表,都是这条四步流水线在不同骨架上的重复。

拟人臂 DH 建系四步分镜 四个等轴测分镜展示拟人机械臂的 DH 建系过程:格一只画机械臂与三根关节轴线;格二在肩点加坐标系0,z0 沿竖直的关节1轴;格三加坐标系1,标出两轴相交故 a1=0、z0 绕 x1 转到 z1 为 90 度;格四在肘与腕加坐标系2、3,红色标出公垂线即上臂与前臂,长度即 a2、a3。 ① 定轴线:关节1 竖直,关节2、3 平行 关节1轴(竖直) 关节2轴 关节3轴 肩 肘 腕 ② 放系 0:z0 沿关节1轴,原点取在两轴交点 x0 y0 z0 o0 ③ 放系 1:z1 沿关节2轴;两轴相交,a1 = 0 x1 y1 z1 o1 z0 a1 = 0 α1 = 90° ④ 放系 2、3:平行轴对的公垂线 = 连杆本身 z1 x2 y2 z2 o2 x3 y3 z3 o3 公垂线,长 = a2 a3
拟人臂的 DH 建系全过程(本教程绘,等轴测投影)。格一先画轴线:轴线的两两关系(相交 / 平行)已决定参数表的全部取值;格二放系 0(z0z_0 = 关节1轴,原点取在两轴交点,d1=0d_1=0);格三放系 1(相交轴对:a1=0a_1=0,从 z0z_0 绕 x1x_1 转到 z1z_1 为 +90∘+90^\circ,故 α1=π/2\alpha_1=\pi/2;注意 y1y_1 恰与 z0z_0 同向);格四放系 2、3(平行轴对:公垂线就是连杆本身,a2a_2、a3a_3 即杆长)。拖动下方实验的角度滑杆,可以看到这套坐标系如何随关节运动。
动手实验 · 把四个坐标系亲手拖出来

上面四格是快照,这个实验让它动起来。拖动 ϑ1,ϑ2,ϑ3\vartheta_1,\vartheta_2,\vartheta_3 与视角方位角,重点观察三件事:其一,关节1转动时整条臂平面带着系 1、2、3 一起绕 z0z_0 转,而系 0 纹丝不动——每个关节只「指挥」自己下游的坐标系;其二,无论姿态怎么变,α1=π/2\alpha_1=\pi/2、a2a_2 等几何量始终不变——「3 常 1 变」一眼可见;其三,转到侧面视角时,z1z_1、z2z_2 两根平行轴与公垂线(上臂)的立体关系一目了然——这正是静态图最难画清的部分。

不唯一的五种情形(原书;录播 0:58:06–0:59:21 老师逐条点名)

① 系 0:o0o_0、x0x_0 均可任选(前面没有公垂线),工程上尽量与基坐标系重合;② 系 nn:后面没有关节 n+1n+1,znz_n 不唯一,典型做法是取与 zn−1z_{n-1} 同向;③ 相邻两轴平行:公垂线不唯一(例解④已给出标准动作:取穿过 oi−1o_{i-1} 的那条);④ 相邻两轴相交:无公垂线,xix_i 方向任意(例解③);⑤ 关节 ii 为移动型:zi−1z_{i-1} 方向任意。不唯一 ≠ 随便:所有自由度都按「能零则零」(总原则:让参数尽量为零)去用,同一结构的不同合法选系给出的 Tn0T_n^0 完全相同。

同一套流程再拿平面两连杆做一遍快检(见下图):三个 zz 轴全部指出纸面、互相平行。正是「平行」这一个几何事实,一次性解释了参数表里成片的 00 与仅有的两个变量——建议先遮住右表,照着 例解 的四步自己走一遍,再对答案。

两连杆平面臂的 DH 建系实例 左图俯视:基座与肘部两个关节加末端共三个坐标系,z 轴全部垂直纸面向外(圆点符号),x 轴沿连杆方向,相邻 x 的夹角即关节变量 ϑ。右图给出两行 DH 参数表:a 列为杆长常数,ϑ 列为变量,α 与 d 全为零。 建系结果(俯视,z 全部指出纸面 ⊙) DH 参数表:每个 0 都有来历 x y ϑ1 ϑ2 x0 x1 x2 o0 o1 o2 a1 a2 z 全平行 → α = 0;原点同面 → d = 0;x 沿连杆方向 → a 恰为杆长 连杆 i a α d ϑ 1 a1 0 0 ϑ1 2 a2 0 0 ϑ2 变量(每行恰一个:z 规则决定) 常数(杆长 / 扭角:公垂线与两轴夹角) 0(z 平行 → α=0;原点共面 → d=0) 参数选得好 = 让 0 尽量多;2.9 节全部算例照此办理
DH 建系的第一个完整实例(本教程绘):俯视下三个 zz 轴全部指出纸面且互相平行,于是 αi=0\alpha_i=0;原点取在同一平面,di=0d_i=0;xix_i 沿连杆方向,aia_i 恰为杆长;相邻 xx 轴的夹角就是仅有的两个变量 ϑ1,ϑ2\vartheta_1,\vartheta_2。把左图的几何逐条「翻译」成右表——这就是 DH 法的全部动作;「让 0 尽量多」的选系原则见下文(总原则:让参数尽量为零)。
总原则:让参数尽量为零(录播 0:59:31–1:00:04,课堂提炼)

凡是可自由选取之处,都「选择让参数尽量为零的方案」。道理很简单:参数本身是常数,选得好就能让一大批参数为 0,代入 AA 矩阵时「都是零的乘来乘去」,计算量骤减。2.9 节每个算例的参数表里成片的 0,正是这条原则的兑现。

DH 四参数与 Aii−1A_i^{i-1}

上面两例的轴线两两「相交 / 平行」,是教学里的乖巧情形;一般情形下相邻两轴异面(既不相交也不平行,工业臂的肩部偏置很常见),此时公垂线唯一。四个参数在这种一般位置下的几何定义如下图——例解里的每一步,都是这张图在特殊轴对上的退化版本:

DH 建系四规则与四参数的几何来源 左图画出相邻两根关节轴、公垂线、两个坐标系原点与 x 轴,并标出杆件长度 a 与关节距离 d;右图沿 x 轴方向看,说明扭角 α 是两轴的夹角。 zi−1 zi xi oi′ oi oi−1 ai 杆件长度 di 关节距离 zi−1 沿关节 i 的轴;zi 沿关节 i+1 的轴 xi 沿公垂线(由关节 i 指向关节 i+1) αi zi−1 zi 沿 xi 方向看:两轴夹角即扭角 αi (绕 xi 逆时针为正) 转动关节:ϑi 是变量 移动关节:di 是变量;ai、αi 恒为常数
DH 建系四规则不是并列的口诀(本教程绘):每条规则各管一个参数——zz 轴规则管变量(ϑi\vartheta_i 或 did_i),公垂线规则管常数(aia_i),两轴的方向关系管 αi\alpha_i,右手系补 yiy_i 不引入参数。左图中 oio_i 取在公垂线与 ziz_i 的交点、xix_i 沿公垂线——这两条决定了 Aii−1A_i^{i-1} 第 4 列的 (aicϑi, aisϑi, di)(a_ic_{\vartheta_i},\ a_is_{\vartheta_i},\ d_i)。
定义 2.8.3 · DH 参数

建立连杆坐标系后,系 ii 相对系 i−1i-1 的位姿就由 4 个参数完全确定:

参数 名称(课堂助记) 几何含义 属性
aia_i 杆件长度 oi′o_i' 与 oio_i 间距离(公垂线长度,沿 xix_i) 恒为常数
did_i 关节距离 oi′o_i' 沿 zi−1z_{i-1} 的坐标 移动关节时为变量
αi\alpha_i 杆件扭角 轴 zi−1z_{i-1} 与 ziz_i 的夹角(绕 xix_i 逆时针为正) 恒为常数
ϑi\vartheta_i 关节转角 轴 xi−1x_{i-1} 与 xix_i 的夹角(绕 zi−1z_{i-1} 逆时针为正) 转动关节时为变量

3 常 1 变:ai,αia_i,\alpha_i 永远是常数(由杆的几何决定);di,ϑid_i,\vartheta_i 中恰有一个是关节变量,统一记作 qiq_i(录播 1:04:31–1:05:04:「后面用的最多的是叫 Q……转动关节就是 ϑ\vartheta,移动关节就是 dd」)。换言之,相邻两坐标系之间只需要一个量就能描述。

规则 → 参数:每条建系规则「为谁服务」

四条规则不是并列的口诀,而是每条各管一个参数——这既是「建系为什么这样建」的答案,也是填表时自查的依据:

规则 服务的参数 为什么恰好是它
zi−1z_{i-1} 沿关节 ii 的轴 ϑi\vartheta_i、did_i(变量) 关节 ii 的运动物理上就是「绕 / 沿自己的轴」;zi−1z_{i-1} 与该轴重合后,这场运动在 Aii−1A_i^{i-1} 里恰好表现为绕 zi−1z_{i-1} 的转角 ϑi\vartheta_i(旋转块)或沿 zi−1z_{i-1} 的位移 did_i(第 4 列)——这就是「转动 ϑ\vartheta 当变量、移动 dd 当变量」的全部出处
原点 oio_i 取在公垂线上、xix_i 沿公垂线 aia_i(常数) 两根 zz 轴的相对位置被这段公垂线一锤定音:aia_i = 公垂线长,沿 xix_i 度量——第 4 列的 (aicϑi, aisϑi)(a_ic_{\vartheta_i},\ a_is_{\vartheta_i}) 由此而来
同一对 zz 轴的方向关系 αi\alpha_i(常数) 两轴的方向差只剩绕公垂线 xix_i 的一个转角:αi\alpha_i = 从 zi−1z_{i-1} 绕 xix_i 转到 ziz_i——旋转块里「绕 xx 转 α\alpha」那一块由此而来
yiy_i 右手系补齐 无 只保证 R∈SO(3)R\in SO(3) 且唯一,不引入参数

一句话总结:zz 轴规则管变量(ϑ,d\vartheta,d),公垂线规则管常数(a,αa,\alpha)。2.9 各参数表里成片的 00 与 ±π/2\pm\pi/2,全部来自这两条规则对齐之后的「自然归零 / 自然成直角」——不是巧合,而是设计。

Aii−1A_i^{i-1}:从建系几何直接读出两步分解(原书式 2.52;录播 1:05:42–1:09:01)

建系规则不仅告诉我们坐标系放在哪,还把「从系 i−1i-1 走到系 ii」的路线规定成了四段各含一个参数的路程。站在 oi−1o_{i-1}、以系 i−1i-1 的姿态起步,依次做四个动作(每个都绕 / 沿当前轴):

  1. 绕 zi−1z_{i-1} 转 ϑi\vartheta_i——把 xx 轴从 xi−1x_{i-1} 方向转到公垂线方向 xix_i(ϑi\vartheta_i 的定义);
  2. 沿 zi−1z_{i-1} 移 did_i——原点落到垂足 oi′o_i'(did_i 的定义;与动作 1 都在 zi−1z_{i-1} 上、互不干扰,可并成一步);
  3. 沿新 xx(已对准 xix_i)移 aia_i——原点从 oi′o_i' 走到新轴线上的 oio_i(aia_i 的定义);
  4. 绕 xix_i 转 αi\alpha_i——把 zz 轴从 zi−1z_{i-1} 方向拧到 ziz_i 方向(αi\alpha_i 的定义)。

四段走完,恰好到达系 ii;不多不少,每段恰好消费一个参数。按「当前轴右乘」(原理 2.3.A)把这段路线记成矩阵,就得到原书的两步分解:

  1. 动作 1+2 合并为绕 zi−1z_{i-1} 转 ϑi\vartheta_i、沿 zi−1z_{i-1} 移 did_i → 中间系 i′i'(原点 oi′o_i',zz 轴仍沿 zi−1z_{i-1},xx 轴已对准 xix_i):

Ai′i−1=[cϑi−sϑi00sϑicϑi00001di0001]A_{i'}^{i-1}=\begin{bmatrix}c_{\vartheta_i} & -s_{\vartheta_i} & 0 & 0\\ s_{\vartheta_i} & c_{\vartheta_i} & 0 & 0\\ 0&0&1&d_i\\ 0&0&0&1\end{bmatrix}

  1. 动作 3+4 合并为沿 xi′x_{i'} 移 aia_i、绕 xi′x_{i'} 转 αi\alpha_i → 系 ii:

Aii′=[100ai0cαi−sαi00sαicαi00001]A_i^{i'}=\begin{bmatrix}1&0&0&a_i\\ 0&c_{\alpha_i} & -s_{\alpha_i} & 0\\ 0&s_{\alpha_i} & c_{\alpha_i} & 0\\ 0&0&0&1\end{bmatrix}

右乘合成(先发生的在左边——原理 2.3.A):

Aii−1(qi)=Ai′i−1Aii′=[cϑi−sϑicαisϑisαiaicϑisϑicϑicαi−cϑisαiaisϑi0sαicαidi0001]A_i^{i-1}(q_i)=A_{i'}^{i-1}A_i^{i'}=\begin{bmatrix} c_{\vartheta_i} & -s_{\vartheta_i}c_{\alpha_i} & s_{\vartheta_i}s_{\alpha_i} & a_ic_{\vartheta_i}\\ s_{\vartheta_i} & c_{\vartheta_i}c_{\alpha_i} & -c_{\vartheta_i}s_{\alpha_i} & a_is_{\vartheta_i}\\ 0 & s_{\alpha_i} & c_{\alpha_i} & d_i\\ 0&0&0&1 \end{bmatrix}

验算 · 逐列读回几何 + 两个退化自检(本编补充)

第 4 列(位置):追踪原点的齐次坐标 [0,0,0,1]T[0,0,0,1]^{\mathrm T} 在乘积下的像(矩阵作用在列向量上时从最右因子往左读,与上面建系时序互为镜像,正是 原理 2.3.A/原理 2.3.B 的左 / 右乘对偶)。绕 xx 转 αi\alpha_i 不动原点 → 沿 xx 移 aia_i 得 [ai,0,0,1]T[a_i,0,0,1]^{\mathrm T} → 沿 zz 移 did_i 得 [ai,0,di,1]T[a_i,0,d_i,1]^{\mathrm T} → 绕 zz 转 ϑi\vartheta_i 只旋转前两个分量:

p=[ aicϑi   aisϑi   di ]T\boldsymbol p=\big[\,a_ic_{\vartheta_i}\ \ \ a_is_{\vartheta_i}\ \ \ d_i\,\big]^{\mathrm T}

did_i 躺在转轴上原样保留;aia_i 的方向被 ϑi\vartheta_i 旋转——第 4 列三个元素各自的来历,一目了然。

第 3 行(姿态):Ai′i−1A_{i'}^{i-1} 的旋转块是 xyxy 平面内的事,第 3 行为 [0,0,1][0,0,1],作用在 Aii′A_i^{i'} 上不动它的第 3 行;而 Aii′A_i^{i'} 的第 3 行是 [0,sαi,cαi][0,s_{\alpha_i},c_{\alpha_i}]——故乘积第 3 行就是 [0  sαi  cαi][0\ \ s_{\alpha_i}\ \ c_{\alpha_i}]。其余两行由平面旋转 Rz(ϑi)R_z(\vartheta_i) 作用到 Rx(αi)R_x(\alpha_i) 的前两行得出,逐项乘开即得完整矩阵。

自检一(退化为纯转动关节):令 ai=αi=di=0a_i=\alpha_i=d_i=0(两轴相交且共原点,如例解③),Aii−1A_i^{i-1} 只剩 Rotz(ϑi)\mathrm{Rot}_z(\vartheta_i)——纯粹的「绕关节轴转 ϑi\vartheta_i」。 自检二(退化为纯移动关节):令 ϑi=αi=ai=0\vartheta_i=\alpha_i=a_i=0,Aii−1=Transz(di)A_i^{i-1}=\mathrm{Trans}_z(d_i)(变量换成 did_i 沿 zi−1z_{i-1} 伸缩,如球形臂的第三关节)。 两个退化情形都对得上物理直觉,说明四个参数各就各位、没有放错地方。□

□

这个矩阵值得默写:第 4 列的 aicϑi, aisϑi, dia_ic_{\vartheta_i},\ a_is_{\vartheta_i},\ d_i 就是三个参数的「肉身」(上一框已逐列验算),旋转块则是「绕 zz 转 ϑ\vartheta ⊕\oplus 绕 xx 转 α\alpha」的复合。整条链的正运动学,无非是把各 Aii−1A_i^{i-1} 依次连乘(原理 2.8.A)。

DH 十步操作流程(原书)
  1. 给关节轴编号,定出 z0,…,zn−1z_0,\dots,z_{n-1} 的方向;
  2. 选取系 0(o0o_0 在轴 z0z_0 上;可行时与基坐标系重合);
  3. 对 i=1,…,n−1i=1,\dots,n-1 逐个处理:把 oio_i 放到 ziz_i 与公垂线的交点(平行轴 + 转动关节取 di=0d_i=0;移动关节取机械参考点);
  4. 沿公垂线取 xix_i(方向由关节 ii 指向关节 i+1i+1);
  5. 右手系补 yiy_i;
  6. 选取系 nn(转动关节取 zn∥zn−1z_n\parallel z_{n-1};移动关节 znz_n 任意;xnx_n 按步骤 4);
  7. 列出 4n4n 个参数的参数表;
  8. 逐个算出 Aii−1(qi)A_i^{i-1}(q_i);
  9. 连乘得到 Tn0(q)T_n^0(q);
  10. 串接常值变换 Tb0,TenT_b^0,T_e^n,得到 Teb(q)T_e^b(q)。 录播 1:11:13 的口诀:「编号、建系(能零则零)、列参数表、代入、连乘」——参数表写对,剩下的就是机械代入。
计算方面(原书 §2.8 末)

正运动学的主要计算开销,来自 Aii−1A_i^{i-1} 连乘中超越函数(sin / cos)的求值;做因式化处理可以减少乘加次数(flops)。另外,末端坐标系的三个单位向量不必都从矩阵里读——第三个用叉积导出即可(ne=se×ae\boldsymbol n_e=\boldsymbol s_e\times\boldsymbol a_e,见 定义 2.8.2)。

动手实验 · 把 DH 表连乘成一条手臂

平面 3R 是 DH 法的最小实例:三个 zz 轴都指出纸面且互相平行(αi=0\alpha_i=0),原点共面(di=0d_i=0),xix_i 沿连杆(ai=lia_i=l_i),于是 DH 表里只剩下三个变量 ϑ1,ϑ2,ϑ3\vartheta_1,\vartheta_2,\vartheta_3。拖动它们,观察末端轨迹与闭式 x=l1c1+l2c12+l3c123x=l_1c_1+l_2c_{12}+l_3c_{123} 如何同步变化——这就是 总原则:让参数尽量为零「让 0 尽量多」带来的收益。

2.8.3 闭链(教材补充 · 课程未授)

本节定位

录播 0:41:58 老师明确讲过「闭链我们不讲」,所以这一节属于教材补充(原书 §2.8.3),考试不作要求;但它是 2.9.2 平行四边形臂与并联机构的建模基础,故存此备查。

上面这套 DH 法利用的是开链的递归特性。面对含闭运动链的机械手,思路是把它化归为开链:

闭链的 DH 处理(原书 §2.8.3)

设闭链有 n+1n+1 个连杆、关节数 l>nl>n(于是闭环数 = l−nl-n)。

  1. 虚拟断开:在某个非驱动关节处把闭环「剪开」(设为连接连杆 jj 与 kk 的关节 j+1j+1),得到一个树状开链;连杆 0⋯i0\cdots i 位于两分支之前(公共段),连杆 j+1⋯nj+1\cdots n 则被排除;
  2. 按 DH 建系:对树上各分支分别建连杆坐标系(开链流程照用);
  3. 写约束:断点两侧坐标系 jj 与 kk 必须满足原闭环的几何一致条件。当关节 j+1j+1 为转动型时约束为

zji(q′)=zki(q′′),Rij(q′)(pji(q′)−pki(q′′))=[00djk]T\boldsymbol z_j^i(\boldsymbol q')=\boldsymbol z_k^i(\boldsymbol q''),\qquad R_i^j(\boldsymbol q')\big(\boldsymbol p_j^i(\boldsymbol q')-\boldsymbol p_k^i(\boldsymbol q'')\big)=\begin{bmatrix}0&0&d_{jk}\end{bmatrix}^T

(Rij=(Rji)TR_i^j=(R_j^i)^T,把系 ii 中表达的向量投到系 jj;原书式 2.55–2.57)——它说的就是「两 zz 轴共线 + 相对位置只剩沿轴向的固定偏移」。若关节 j+1j+1 为移动型,则 djkd_{jk} 变为变量,位置约束只保留前两个分量,并追加方向约束 xjiTxki=cos⁡ϑjk\boldsymbol x_j^{iT}\boldsymbol x_k^i=\cos\vartheta_{jk}(原书式 2.58–2.60);两种情形下都恰有 6 个约束方程; 4. 求独立变量:由这 6 个方程解出数目较少的独立关节变量——它们就是驱动关节的自然候选,链中其余关节(含断开关节)通常不作为驱动关节; 5. 连乘出正运动学:Teb(q)=A10A21⋯Ann−1T_e^b(\boldsymbol q)=A_1^0A_2^1\cdots A_n^{n-1},链路闭合后,变换序列通常从坐标系 jj 重新开始(原书式 2.61)。

何时能解出闭式约束

除结构简单的情形(如平面机构)外,约束方程不保证有闭合解;不过若机械手具有特殊几何构形,部分方程会变得不独立、独立方程数少于 6,求解反而更容易(原书)。

默写点 · 合上书再写(主动回忆)

不要翻正文与速查卡,先独立写出下面几条,再展开核对。写不出来,就说明这一节还没真正「拿走」。

  1. 默写 Aii−1(qi)A_i^{i-1}(q_i) 的完整矩阵,并指出第 4 列各元素对应哪个参数。
  2. 看守模型怎么说?——「关节 ii 的轴线」是哪根 zz?杆 ii 固连哪个系?
  3. DH 四规则各是什么?每条规则「为哪个参数服务」?平行轴对、相交轴对分别怎么处理?
  4. 四个参数中哪两个永远是常数?变量怎么定?
核对

Aii−1A_i^{i-1} 见公式速查卡 B1。第 4 列 = (aicϑi, aisϑi, di, 1)T(a_ic_{\vartheta_i},\ a_is_{\vartheta_i},\ d_i,\ 1)^{\mathrm T}——三个参数的「肉身」。

系 i−1i-1 看守关节 ii:关节 ii 的轴线就是 zi−1z_{i-1};杆 ii 固连系 ii(原点在关节 i+1i+1 的轴上)。

ziz_i 沿关节 i+1i+1 的轴(服务变量 ϑi,di\vartheta_i,d_i);原点取公垂线交点、xix_i 沿公垂线(服务 aia_i);两 zz 轴的方向关系给 αi\alpha_i;yiy_i 右手系补齐(不引入参数)。平行轴对取穿过 oi−1o_{i-1} 的公垂线(di=0d_i=0);相交轴对公垂线退化(ai=0a_i=0)。

aia_i(杆件长度)与 αi\alpha_i(杆件扭角)恒为常数;did_i 与 ϑi\vartheta_i 中恰有一个是变量,由关节类型决定(转动 qi=ϑiq_i=\vartheta_i、移动 qi=diq_i=d_i)——这就是「3 常 1 变」。

2.8 小结与常见错误

  • 一条流水线:编号 → 建系(四规则 + 能零则零)→ 填 4n 参数表(3 常 1 变)→ 逐个写 Aii−1A_i^{i-1} → 连乘 Tn0T_n^0 → 串常值变换。相邻坐标系的 6 个自由度,被杆约束压缩到 4 个参数。
  • 一个验证器:填完表先扫一遍——转动关节那一行的 did_i 应当是常数,移动关节那一行的 ϑi\vartheta_i 应当是常数;谁在变量位置上摇摆,谁的关节类型就读错了。
常见错误清单 · 自查四条
  1. 把 ziz_i 配错了关节——记住 zi−1z_{i-1} 沿关节 ii 的轴(看守模型见 先把「系到底挂在哪」说透:看守模型;「坐标系 ii 挂在关节 i+1i+1 上」最容易和「改进 DH」记法混淆,见勘误 E2.4);
  2. 丢掉 αi\alpha_i 的符号——绕 xix_i 逆时针为正,2.9 节球形臂的 −π/2-\pi/2 就是在这里翻的车(录播 1:19:38 老师:「正负号容易错」);
  3. 移动关节却让 ϑi\vartheta_i 当变量——变量只能有一个,判定关节类型的唯一依据是关节本身,而不是杆的形状;
  4. 把 Ten,Tb0T_e^n,T_b^0 忘在门外——Tn0T_n^0 给出的只是「杆 nn 坐标系」的位姿,末端执行器坐标系的常值串接(原书式 2.51)不可省。