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 章共 20 道习题(p.74–76,2.1–2.20)。本编以 10 框收录其中 14 个题号——B3 的解答兼给对偶的原书 2.3 的答案;B5 = 原书 2.15+2.16、C2 = 原书 2.12+2.19 各并两题;D4 第 (4) 步即原书 2.20(SCARA 逆解)的求解结构。四元数 2.6–2.9 与闭链 2.11 超出课程范围未选;类人机械手 2.14 存目(其正运动学即 2.9.9)。另自编 10 题,共 20 框,按 A(概念判断 4)、B(分析证明 6)、C(计算编程 6)、D(开放研讨 4)分层,全部附解答(默认折叠)。标「原书 2.x」者与原书逐条对照;代码题给验收标准。

A / B 组的自评标准(C / D 组另给验收标准)
  • A 组(概念判断):达标要求是「判对 + 说得出依据」。例如 A1 不只说「三重身份」,而要指出每一问用到的是哪一重身份以及为什么。
  • B 组(分析证明):按「思路 → 关键步 → 结论」三步自评。本编 B 组多为证明题,判分点在三处:起点(用了哪条性质)、中间不等式的方向或符号、结论的适用条件(如「sϑ≠0s_\vartheta\neq0 时」)。
  • 通用扣分点:上下标读反;R−1=RTR^{-1}=R^{\mathrm T} 用在齐次变换上;漏掉第二支解或符号分支;把 ϕ\boldsymbol\phi 当向量相加。

A 组 · 概念判断

A1 · 三重身份对号

(对应 定理 2.2.B。)下列计算分别用到旋转矩阵的哪重身份?(a) 把相机系下测到的点坐标换算到机器人基座系;(b) 描述工具相对法兰的姿态;(c) 把刀尖向量绕刀轴转 30°30° 做倒角。

解答

(a) 坐标变换(原点重合 / 配合齐次变换处理平移);(b) 姿态描述(列 = 工具系轴在法兰系中的方向余弦);(c) 旋转算子(同系内旋转向量、模长不变)。三重身份同一矩阵、三种读法——选哪种只取决于你在「说」什么。

A2 · 可行的欧拉角序列

(a) 三个基本旋转共 27 种组合,为什么只有 12 种可行?(b) 判断下列序列是否可行,并说明它属于「绕当前轴」还是「绕固定轴」家族的哪个成员:ZYZZYZ、ZYXZYX、XXZXXZ、XZXXZX。

解答

(a) 相邻两次绕平行轴的旋转可合并为一次,三个角实际只剩两个自由方向,无法覆盖 SO(3)SO(3);「相邻不同轴」的组合 3×2×2=123\times2\times2=12 种才可行(录播 0:07:57–0:08:28)。(b) XXZXXZ 不可行(前两轴平行);ZYZZYZ、XZXXZX、ZYXZYX 可行——其中 ZYZZYZ 是机器人学惯用的绕当前轴右乘族(2.4.2);ZYXZYX 是 RPY,按固定轴左乘定义(2.4.5);XZXXZX 可行但工程少用(原书习题 2.1 以它为练习)。

A3 · 右乘还是左乘?

写出下列旋转序列的乘积顺序并说明依据:(a) ZYZ 欧拉角;(b) RPY 角;(c) 2.5 节把任意轴 r\boldsymbol r 转到 zz 轴的三步操作;(d) 机械手关节链 0→1→2→30\to1\to2\to3 的姿态合成。

解答

