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-4 / 2-12 / 2-19(附详细解答与验算)

作业信息(据录播与课件)
  • 题号:教材第 2 章习题 2-4、2-12、2-19(课堂 PPT 末页「作业:2-4, 2-12, 2-19」,录播 2:12:36 展示);
  • 提交:智学北航 → 我的课 → 进入课程 → 课程作业栏目(平台已建作业条目并标注截止时间);
  • 截止:当周周日 24:00 前(录播 1:19:40 与 2:16:49 两次重申);
  • 计分:平时分 = 考勤 + 作业;缺交扣分、做错不扣分——「只要交了就有分,目的是认真做,不要抄」(录播 1:21:36–1:22:00)。

三题正好串成本章主线的一条链:2-4 验证姿态表示的核心公式 → 2-12 用 DH 法建立正运动学 → 2-19 反过来求逆解。下文每题给「题目 → 思路 → 详细推导 → 结果 → 验算 → 易错点」,全部结论已与官方解答手册(Solution Manual, Springer 2009,Problem 2.4 / 2.12 / 2.19)逐项核对,并通过 2 万组随机数值实验。

2-4 · 验证绕任意轴旋转的旋转矩阵由式(2.25)给出

题目原文(教材 p.75 第 2.4 题,逐字):

2.4 验证绕任意轴旋转一定角度所对应的旋转矩阵由式(2.25)给出。

思路:式(2.25)是结论,式(2.24)的五步合成是已知。所以只需把五步合成算到底,看是否等于式(2.25)。关键是三步:① 把五步写成「相似变换」MRz(ϑ)MTMR_z(\vartheta)M^T;② 认出 MM 的第三列恰是旋转轴 r\boldsymbol r;③ 证明反对称部分等于叉积矩阵 [r]×[\boldsymbol r]_\times。

与正文的关系

正文 2.5.1 已把这条推导完整写出(含「旋转保持叉积 → 共轭恒等式」的工具化版本);本作业要求你独立复现并数值验算——同一件事,作业走「逐元素硬乘」路线,正文走「共轭恒等式搬运」路线,两相对照更能看清哪些是机械计算、哪些是结构。

详细推导

第 0 步:把 α、β 用 r 的分量写出。 由式(2.24)的几何(图 2.10),r\boldsymbol r 的球坐标分解给出

sin⁡α=ryrx2+ry2,cos⁡α=rxrx2+ry2,sin⁡β=rx2+ry2,cos⁡β=rz.(1)\sin\alpha=\frac{r_y}{\sqrt{r_x^2+r_y^2}},\quad \cos\alpha=\frac{r_x}{\sqrt{r_x^2+r_y^2}},\qquad \sin\beta=\sqrt{r_x^2+r_y^2},\quad \cos\beta=r_z .\tag{1}

第 1 步:合并前两个因子。 记

M=Rz(α)Ry(β)=[cαcβ−sαcαsβsαcβcαsαsβ−sβ0cβ],M=R_z(\alpha)R_y(\beta)=\begin{bmatrix}c_\alpha c_\beta & -s_\alpha & c_\alpha s_\beta\ s_\alpha c_\beta & c_\alpha & s_\alpha s_\beta\ -s_\beta & 0 & c_\beta\end{bmatrix},

则式(2.24)可写成相似变换(因为 Ry(−β)Rz(−α)=MTR_y(-\beta)R_z(-\alpha)=M^T):

R(ϑ,r)=M Rz(ϑ) MT.(2)R(\vartheta,\boldsymbol r)=M,R_z(\vartheta),M^T .\tag{2}

第 2 步:认出 MM 的第三列就是 r\boldsymbol r。 把式(1)代入 MM 的第三列:

M:,3=[cαsβsαsβcβ]=[rxrx2+ry2⋅rx2+ry2ryrx2+ry2⋅rx2+ry2rz]=[rxryrz]=r.M_{:,3}=\begin{bmatrix}c_\alpha s_\beta\ s_\alpha s_\beta\ c_\beta\end{bmatrix} =\begin{bmatrix}\dfrac{r_x}{\sqrt{r_x^2+r_y^2}}\cdot\sqrt{r_x^2+r_y^2}\[2mm] \dfrac{r_y}{\sqrt{r_x^2+r_y^2}}\cdot\sqrt{r_x^2+r_y^2}\[2mm] r_z\end{bmatrix} =\begin{bmatrix}r_x\ r_y\ r_z\end{bmatrix}=\boldsymbol r .

