作业信息(据录播与课件)
- 题号:教材第 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 万组随机数值实验。
题目原文(教材 p.75 第 2.4 题,逐字):
2.4 验证绕任意轴旋转一定角度所对应的旋转矩阵由式(2.25)给出。
思路:式(2.25)是结论,式(2.24)的五步合成是已知。所以只需把五步合成算到底,看是否等于式(2.25)。关键是三步:① 把五步写成「相似变换」MRz(ϑ)MT;② 认出 M 的第三列恰是旋转轴 r;③ 证明反对称部分等于叉积矩阵 [r]×。
与正文的关系
正文 2.5.1 已把这条推导完整写出(含「旋转保持叉积 → 共轭恒等式」的工具化版本);本作业要求你独立复现并数值验算——同一件事,作业走「逐元素硬乘」路线,正文走「共轭恒等式搬运」路线,两相对照更能看清哪些是机械计算、哪些是结构。
第 0 步:把 α、β 用 r 的分量写出。 由式(2.24)的几何(图 2.10),r 的球坐标分解给出
sinα=rx2+ry2ry,cosα=rx2+ry2rx,sinβ=rx2+ry2,cosβ=rz.(1)
第 1 步:合并前两个因子。 记
M=Rz(α)Ry(β)=cαcβsαcβ−sβ−sαcα0cαsβsαsβcβ,
则式(2.24)可写成相似变换(因为 Ry(−β)Rz(−α)=MT):
R(ϑ,r)=MRz(ϑ)MT.(2)
第 2 步:认出 M 的第三列就是 r。 把式(1)代入 M 的第三列:
M:,3=cαsβsαsβcβ=rx2+ry2rx⋅rx2+ry2rx2+ry2ry⋅rx2+ry2rz=rxryrz=r.
这就是「绕 r 转」被编码进 M 的地方——M 正是把 z 轴转到 r 的那次旋转。
第 3 步:展开相似变换。 记 M=[m1 m2 m3](按列分块)。由 (2):
R=MRz(ϑ)MT=[cϑm1+sϑm2, −sϑm1+cϑm2, m3]MT=cϑ(m1m1T+m2m2T)+sϑ(m2m1T−m1m2T)+m3m3T.
因 M 正交,m1m1T+m2m2T=I−m3m3T=I−rrT,于是
R(ϑ,r)=cϑI+(1−cϑ)rrT+sϑ=:S(m2m1T−m1m2T).(3)
第 4 步:证明 S=[r]×。 由 m1=[cαcβ, sαcβ, −sβ]T、m2=[−sα, cα, 0]T 逐元素计算:
| (i,j) | (m2m1T)ij−(m1m2T)ij | 代入 (1) | [r]× 对应元 |
| (1,1) | −sαcαcβ+sαcαcβ | 0 | 0 √ |
| (1,2) | −sα2cβ−cα2cβ=−cβ(sα2+cα2) | −rz | −rz √ |
| (1,3) | sαsβ | ry | ry √ |
| (2,1) | cα2cβ+sα2cβ=cβ | rz | rz √ |
| (2,3) | −cαsβ | −rx | −rx √ |
| (3,1) | −sαsβ | −ry | −ry √ |
| (3,2) | cαsβ | rx | rx √ |
即 S=[r]×=0rz−ry−rz0rxry−rx0,其余对角元与 (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ϑ
正是式(2.25)。□
官方解答手册走的是等价的代数路线
手册(Solution Manual p.3)直接把 Rz(α)Ry(β)、Rz(α)Ry(β)Rz(ϑ) 乘开,再用 Ry(−β)Rz(−α)=(Rz(α)Ry(β))T 得同一个矩阵,最后代入 (1) 整理。本教程的「相似变换 + M:,3=r + S=[r]×」写法与它完全等价,但把「为什么第三列是 r」这一步显式化了——这正是式(2.25)成立的几何内核。
2 万组随机 (ϑ,r)(r 随机方向、ϑ∈(−π,π)),比对式(2.25)与式(2.24)五步合成、以及手册的 (sα,cα,sβ,cβ) 形式:
| 检验项 | 最大偏差 | 结论 |
| 式(2.25) ≡ 式(2.24) 五步合成 | 1.1×10−15 | 机器精度内相等 |
| 式(2.25) ≡ 官方手册形式 | 6.1×10−16 | 三方一致 |
| Rr=r(轴不变) | 1.1×10−15 | √ |
| RTR=I、detR=+1 | 2.0×10−15 | √ |
| trR=1+2cosϑ | 1.1×10−15 | √(式 2.27 的自洽性) |
| R(−ϑ,−r)=R(ϑ,r) | 0 | √(式 2.26 不唯一性) |
| ϑ=0⇒R=I;ϑ=π⇒R=2rrT−I | ≤10−16 | √ 特例 |
两个易错点
- 符号:S 的反对称项符号取决于 [r]× 的约定(本课程取 [r]×p=r×p)。若把 sϑ 项的符号写反,得到的是绕 −r 转 ϑ——而由 R(−ϑ,−r)=R(ϑ,r),错号等价于把 r 取反,在同一组随机测试里能立刻暴露。
- sinϑ=0 的反解:由 R 反解 (ϑ,r) 用式(2.28)要除以 2sinϑ,ϑ→0,π 时病态(数值实验中 ∣sinϑ∣≤10−2 的 143 组偏差放大到 10−7,良态区仅 10−12)——这就是教程 定理 2.5.B 说的失效情形,ϑ=0 时轴任意、ϑ=π 时须另用对称部分求轴。
题目原文(教材 p.75 第 2.12 题,逐字):
2.12 列出如图 2.35 中的圆柱形臂的正运动学方程。
原题图 2.35(教材扫描,p.75):
结构:关节 1 绕竖直轴 z0 转动(ϑ1);关节 2 沿竖直方向移动(d2);关节 3 沿水平径向移动(d3)。末端位置由柱坐标 (d3,ϑ1,d2) 决定——这正是「圆柱形」得名的原因。
圆柱形臂的关节配置:转动关节 ϑ1(绕 z0)+ 竖直移动 d2 + 径向移动 d3。末端位置 px=−d3sinϑ1、py=d3cosϑ1、pz=d2(本教程自绘示意,对照原书图 2.35)。
第 1 步:建系。 按 DH 建系四规则 的四规则建连杆坐标系:z0 沿关节 1 转轴(竖直);z1 沿关节 2 的移动方向(竖直,与 z0 同向);因关节 3 沿水平径向移动,取 z2 沿该径向、x2 与之配合(故 α2=−π/2)。
对照官方解答手册的建系结果(Fig. S2.2,可见各系的 xi,yi,zi 与 ϑ1,d2,d3 标注):
第 2 步:填 DH 参数表。
| 连杆 i | ai | αi | di | ϑi |
| 1 | 0 | 0 | 0 | ϑ1 |
| 2 | 0 | −π/2 | d2 | 0 |
| 3 | 0 | 0 | d3 | 0 |
读法:ai 全为 0(相邻 z 轴皆相交或平行、公垂线长度为零——总原则:让参数尽量为零 的「能零则零」);α1=0(z0∥z1)、α2=−π/2(z1→z2 由竖直转为水平)、α3=0(z2∥z3);关节 1 是转动型故 ϑ1 是变量,关节 2、3 是移动型故 d2,d3 是变量、对应角列为常数 0。
第 3 步:写各关节变换矩阵(代入 Aii−1:从建系几何直接读出两步分解 的通式):
A10(ϑ1)=c1s100−s1c10000100001,A21(d2)=100000−10010000d21,A32(d3)=10000100001000d31.
(A21 是 ϑ2=0、α2=−π/2 代入通式的结果:c2=1,s2=0,cα2=0,sα2=−1。)
第 4 步:连乘(原理 2.8.A)。先算后半段:
A21A32=100000−1001000d3d21,
再左乘 A10:
T30(q)=A10A21A32=c1s10000−10−s1c100−d3s1d3c1d21,q=[ϑ1 d2 d3]T.
结果:末端执行器的位置与方向(n,s,a 为前三列)分别为
p=−d3s1d3c1d2,n=c1s10,s=00−1,a=−s1c10.
几何解读:长度 d3 的臂绕 z0 转 ϑ1 后指到径向;注意零位(ϑ1=0)时 px=0,py=d3——臂指向 +y0,这是本建系约定的产物(p=[0,d3,0]T 是把 [0,d3]T 逆时针转 ϑ1 的结果);z 坐标只由 d2 决定,与两个水平变量解耦;s=−z0 说明末端坐标系的 y 轴朝下。
| 检验项 | 结果 |
| DH 连乘 ≡ 上述闭式 T30(2 万组随机 q) | 最大偏差 1.1×10−16 |
| 旋转块正交、det=+1 | 2.2×10−16 |
| 三个 A 矩阵与官方手册逐项一致 | 6.1×10−17 |
| 样例 q=[0.9, 0.35, 1.25] | p=(−0.979159, 0.777012, 0.350000)(与 −d3s1,d3c1,d2 一致) |
易错点
- α2 的符号:必须比划「从 z1(竖直)绕 x2 转到 z2(水平径向)」的方向。取 +π/2 会得到 py=−d3c1 一类结果——与官方手册差一个符号,这类错误在单元测试里会立刻暴露(见验算表第 1 行)。
- d 列与 ϑ 列:移动关节的变量必须写进 d 列、ϑ 列置常数 0;写成 ϑ2 会连锁导致 A21 用错形式。
- 零位方向:本题约定零位指向 +y0(故 px=−d3s1 带负号)。不同教材/厂商的零位约定可能不同,答案的形式随约定变、物理内容不变——抄答案时要连约定一起抄。
题目原文(教材 p.76 第 2.19 题,逐字):
2.19 求解如图 2.35 中的圆柱形臂的逆运动学方程。
(原题图同 2-12 的图 2.35,见上。)
思路:正解位置式 p=[−d3s1, d3c1, d2]T 已在上题得到,逆解就是对它做「平方求和 + 取比 + 直读」三步——注意 d3 是移动关节的实际长度,有明确物理约束 d3≥0,这一条恰好把解定成唯一。
第 1 步:分离 d2。 第三式只含 d2:
d2=pz.
第 2 步:平方求和消去 ϑ1。
px2+py2=d32(s12+c12)=d32⟹d3=px2+py2(取 d3≥0 支).
第 3 步:作比得 ϑ1。 由 sinϑ1=−px/d3、cosϑ1=py/d3(d3>0 时两式可同除以 d3):
ϑ1=Atan2(d3−px, d3py)=Atan2(−px, py).
用 Atan2 而非 arccos 的理由见 原理 2.4.A(唯一化象限 + 精度均匀)。
结论 2.19 · 圆柱形臂的逆解
ϑ1=Atan2(−px,py),d3=px2+py2,d2=pz
解的存在性:任意 p∈R3 都可达(d2 无界、d3 取到任意非负值、ϑ1 全周),故无「超出工作空间」的不可达情形——这与拟人臂等有界臂不同。
解的唯一性与奇异:d3>0 时解唯一;当 d3=0(末端落在转轴 z0 上,即 px=py=0)时 ϑ1 任意,逆解有无穷多组——臂在轴线上,转不转都到同一处(教程 2.12 提到的「无穷多解」在本机型的实例)。
| 检验项 | 结果 |
| 随机 q(d3>0)正解 → 逆解回代 | 最大偏差 2.2×10−16 |
| 随机 p 逆解 → 正解回代 | 最大偏差 2.2×10−16 |
| 样例 q=[0.83, 0.2, 1.4] | p=(−1.033104, 0.944826, 0.200000) → 逆解得 [0.830000, 0.2, 1.4] √ |
| d3=0 奇异:9 个不同 ϑ1 均给出同一 p | √(验证「ϑ1 任意」) |
易错点
- 忘记 d3≥0:若允许 d3<0,则 ϑ1′=ϑ1+π、d3′=−d3 也是同一点的形式解(多出一支「假解」)。移动关节长度非负——这一条约束才是「解唯一」的来源,不是公式给的。
- 轴上奇异当成「无解」:d3=0 不是无解而是无穷多解(ϑ1 任意)。编程时应特判:若 px=py=0,ϑ1 取上一次的值或 0(术语上叫「沿既定姿态保持」)。
- 用 arccos 求 ϑ1:只能得到 [0,π] 的值,丢一半象限——必须用
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=pz、d3=px2+py2、ϑ1=Atan2(−px,py))。
- 差别:C2 面向练习(留白让读者填),本页是完整解答,可直接用于作业作答与自查。
依据 Siciliano 等《机器人学:建模、规划与控制》第 2 章习题 2-4/2-12/2-19 · 与官方解答手册(Springer, 2009)逐项核对 · 数值验算通过 · 整理日期 2026-09-16