几何雅可比的构造是一条流水线 ;这一节把这条流水线放到三种结构上试跑:三连杆平面臂(全转动、平面)、拟人臂(三转动、空间)和斯坦福机械手(五转一移、六自由度)。结构越复杂,越能显出「从 T T T 矩阵读取 z , p z,p z , p 」的威力——斯坦福机械手的雅可比没有人愿意手推,实际全部由符号计算完成。录播 1:12:12–1:23:42(1:23:39「以上是重点中的重点 」)。
方法 3.2.A · 雅可比计算的五步流程(三种结构共用)
按 DH 规则建立各连杆坐标系(第 2 章已练);
求解 DH 参数 a i , α i , d i , ϑ i a_i,\alpha_i,d_i,\vartheta_i a i , α i , d i , ϑ i (每行 3 常 1 变,定义 2.8.3 );
求 A i i − 1 A_i^{i-1} A i i − 1 与 T i 0 = A 1 0 ⋯ A i i − 1 T_i^0=A_1^0\cdots A_i^{i-1} T i 0 = A 1 0 ⋯ A i i − 1 (每个中间 T T T 都要保留 );
从 T i − 1 0 T_{i-1}^0 T i − 1 0 读 z i − 1 z_{i-1} z i − 1 (R i − 1 R_{i-1} R i − 1 第三列)与 p i − 1 p_{i-1} p i − 1 (第四列前三行);
按移动 / 转动列公式(定理 3.1.C )逐列组装 J J J 。
在逐列组装 J J J 之前,值得先单独看一眼这两种「积木列」的几何(下图):转动列的速度来自叉乘 ,方向天然垂直于矢径;移动列的速度就是轴本身,不产生转动——所有结构的雅可比都由这两类列拼装而成。
几何雅可比的两类列:转动关节与移动关节
左图俯视:转动关节绕指出纸面的 z 轴旋转,末端速度等于角速度叉乘矢径,方向在平面内垂直于矢径。右图侧视:移动关节沿轴平移,速度沿轴方向,角速度为零。
逐列组装的两类积木
转动关节 i(俯视,zi−1 指出纸面 ⊙)
移动关节 i(侧视)
pi−1 ,zi−1 ⊙
ϑ′i
r = pe −pi−1
v = zi−1 ×r
转动列 = [ zi−1 ×(pe −pi−1 ) ; zi−1 ]:速度 ⊥ 矢径(平面内),随 r 增大而增大
zi−1
v = zi−1 ·d′i
滑鞍沿轴平移
移动列 = [ zi−1 ; 0 ]:只平移、不转动(ω = 0)
「锁死其余关节、单位速度驱动第 i 关节」:全部雅可比列都由这两类积木拼成
两类雅可比列的几何(本教程绘):转动列 的速度项 z i − 1 × ( p e − p i − 1 ) z_{i-1}\times(p_e-p_{i-1}) z i − 1 × ( p e − p i − 1 ) 在俯视图里一目了然——永远垂直于矢径,离轴越远越大;移动列 则只有平移项 z i − 1 z_{i-1} z i − 1 ,角速度行恒为零。「锁死其余关节、单位速度驱动第 i 关节」的逐列物理图像,见 3.1 的绿框图(定理 3.1.C );2.9 节中,各结构的 z i − 1 , p i − 1 z_{i-1},p_{i-1} z i − 1 , p i − 1 都能从中间 T T T 矩阵直接读出,读出后逐列套用即可。
三个转动关节,四个轴全部竖直且互相平行(平面结构);a i a_i a i 即三根杆长,α i = d i = 0 \alpha_i=d_i=0 α i = d i = 0 :
A i i − 1 ( ϑ i ) = [ c i − s i 0 a i c i s i c i 0 a i s i 0 0 1 0 0 0 0 1 ] , T i 0 = A 1 0 ⋯ A i i − 1 A_i^{i-1}(\vartheta_i)=\begin{bmatrix}c_i&-s_i&0&a_ic_i\ s_i&c_i&0&a_is_i\ 0&0&1&0\ 0&0&0&1\end{bmatrix},\qquad T_i^0=A_1^0\cdots A_i^{i-1} A i i − 1 ( ϑ i ) = c i s i 0 0 − s i c i 0 0 0 0 1 0 a i c i a i s i 0 1 , T i 0 = A 1 0 ⋯ A i i − 1
这几个量可以直读结构得到(不必乘出矩阵也能看出来):所有 z z z 轴竖直平行,
z 0 = z 1 = z 2 = [ 0 , 0 , 1 ] T ; p 0 = [ 0 , 0 , 0 ] T , p 1 = [ a 1 c 1 , a 1 s 1 , 0 ] T , p 2 = [ a 1 c 1 + a 2 c 12 , a 1 s 1 + a 2 s 12 , 0 ] T z_0=z_1=z_2=[0,0,1]^{\mathrm T};\qquad p_0=[0,0,0]^{\mathrm T},\ p_1=[a_1c_1,a_1s_1,0]^{\mathrm T},\ p_2=[a_1c_1+a_2c_{12},\ a_1s_1+a_2s_{12},\ 0]^{\mathrm T} z 0 = z 1 = z 2 = [ 0 , 0 , 1 ] T ; p 0 = [ 0 , 0 , 0 ] T , p 1 = [ a 1 c 1 , a 1 s 1 , 0 ] T , p 2 = [ a 1 c 1 + a 2 c 12 , a 1 s 1 + a 2 s 12 , 0 ] T
(c 12 = cos ( ϑ 1 + ϑ 2 ) c_{12}=\cos(\vartheta_1+\vartheta_2) c 12 = cos ( ϑ 1 + ϑ 2 ) ,下同)。三列全部取转动列 ,叉乘按 [ 0 , 0 , 1 ] × [ x , y , 0 ] = [ − y , x , 0 ] [0,0,1]\times[x,y,0]=[-y,x,0] [ 0 , 0 , 1 ] × [ x , y , 0 ] = [ − y , x , 0 ] 逐列算出:
J = [ − a 1 s 1 − a 2 s 12 − a 3 s 123 − a 2 s 12 − a 3 s 123 − a 3 s 123 a 1 c 1 + a 2 c 12 + a 3 c 123 a 2 c 12 + a 3 c 123 a 3 c 123 0 0 0 0 0 0 0 0 0 1 1 1 ] J=\begin{bmatrix} -a_1s_1-a_2s_{12}-a_3s_{123}&-a_2s_{12}-a_3s_{123}&-a_3s_{123}\ a_1c_1+a_2c_{12}+a_3c_{123}&a_2c_{12}+a_3c_{123}&a_3c_{123}\ 0&0&0\ 0&0&0\ 0&0&0\ 1&1&1 \end{bmatrix} J = − a 1 s 1 − a 2 s 12 − a 3 s 123 a 1 c 1 + a 2 c 12 + a 3 c 123 0 0 0 1 − a 2 s 12 − a 3 s 123 a 2 c 12 + a 3 c 123 0 0 0 1 − a 3 s 123 a 3 c 123 0 0 0 1
平面任务既不涉及 z z z 向平动,也不涉及 x , y x,y x , y 向转动,因此只取有效行 (前两行 + 末行),得到 3 × 3 3\times3 3 × 3 任务雅可比(1:15:50「平面情形只取前两行;如需 ω z \omega_z ω z 再加末行」):
J ˉ = [ − a 1 s 1 − a 2 s 12 − a 3 s 123 − a 2 s 12 − a 3 s 123 − a 3 s 123 a 1 c 1 + a 2 c 12 + a 3 c 123 a 2 c 12 + a 3 c 123 a 3 c 123 1 1 1 ] \bar J=\begin{bmatrix} -a_1s_1-a_2s_{12}-a_3s_{123}&-a_2s_{12}-a_3s_{123}&-a_3s_{123}\ a_1c_1+a_2c_{12}+a_3c_{123}&a_2c_{12}+a_3c_{123}&a_3c_{123}\ 1&1&1 \end{bmatrix} J ˉ = − a 1 s 1 − a 2 s 12 − a 3 s 123 a 1 c 1 + a 2 c 12 + a 3 c 123 1 − a 2 s 12 − a 3 s 123 a 2 c 12 + a 3 c 123 1 − a 3 s 123 a 3 c 123 1
同样是三个转动关节,区别在于第一个关节带 π / 2 \pi/2 π /2 扭转(肩部),后两个关节的轴水平且互相平行:
i i i a i a_i a i α i \alpha_i α i d i d_i d i ϑ i \vartheta_i ϑ i
1 0 π / 2 \pi/2 π /2 0 ϑ 1 \vartheta_1 ϑ 1
2 a 2 a_2 a 2 0 0 ϑ 2 \vartheta_2 ϑ 2
3 a 3 a_3 a 3 0 0 ϑ 3 \vartheta_3 ϑ 3
A 1 0 = [ c 1 0 s 1 0 s 1 0 − c 1 0 0 1 0 0 0 0 0 1 ] , A i i − 1 = [ c i − s i 0 a i c i s i c i 0 a i s i 0 0 1 0 0 0 0 1 ] ( i = 2 , 3 ) A_1^0=\begin{bmatrix}c_1&0&s_1&0\ s_1&0&-c_1&0\ 0&1&0&0\ 0&0&0&1\end{bmatrix},\qquad A_i^{i-1}=\begin{bmatrix}c_i&-s_i&0&a_ic_i\ s_i&c_i&0&a_is_i\ 0&0&1&0\ 0&0&0&1\end{bmatrix}\ (i=2,3) A 1 0 = c 1 s 1 0 0 0 0 1 0 s 1 − c 1 0 0 0 0 0 1 , A i i − 1 = c i s i 0 0 − s i c i 0 0 0 0 1 0 a i c i a i s i 0 1 ( i = 2 , 3 )
把三个变换连乘起来,逐一读出:
z 0 = [ 0 , 0 , 1 ] T , z 1 = z 2 = [ s 1 , − c 1 , 0 ] T ( 水平,随肩转动 ) z_0=[0,0,1]^{\mathrm T},\qquad z_1=z_2=[s_1,-c_1,0]^{\mathrm T}\ (\text{水平,随肩转动}) z 0 = [ 0 , 0 , 1 ] T , z 1 = z 2 = [ s 1 , − c 1 , 0 ] T ( 水平,随肩转动 )
p 0 = p 1 = [ 0 , 0 , 0 ] T , p 2 = [ a 2 c 1 c 2 , a 2 s 1 c 2 , a 2 s 2 ] T , p 3 = p 2 + a 3 [ c 1 c 23 , s 1 c 23 , s 23 ] T p_0=p_1=[0,0,0]^{\mathrm T},\quad p_2=[a_2c_1c_2,\ a_2s_1c_2,\ a_2s_2]^{\mathrm T},\quad p_3=p_2+a_3,[c_1c_{23},\ s_1c_{23},\ s_{23}]^{\mathrm T} p 0 = p 1 = [ 0 , 0 , 0 ] T , p 2 = [ a 2 c 1 c 2 , a 2 s 1 c 2 , a 2 s 2 ] T , p 3 = p 2 + a 3 [ c 1 c 23 , s 1 c 23 , s 23 ] T
「z 1 z_1 z 1 跟 z 0 z_0 z 0 就不一样了——z 1 , z 2 z_1,z_2 z 1 , z 2 平行、都是水平的」(1:18:27)。逐列组装时,叉乘按 [ s 1 , − c 1 , 0 ] × [ X , Y , Z ] = [ − c 1 Z , − s 1 Z , s 1 Y + c 1 X ] [s_1,-c_1,0]\times[X,Y,Z]=[-c_1Z,,-s_1Z,,s_1Y+c_1X] [ s 1 , − c 1 , 0 ] × [ X , Y , Z ] = [ − c 1 Z , − s 1 Z , s 1 Y + c 1 X ] 进行;组装完成后会发现,六行中只有三行线性无关 ——秩最多等于列数 3,而 ω x , ω y \omega_x,\omega_y ω x , ω y 两个分量经由 ϑ ˙ 2 , ϑ ˙ 3 \dot\vartheta_2,\dot\vartheta_3 ϑ ˙ 2 , ϑ ˙ 3 耦合在一起,并不独立。于是经行变换取出「关节速度 → 末端线速度 」的 3 × 3 3\times3 3 × 3 块:
J ˉ = [ − s 1 ( a 2 c 2 + a 3 c 23 ) − c 1 ( a 2 s 2 + a 3 s 23 ) − c 1 a 3 s 23 c 1 ( a 2 c 2 + a 3 c 23 ) − s 1 ( a 2 s 2 + a 3 s 23 ) − s 1 a 3 s 23 0 a 2 c 2 + a 3 c 23 a 3 c 23 ] \bar J=\begin{bmatrix} -s_1(a_2c_2+a_3c_{23})&-c_1(a_2s_2+a_3s_{23})&-c_1a_3s_{23}\ c_1(a_2c_2+a_3c_{23})&-s_1(a_2s_2+a_3s_{23})&-s_1a_3s_{23}\ 0&a_2c_2+a_3c_{23}&a_3c_{23} \end{bmatrix} J ˉ = − s 1 ( a 2 c 2 + a 3 c 23 ) c 1 ( a 2 c 2 + a 3 c 23 ) 0 − c 1 ( a 2 s 2 + a 3 s 23 ) − s 1 ( a 2 s 2 + a 3 s 23 ) a 2 c 2 + a 3 c 23 − c 1 a 3 s 23 − s 1 a 3 s 23 a 3 c 23
(注意第三行是余弦 组合——该行在转写中一度被误读成正弦,本编按课件绿框、教材式 (3.37)–(3.38) 与数值差分三源核对后,采用余弦,见勘误 E3.1 。)取行列式,并按第一列展开(c 1 2 + s 1 2 = 1 c_1^2+s_1^2=1 c 1 2 + s 1 2 = 1 三次消去):
det J ˉ = − a 2 a 3 s 3 ( a 2 c 2 + a 3 c 23 ) \det\bar J=-a_2a_3,s_3,(a_2c_2+a_3c_{23}) det J ˉ = − a 2 a 3 s 3 ( a 2 c 2 + a 3 c 23 )
两个因子各自为零,正对应拟人臂的两类奇点:s 3 = 0 s_3=0 s 3 = 0 (肘伸直 / 折回,边界奇点)与 a 2 c 2 + a 3 c 23 = 0 a_2c_2+a_3c_{23}=0 a 2 c 2 + a 3 c 23 = 0 (腕点落到 z 0 z_0 z 0 轴上,肩奇点)——与 3.3 的解耦分析逐条对应(习题 B2)。
为什么敢「丢三行」
雅可比的行 对应操作空间的速度分量,列 对应关节(0:21:46)。拟人臂只有 3 个自由度,在 6 维操作空间里至多张出 3 维子空间;因此丢掉相关的行并不损失信息,保留下来的三行(v x , v y , v z v_x,v_y,v_z v x , v y , v z )恰好构成「臂部」的有效映射。这一「按任务取行」的思想,到 3.4 的冗余分析里就是正式工具了。
六个关节中只有关节 3 是移动关节 ,其余五个都是转动关节(臂部:肩摆 + 肘转 + 伸缩;腕部:三轴汇交):
i i i a i a_i a i α i \alpha_i α i d i d_i d i ϑ i \vartheta_i ϑ i
1 0 − π / 2 -\pi/2 − π /2 0 ϑ 1 \vartheta_1 ϑ 1
2 0 π / 2 \pi/2 π /2 d 2 d_2 d 2 ϑ 2 \vartheta_2 ϑ 2
3 0 0 d 3 d_3 d 3 —(移动)
4 0 − π / 2 -\pi/2 − π /2 0 ϑ 4 \vartheta_4 ϑ 4
5 0 π / 2 \pi/2 π /2 0 ϑ 5 \vartheta_5 ϑ 5
6 0 0 d 6 d_6 d 6 ϑ 6 \vartheta_6 ϑ 6
要注意,六个相邻变换各不相同 ——「每个都不一样,不能用通式」(1:21:25):
A 1 0 = [ c 1 0 − s 1 0 s 1 0 c 1 0 0 − 1 0 0 0 0 0 1 ] , A 2 1 = [ c 2 0 s 2 0 s 2 0 − c 2 0 0 1 0 d 2 0 0 0 1 ] , A 3 2 = [ 1 0 0 0 0 1 0 0 0 0 1 d 3 0 0 0 1 ] , A_1^0=\begin{bmatrix}c_1&0&-s_1&0\ s_1&0&c_1&0\ 0&-1&0&0\ 0&0&0&1\end{bmatrix},\ A_2^1=\begin{bmatrix}c_2&0&s_2&0\ s_2&0&-c_2&0\ 0&1&0&d_2\ 0&0&0&1\end{bmatrix},\ A_3^2=\begin{bmatrix}1&0&0&0\ 0&1&0&0\ 0&0&1&d_3\ 0&0&0&1\end{bmatrix}, A 1 0 = c 1 s 1 0 0 0 0 − 1 0 − s 1 c 1 0 0 0 0 0 1 , A 2 1 = c 2 s 2 0 0 0 0 1 0 s 2 − c 2 0 0 0 0 d 2 1 , A 3 2 = 1 0 0 0 0 1 0 0 0 0 1 0 0 0 d 3 1 ,
A 4 3 = [ c 4 0 − s 4 0 s 4 0 c 4 0 0 − 1 0 0 0 0 0 1 ] , A 5 4 = [ c 5 0 s 5 0 s 5 0 − c 5 0 0 1 0 0 0 0 0 1 ] , A 6 5 = [ c 6 − s 6 0 0 s 6 c 6 0 0 0 0 1 d 6 0 0 0 1 ] A_4^3=\begin{bmatrix}c_4&0&-s_4&0\ s_4&0&c_4&0\ 0&-1&0&0\ 0&0&0&1\end{bmatrix},\ A_5^4=\begin{bmatrix}c_5&0&s_5&0\ s_5&0&-c_5&0\ 0&1&0&0\ 0&0&0&1\end{bmatrix},\ A_6^5=\begin{bmatrix}c_6&-s_6&0&0\ s_6&c_6&0&0\ 0&0&1&d_6\ 0&0&0&1\end{bmatrix} A 4 3 = c 4 s 4 0 0 0 0 − 1 0 − s 4 c 4 0 0 0 0 0 1 , A 5 4 = c 5 s 5 0 0 0 0 1 0 s 5 − c 5 0 0 0 0 0 1 , A 6 5 = c 6 s 6 0 0 − s 6 c 6 0 0 0 0 1 0 0 0 d 6 1
连乘 T 1 0 = A 1 0 , T 2 0 = A 1 0 A 2 1 , … , T 6 0 = A 1 0 ⋯ A 6 5 T_1^0=A_1^0,\ T_2^0=A_1^0A_2^1,\ \dots,\ T_6^0=A_1^0\cdots A_6^5 T 1 0 = A 1 0 , T 2 0 = A 1 0 A 2 1 , … , T 6 0 = A 1 0 ⋯ A 6 5 ,然后逐个读取;读取时优先利用结构特征,而不是硬算:
p 0 = p 1 = [ 0 , 0 , 0 ] T p_0=p_1=[0,0,0]^{\mathrm T} p 0 = p 1 = [ 0 , 0 , 0 ] T ;p 3 = p 4 = p 5 p_3=p_4=p_5 p 3 = p 4 = p 5 (腕中心 ,三腕轴汇交,与 2.12 解耦点同一位置);p 6 p_6 p 6 最复杂(含 d 6 d_6 d 6 工具偏置);
z 0 = [ 0 , 0 , 1 ] T z_0=[0,0,1]^{\mathrm T} z 0 = [ 0 , 0 , 1 ] T ;z 1 z_1 z 1 沿肩轴水平;z 2 = z 3 = [ c 1 s 2 , s 1 s 2 , c 2 ] T z_2=z_3=[c_1s_2,\ s_1s_2,\ c_2]^{\mathrm T} z 2 = z 3 = [ c 1 s 2 , s 1 s 2 , c 2 ] T (伸缩方向);z 4 , z 5 z_4,z_5 z 4 , z 5 表达式最长。
组装时,第 3 列取移动列 ,其余各列取转动列 ,得到 6 × 6 6\times6 6 × 6 几何雅可比:
J = [ z 0 × ( p 6 − p 0 ) z 1 × ( p 6 − p 1 ) z 2 z 3 × ( p 6 − p 3 ) z 4 × ( p 6 − p 4 ) z 5 × ( p 6 − p 5 ) z 0 z 1 0 z 3 z 4 z 5 ] J=\begin{bmatrix} z_0\times(p_6-p_0)&z_1\times(p_6-p_1)&z_2&z_3\times(p_6-p_3)&z_4\times(p_6-p_4)&z_5\times(p_6-p_5)\ z_0&z_1&0&z_3&z_4&z_5 \end{bmatrix} J = [ z 0 × ( p 6 − p 0 ) z 0 z 1 × ( p 6 − p 1 ) z 1 z 2 0 z 3 × ( p 6 − p 3 ) z 3 z 4 × ( p 6 − p 4 ) z 4 z 5 × ( p 6 − p 5 ) z 5 ]
「这个计算过程不是手推的」(1:20:13)
符号推导「都是 MATLAB 来写的,表达式非常复杂,很多 sin、cos 在合成,计算量很大;实际应用中都是写代码。人手推也能做出来,但非常花时间。」本编已把三个结构的雅可比全部做了中心差分数值验证 并入库(tools/verify_ch03_jac.py,make verify)——这也是读者自查任何雅可比的通用手段(习题 C1)。
[1:23:39] 「以上是重点中的重点。」 ——几何雅可比的推导与构造到此收束;接下来要看的,是它的「病理学」(奇点)与「超定 / 欠定学」(冗余)。
默写点 · 合上书再写(主动回忆)
不看正文与速查卡,先把下面几条写出来,再展开核对。写不出来,就说明这一节还没有真正「拿走」。
默写雅可比计算五步。
斯坦福机械手的第 3 列为什么取移动列,而不取转动列?
平面臂的雅可比哪几行恒为零?为什么?
核对
建系 → 填 DH 表 → 连乘得 T i 0 T_i^0 T i 0 → 读 z i − 1 z_{i-1} z i − 1 与 p i − 1 \boldsymbol p_{i-1} p i − 1 → 逐列组装。
q 3 = d 3 q_3=d_3 q 3 = d 3 是移动 关节,故 J 3 = [ z 2 ; 0 ] J_3=[z_2;\ \boldsymbol 0] J 3 = [ z 2 ; 0 ] ——角速度行是零。把这一列错写成转动列,是本节最常见的错误。
第三、四、五行恒为零(平面运动没有 z z z 向线速度、x x x /y y y 向角速度);讨论行列式与秩之前,应先把有效行 选出来。
一条主线 :五步流水线(建系 → 填表 → 连乘 → 读取 → 组装)。平面臂完全可以看结构直读 z , p z,p z , p ,空间臂要老老实实走流水线,斯坦福机械手则交给符号计算。
两个结构规律 :腕三轴汇交 ⇒ p 3 = p 4 = p 5 p_3=p_4=p_5 p 3 = p 4 = p 5 (腕中心);平行轴族 ⇒ 对应的 z z z 相等,经行变换后可以降维。
常见错误清单 · 自查三条
斯坦福第 3 列误取转动列——q 3 = d 3 q_3=d_3 q 3 = d 3 是移动 关节,J 3 = [ z 2 0 ] J_3=\begin{bmatrix}z_2\\0\end{bmatrix} J 3 = [ z 2 0 ] ,角速度行是零;
拟人臂忘了 z 1 ≠ z 0 z_1\neq z_0 z 1 = z 0 ——肩部 π / 2 \pi/2 π /2 扭转后,关节 2、3 的轴水平([ s 1 , − c 1 , 0 ] T [s_1,-c_1,0]^{\mathrm T} [ s 1 , − c 1 , 0 ] T ),不随 ϑ 2 , ϑ 3 \vartheta_2,\vartheta_3 ϑ 2 , ϑ 3 改变,却随 ϑ 1 \vartheta_1 ϑ 1 改变;
平面臂保留全部六行去做运算——第三、四、五行恒为零,应当先选出有效行 ,再谈行列式与秩。