这就是「绕 r\boldsymbol r 转」被编码进 MM 的地方——MM 正是把 z\boldsymbol z 轴转到 r\boldsymbol r 的那次旋转。

第 3 步:展开相似变换。 记 M=[m1 m2 m3]M=[\boldsymbol m_1\ \boldsymbol m_2\ \boldsymbol m_3](按列分块)。由 (2):

R=MRz(ϑ)MT=[cϑm1+sϑm2, −sϑm1+cϑm2, m3]MT=cϑ(m1m1T+m2m2T)+sϑ(m2m1T−m1m2T)+m3m3T.R = M R_z(\vartheta) M^T = \big[c_\vartheta\boldsymbol m_1+s_\vartheta\boldsymbol m_2,\ -s_\vartheta\boldsymbol m_1+c_\vartheta\boldsymbol m_2,\ \boldsymbol m_3\big]M^T = c_\vartheta(\boldsymbol m_1\boldsymbol m_1^T+\boldsymbol m_2\boldsymbol m_2^T)+s_\vartheta(\boldsymbol m_2\boldsymbol m_1^T-\boldsymbol m_1\boldsymbol m_2^T)+\boldsymbol m_3\boldsymbol m_3^T .

因 MM 正交,m1m1T+m2m2T=I−m3m3T=I−rrT\boldsymbol m_1\boldsymbol m_1^T+\boldsymbol m_2\boldsymbol m_2^T=I-\boldsymbol m_3\boldsymbol m_3^T=I-\boldsymbol r\boldsymbol r^T,于是

R(ϑ,r)=cϑI+(1−cϑ) rrT+sϑ(m2m1T−m1m2T)⏟=: S.(3)R(\vartheta,\boldsymbol r)=c_\vartheta I+(1-c_\vartheta),\boldsymbol r\boldsymbol r^T+s_\vartheta\underbrace{(\boldsymbol m_2\boldsymbol m_1^T-\boldsymbol m_1\boldsymbol m_2^T)}_{=:,S}.\tag{3}

第 4 步:证明 S=[r]×S=[\boldsymbol r]_\times。 由 m1=[cαcβ, sαcβ, −sβ]T\boldsymbol m_1=[c_\alpha c_\beta,\ s_\alpha c_\beta,\ -s_\beta]^T、m2=[−sα, cα, 0]T\boldsymbol m_2=[-s_\alpha,\ c_\alpha,\ 0]^T 逐元素计算:

(i,j)(i,j)(m2m1T)ij−(m1m2T)ij(m_2\boldsymbol m_1^T)_{ij}-(\boldsymbol m_1\boldsymbol m_2^T)_{ij}代入 (1)[r]×[\boldsymbol r]_\times 对应元
(1,1)−sαcαcβ+sαcαcβ-s_\alpha c_\alpha c_\beta+s_\alpha c_\alpha c_\beta0000 √
(1,2)−sα2cβ−cα2cβ=−cβ(sα2+cα2)-s_\alpha^2 c_\beta-c_\alpha^2 c_\beta=-c_\beta(s_\alpha^2+c_\alpha^2)−rz-r_z−rz-r_z √
(1,3)sαsβs_\alpha s_\betaryr_yryr_y √
(2,1)cα2cβ+sα2cβ=cβc_\alpha^2 c_\beta+s_\alpha^2 c_\beta=c_\betarzr_zrzr_z √
(2,3)−cαsβ-c_\alpha s_\beta−rx-r_x−rx-r_x √
(3,1)−sαsβ-s_\alpha s_\beta−ry-r_y−ry-r_y √
(3,2)cαsβc_\alpha s_\betarxr_xrxr_x √

即 S=[r]×=[0−rzryrz0−rx−ryrx0]S=[\boldsymbol r]_\times=\begin{bmatrix}0&-r_z&r_y\ r_z&0&-r_x\ -r_y&r_x&0\end{bmatrix},其余对角元与 (2,2)、(3,3) 同理为零。

