简介:《现代机器人学》课后习题解答以单份PDF呈现,面向机器人专业学生、工程师及自学者,用于对照教材完成Mechanics、Planning and Control各章练习并夯实理论。压缩包仅含1个PDF,大小13.97MB,内容按章节组织,覆盖第2至13章习题答案,便于按学习进度检索。已有1247人学习,说明其在机器人学练习资料中具有一定参考热度。答案从自由度计算、空间拓扑、上肢七自由度机构与约束分析入手,延伸至动力学、路径规划和控制策略等主题,既给出推导思路,也帮助读者理解机构运动特性与关节相互影响。适合课程复习、作业核对和设计问题建模时查阅,可深化对机械设计、运动学与控制核心概念的理解,并促进实践应用。
1. 知识地图:从构型空间到控制的十三级台阶
现代机器人学这门课的知识骨架和多数人的想象不一样,它不按「先补线性代数、再背 PID」的路子铺开,而是先把机器人整体抽象成构型空间里的一个点,再一层层往上搭运动学、规划与控制。这份课后习题答案从第二章排到第十三章,恰好就是这条主线的镜像:前面几章反复在算自由度、拓扑和螺旋轴,后面才逐渐过渡到雅可比、动力学和控制律。它适合两类人:一类是正在系统学机器人学、想把每道题背后方法论抠出来的学生;另一类是做过项目、但概念之间还串不起来的工程师。读这份答案最忌讳只看算式不看拓扑说明,那等于把地图当成了路标。
2. 构型空间与自由度计数:C-space 与 Grübler 公式的完整用法
自由度计数看起来是全书最简单的一章,实际却是后面所有内容的地基。构型空间没搞明白,后面雅可比的零空间、奇异位形的几何含义都会变成纯符号运算。第二章的题目之所以值得逐题过一遍,是因为它把「参数个数」「约束个数」「空间拓扑」这三件事反复拆开重组,练的是同一套思维动作。
2.1 构型空间:自由度不是「关节数」,而是参数的最小个数
构型(configuration)是能唯一确定机器人所有部件位置的一组数,这组数张成的空间叫构型空间。Exercise 2.1 是最干净的入口:在 n 维空间里逐点放置点,第一个点有 n 个自由度,第二个点被约束在第一个点周围的球面上,只剩 n−1 个,第三个再少一个,累加得到 n(n+1)/2。这个结果里 n 个是平移自由度,剩下的 n(n−1)/2 全是旋转自由度。更关键的是后半句:选完第一个点后,第二个点落在 S^{n−1} 上,第三个落在 S^{n−2} 上,于是整个构型空间的拓扑是 R^n × S^{n−1} × … × S^1。这句话决定了后面能不能用「圆环面」「球面」的直觉去判断机构能不能动。
常见构型空间的对照可以先记成一张表,做题时先归类再代数:
| 机构 | 构型空间 | 维数 |
|---|---|---|
| 平面刚体 | R² × S¹ | 3 |
| 空间刚体 | SE(3) = R³ × SO(3) | 6 |
| 平面 nR 开链 | Tⁿ | n |
| 空间 6R 开链 | T⁶ | 6 |
| 轮式移动底盘 | R² × T² | 4 |
| 移动底盘 + 6R 机械臂 | R² × T⁸ | 10 |
最后一行对应 Exercise 2.6(a):轮式底盘当成滚动硬币,构型空间是 R² × T²,6R 手臂是 T⁶,两者拼起来就是 R² × T⁸。这里最容易忽略的是「拼接方式」——底盘和手臂是串联的,构型空间直接做笛卡尔积,维数相加;如果是并联机构,约束会把维数压下去,这一层区别在第 5 章会反复出现。
2.2 两套 Grübler 公式:平面 3 与空间 6 的差别
计数公式本身只有两行,但选错版本几乎等于整题作废。平面版本是 dof = 3(N−1−J) + Σfᵢ,空间版本是 dof = 6(N−1−J) + Σfᵢ。其中 N 是连杆数(地面算一根),J 是关节数,fᵢ 是第 i 个关节的自由度数。3 和 6 的来源不是约定,而是平面刚体有 3 个自由度、空间刚体有 6 个,每增加一个关节就减少一个「连杆相对地面」的刚体约束,再把关节自身放开的自由度加回来。
| 项 | 平面版本 | 空间版本 |
|---|---|---|
| 每个连杆贡献 | 3 | 6 |
| 每个关节扣除 | 3 | 6 |
| 关节自由度上限 | 3(R/P 取 1,C 取 2) | 6(S 取 3,U 取 2,SP 取 4) |
| 典型失效场景 | 球面机构、空间闭链 | 平面四杆、含局部自由度的机构 |
Exercise 2.5 是空间版的标准范例:N = 6 根连杆加地面共 7,J = 5 个 R 关节加 2 个 S 关节共 7,Σfᵢ = 5×1 + 2×3 = 11,代入得 dof = 6(7−1−7) + 11 = 5。Exercise 2.9(a) 则是平面版的范例:把 R 和 P 的组合看成一个 C 关节,N = 8,J = 10,Σfᵢ = 7×1 + 1×1 + 2×2 = 12,dof = 3(8−1−10) + 12 = 3。注意同一道题里 (a) 和 (b) 用两种记账方式算出了同一个答案,(b) 把 C 关节拆回 R+P,N 从 8 变成 14,J 从 10 变成 18,数字全变了但结果一致——这种「换个拆法验证」是检查记账有没有错的最快手段。
2.3 关节记账:fᵢ 怎么取,闭链怎么算
关节自由度是计数的唯一易错来源,建议直接背表再做题:
| 关节 | 符号 | fᵢ | 备注 |
|---|---|---|---|
| 转动 | R | 1 | 平面、空间都一样 |
| 移动 | P | 1 | 平面、空间都一样 |
| 圆柱 | C | 2 | 等价于 R + P 同轴 |
| 万向 | U | 2 | 等价于两个正交 R |
| 球 | S | 3 | 空间球铰 |
| 球-移动组合 | SP | 4 | Exercise 2.17 中约束工具过定点 |
| 开链整体 | — | 6 或 7 | 整条支链当成一个关节处理 |
用代码把公式封起来,做题时只喂结构参数,可以避免手算时漏项:
def grubler(n_links, joints, planar=True): """ n_links: 连杆总数,含地面 joints: {关节名: (数量, 单个关节自由度)} planar: True 用平面公式(3),False 用空间公式(6) """ m = 3 if planar else 6 n_joints = sum(cnt for cnt, _ in joints.values()) sum_f = sum(cnt * f for cnt, f in joints.values()) dof = m * (n_links - 1 - n_joints) + sum_f return dof, n_joints, sum_f # Exercise 2.5:6 根连杆 + 地面,5 个 R + 2 个 S print(grubler(7, {"R": (5, 1), "S": (2, 3)}, planar=False)) # (5, 7, 11) # Exercise 2.9(a):拆成 C 关节后的平面机构 print(grubler(8, {"R": (7, 1), "P": (1, 1), "C": (2, 2)}, planar=True)) # (3, 10, 12)这段代码做的事就是把 N、J、Σfᵢ 三个量分开统计,返回自由度并同时打印关节数和自由度总和,方便和手算对照。n_links 一定要把地面算进去,很多人漏掉这一根,结果整体偏差 3 或 6。planar 参数不要凭感觉选,判断标准是「所有连杆的运动是否被限制在同一平面或同一球面上」,而不是「图看起来像不像平面图」。
提示:同一个机构换一种关节拆分方式(C 拆成 R+P、U 拆成两个 R)算出的自由度必须一致,如果不一致,先检查 N 有没有随拆分同步变化。
2.4 从开链到闭链:并联机构怎么套同一套公式
并联机构的题(Exercise 2.12 到 2.14)看上去复杂,套路其实固定:把每条支链的连杆和关节如实计入 N 和 J,被支链共同支撑的平台算一根连杆,地面算一根,然后照公式算。Exercise 2.13 的六足平台是典型:N = 6 条腿 + 上平台 + 地面 = 8,J = 12 个 S 关节,Σfᵢ = 12×3 = 36,空间公式给出 dof = 6(8−1−12) + 36 = 6,和「平台能绕竖轴转、能水平平移」的直觉一致。Exercise 2.14 更值得注意:三个 P 关节锁死后按公式应该变成结构,但机构实际还能动,这就是 Grübler 公式的经典盲区,说明公式给出的是「瞬时自由度」,遇到闭环里的特殊几何(等长杆、共面轴)必须回到构型空间的几何去验证。
3. 刚体运动与螺旋理论:SE(3)、Twist 与指数积的复习重点
第三章往后,题目从「数个数」转向「描述运动」。这一段的复习目标不是背矩阵,而是建立一套能同时处理开链、闭链和冗余机构的统一语言。螺旋理论就是这套语言,它的价值在于把「转轴 + 平移」打包成一个六维向量,让正运动学写成连乘形式,逆运动学化归为几个标准子问题。
3.1 旋转矩阵与齐次变换的硬约束
旋转矩阵 R 必须满足 RᵀR = I 且 det(R) = 1,前者保证长度和夹角不变,后者排除镜像。很多题在最后一步算出的矩阵不满足正交性,根源往往不是公式错,而是中间某一步把角度单位混成了度。齐次变换矩阵 T = [[R, p], [0, 1]] 是 4×4,它的逆不需要求逆矩阵,直接写成 [[Rᵀ, −Rᵀp], [0, 1]],这个技巧在串联链求逆时能把计算量砍掉一大半。
指数坐标是这一节的另一个重点:任意旋转都可以写成绕某个单位轴 ω̂ 转 θ 角,对应的 so(3) 元素是 [ω̂]θ,指数映射用罗德里格斯公式展开。这里要建立的直觉是「旋转矩阵的乘法不对易」,所以串联链的变换顺序一旦写反,结果就是另一个姿态——这是后面螺旋轴顺序容易出错的总根源。
3.2 螺旋轴、Twist 与指数积公式
螺旋轴写成 S = (ω, v),前三个分量是角速度方向,后三个分量与线速度有关。当螺旋的 pitch 为无穷大时退化成纯移动,pitch 为零时退化成纯转动,这两种退化情形在题目里出现频率很高。Twist 是螺旋轴乘以速度标量,V = S·θ̇,它描述的是瞬时运动,而螺旋轴描述的是「运动可以沿哪条轴发生」,两者不能混。
指数积(PoE)公式把整条开链的正运动学写成:
T(θ) = e^{[S₁]θ₁} · e^{[S₂]θ₂} · … · e^{[Sₙ]θₙ} · M
其中 M 是零位时的末端位姿,每个 [Sᵢ] 是螺旋轴的 4×4 矩阵形式,指数项用矩阵指数展开。这个形式和 DH 参数法的差别在于:螺旋轴全部定义在基座坐标系(空间形式)或末端坐标系(物体形式),不需要每根连杆都建一个中间坐标系,因此对闭链和冗余机构更友好。
import numpy as np def exp_screw(S, theta): """S: 6 维螺旋轴 [omega, v],theta: 关节变量""" w, v = np.array(S[:3], float), np.array(S[3:], float) if np.linalg.norm(w) < 1e-9: # 纯移动,pitch 无穷大 R = np.eye(3) p = v * theta else: w = w / np.linalg.norm(w) # 单位化转轴 K = np.array([[0, -w[2], w[1]], [w[2], 0, -w[0]], [-w[1], w[0], 0]]) R = np.eye(3) + np.sin(theta) * K + (1 - np.cos(theta)) * K @ K G = np.eye(3) * theta + (1 - np.cos(theta)) * K + (theta - np.sin(theta)) * K @ K p = G @ v T = np.eye(4) T[:3, :3], T[:3, 3] = R, p return T def fk_poe(screws, thetas, M): """screws: 螺旋轴列表;thetas: 关节角列表;M: 零位位姿""" T = np.eye(4) for S, th in zip(screws, thetas): T = T @ exp_screw(S, th) return T @ Mexp_screw 里把纯移动和带转动的螺旋分开处理,是因为纯移动时旋转矩阵退化为单位阵,若仍套罗德里格斯公式会出现除零。G 矩阵是平移部分的积分项,theta 很小时它趋近于单位阵乘 theta,这一点可以用来做数值校验。fk_poe 按螺旋轴顺序从左往右连乘,顺序写错得到的就是另一个机构的位姿,所以做题时建议先把每个螺旋轴的方向和过点画在草图上再代入。
3.3 逆运动学:把问题拆成标准子问题
从 PoE 出发做逆解,标准做法是 Paden-Kahan 子问题:绕单轴转到一个点、绕单轴转到一条线上、绕两个相交轴或平行轴转动。题目里的逆解通常可以化成「已知末端位姿,先消去最后一个关节的影响,再逐层剥离」的形式。这一节的重点不在公式推导,而在判断「这个机构有没有解析解」:三轴交于一点(球形腕)才有解耦条件,否则只能上数值迭代。Exercise 2.2 里那条七自由度手臂的分析思路在这里会重现——固定手掌位姿相当于加了六个约束,剩下的一个自由度对应肘尖在圆弧上滑动,这就是冗余机构零空间维数的几何解释。
4. 速度、规划与控制:雅可比、奇异位形与控制律的三层结构
后半本书的主线可以概括成一句话:位置层面的运动学解决「在哪」,速度层面的雅可比解决「怎么动」,动力学与控制解决「用多大力去动」。这三层在题目里经常被混着考,复习时要把每一层的输入输出分清楚。
4.1 雅可比矩阵:速度层面的一阶映射
雅可比 J(q) 把关节速度映射成末端速度,V = J(q)·q̇。它的构造有两条路:几何法逐列写「第 i 个关节转动时末端的速度」,或者从 PoE 直接读出空间雅可比。两条路结果应该一致,如果对不上,八成是螺旋轴的参考系搞混了——空间雅可比定义在基座系,物体雅可比定义在末端系,两者差一个伴随变换。
雅可比的用途远不止速度映射:它还是静力映射的转置(τ = JᵀF)、可操作性椭球的形状矩阵(JJᵀ 的特征值)、以及奇异判据(det(J) = 0 或条件数爆炸)。复习时建议把这三件事放在一起记,它们本质是同一个矩阵的三种读法。
4.2 奇异位形:不是数学故障,是几何事实
奇异位形分为边界奇异和内部奇异。边界奇异出现在机构伸展到工作空间边缘时,内部奇异出现在两个关节轴共线导致某个方向瞬间失去运动能力时。判断方法有三层:解析上解 det(J) = 0,数值上看最小奇异值接近零,几何上看「是否有某个方向的力无法由关节力矩平衡」。第三种最容易被忽略,但它在解释「为什么奇异点附近关节速度会飙到无穷大」时最直观——末端要在某个方向产生速度,而该方向恰好落在雅可比的零空间之外,只能靠关节无限快地转来凑。
数值雅可比可以用于验证解析推导,写法如下:
def jacobian_numeric(fk, q, eps=1e-6): """fk: 输入关节角返回末端位置; q: 当前关节角""" q = np.array(q, float) n = len(q) J = np.zeros((3, n)) p0 = fk(q) for i in range(n): dq = np.zeros(n) dq[i] = eps J[:, i] = (fk(q + dq) - p0) / eps # 前向差分近似偏导 return J这段代码用前向差分逐列逼近雅可比,eps 取太小会被浮点误差淹没,取太大则截断误差明显,1e-6 是个常用折中。它只能验证位置雅可比,姿态部分需要把旋转矩阵转成轴角再差分,题目里如果只要求速度映射,位置雅可比已经够用。用它和解析结果对比时,误差应该随 eps 减小而先降后升,如果单调上升,说明解析式本身就写错了。
4.3 从轨迹规划到动力学控制:三层结构的衔接
轨迹规划解决的是「给定期望位姿序列,怎么生成光滑的关节曲线」。关节空间规划用多项式或梯形速度曲线,优点是计算简单且不会中途穿过奇异;任务空间规划用直线或圆弧插补,优点是末端轨迹直观,缺点是要反复做逆解,遇到奇异点会卡住。这一节的复习重点是时间标定——给定几何路径 s(λ),再给 λ(t) 加上起止速度和加速度约束,两步分开做,不要一上来就写五次多项式。
动力学部分的标准形式是 M(q)q̈ + C(q, q̇)q̇ + g(q) = τ,其中 M 是对称正定的惯量矩阵,C 包含科氏力和离心力,g 是重力项。惯量矩阵的正定性可以用动能 ½q̇ᵀMq̇ > 0 来记,它保证了动力学方程不会出现「负质量」这种非物理情形。控制律可以按补偿程度排一张表:
| 控制律 | 补偿项 | 适用场景 | 主要问题 |
|---|---|---|---|
| 纯 PD | 无 | 低速、重力可忽略 | 稳态误差、响应慢 |
| PD + 重力补偿 | g(q) | 定点保持、示教 | 高速时跟踪误差大 |
| 计算力矩控制 | M、C、g 全补 | 高精度轨迹跟踪 | 依赖模型精度 |
| 任务空间控制 | 雅可比 + 动力学 | 末端柔顺作业 | 奇异附近不稳定 |
这张表的读法是「补偿得越多,跟踪越好,但对模型的依赖越强」。题目里如果给出质量矩阵和重力向量却只让设计 PD,那基本是在考「先补偿再调增益」的顺序,而不是让你硬调参数。
5. 易错点:自由度记账里最容易翻车的五处细节
第二章的题量大、花样多,真正拉开差距的不是会不会套公式,而是能不能在公式失效的地方看出来。下面五条是梳理整份答案后反复出现的坑,每一条都对应原题里的具体情形。
5.1 平面公式和空间公式选反
易漏点:看到机构是「画在纸上」的,就默认用平面公式;看到三维图,就默认用空间公式。为什么漏:判断依据不是图形维度,而是连杆的运动是否被约束在同一平面或同一球面上。Exercise 2.16 的球面机构四条连杆都被约束在球面上运动,必须用二维版本(等价于平面版本的 3),用空间公式会算出 dof = −2,得到一个「机构不能动」的荒谬结论。怎么补:动笔前先问一句「所有点的运动轨迹是否落在同一个二维流形上」,是就用平面版,不是才用空间版;算完如果得到负自由度,先怀疑公式版本而不是机构本身。
5.2 把 Grübler 公式当成万能判据
易漏点:算出 dof = 0 就断定机构是结构。为什么漏:公式只统计「一般位置」的自由度,无法识别特殊几何带来的局部自由度。Exercise 2.15 里五个同尺寸正方形铰接成的机构,空间公式给出 0,但实际能以一个自由度运动,因为等长条件引入了额外的约束相关性,公式看不见。怎么补:遇到闭环、对称、等长杆这些关键词,算完公式必须再补一句几何判断;反过来,算出正自由度但在实物上卡死,也要怀疑是不是有未建模的冗余约束。
5.3 等效关节漏记或拆错
易漏点:把 C 关节只记成 R、把 U 关节只记成一个 R、把 fork 关节当成普通 R。为什么漏:题目常把复合关节画成一个符号,视觉上像一个关节,实际自由度是 2 甚至 3。Exercise 2.9(a) 把 R+P 合成 C 后,Σfᵢ 从 18 变成 12,如果按一个 R 记,结果会差好几分。怎么补:每认出一个关节就写下它的 fᵢ,写在图的旁边,最后加总;C = 2、U = 2、S = 3、SP = 4 这张表要能默写。Exercise 2.17 里的 SP 关节更隐蔽——它表示工具必须穿过一个固定点,是 3 个转动加 1 个移动,漏掉这一项,自由度会从 2 变成 4。
5.4 末端执行器和被抓物体算不算连杆
易漏点:在多臂抓取、双手操作类题目里,不知道该把被操作的物体当成连杆还是当成约束。为什么漏:物体被夹住之后既像连杆又像约束,取决于夹持是否形成闭环。Exercise 2.6 里两个 6R 机器人共同抓住冰箱门,N 要把两条手臂的连杆、门和地面全部计入,J 要算上所有 R 关节,最后得到 1 个自由度;如果把门当成「约束」而不是连杆,数字会全乱。怎么补:判据是「这个物体是否参与构成运动链」,参与就计入 N,不参与才当外部约束。Exercise 2.7 里把开链手臂整体当成一个 7 自由度关节,也是一种合法记账,但要保证 N 和 J 同步调整。
5.5 开链整体当关节时的自由度取值
易漏点:把一条 6R 开链手臂简化成「一个 6 自由度关节」时,搞不清该取 6 还是 7。为什么漏:6R 手臂末端位姿是 6 维,但如果它抓住一个物体、物体又被其他支链约束,实际贡献的自由度要按闭合后的情形算。Exercise 2.7(b) 里 n 条 7 自由度开链抓住同一个物体,把每条链当成 7 自由度关节,代入后得到 dof = n + 6,这个结果说明「每条链多出来的 1 个自由度是冗余的」;Exercise 2.8 进一步证明,只要每条腿是 6 自由度,不管多少条腿,总自由度恒为 6。怎么补:简化之前先写清「这条链的末端是被固定、被共享还是自由」,共享就按共享后的闭合链算,别直接套开链的自由度数。
6. 复习清单:把十三章压成一张可自测的查漏表
复习到最后一轮,最有效的做法不是重读答案,而是拿一张表逐项自测:每一行对应一个模块,左边写核心公式或概念,右边写「能不能不看答案复述出推导路径」。下面这张表是按章节顺序压出来的,括号里是自测问题,答不上来就回到对应章节的习题。
| 模块 | 核心内容 | 自测问题 |
|---|---|---|
| 构型空间 | Rⁿ × S^{n−1} × … × S¹ 的来历 | 为什么 n 个点的自由度是 n(n+1)/2 |
| 自由度计数 | 平面 3、空间 6 两套 Grübler | 什么情况下公式会失效 |
| 关节记账 | R/P=1、C/U=2、S=3、SP=4 | 换一种拆分方式结果是否一致 |
| 刚体运动 | SO(3) 正交性、SE(3) 求逆技巧 | 齐次变换的逆为什么不用求逆矩阵 |
| 螺旋理论 | S = (ω, v)、pitch、PoE 连乘 | 空间雅可比和物体雅可比差什么 |
| 逆运动学 | Paden-Kahan 子问题、解耦条件 | 什么机构才有解析解 |
| 雅可比 | 速度映射、静力映射、可操作性椭球 | det(J)=0 的几何含义 |
| 动力学 | M 正定、C 的物理来源 | 为什么惯量矩阵必须正定 |
| 控制 | PD、重力补偿、计算力矩 | 补偿项越多越好吗 |
具体过法建议分三遍。第一遍按章节顺序把每道题的「记账表」重画一遍,只写 N、J、Σfᵢ 和结果,不写推导,目的是让手熟悉数字;第二遍只做算错的题,重点是找出错在「公式版本」「关节自由度」「连杆归属」中的哪一类,把错因写在题号旁边;第三遍合上答案,对着上面这张表逐行口述,卡住的格子就是这一轮要补的洞。
还有一个很实用的习惯:每算完一道自由度题,强制用另一种拆分方式验算一次。把 C 拆成 R+P、把 U 拆成两个 R、把开链整体拆成逐个关节,如果两次结果不同,问题一定出在 N 或 J 的统计上,而不是公式本身。这个动作花不了两分钟,却能拦住后面百分之八十的连锁错误。
我自己的教训是第一次做第二章时连错四道,全部错在「地面算不算连杆」和「关节自由度取几」这两个最基础的地方,当时觉得是粗心,后来发现是记账习惯没建立起来。从那以后我每道题都先画一张只有节点和数字的小表,把 N、J、Σfᵢ 三列填满再动笔,错误率才降下来。希望这份梳理能帮到你,少走几道弯路。
本文还有配套的精品资源,点击获取