简介:《机器人建模和控制》习题答案以PDF文档形式整理,面向学习机器人运动学、动力学与控制理论的高校学生、研究生及工程技术人员,可用于课后对照、复习自测与考前查漏补缺。压缩包内共1个PDF文件,大小约6.46MB,结构简洁,适合在电脑或平板上直接查阅、标注与打印。已有3106人学习下载,在机器人学基础训练中具有一定参考价值。内容围绕教材各章习题展开,涉及坐标变换、正向与逆向运动学、牛顿—欧拉和拉格朗日动力学建模、轨迹规划、基于Lyapunov理论的稳定性分析以及传感器数据处理等典型题目;答案可用于核对推导过程、理解建模思路、发现计算盲点,并帮助读者把课堂理论、习题训练与工程应用衔接起来。
1. 知识地图:机器人建模和控制这门课的习题,考点其实高度收敛
机器人建模和控制这门课的课后题,翻开目录会以为要啃下一整本书,真做下来会发现考点高度收敛:位姿描述、正向与逆向运动学、雅可比、动力学方程、控制律设计与稳定性证明,五层依次递进,每一层都在前一层的输出上继续算。这也是我建议先看知识地图、再翻习题答案的原因——地图不清楚,答案每一步都看得懂,连起来就断片。
这张地图大概长这样:坐标系与齐次变换是所有题的地基;运动学负责“关节角变末端位姿”,逆解负责反着来;雅可比把速度、静力接到同一套矩阵上;动力学给出力矩与运动的关系;控制在动力学之上设计误差收敛的律。适合两类人:正在跟课、想把零散作业串成体系的人,以及期末或考研复习、需要快速定位薄弱环节的人。习题答案的价值不在于抄,而在于每一步都能对上地图上的某个节点。
2. 位姿与运动学:齐次变换、DH 参数与正逆解的完整解题链
2.1 坐标系与齐次变换:把一句文字题翻译成一个矩阵
这一层的题,九成错误不是算错,而是坐标系没对齐。习题里常出现四种坐标系:世界(基座)坐标系、关节坐标系、工具(末端)坐标系、任务(工件)坐标系。读题时先在草稿上画三个箭头,标清“谁相对谁”,再动笔列矩阵,比直接套公式稳得多。
齐次变换矩阵是 4×4 结构,左上 3×3 是旋转矩阵 R,右上 3×1 是平移向量 p,最后一行是 [0 0 0 1]。R 必须满足正交性 RᵀR = I 且 det R = 1,这两条是后面所有验算的抓手。复合变换的乘法顺序有个口诀:左乘是绕基座系(固定系)变换,右乘是绕当前(动系)变换。写错顺序是这一节最常见的翻车点。
import numpy as np def rot_z(t): c, s = np.cos(t), np.sin(t) return np.array([[c, -s, 0], [s, c, 0], [0, 0, 1]]) def make_T(R=np.eye(3), p=np.zeros(3)): T = np.eye(4) T[:3, :3] = R # 旋转块 T[:3, 3] = p # 平移块 return T def inv_T(T): R, p = T[:3, :3], T[:3, 3] # 刚体变换的逆有解析形式,不用调 np.linalg.inv return make_T(R.T, -R.T @ p) T = make_T(rot_z(np.pi / 2), np.array([1.0, 2.0, 0.0])) assert np.allclose(T @ inv_T(T), np.eye(4))这段代码里,rot_z只处理绕 z 轴旋转,其余轴同理换基向量即可;inv_T用的是 Rᵀ 和 -Rᵀp 的解析逆,前提是 R 严格正交、没有缩放。习题里凡是要求“求逆变换”,先检查 R 是否正交,再决定用解析式还是数值求逆。用np.linalg.inv算出来的结果如果和解析式差在 1e-12 量级,说明矩阵构造没问题;差得多,基本是 R 里混进了缩放或者行列式为 -1。
还有一个容易忽略的点:齐次矩阵的最后一行的前三个元素必须严格为 0,第四个数为 1。有些手写推导会把透视项写成非零,后面再乘就会把平移“放大”,结果越算越离谱。
2.2 旋转的三种参数化:轴角、欧拉角与四元数怎么互转不翻车
习题里同一个姿态会换三种问法:给矩阵求轴角、给欧拉角求矩阵、给四元数判断等价性。理清各自的自由度和退化条件,比背公式重要。
| 参数化 | 参数个数 | 退化/奇异 | 常见考法 | 易错点 |
|---|---|---|---|---|
| 旋转矩阵 | 9(6 个约束) | 无奇异 | 变换链相乘、验算 | 忘记检查 det R = 1 |
| 轴角 | 4(实际 3 自由度) | θ = 0 时轴不唯一 | 罗德里格斯公式 | 轴未归一化就代入 |
| 欧拉角 ZYZ | 3 | β = 0 或 π 时退化 | 腕部姿态反解 | 与 RPY 顺序混用 |
| RPY(xyz) | 3 | β = ±π/2 时万向节死锁 | 移动平台姿态 | 内外旋顺序写反 |
| 四元数 | 4(单位约束) | q 与 -q 表示同一旋转 | 插值、数值迭代 | 忘记归一化 |
ZYZ 和 RPY 是最容易混的一对:前者常用于关节型机械臂的腕部,后者常用于飞行器或移动平台。考试里给了“绕 z、再绕 y、再绕 x”这种文字描述,一定按字面顺序写成矩阵连乘,别凭记忆套现成公式。
互转之后的验算有个笨但有效的办法:把结果再转回去,看是否复现原矩阵。四元数要记住双覆盖,q 和 -q 是同一个旋转,判断“是否相等”时应当比较旋转效果,而不是逐个分量比较。万向节死锁的判断也别只背结论,直接看反解公式里是否出现除以 cos β 或 sin β 的项,β 接近 ±90° 时分母趋零,这就是死锁的数学来源。
2.3 DH 参数表:四个参数怎么读、表怎么建
DH 参数是运动学题的“字典”。标准 DH 约定下,相邻两连杆的变换由四个参数决定:θ(绕 z 轴的关节角)、d(沿 z 轴的连杆偏距)、a(沿 x 轴的连杆长度)、α(绕 x 轴的连杆扭转角)。单个变换写成:
A = Rot(z, θ) · Trans(z, d) · Trans(x, a) · Rot(x, α)
建表步骤梳理下来是四步:先定每个关节的 z 轴(沿关节转轴或移动方向);再找相邻 z 轴的公垂线,把 x 轴放在公垂线上;然后读 a(两 z 轴公垂线距离)和 α(两 z 轴夹角);最后读 d 和 θ。转动关节的 θ 是变量、d 是常数,移动关节反过来。
def dh_transform(theta, d, a, alpha): ct, st = np.cos(theta), np.sin(theta) ca, sa = np.cos(alpha), np.sin(alpha) # 标准 DH:Rot(z,theta)·Trans(z,d)·Trans(x,a)·Rot(x,alpha) return np.array([ [ct, -st * ca, st * sa, a * ct], [st, ct * ca, -ct * sa, a * st], [0, sa, ca, d], [0, 0, 0, 1] ]) # 平面二连杆:l1 = l2 = 1,全部绕 z 轴转动 def fk_2r(q, l1=1.0, l2=1.0): A1 = dh_transform(q[0], 0, l1, 0) # 连杆 1 A2 = dh_transform(q[1], 0, l2, 0) # 连杆 2 return A1 @ A2 print(fk_2r([0.0, 0.0])[:3, 3]) # 应为 [2, 0, 0]dh_transform里四个参数顺序不要换,alpha的余弦落在第三行第三列,a只影响平移块。用平面二连杆自测:两关节都为 0 时末端应在 [l1+l2, 0, 0],关节 2 转 90° 时应在 [l1, l2, 0],这两个数对不上,说明表建错了。
改进 DH(Craig 约定)和标准 DH 的差别在于:改进型的 x 轴沿 z_{i-1} 与 z_i 的公垂线,变换顺序变成 Rot(x, α) · Trans(x, a) · Rot(z, θ) · Trans(z, d)。两种约定不能混用,一道题里从头到尾只用一种。有些习题答案不写约定,直接给矩阵,这时候对照它 q = 0 时的矩阵是否与你的一致,就能反推它用的是哪种。
2.4 正向运动学:乘积链与三个验算习惯
正向运动学在形式上很简单:T_0^n = A_1 · A_2 · … · A_n。难的是乘完以后自己不确定对不对。三个验算习惯能挡掉大部分错误:第一,令所有关节角为 0,把结果和机构简图上量出来的尺寸对比;第二,只让某一个关节转动,看末端轨迹是不是该关节对应的圆弧;第三,看平移向量各分量的量级,如果出现比连杆总长还大的数,多半是某个 a 或 d 填错了位置。
还有一类题会问“末端在基座系下的位姿”,但图里给的是工具坐标系。这时要右乘一个固定的工具变换 T_tool,位置是 T_0^n · T_tool。很多人把工具变换左乘到最前面,结果整个机械臂像被平移了一样,这种错误在数值上很难一眼看出来,只能靠验算习惯拦。
2.5 逆向运动学:解析解、几何解与数值解的取舍
逆解的题面通常很客气:“求所有解”或“判断是否可达”。解析解存在性有个经典判据:三个相邻关节轴交于一点,或者三个相邻轴互相平行,就存在封闭解。六自由度关节型机械臂大多按“前三轴定位置、后三轴定姿态”拆开解,位置部分用几何法,姿态部分用欧拉角反解。
平面二连杆是最小可解例子,用余弦定理直接写:cos θ₂ = (x² + y² - l₁² - l₂²) / (2 l₁ l₂),θ₂ 取正负得到肘上、肘下两组解,再代回求 θ₁。这一步最容易漏的是解的个数,题目问“所有解”时只写一组,扣分很冤。
数值解适合没有封闭解的结构,牛顿-拉夫逊迭代是标配,但雅可比在奇异位形附近会病态,工程上更常用阻尼最小二乘:
def ik_dls(fk, jac, q0, x_target, iters=300, tol=1e-8, lam=1e-3): q = np.array(q0, dtype=float) for k in range(iters): e = np.asarray(x_target) - fk(q) if np.linalg.norm(e) < tol: break J = jac(q) # (JᵀJ + λ²I)⁻¹Jᵀ 的等价写法,避免直接求 JᵀJ 的逆 dq = J.T @ np.linalg.solve(J @ J.T + lam**2 * np.eye(J.shape[0]), e) q = q + dq return q, np.linalg.norm(e)lam是阻尼系数,取 1e-3 到 1e-2 之间比较稳;iters给大一点不影响收敛速度,只影响失败时的耗时;tol按任务精度取,位置量级是米时 1e-8 已经足够。这个写法比np.linalg.pinv(J)更稳,因为它在奇异附近自动退化成梯度下降,不会因为 J 不满秩直接报错。
解出多组解之后还有筛选:关节限位、避障、解的连续性。习题里常给限位表,别忘了逐组检查,很多人算出四组解就直接写“共四组”,实际只有两组落在限位内。
2.6 雅可比与奇异位形:速度题和力题共用一套矩阵
雅可比描述关节速度到末端速度的线性映射:v = J(q) q̇。构造上有几何法和微分法两条路,几何法更直观:第 i 列由 z_i × (p_e - p_i) 和 z_i 组成,转动关节如此,移动关节只取 z_i。写的时候一定要在矩阵右上角标注参考系,因为同一机械臂在基座系和末端系下的雅可比不一样,静力题用错参考系,力矩会差一个旋转变换。
奇异位形是 det J(q) = 0 的位形,物理上意味着某些方向末端动不了。可操作度 w = sqrt(det(J Jᵀ)) 常被用来量化“离奇异有多远”。习题里让判断奇异位形,最稳的做法是先把 J 写出来,再解行列式为零的方程,别只凭机构简图猜“手臂伸直”这种结论。
静力映射 τ = Jᵀ F 和速度映射共用同一个 J,这一点值得单独记:末端施加力 F,各关节需要提供的力矩就是 JᵀF。很多题把这两个公式的方向搞反,写成 F = Jᵀ τ,量纲上立刻能看出来不对,但考试紧张时容易漏检查。
3. 动力学与控制:拉格朗日方程、惯量矩阵与 Lyapunov 证明
3.1 拉格朗日建模四步法:从能量到方程
动力学题的标准流程四步:选广义坐标、写动能 K、写势能 P、代入 d/dt(∂L/∂q̇) - ∂L/∂q = τ,其中 L = K - P。看着机械,但每一步都有具体的坑。
动能要算平动加转动:K = ½ m vᵀv + ½ ωᵀIω,其中 v 和 ω 都要用雅可比表示成 q̇ 的函数,最后整理成 ½ q̇ᵀM(q)q̇ 的形式。质量惯性矩 I 是对质心写的,如果题里给的是对关节轴的惯量,直接替换即可,但要是要求从质心平移到关节,必须补上平行轴定理的 md² 项。
势能只有重力时最简:P = Σ m_i g ᵀ p_ci,p_ci 是各连杆质心位置。很多人动能算得很仔细,势能却漏掉某个连杆,最后重力项少一项,整道题的结果都偏。
整理出来的标准形式是 M(q)q̈ + C(q,q̇)q̇ + g(q) = τ。这里的 C 矩阵不唯一,但 C q̇ 唯一,所以习题里给不同的 C 写法不要慌,代进去算出来的广义力是一样的。
3.2 牛顿-欧拉迭代:什么时候用它,怎么和拉格朗日互验
拉格朗日法适合推导闭式方程,牛顿-欧拉法适合数值计算,两段式:先从基座向末端外推各连杆的速度和加速度,再从末端向基座内推力和力矩。手算题里牛顿-欧拉的优势是每一步物理意义清楚,链式结构不会因为项数多而崩。
互验的办法很实用:随便取一组 (q, q̇, q̈),分别用拉格朗日得到的闭式方程和牛顿-欧拉递推算 τ,两边的数值应该一致到小数点后若干位。手算时不可能取很多组,取一组 q̇ = 0、q̈ = 0,此时 τ 应该只剩重力项 g(q),这一步能快速定位是重力项写错还是惯性项写错。
3.3 惯量矩阵的三条性质:对称正定、斜对称、线性参数化
性质一,M(q) 对称正定。对称来自动能是二次型,正定来自动能非负且只有零速度时为零。习题里经常让你“证明 M 对称正定”,标准答法是写出 K = ½ q̇ᵀM q̇ ≥ 0,再说明等号仅在 q̇ = 0 时成立。
性质二,Ṁ - 2C 斜对称,即对任意向量 x,xᵀ(Ṁ - 2C)x = 0。这条性质是后面 Lyapunov 证明能化简的关键,考试里如果题目让你“利用斜对称性质”,指的就是它。手推容易漏掉 Christoffel 符号里的系数 ½,下面这段数值检查可以当自测工具:
def christoffel(M, q, dq, eps=1e-6): n = len(q) dM = np.zeros((n, n, n)) # dM[k,i,j] = ∂M_ij/∂q_k for k in range(n): dqk = np.zeros(n); dqk[k] = eps dM[k] = (M(q + dqk) - M(q - dqk)) / (2 * eps) C = np.zeros((n, n)) for i in range(n): for j in range(n): for k in range(n): # c_ijk = ½(∂M_ij/∂q_k + ∂M_ik/∂q_j - ∂M_jk/∂q_i) C[i, j] += 0.5 * (dM[k, i, j] + dM[j, i, k] - dM[i, j, k]) * dq[k] return C def check_skew(M, q, dq, dt=1e-6): Md = (M(q + dt * dq) - M(q - dt * dq)) / (2 * dt) # 沿轨迹的 Ṁ N = Md - 2 * christoffel(M, q, dq) return np.allclose(N, -N.T, atol=1e-4) # 反对称检查eps和dt是数值微分步长,太大会截断误差明显,太小会放大浮点噪声,1e-6 附近比较平衡;atol放到 1e-4 是因为数值微分本身有误差,不必强求 1e-12。这个检查跑通,说明你的 M 和 C 是配套的;跑不通,通常是 C 的符号或 ½ 系数错了。
性质三,动力学方程对惯性参数是线性的:τ = Y(q, q̇, q̈)θ,Y 是回归矩阵,θ 是参数向量。这条性质在自适应控制题里会用到,属于“知道有这回事”就够的层次,不必手推完整回归矩阵。
3.4 独立关节 PID 与计算力矩:重力补偿不是可选项
最基础的控制律是独立关节 PD 加重力补偿:τ = K_p(q_d - q) - K_d q̇ + g(q)。很多人问为什么不能只用 PD,答案藏在重力项里:没有 g(q) 补偿,稳态误差会稳定在 K_p⁻¹g(q) 上,关节越多、负载越重,偏差越明显。习题里让“分析稳态误差”,把 q̈ = q̇ = 0 代入方程就能直接看出这一项。
计算力矩法(逆动力学控制)的思路是先用期望加速度把非线性项抵消掉:
τ = M(q)(q̈_d + K_d ė + K_p e) + C(q, q̇)q̇ + g(q),其中 e = q_d - q。
代回动力学方程,非线性项全部消掉,误差方程化为 ė̈ + K_d ė + K_p e = 0,一个线性二阶系统。取 K_d、K_p 正定对角,误差指数收敛。这一步是整章最值得背下来的推导,因为考试里“证明闭环稳定”几乎都是这个套路。
参数怎么选:把 K_p 看成 ω_n²,K_d 看成 2ζω_n,按想要的带宽和阻尼比反推。ζ 取 0.7 到 1.0 之间,响应快又不过冲;ω_n 受采样频率和未建模动态限制,经验上不超过采样角频率的十分之一。
3.5 Lyapunov 稳定性:答题骨架与三个常见断点
稳定性题的答题骨架固定:选候选函数、求导、化简、下结论。机电系统里最常用的候选函数是能量型:
V = ½ q̇ᵀM(q)q̇ + ½ eᵀK_p e
第一项是动能,第二项是“虚拟弹簧”的势能,正定性由 M 正定、K_p 正定保证。求导时把 M 的导数项和 C 矩阵的项凑在一起,利用 Ṁ - 2C 斜对称,交叉项正好消掉,剩下 V̇ = -q̇ᵀK_d q̇ ≤ 0。
三个常见断点:第一,V̇ 只是半负定,不能直接说渐近稳定,要补 LaSalle 不变集或者 Barbalat 引理;第二,候选函数必须径向无界,否则只能得到局部结论;第三,K_p、K_d 的正定性要写出来,光说“取正定矩阵”不够,最好指出对角元为正。
完整的收尾逻辑是:V̇ ≤ 0 说明一致稳定,再由 LaSalle 说明系统最大不变集里只有 q̇ = 0、e = 0 的平衡点,于是渐近稳定。这一步写不写,往往是满分和扣分的分界线。
3.6 自适应与鲁棒控制:习题边界在哪
自适应控制的题通常只要求两件事:写出误差方程,选参数自适应律并给 Lyapunov 函数。典型形式是 τ = Y(q, q̇, q̇_r, q̈_r)θ̂ - K_d s,自适应律 θ̂̇ = -Γ Yᵀ s,Lyapunov 函数在 3.5 的基础上再加一项 ½ θ̃ᵀΓ⁻¹θ̃。推导里参数误差 θ̃ 的导数会与自适应律里的 Yᵀs 抵消,剩下的 V̇ 仍是半负定。
滑模控制则要注意抖振的定性描述:sign 函数换成饱和函数或边界层,稳态误差有界。这两类题一般不会要求完整数值仿真,把稳定性结论和参数含义说清楚即可,别在符号推导上耗太久。
4. 易漏点清单:位姿、运动学、动力学与控制里最容易翻车的五个地方
4.1 位姿与运动学里的三个漏项
易漏点一:复合变换的乘法顺序。为什么漏——题目用文字描述“先绕基座 z 轴转,再沿当前 x 轴平移”,两种操作恰好一个左乘一个右乘,凭语感容易写反。怎么补——在草稿上给每个变换标“固定系”还是“动系”,固定系一律左乘,动系一律右乘,写完用 q = 0 时的结果验一次。
易漏点二:DH 参数表里 θ 的偏置。为什么漏——很多机构在零位时关节并不在 DH 定义的零位,表里要写 θ = q + offset。怎么补——建完表先令 q = 0,看正解结果是否与机构简图的零位一致,不一致就把偏差折算进 offset,再重算一遍。
易漏点三:雅可比的参考系。为什么漏——速度题和静力题分开做,各自套公式,没人提醒两者必须用同一个参考系的 J。怎么补——在 J 旁边永远标注上标(如 ᴮJ),做 τ = JᵀF 之前先确认 F 是在哪个系下表示的,不在同一系就先乘旋转矩阵换过去。
4.2 动力学与控制里的两个错法
易错点一:惯量矩阵漏掉电机转子惯量和减速比。为什么漏——习题图里只画连杆,电机藏在关节里,题干不写就容易当不存在。怎么补——读题时专门找“转子惯量”“减速比”这类词,关节等效惯量按 J_m 加 i²J_motor 的形式并入 M(q) 的对角项,量级上差一个 i²,漏了会差出好几倍。
易错点二:Lyapunov 只证到 V̇ ≤ 0 就下“渐近稳定”的结论。为什么漏——课堂上讲能量函数时常常停在半负定,后面的 LaSalle 一笔带过,做题时记忆就断在这里。怎么补——养成固定句式:“V̇ ≤ 0 得稳定;再由 LaSalle(或 Barbalat)说明最大不变集仅含平衡点,得渐近稳定。”两句都写,比只写一句稳。
另外还有一个隐藏的易错点值得单列:计算力矩法里 C 项写成 Cᵀq̇。为什么漏——斜对称性质里 Ṁ - 2C 的 C 和方程里的 C 容易混,符号一乱就写成转置。怎么补——记住标准形式是 C(q,q̇)q̇,C 的选取不唯一但 C q̇ 唯一,用 3.3 的数值检查跑一遍,斜对称通过就说明 C 没错。
5. 复习清单:用错题反查知识地图的三周走法
复习最怕的是“题都做过,一考就懵”。我的做法是把错题按地图上的五层归类,而不是按章节顺序重刷。具体走法分三段,每段一周。
第一周只做位姿与运动学,目标是“手算不出错”。每天挑五道变换题、三道正解、两道逆解,做完立刻用三个验算习惯过一遍:q = 0 对简图、单关节转动看圆弧、量级是否合理。这一周不碰动力学,避免注意力分散。
第二周攻动力学与控制,重点是推导而不是计算。每天手推一遍计算力矩的误差方程,再挑一道 Lyapunov 题完整写到“由 LaSalle 得渐近稳定”为止。推完对照下面这张自查表打分:
| 检查项 | 合格标准 | 不合格时的补法 |
|---|---|---|
| 动能是否含转动项 | 每根连杆都有 ½ωᵀIω | 回看 3.1 的 K 表达式 |
| M 是否对称正定 | 手动验证对角元为正 | 检查是否有负质量或漏项 |
| C 与 M 是否配套 | Ṁ - 2C 斜对称通过 | 用 3.3 的数值检查脚本 |
| 重力项符号 | q̇ = q̈ = 0 时 τ = g(q) | 检查势能求导的符号 |
| 稳定性结论 | 写全“稳定 + 不变集”两句 | 补 LaSalle 或 Barbalat |
第三周做整卷限时训练,只做两类题:一类是跨层的综合题(比如“给轨迹求逆解再设计控制律”),另一类是过去错过的原题。限时训练的意义是暴露“会但慢”的问题,很多人栽在时间上而不是不会。
查漏补缺的具体技巧:把每次卡住的地方写成一句话,比如“逆解多解没筛限位”“雅可比参考系没标”,攒到十句左右,回头对照第 4 章的易漏点清单,重合的部分就是你的真短板。这套习题答案的用法也在这里——先自己写,写完再逐行对照,卡住的那一步才是要复盘的地方,而不是整页抄一遍。
说个血泪经验:我曾经连续三道逆解题都只写了一组解,对照答案才发现每组都少了肘下的分支,问题出在开方后忘了取负号。从那以后我每做完一道逆解题,都强制把解代回正解验一遍,并且数一遍解的个数是否和机构自由度匹配。这个习惯后来帮我拦下了不少低级错误,也希望帮到你。
本文还有配套的精品资源,点击获取