第 5 步:展开得式(2.25)。 把 (3) 写成分量:

R(ϑ,r)=[rx2(1−cϑ)+cϑrxry(1−cϑ)−rzsϑrxrz(1−cϑ)+rysϑrxry(1−cϑ)+rzsϑry2(1−cϑ)+cϑryrz(1−cϑ)−rxsϑrxrz(1−cϑ)−rysϑryrz(1−cϑ)+rxsϑrz2(1−cϑ)+cϑ]R(\vartheta,\boldsymbol r)=\begin{bmatrix} r_x^2(1-c_\vartheta)+c_\vartheta & r_xr_y(1-c_\vartheta)-r_zs_\vartheta & r_xr_z(1-c_\vartheta)+r_ys_\vartheta\ r_xr_y(1-c_\vartheta)+r_zs_\vartheta & r_y^2(1-c_\vartheta)+c_\vartheta & r_yr_z(1-c_\vartheta)-r_xs_\vartheta\ r_xr_z(1-c_\vartheta)-r_ys_\vartheta & r_yr_z(1-c_\vartheta)+r_xs_\vartheta & r_z^2(1-c_\vartheta)+c_\vartheta \end{bmatrix}

正是式(2.25)。□

官方解答手册走的是等价的代数路线

手册(Solution Manual p.3)直接把 Rz(α)Ry(β)R_z(\alpha)R_y(\beta)、Rz(α)Ry(β)Rz(ϑ)R_z(\alpha)R_y(\beta)R_z(\vartheta) 乘开,再用 Ry(−β)Rz(−α)=(Rz(α)Ry(β))TR_y(-\beta)R_z(-\alpha)=(R_z(\alpha)R_y(\beta))^T 得同一个矩阵,最后代入 (1) 整理。本教程的「相似变换 + M:,3=rM_{:,3}=\boldsymbol r + S=[r]×S=[\boldsymbol r]_\times」写法与它完全等价,但把「为什么第三列是 r\boldsymbol r」这一步显式化了——这正是式(2.25)成立的几何内核。

验算

2 万组随机 (ϑ,r)(\vartheta,\boldsymbol r)(r\boldsymbol r 随机方向、ϑ∈(−π,π)\vartheta\in(-\pi,\pi)),比对式(2.25)与式(2.24)五步合成、以及手册的 (sα,cα,sβ,cβ)(s_\alpha,c_\alpha,s_\beta,c_\beta) 形式:

检验项最大偏差结论
式(2.25) ≡ 式(2.24) 五步合成1.1×10−151.1\times10^{-15}机器精度内相等
式(2.25) ≡ 官方手册形式6.1×10−166.1\times10^{-16}三方一致
Rr=rR\boldsymbol r=\boldsymbol r(轴不变)1.1×10−151.1\times10^{-15}√
RTR=IR^TR=I、det⁡R=+1\det R=+12.0×10−152.0\times10^{-15}√
tr⁡R=1+2cos⁡ϑ\operatorname{tr}R=1+2\cos\vartheta1.1×10−151.1\times10^{-15}√(式 2.27 的自洽性)
R(−ϑ,−r)=R(ϑ,r)R(-\vartheta,-\boldsymbol r)=R(\vartheta,\boldsymbol r)00√(式 2.26 不唯一性)
ϑ=0⇒R=I\vartheta=0\Rightarrow R=I;ϑ=π⇒R=2rrT−I\vartheta=\pi\Rightarrow R=2\boldsymbol r\boldsymbol r^T-I≤10−16\le10^{-16}√ 特例
两个易错点
  1. 符号:SS 的反对称项符号取决于 [r]×[\boldsymbol r]_\times 的约定(本课程取 [r]×p=r×p[\boldsymbol r]_\times\boldsymbol p=\boldsymbol r\times\boldsymbol p)。若把 sϑs_\vartheta 项的符号写反,得到的是绕 −r-\boldsymbol r 转 ϑ\vartheta——而由 R(−ϑ,−r)=R(ϑ,r)R(-\vartheta,-\boldsymbol r)=R(\vartheta,\boldsymbol r),错号等价于把 r\boldsymbol r 取反,在同一组随机测试里能立刻暴露。
  2. sin⁡ϑ=0\sin\vartheta=0 的反解:由 RR 反解 (ϑ,r)(\vartheta,\boldsymbol r) 用式(2.28)要除以 2sin⁡ϑ2\sin\vartheta,ϑ→0,π\vartheta\to0,\pi 时病态(数值实验中 ∣sin⁡ϑ∣≤10−2|\sin\vartheta|\le10^{-2} 的 143 组偏差放大到 10−710^{-7},良态区仅 10−1210^{-12})——这就是教程 定理 2.5.B 说的失效情形,ϑ=0\vartheta=0 时轴任意、ϑ=π\vartheta=\pi 时须另用对称部分求轴。