(a) 右乘 Rz(φ)Ry′(ϑ)Rz′′(ψ)R_z(\varphi)R_{y'}(\vartheta)R_{z''}(\psi)——每次绕当前轴(原理 2.3.A);(b) 左乘 Rz(φ)Ry(ϑ)Rx(ψ)R_z(\varphi)R_y(\vartheta)R_x(\psi)——每次绕固定轴(原理 2.3.B);(c) 左乘 Rz(α)Ry(β)Rz(ϑ)Ry(−β)Rz(−α)R_z(\alpha)R_y(\beta)R_z(\vartheta)R_y(-\beta)R_z(-\alpha)——全程绕固定系(录播 0:25:40);(d) 右乘 R30=R10R21R32R_3^0=R_1^0R_2^1R_3^2——关节依次绕新系轴(录播 0:30:26)。

A4 · DH 参数账本

(a) nn 关节开链共多少个 DH 参数?其中常数、变量各多少?(b) 对 SCARA(R–R–P–R,四轴竖直平行)逐行判断哪个参数是变量。(c) 转动关节的 did_i、移动关节的 ϑi\vartheta_i 是什么?

解答

(a) 4n4n 个;每行「3 常 1 变」,全表常数 3n3n、变量 nn(定义 2.8.3)。(b) 四行变量都在 ϑ\vartheta 列(ϑ1,ϑ2,ϑ4\vartheta_1,\vartheta_2,\vartheta_4)与 dd 列(第 3 行 d3d_3),且四轴平行 ⇒ 全表 αi=0\alpha_i=0。(c) 都是常数——「杆件长度和扭角是不动的,距离这两个或转角,根据关节类型二选一当变量」(录播 1:03:57–1:04:31)。

B 组 · 分析证明

B1 · ZXZ 欧拉角(原书 2.1)

推导 ZXZ 欧拉角(绕当前轴:先 zz 转 φ\varphi、再新 x′x' 转 ϑ\vartheta、再新 z′′z'' 转 ψ\psi)的合成矩阵,并给出由 R=[rij]R=[r_{ij}] 反解三角的公式。

解答

R=Rz(φ)Rx′(ϑ)Rz′′(ψ)=[cφcψ−sφcϑsψ−cφsψ−sφcϑcψsφsϑsφcψ+cφcϑsψ−sφsψ+cφcϑcψcφsϑsϑsψsϑcψcϑ].R=R_z(\varphi)R_{x'}(\vartheta)R_{z''}(\psi)=\begin{bmatrix} c_\varphi c_\psi-s_\varphi c_\vartheta s_\psi & -c_\varphi s_\psi-s_\varphi c_\vartheta c_\psi & s_\varphi s_\vartheta\\ s_\varphi c_\psi+c_\varphi c_\vartheta s_\psi & -s_\varphi s_\psi+c_\varphi c_\vartheta c_\psi & c_\varphi s_\vartheta\\ s_\vartheta s_\psi & s_\vartheta c_\psi & c_\vartheta \end{bmatrix}.

对比第三列与第三行(设 sϑ>0s_\vartheta&gt;0):φ=Atan2⁡(r13,r23)\varphi=\operatorname{Atan2}(r_{13},r_{23}),ϑ=Atan2⁡(r132+r232,r33)\vartheta=\operatorname{Atan2}\big(\sqrt{r_{13}^2+r_{23}^2},r_{33}\big),ψ=Atan2⁡(r31,r32)\psi=\operatorname{Atan2}(r_{31},r_{32});sϑ<0s_\vartheta&lt;0 时各宗量整体变号(对照 2.4.4 两支解结构——任何「相邻不同轴」序列的逆解都长这样)。

B2 · 旋转矩阵的等距性(自编)

证明:(a) ∥Rp∥=∥p∥\|R\boldsymbol p\|=\|\boldsymbol p\| 且 (Rp)T(Rq)=pTq(R\boldsymbol p)^T(R\boldsymbol q)=\boldsymbol p^T\boldsymbol q;(b) RTR^T 也是旋转矩阵(从而逆变换不改变长度与夹角)。(原书 2.7 问的是四元数版的同类不变性,属超范围内容,见 D3 自学路线。)

解答

(a) (Rp)T(Rq)=pTRTR q=pTq(R\boldsymbol p)^T(R\boldsymbol q)=\boldsymbol p^TR^TR\,\boldsymbol q=\boldsymbol p^T\boldsymbol q(RTR=IR^TR=I),取 q=p\boldsymbol q=\boldsymbol p 得模长不变。(b) (RT)TRT=(RRT)T=I(R^T)^TR^T=(RR^T)^T=I;det⁡(RT)=det⁡(R)=1\det(R^T)=\det(R)=1。故 RT∈SO(3)R^T\in SO(3)——这正是「行的方向余弦」解释(2.3.1 末)成立的原因。

B3 · ZYZ 的退化支(原书 2.2,兼答 2.3)

讨论 sϑ=0s_\vartheta=0(ϑ=0\vartheta=0 与 ϑ=π\vartheta=\pi)时 ZYZ 逆解的行为;并给出 RPY 在 cϑ=0c_\vartheta=0 时的对偶结论(原书 2.3)。

解答

ϑ=0\vartheta=0:R=Rz(φ)Rz(ψ)=Rz(φ+ψ)R=R_z(\varphi)R_z(\psi)=R_z(\varphi+\psi)——矩阵只含和 φ+ψ\varphi+\psi,任何满足同一和的 (φ,ψ)(\varphi,\psi) 都给出同一 RR(无穷多组角,同一姿态)。ϑ=π\vartheta=\pi:利用 Ry(π)Rz(ψ)=Rz(−ψ)Ry(π)R_y(\pi)R_z(\psi)=R_z(-\psi)R_y(\pi)(共轭反转轴的转向),R=Rz(φ−ψ)Ry(π)R=R_z(\varphi-\psi)R_y(\pi)——只含差 φ−ψ\varphi-\psi。结论:退化时只能确定和 / 差,另一独立组合丢失,即 定理 2.4.B 的奇点;工程表现是逆解出的 φ,ψ\varphi,\psi 随微小扰动剧烈跳动。

RPY 对偶(原书 2.3):R=Rz(φ)Ry(ϑ)Rx(ψ)R=R_z(\varphi)R_y(\vartheta)R_x(\psi),ϑ=π/2\vartheta=\pi/2 时数值验证只剩和 φ+ψ\varphi+\psi、ϑ=−π/2\vartheta=-\pi/2 时只剩差 φ−ψ\varphi-\psi(把上面 ZYZ 的 Ry(π)R_y(\pi) 换成 Ry(±π/2)R_y(\pm\pi/2) 同法可证)——与 2.4.5 末「只能确定 φ\varphi 与 ψ\psi 的和或差」互为印证。

B4 · 角和轴在 sin⁡ϑ=0\sin\vartheta=0 的逆解(原书 2.5)

给出 ϑ=0\vartheta=0 与 ϑ=π\vartheta=\pi 时由 RR 求 (ϑ,r)(\vartheta,\boldsymbol r) 的公式。

解答

ϑ=0\vartheta=0:R=I3R=I_3,任何单位向量可作 r\boldsymbol r(表示奇异,轴完全任意)。ϑ=π\vartheta=\pi:由 定理 2.5.A 不妨取正支,R(π,r)=2rrT−I3R(\pi,\boldsymbol r)=2\boldsymbol r\boldsymbol r^T-I_3(式 2.25 中 cϑ=−1,sϑ=0c_\vartheta=-1,s_\vartheta=0),故 rrT=(R+I)/2\boldsymbol r\boldsymbol r^T=(R+I)/2。于是

ri2=12(rii+1),rirj=12rij (i≠j).r_i^2=\tfrac12(r_{ii}+1),\qquad r_ir_j=\tfrac12 r_{ij}\ (i\neq j).

算法:选对角元最大的那一轴定该分量符号(设 r11r_{11} 最大:rx=(r11+1)/2r_x=\sqrt{(r_{11}+1)/2}),其余分量由交叉项恢复:ry=r12/(2rx)r_y=r_{12}/(2r_x)、rz=r13/(2rx)r_z=r_{13}/(2r_x);(r)(\boldsymbol r) 与 (−r)(-\boldsymbol r) 等价(定理 2.5.A)。最大对角元准则保证分母不接近零(数值稳定性——与 原理 2.4.A 同一思想)。

B5 · 旋转的「加法」可交换吗(原书 2.15 + 2.16)

(a) 在最简表示集合上定义 ϕ1⊕ϕ2:=rep(R(ϕ1)R(ϕ2))\boldsymbol\phi_1\oplus\boldsymbol\phi_2:=\mathrm{rep}\big(R(\boldsymbol\phi_1)R(\boldsymbol\phi_2)\big)。举例说明 ⊕\oplus 不满足交换律。(b) 对微小旋转证明:Rx(dφx)Ry(dφy)Rz(dφz) Rx(dφx′)Ry(dφy′)Rz(dφz′)=Rx(dφx+dφx′)Ry(dφy+dφy′)Rz(dφz+dφz′)R_x(d\varphi_x)R_y(d\varphi_y)R_z(d\varphi_z)\,R_x(d\varphi&#x27;_x)R_y(d\varphi&#x27;_y)R_z(d\varphi&#x27;_z)=R_x(d\varphi_x+d\varphi&#x27;_x)R_y(d\varphi_y+d\varphi&#x27;_y)R_z(d\varphi_z+d\varphi&#x27;_z)(一阶近似)。

解答

(a) 取 ϕ1\boldsymbol\phi_1 = 绕 zz 转 90°90°、ϕ2\boldsymbol\phi_2 = 绕 yy 转 90°90°(同为 ZYZ / RPY 任一具体化均可):Rz(90°)Ry(90°)R_z(90°)R_y(90°) 第一列为 [0,0,−1]T[0,0,-1]^T,而 Ry(90°)Rz(90°)R_y(90°)R_z(90°) 第一列为 [0,1,0]T[0,1,0]^T,两乘积不同——「先转这个再转那个,反过来结果不一样」(录播 0:07:01)。⊕\oplus 继承了矩阵乘法的不可交换性。(b) 对微小角 cos⁡(dφ)≈1, sin⁡(dφ)≈dφ\cos(d\varphi)\approx1,\ \sin(d\varphi)\approx d\varphi,基本旋转 Rk(dφ)=I+Sk(dφ)+O(dφ2)R_k(d\varphi)=I+S_k(d\varphi)+O(d\varphi^2),SkS_k 为反对称阵。多因子乘积保留一阶项:

(I+S1)(I+S1′)=I+S1+S1′+O(dφ2),(I+S_1)(I+S_1&#x27;)=I+S_1+S_1&#x27;+O(d\varphi^2),

反对称阵相加可交换,合并二阶以上项后即得恒等式。几何意义:微小旋转在忽略二阶效应时像向量一样可加——角速度 / 微分运动学(第 3 章)成立的代数根源。

B6 · 齐次变换的逆(原书 2.10)

用分块矩阵求逆法则证明式 2.45:A10=[Ro0T1]⇒(A10)−1=[RT−RTo0T1]A_1^0=\begin{bmatrix}R&amp;\boldsymbol o\\\boldsymbol 0^T&amp;1\end{bmatrix}\Rightarrow(A_1^0)^{-1}=\begin{bmatrix}R^T&amp;-R^T\boldsymbol o\\\boldsymbol 0^T&amp;1\end{bmatrix}。

解答

设 (A10)−1=[XywTz](A_1^0)^{-1}=\begin{bmatrix}X&amp;\boldsymbol y\\\boldsymbol w^T&amp;z\end{bmatrix}。要求 A10(A10)−1=I4A_1^0(A_1^0)^{-1}=I_4:

底部行:wT=0T\boldsymbol w^T=\boldsymbol 0^T、z=1z=1。顶部块:RX+owT=RX=I3⇒X=R−1=RTRX+\boldsymbol o\boldsymbol w^T=RX=I_3\Rightarrow X=R^{-1}=R^T(R∈SO(3)R\in SO(3));Ry+o=0⇒y=−R−1o=−RToR\boldsymbol y+\boldsymbol o=\boldsymbol 0\Rightarrow\boldsymbol y=-R^{-1}\boldsymbol o=-R^T\boldsymbol o。右乘验证 A−1A=I4A^{-1}A=I_4 同理。□

注意逆的旋转块是 RTR^T 但平移块要先转置再反向,「整体转置」不成立(A−1≠ATA^{-1}\neq A^T,原书式 2.46)。

C 组 · 计算与编程

C1 · Rodrigues 公式的数值验证(原书 2.4)

编程验证式 2.25:随机生成 1000 组 (ϑ,r)(\vartheta,\boldsymbol r)(r\boldsymbol r 归一化),比较 R(ϑ,r)R(\vartheta,\boldsymbol r) 与「五步合成」Rz(α)Ry(β)Rz(ϑ)Ry(−β)Rz(−α)R_z(\alpha)R_y(\beta)R_z(\vartheta)R_y(-\beta)R_z(-\alpha),报告最大元素偏差。

解答

参考实现(Python / NumPy):

import numpy as np
rng = np.random.default_rng(42)
def Rz(t): c,s=np.cos(t),np.sin(t); return np.array([[c,-s,0],[s,c,0],[0,0,1.]])
def Ry(t): c,s=np.cos(t),np.sin(t); return np.array([[c,0,s],[0,1.,0],[-s,0,c]])
def rodrigues(th, r):
    r = r/np.linalg.norm(r); K = np.array([[0,-r[2],r[1]],[r[2],0,-r[0]],[-r[1],r[0],0]])
    return (1-np.cos(th))*np.outer(r,r) + np.cos(th)*np.eye(3) + np.sin(th)*K
err = 0.0
for _ in range(1000):
    r = rng.normal(size=3); th = rng.uniform(-np.pi, np.pi)
    a = np.arctan2(r[1], r[0]); b = np.arctan2(np.hypot(r[0],r[1]), r[2])
    R5 = Rz(a)@Ry(b)@Rz(th)@Ry(-b)@Rz(-a)
    err = max(err, np.abs(R5 - rodrigues(th, r)).max())
print(err)   # 典型输出量级 1e-15

验收:最大偏差 <10−12&lt;10^{-12};同时校验 RTR=IR^TR=I、det⁡R=1\det R=1。若把五步序列误写成右乘顺序,偏差将是 O(1)O(1)——这个「错误实验」值得顺手做一遍以体会 原理 2.3.B。

C2 · 圆柱形臂的正逆运动学(原书 2.12 + 2.19)

图 2.35 的圆柱形臂:转动关节(竖直腰)+ 竖直升降移动关节(d2d_2)+ 水平伸缩移动关节(d3d_3)。建 DH 系、列参数表、求正运动学;再由末端位置 p\boldsymbol p 反解三个关节变量(逆解结论见 结论 2.19)。

解答

建系:z0z_0 竖直(关节 1 轴);z1z_1 竖直(关节 2 轴,d2d_2 沿它升降);关节 3 轴水平径向 ⇒ z2z_2 取水平径向(α2=−π/2\alpha_2=-\pi/2);d3d_3 沿 z2z_2。

连杆 aia_i αi\alpha_i did_i ϑi\vartheta_i
1 0 0 0 ϑ1\vartheta_1
2 0 −π/2-\pi/2 d2d_2 0
3 0 0 d3d_3 0

正运动学(本约定下零位径向沿 y0y_0;若你的建系取零位沿 x0x_0,仅 ϑ1\vartheta_1 多一个常值偏移,方法全同):

T30=[c10−s1−s1d3s10c1c1d30−10d20001].T_3^0=\begin{bmatrix}c_1&amp;0&amp;-s_1&amp;-s_1d_3\\ s_1&amp;0&amp;c_1&amp;c_1d_3\\ 0&amp;-1&amp;0&amp;d_2\\ 0&amp;0&amp;0&amp;1\end{bmatrix}.

逆解:由 px=−s1d3, py=c1d3, pz=d2p_x=-s_1d_3,\ p_y=c_1d_3,\ p_z=d_2,且伸缩 d3>0d_3&gt;0:

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

解唯一(d3>0d_3&gt;0 约定下);p\boldsymbol p 在轴线上(d3=0d_3=0)时 ϑ1\vartheta_1 任意——又一个「轴上奇异」实例,与 定理 2.12.C 后的肩奇异同型。

C3 · SCARA 的正运动学(原书 2.13)

对 SCARA 机械手(R–R–P–R,四轴全部竖直平行,杆长 a1,a2a_1,a_2,升降 d3d_3,腕转 ϑ4\vartheta_4;另计自加的工具偏置 d4d_4——原书 2.13 官方参数表无此行,加上它只是把腕旋转中心沿 zz 平移一个常值)建立 DH 表并求 T40T_4^0。

解答
连杆 aia_i αi\alpha_i did_i ϑi\vartheta_i
1 a1a_1 0 0 ϑ1\vartheta_1
2 a2a_2 0 0 ϑ2\vartheta_2
3 0 0 d3d_3 0
4 0 0 d4d_4 ϑ4\vartheta_4

(全表 αi=0\alpha_i=0:四轴平行 + 原点全在公垂线上,总原则:让参数尽量为零 的极致。)

T40=[c124−s1240a1c1+a2c12s124c1240a1s1+a2s12001−(d3+d4)0001]T_4^0=\begin{bmatrix} c_{124} &amp; -s_{124} &amp; 0 &amp; a_1c_1+a_2c_{12}\\ s_{124} &amp; c_{124} &amp; 0 &amp; a_1s_1+a_2s_{12}\\ 0&amp;0&amp;1&amp;-(d_3+d_4)\\ 0&amp;0&amp;0&amp;1 \end{bmatrix}

(zz 轴向上、d3d_3 向下伸缩的约定下末端高度为 −(d3+d4)-(d_3+d_4);若定义 d3d_3 向上为正则去掉负号——符号随建系约定,结构不变。)结构观察:d3,ϑ4d_3,\vartheta_4 不影响 (x,y)(x,y)、ϑ1,ϑ2\vartheta_1,\vartheta_2 不影响 zz——定位(臂)与装配(轴 + 腕)天然解耦,正是 1.2.2 SCARA「竖直刚性 + 水平柔性」的运动学注脚。

C4 · 三连杆平面臂的工作空间作图(原书 2.17)

取 a1=0.5, a2=0.3, a3=0.2a_1=0.5,\ a_2=0.3,\ a_3=0.2(m),限位 −π/3≤ϑ1≤π/3-\pi/3\le\vartheta_1\le\pi/3、−2π/3≤ϑ2≤2π/3-2\pi/3\le\vartheta_2\le2\pi/3、−π/2≤ϑ3≤π/2-\pi/2\le\vartheta_3\le\pi/2。编程画出末端原点的工作空间并描述其边界。

解答
import numpy as np, matplotlib.pyplot as plt
rng = np.random.default_rng(42)
N = 200_000
a1, a2, a3 = 0.5, 0.3, 0.2
t1 = rng.uniform(-np.pi/3, np.pi/3, N)
t2 = rng.uniform(-2*np.pi/3, 2*np.pi/3, N)
t3 = rng.uniform(-np.pi/2, np.pi/2, N)
x = a1*np.cos(t1) + a2*np.cos(t1+t2) + a3*np.cos(t1+t2+t3)
y = a1*np.sin(t1) + a2*np.sin(t1+t2) + a3*np.sin(t1+t2+t3)
r, phi = np.hypot(x, y), np.arctan2(y, x)   # 半径、方位角必须由末端坐标计算
plt.scatter(x, y, s=0.05); plt.axis('equal'); plt.show()
print(r.min(), r.max(), np.degrees(phi.min()), np.degrees(phi.max()))
# 典型输出:r∈[0.2383, 1.0000],φ∈[−123.9°, +123.9°]

两个易错点:半径用 x2+y2\sqrt{x^2+y^2}(不是 xx 分量);方位角用 Atan2⁡(y,x)\operatorname{Atan2}(y,x)(不是 ϑ1+ϑ2+ϑ3\vartheta_1+\vartheta_2+\vartheta_3——末端姿态角与位置方位角一般不相等)。初版本解两处皆误,「画」出了与错误结论吻合的整环,是「代码与结论互相印证着错」的典型。

解析刻画(对照官方解 Fig. S2.4):工作空间不是整圆环,而是一块环形扇域——

  • 径向全域 r∈[0.238, 1.0]r\in[0.238,\,1.0]:外径 =a1+a2+a3=1=a_1+a_2+a_3=1(ϑ2=ϑ3=0\vartheta_2=\vartheta_3=0 臂全伸直);内径 0.2380.238 由 ϑ2=±2π3\vartheta_2=\pm\frac{2\pi}{3} 且 ϑ3\vartheta_3 取同号 ±π2\pm\frac{\pi}{2} 生成(前臂回折贴向基座;若 ϑ3\vartheta_3 反号得 r=0.635r=0.635,是内部结构而非内边界);
  • 方位角全域 φ∈[−123.9°, +123.9°]\varphi\in[-123.9°,\,+123.9°],不足整圆也随 rr 变化:r=1r=1 处仅 ±60°\pm60°(肩限位 ϑ1=±π/3\vartheta_1=\pm\pi/3),r=0.5r=0.5 处张到 ±120°\pm120°,最宽 ±123.9°\pm123.9° 在 r≈0.39r\approx0.39 的侧弧上;
  • 边界全由圆弧拼成(官方解法):列出所有「丧失机动性」的临界位形——8 个关节限位角点、ϑ2=0\vartheta_2=0 的 4 个、ϑ3=0\vartheta_3=0 的 4 个、双零的 2 个——在笛卡儿空间把只差一个分量的两点用弧相连,外轮廓 AMQRPHEDA(官方解记号)围出可达工作空间:QRQR 是 r=1r=1 的外弧,HEHE 与 DADA 两段拼出 r=0.238r=0.238 的内弧(圆心角合计约 204°204°)。

验收:散点图的 rmin⁡,rmax⁡r_{\min},r_{\max} 与 φ\varphi 极值同上列数值吻合(容差 = 网格步长);把三个限位放宽到 [−π,π][-\pi,\pi] 应退化为整环 0≤r≤10\le r\le1——两个极端都对了,中间形态才可信。

C5 · ZYZ / RPY 正逆解闭环(自编)

实现式 2.18–2.23 的正逆解,做双向闭环测试;再专门测试 ϑ≈0\vartheta\approx0(ZYZ)与 ϑ≈±π/2\vartheta\approx\pm\pi/2(RPY)附近的逆解行为。

解答

要点与预期结果:

def zyz_fwd(p, t, ps): ...          # 式 2.18
def zyz_inv(R):
    t = np.arctan2(np.hypot(R[0,2],R[1,2]), R[2,2])          # 支 I: ϑ∈(0,π)
    if abs(np.sin(t)) < 1e-12: ...                            # 奇点: 只能定 φ±ψ
    p = np.arctan2(R[1,2],R[0,2]); ps = np.arctan2(R[2,1],-R[2,0])
    return p, t, ps

(a) 随机 1000 组角,inv(fwd(angles)) 与原角或「支 II 对应角」(式 2.20)逐组比对,全部应等价(同姿态)。(b) 在 ϑ=10−6\vartheta=10^{-6} rad 附近:RR 对 φ,ψ\varphi,\psi 各自的变化不敏感(只感知其和),逆解出的 φ,ψ\varphi,\psi 对浮点噪声放大 10610^6 倍量级——原理 2.4.A 的活教材:不是公式错,是表示在该处退化。验收:正常区误差 <10−12&lt;10^{-12};奇异区能复现「跳变」并解释。

C6 · 通用 DH 正运动学函数与逆解数值验证(自编)

写一个 fk(dh, q) -> T(输入 4n 参数表 + 关节变量),用它重现 Aii−1A_i^{i-1}:从建系几何直接读出两步分解 的三连杆平面臂与 2.9.4 拟人臂结果;再对平面臂实现 2.12.2 解析逆解,与 scipy.optimize 的数值解对照(含肘上 / 肘下两支)。

解答
def fk(dh, q):
    T = np.eye(4)
    for (a, al, d, th), qi in zip(dh, q):
        t = qi if th is None else th       # 变量列: None 标记
        d = qi if d  is None else d
        ct, st, ca, sa = np.cos(t), np.sin(t), np.cos(al), np.sin(al)
        A = np.array([[ct,-st*ca, st*sa, a*ct],
                      [st, ct*ca,-ct*sa, a*st],
                      [ 0,    sa,    ca,    d],
                      [ 0,     0,     0,    1]])
        T = T @ A
    return T

验收标准:(a) 平面臂 fk 输出与式 2.63 逐元素一致;(b) 拟人臂输出与式 2.66 一致(代 ϑ=0\vartheta=0 抽查 p=[a2+a3,0,0]T\boldsymbol p=[a_2+a_3,0,0]^T 型特例);(c) 随机 100 组 (px,py,ϕ)(p_x,p_y,\phi):解析解(两支)回代 fk 的误差 <10−12&lt;10^{-12},且每组的解数与 c2c_2 容许性判据一致;工作空间外的测试点应被 ∣c2∣>1|c_2|&gt;1 正确拒绝而非输出 NaN。解析解是「快 + 全」、数值解是「通用 + 单支」——两者的互补关系在第 3 章还会升级。

D 组 · 开放研讨

D1 · 拟人臂肩奇异解的数目(原书 2.18)

讨论 定理 2.12.C 的拟人臂在 s3=0s_3=0 时解的数目,特别是 s3=0s_3=0 且 pwx=pwy=0p_{wx}=p_{wy}=0 的边界情形:多少组?几何解释是什么?

解答

s3=0s_3=0 分两支:c3=1c_3=1(臂伸直,ϑ3=0\vartheta_3=0)与 c3=−1c_3=-1(臂全折,ϑ3=π\vartheta_3=\pi)。

通例(pwx2+pwy2>0p_{wx}^2+p_{wy}^2&gt;0):两支各给出两个不同的 ϑ2\vartheta_2(伸直支 ϑ2=Atan2⁡(pwz, ±pwx2+pwy2)\vartheta_2=\operatorname{Atan2}\big(p_{wz},\ \pm\sqrt{p_{wx}^2+p_{wy}^2}\big);全折支同形,把 a2+a3a_2+a_3 换成 ∣a2−a3∣|a_2-a_3|,须 a2≠a3a_2\ne a_3),每个 ϑ2\vartheta_2 对应由式 2.109/2.110 定出的 ϑ1\vartheta_1——共 4 组解(肩前 / 后 × 伸直 / 全折),退化只表现为「肘上 / 肘下两支在 s3=0s_3=0 处合并」,解数不增。

边界(pwx=pwy=0p_{wx}=p_{wy}=0,腕心落在 z0z_0 轴上):旋转 ϑ1\vartheta_1 不移动腕心,故 ϑ1\vartheta_1 任意(无穷多)。可解性要求腕心恰在极值点:伸直支 pwz=±(a2+a3)p_{wz}=\pm(a_2+a_3)、全折支 pwz=±∣a2−a3∣p_{wz}=\pm|a_2-a_3|,此时 ϑ2=±π/2\vartheta_2=\pm\pi/2。结论:ϑ1\vartheta_1 连续无穷多 × 每支有限的 (ϑ2,ϑ3)(\vartheta_2,\vartheta_3),几何图像是「臂绕竖直轴自转也够得着轴上的腕心」——肩奇异(对照球形臂 d3=0d_3=0、圆柱臂 d3=0d_3=0 的同类现象,原书图 2.33 的第 3 章后续)。

特例(a2=a3a_2=a_3,全折支):全折时腕心与肩重合(pwx=pwy=pwz=0p_{wx}=p_{wy}=p_{wz}=0 是唯一可解点),此时 ϑ2\vartheta_2 与 ϑ1\vartheta_1 同时不定——二维连续解族(两个参数族),是最深的退化层级。

D2 · 标定算法的仿真实验设计(自编)

设计一个数值实验验证 标定三步法:给「真值」DH 参数,仿真量测,检验最小二乘迭代能否恢复真值。给出实验要素与验收标准。

解答

要素:(1) 真值 ξ⋆\boldsymbol\xi^\star:如拟人臂 12 个参数,对每个常数参数加 [−1,1][-1,1] mm / mrad 级「制造偏差」;(2) 量测:t=60t=60 个随机关节位形(tm=180≫4n=12tm=180\gg4n=12),位姿铺满工作空间(对照 2.11 常见错误 2);(3) 噪声:位置加 σ=0.05\sigma=0.05 mm 高斯噪声(姿态可不加或加 mrad 级);(4) 迭代初值为标称(无偏差)参数。验收:迭代收敛(∥Δξ∥\|\Delta\boldsymbol\xi\| 单调下降至平台);恢复误差与 Cramér–Rao 量级一致(参数误差 ≈ 噪声 / t\sqrt{t} 级);把 tt 降到 3(tm=9<12tm=9&lt;12)应看到欠定失败;把量测集中到工作空间一角应看到 ΦTΦ\Phi^T\Phi 病态、误差放大——三个「反例开关」都能按预期失效,实验才算完整。

D3 · 从角和轴到四元数的自学路线(自编)

课程以「卫星姿态用四元数」点题(录播 0:21:26)但未展开。以 定义 2.5.1 与 2.4.5 预告框为起点,设计一条不超原书 §2.6 的自学路线,并说明四元数分别「修掉」了角和轴的哪些毛病。

解答

路线:(1) 读原书式 2.30–2.32,验证单位约束 η2+∥ϵ∥2=1\eta^2+\|\boldsymbol\epsilon\|^2=1(与 r\boldsymbol r 单位模同型);(2) 用式 2.33 数值验证 R(η,ϵ)R(\eta,\boldsymbol\epsilon) 与 R(ϑ,r)R(\vartheta,\boldsymbol r) 在 η=cos⁡ϑ2,ϵ=sin⁡ϑ2r\eta=\cos\frac{\vartheta}{2},\boldsymbol\epsilon=\sin\frac{\vartheta}{2}\boldsymbol r 时一致(复用 C1 代码);(3) 用式 2.34–2.35 实现由 RR 提取四元数,重点测试 ϑ=π\vartheta=\pi——四元数无奇点(对照 定理 2.5.B 的失效点);(4) 用式 2.36 验证 Q−1={η,−ϵ}Q^{-1}=\{\eta,-\boldsymbol\epsilon\},并解释为何 (ϑ,r)≡(−ϑ,−r)(\vartheta,\boldsymbol r)\equiv(-\vartheta,-\boldsymbol r) 的不唯一(定理 2.5.A)在四元数中消失(半角把「轴 + 角」打包后,(π−⋅)(\pi-\cdot) 支对应 η→−η\eta\to-\eta,是可区分的两个四元数,对应同一旋转但明确分层)。修掉的毛病:无逆解奇点、无不唯一;代价:4 参数非最简 + 乘法不再是直观的「转轴 + 角」。这条路线也解释了卫星 / 姿态控制行业的选型逻辑。

D4 · SCARA 全流程贯通(自编)

把 1.2.2 的 SCARA 构形知识与本编串成一条链:构形判断 → DH 表(C3)→ 正运动学特征 → 逆解结构 → 选型复核。每步一句话给出「上一编 / 本编的哪条结论在起作用」。

解答

链条:(1) 构形:三轴平行 + 竖直柔性 → SCARA(例 1.2.B 口诀);(2) DH:四轴平行 ⇒ 全表 αi=0\alpha_i=0、平面臂型 AiA_i(总原则:让参数尽量为零);(3) 正运动学:x,yx,y 只依赖 ϑ1,ϑ2\vartheta_1,\vartheta_2、zz 只依赖 d3d_3(C3)——定位与下压解耦;(4) 逆解(此步即原书 2.20 的求解结构):平面二连杆逆解(2.12.2 的 a3=0a_3=0 特例)+ z,d3z,d_3 直读,ϑ4\vartheta_4 由 ϕ\phi 回代——存在「左撇 / 右撇」两支(对应例 2.6 的肘上 / 肘下);(5) 选型复核:竖直装配任务 r=4r=4 恰好用满 n=4n=4、无冗余(定义 2.10.3),装配柔性与第 8 章力控制衔接。一句话总结:构形决定参数表的形状,参数表决定解耦结构,解耦结构决定逆解与控制的难度——这正是全编「一条主线」在具体机型上的落地。

依据 Siciliano 等《机器人学:建模、规划与控制》第 2 章习题(p.74–76)整理扩充 · 全部附解 · 整理日期 2026-09-15