2-12 · 圆柱形臂的正运动学

题目原文(教材 p.75 第 2.12 题,逐字):

2.12 列出如图 2.35 中的圆柱形臂的正运动学方程。

原题图 2.35(教材扫描,p.75):

结构:关节 1 绕竖直轴 z0z_0 转动(ϑ1\vartheta_1);关节 2 沿竖直方向移动(d2d_2);关节 3 沿水平径向移动(d3d_3)。末端位置由柱坐标 (d3,ϑ1,d2)(d_3,\vartheta_1,d_2) 决定——这正是「圆柱形」得名的原因。

俯视图(xy 平面) x0 y0 零位(ϑ1=0) 末端 P d3 ϑ1 p_x p_y 侧视图(竖直面) 径向 z0 d2 P d3 绕 z0 转 ϑ1
圆柱形臂的关节配置:转动关节 ϑ1\vartheta_1(绕 z0z_0)+ 竖直移动 d2d_2 + 径向移动 d3d_3。末端位置 px=−d3sin⁡ϑ1p_x=-d_3\sin\vartheta_1、py=d3cos⁡ϑ1p_y=d_3\cos\vartheta_1、pz=d2p_z=d_2(本教程自绘示意,对照原书图 2.35)。

详细推导

第 1 步:建系。 按 DH 建系四规则 的四规则建连杆坐标系:z0z_0 沿关节 1 转轴(竖直);z1z_1 沿关节 2 的移动方向(竖直,与 z0z_0 同向);因关节 3 沿水平径向移动,取 z2z_2 沿该径向、x2x_2 与之配合(故 α2=−π/2\alpha_2=-\pi/2)。

对照官方解答手册的建系结果(Fig. S2.2,可见各系的 xi,yi,zix_i,y_i,z_i 与 ϑ1,d2,d3\vartheta_1,d_2,d_3 标注):

第 2 步:填 DH 参数表。

连杆 iiaia_iαi\alpha_idid_iϑi\vartheta_i
1000ϑ1\vartheta_1
20−π/2-\pi/2d2d_20
300d3d_30

读法:aia_i 全为 0(相邻 zz 轴皆相交或平行、公垂线长度为零——总原则:让参数尽量为零 的「能零则零」);α1=0\alpha_1=0(z0∥z1z_0\parallel z_1)、α2=−π/2\alpha_2=-\pi/2(z1→z2z_1\to z_2 由竖直转为水平)、α3=0\alpha_3=0(z2∥z3z_2\parallel z_3);关节 1 是转动型故 ϑ1\vartheta_1 是变量,关节 2、3 是移动型故 d2,d3d_2,d_3 是变量、对应角列为常数 0。

第 3 步:写各关节变换矩阵(代入 Aii−1A_i^{i-1}:从建系几何直接读出两步分解 的通式):

A10(ϑ1)=[c1−s100s1c10000100001],A21(d2)=[100000100−10d20001],A32(d3)=[10000100001d30001].A_1^0(\vartheta_1)=\begin{bmatrix}c_1&-s_1&0&0\ s_1&c_1&0&0\ 0&0&1&0\ 0&0&0&1\end{bmatrix},\quad A_2^1(d_2)=\begin{bmatrix}1&0&0&0\ 0&0&1&0\ 0&-1&0&d_2\ 0&0&0&1\end{bmatrix},\quad A_3^2(d_3)=\begin{bmatrix}1&0&0&0\ 0&1&0&0\ 0&0&1&d_3\ 0&0&0&1\end{bmatrix}.

(A21A_2^1 是 ϑ2=0\vartheta_2=0、α2=−π/2\alpha_2=-\pi/2 代入通式的结果:c2=1,s2=0,cα2=0,sα2=−1c_2=1,s_2=0,c_{\alpha_2}=0,s_{\alpha_2}=-1。)

第 4 步:连乘(原理 2.8.A)。先算后半段:

A21A32=[1000001d30−10d20001],A_2^1A_3^2=\begin{bmatrix}1&0&0&0\ 0&0&1&d_3\ 0&-1&0&d_2\ 0&0&0&1\end{bmatrix},

再左乘 A10A_1^0:

  T30(q)=A10A21A32=[c10−s1−d3s1s10c1d3c10−10d20001],q=[ϑ1 d2 d3]T.  \boxed{;T_3^0(\boldsymbol q)=A_1^0A_2^1A_3^2=\begin{bmatrix} c_1 & 0 & -s_1 & -d_3s_1\ s_1 & 0 & c_1 & d_3c_1\ 0 & -1 & 0 & d_2\ 0&0&0&1 \end{bmatrix},\qquad \boldsymbol q=[\vartheta_1\ d_2\ d_3]^T.;}

结果:末端执行器的位置与方向(n,s,a\boldsymbol n,\boldsymbol s,\boldsymbol a 为前三列)分别为

p=[−d3s1d3c1d2],n=[c1s10],s=[00−1],a=[−s1c10].\boldsymbol p=\begin{bmatrix}-d_3s_1\ d_3c_1\ d_2\end{bmatrix},\qquad \boldsymbol n=\begin{bmatrix}c_1\ s_1\ 0\end{bmatrix},\quad \boldsymbol s=\begin{bmatrix}0\ 0\ -1\end{bmatrix},\quad \boldsymbol a=\begin{bmatrix}-s_1\ c_1\ 0\end{bmatrix}.

几何解读:长度 d3d_3 的臂绕 z0z_0 转 ϑ1\vartheta_1 后指到径向;注意零位(ϑ1=0\vartheta_1=0)时 px=0,py=d3p_x=0,p_y=d_3——臂指向 +y0+y_0,这是本建系约定的产物(p=[0,d3,0]T\boldsymbol p=[0,d_3,0]^T 是把 [0,d3]T[0,d_3]^T 逆时针转 ϑ1\vartheta_1 的结果);zz 坐标只由 d2d_2 决定,与两个水平变量解耦;s=−z0\boldsymbol s=-\boldsymbol z_0 说明末端坐标系的 yy 轴朝下。

验算

检验项结果
DH 连乘 ≡ 上述闭式 T30T_3^0(2 万组随机 q\boldsymbol q)最大偏差 1.1×10−161.1\times10^{-16}
旋转块正交、det⁡=+1\det=+12.2×10−162.2\times10^{-16}
三个 AA 矩阵与官方手册逐项一致6.1×10−176.1\times10^{-17}
样例 q=[0.9, 0.35, 1.25]\boldsymbol q=[0.9,\ 0.35,\ 1.25]p=(−0.979159, 0.777012, 0.350000)\boldsymbol p=(-0.979159,\ 0.777012,\ 0.350000)(与 −d3s1,d3c1,d2-d_3s_1,d_3c_1,d_2 一致)
易错点
  1. α2\alpha_2 的符号:必须比划「从 z1z_1(竖直)绕 x2x_2 转到 z2z_2(水平径向)」的方向。取 +π/2+\pi/2 会得到 py=−d3c1p_y=-d_3c_1 一类结果——与官方手册差一个符号,这类错误在单元测试里会立刻暴露(见验算表第 1 行)。
  2. dd 列与 ϑ\vartheta 列:移动关节的变量必须写进 dd 列、ϑ\vartheta 列置常数 0;写成 ϑ2\vartheta_2 会连锁导致 A21A_2^1 用错形式。
  3. 零位方向:本题约定零位指向 +y0+y_0(故 px=−d3s1p_x=-d_3s_1 带负号)。不同教材/厂商的零位约定可能不同,答案的形式随约定变、物理内容不变——抄答案时要连约定一起抄。

2-19 · 圆柱形臂的逆运动学

题目原文(教材 p.76 第 2.19 题,逐字):

2.19 求解如图 2.35 中的圆柱形臂的逆运动学方程。

(原题图同 2-12 的图 2.35,见上。)

思路:正解位置式 p=[−d3s1, d3c1, d2]T\boldsymbol p=[-d_3s_1,\ d_3c_1,\ d_2]^T 已在上题得到,逆解就是对它做「平方求和 + 取比 + 直读」三步——注意 d3d_3 是移动关节的实际长度,有明确物理约束 d3≥0d_3\ge0,这一条恰好把解定成唯一。

详细推导

第 1 步:分离 d2d_2。 第三式只含 d2d_2:

d2=pz.d_2=p_z .

第 2 步:平方求和消去 ϑ1\vartheta_1。

px2+py2=d32(s12+c12)=d32  ⟹  d3=px2+py2(取 d3≥0 支).p_x^2+p_y^2=d_3^2(s_1^2+c_1^2)=d_3^2 ;\Longrightarrow; d_3=\sqrt{p_x^2+p_y^2}\quad(\text{取 }d_3\ge0\ \text{支}).

第 3 步:作比得 ϑ1\vartheta_1。 由 sin⁡ϑ1=−px/d3\sin\vartheta_1=-p_x/d_3、cos⁡ϑ1=py/d3\cos\vartheta_1=p_y/d_3(d3>0d_3>0 时两式可同除以 d3d_3):

ϑ1=Atan2⁡ ⁣(−pxd3, pyd3)=Atan2⁡(−px, py).\vartheta_1=\operatorname{Atan2}!\left(\frac{-p_x}{d_3},\ \frac{p_y}{d_3}\right)=\operatorname{Atan2}(-p_x,\ p_y).

用 Atan2 而非 arccos⁡\arccos 的理由见 原理 2.4.A(唯一化象限 + 精度均匀)。

结论 2.19 · 圆柱形臂的逆解

  ϑ1=Atan2⁡(−px, py),d3=px2+py2,d2=pz  \boxed{\;\vartheta_1=\operatorname{Atan2}(-p_x,\,p_y),\qquad d_3=\sqrt{p_x^2+p_y^2},\qquad d_2=p_z\;}

解的存在性:任意 p∈R3\boldsymbol p\in\mathbb{R}^3 都可达(d2d_2 无界、d3d_3 取到任意非负值、ϑ1\vartheta_1 全周),故无「超出工作空间」的不可达情形——这与拟人臂等有界臂不同。

解的唯一性与奇异:d3>0d_3>0 时解唯一;当 d3=0d_3=0(末端落在转轴 z0z_0 上,即 px=py=0p_x=p_y=0)时 ϑ1\vartheta_1 任意,逆解有无穷多组——臂在轴线上,转不转都到同一处(教程 2.12 提到的「无穷多解」在本机型的实例)。

验算

检验项结果
随机 q\boldsymbol q(d3>0d_3>0)正解 → 逆解回代最大偏差 2.2×10−162.2\times10^{-16}
随机 p\boldsymbol p 逆解 → 正解回代最大偏差 2.2×10−162.2\times10^{-16}
样例 q=[0.83, 0.2, 1.4]\boldsymbol q=[0.83,\ 0.2,\ 1.4]p=(−1.033104, 0.944826, 0.200000)\boldsymbol p=(-1.033104,\ 0.944826,\ 0.200000) → 逆解得 [0.830000, 0.2, 1.4][0.830000,\ 0.2,\ 1.4] √
d3=0d_3=0 奇异:9 个不同 ϑ1\vartheta_1 均给出同一 p\boldsymbol p√(验证「ϑ1\vartheta_1 任意」)
易错点
  1. 忘记 d3≥0d_3\ge0:若允许 d3<0d_3&lt;0,则 ϑ1′=ϑ1+π\vartheta_1&#x27;=\vartheta_1+\pi、d3′=−d3d_3&#x27;=-d_3 也是同一点的形式解(多出一支「假解」)。移动关节长度非负——这一条约束才是「解唯一」的来源,不是公式给的。
  2. 轴上奇异当成「无解」:d3=0d_3=0 不是无解而是无穷多解(ϑ1\vartheta_1 任意)。编程时应特判:若 px=py=0p_x=p_y=0,ϑ1\vartheta_1 取上一次的值或 0(术语上叫「沿既定姿态保持」)。
  3. 用 arccos⁡\arccos 求 ϑ1\vartheta_1:只能得到 [0,π][0,\pi] 的值,丢一半象限——必须用 Atan2。

附:验算脚本

以下脚本可独立运行(需 NumPy),复现上表全部结论:

import numpy as np
rng = np.random.default_rng(20260916)

Rz = lambda t: np.array([[np.cos(t),-np.sin(t),0],[np.sin(t),np.cos(t),0],[0,0,1.]])
Ry = lambda t: np.array([[np.cos(t),0,np.sin(t)],[0,1.,0],[-np.sin(t),0,np.cos(t)]])

# —— 2-4:式(2.25) vs 五步合成   ——
def rodrigues(th, r):
    r = np.asarray(r,float)/np.linalg.norm(r)
    K = np.array([[0,-r[2],r[1]],[r[2],0,-r[0]],[-r[1],r[0],0]])
    return np.cos(th)*np.eye(3) + (1-np.cos(th))*np.outer(r,r) + np.sin(th)*K
def five(th, r):
    r = np.asarray(r,float)/np.linalg.norm(r)
    a = np.arctan2(r[1], r[0]); b = np.arctan2(np.hypot(r[0],r[1]), r[2])
    return Rz(a) @ Ry(b) @ Rz(th) @ Ry(-b) @ Rz(-a)
print(max(np.abs(rodrigues(t,r) - five(t,r)).max()
          for t,r in zip(rng.uniform(-np.pi,np.pi,20000), rng.normal(size=(20000,3)))))

# —— 2-12 / 2-19:圆柱形臂 ——
def A(a, al, d, th):
    c,s,ca,sa = np.cos(th),np.sin(th),np.cos(al),np.sin(al)
    return np.array([[c,-s*ca,s*sa,a*c],[s,c*ca,-c*sa,a*s],[0,sa,ca,d],[0,0,0,1.]])
def fk(q):
    t1,d2,d3 = q
    return (A(0,0,0,t1) @ A(0,-np.pi/2,d2,0) @ A(0,0,d3,0))
def fk_p(q):
    t1,d2,d3 = q; return np.array([-d3*np.sin(t1), d3*np.cos(t1), d2])
def ik(p):
    px,py,pz = p; d3 = np.hypot(px,py)
    return np.array([np.arctan2(-px,py) if d3>0 else np.nan, pz, d3])

q = [0.9, 0.35, 1.25]; print(fk(q)[:3,3], fk_p(q))          # 正解
q = [0.83, 0.2, 1.4];   print(ik(fk_p(q)))                  # 逆解回代
p_test = np.array([0.7, -1.1, 0.4])
print(np.abs(fk_p(ik(p_test)) - p_test).max())               # 逆→正 复现 p(≈0)
与教程已有练习的对应
  • 习题集 C1(原书 2.4)已给 Rodrigues 公式的验证代码与验收标准;
  • 习题集 C2(原书 2.12 + 2.19)已给圆柱形臂的 DH 表、正运动学与逆解,结论与本页一致(d2=pzd_2=p_z、d3=px2+py2d_3=\sqrt{p_x^2+p_y^2}、ϑ1=Atan2⁡(−px,py)\vartheta_1=\operatorname{Atan2}(-p_x,p_y))。
  • 差别:C2 面向练习(留白让读者填),本页是完整解答,可直接用于作业作答与自查。

依据 Siciliano 等《机器人学:建模、规划与控制》第 2 章习题 2-4/2-12/2-19 · 与官方解答手册(Springer, 2009)逐项核对 · 数值验算通过 · 整理日期 2026-09-16