资讯动态

机器人建模与控制习题答案为何对不上:DH约定、逆解与动力学排查

发布时间:2026/10/27 21:40:07 来源:尧图企业网站定制
简介《机器人建模和控制》习题答案以PDF形式整理面向学习机器人学、自动控制及相关课程的高校学生与研究人员用于对照经典教材《Robot Modeling and Control》课后题目进行自测、复核推导与查漏补缺。压缩包内共1个PDF文件大小约6.46MB内容围绕坐标系、正逆运动学、动力学建模、传感器建模、PID与滑模/自适应控制、轨迹规划和Lyapunov稳定性分析等核心知识点展开便于按章节检索习题解答与计算过程。目前已有3106人学习下载说明其在机器人建模与控制课程复习中具有一定参考价值。读者可借助答案核对逆向运动学求解、关节力矩计算、路径平滑与控制器稳定性证明等步骤理解教材习题的建模思路和推导链条也可作为课程作业检查、考研复习与科研入门阶段的辅助材料。1. 习题答案对不上多半不是算错了一份教材埋下的约定翻开《机器人建模和控制》的习题答案最普遍的困惑不是“这题不会做”而是“我算的和答案不一样可答案看着也对”。同一台三连杆臂换个坐标系挂法逆解里那个关节角就从 0.649 变成 1.921数字全变、物理含义没变。真正卡人的地方是教材在建模环节埋下的一整套约定坐标系固定在哪根连杆上、DH 参数按什么顺序量、角度用弧度还是度、雅可比相对基座系还是末端系求。这些约定从不写进公式却决定了机器人建模和控制的最终结果。把这层约定吃透一份习题答案才能被读成可复现的推导流程而不是一串只能背下来的数字。2. 齐次变换与 DH 参数为什么 4×4 矩阵成了通用表示机器人学的所有推导最后都收敛到一个 4×4 矩阵上这件事初看有点浪费姿态只需要 9 个数位置只需要 3 个数为什么非要凑成 16 个答案藏在“复合”这个词里——旋转的复合是矩阵乘法旋转加平移的复合却没法用同维度的乘法表达。齐次坐标把平移塞进第四列代价是矩阵里多了最后一行的 0 0 0 1收益是“串联”这件事被彻底简化为连乘。整条运动链的正运动学本质上就是一次从基座到末端的矩阵累乘。2.1 旋转矩阵的双重含义姿态描述与坐标变换同一个 3×3 矩阵 R在教材里承担两种读法。读法一是姿态描述R 的三列分别是动坐标系三个轴在参考系中的方向余弦它在回答“这个刚体朝向哪里”。读法二是坐标变换算子把一个在动坐标系下表达的向量左乘 R就得到它在参考系下的坐标它在回答“同一个箭头该怎么换算”。两种读法对应的数字完全一样语义却不同这是大量推导错误的起点。最容易出错的地方是求逆。旋转矩阵是正交矩阵满足 R⁻¹ Rᵀ所以“把 A 系下的坐标变到 B 系”只需要转置不需要真的求逆。习惯性写np.linalg.inv的人不会得到错误结果但会失去一个重要的自检点如果转置和求逆结果不一致说明那个矩阵根本不是纯旋转而是混进了缩放或者数值漂移的齐次矩阵。复合时的左右乘也有讲究右乘表示相对动坐标系做变换左乘表示相对固定参考系做变换顺序反了姿态就完全调转而这个错误在只看末端位置时往往察觉不到。注意判断一个齐次矩阵是否合法先查 R 是否正交RᵀR ≈ I 且 det(R) ≈ 1再查最后一行是不是 0 0 0 1。det −1 意味着包含了镜像物理上不可达。2.2 DH 参数的四个量为什么够用任意两个刚体之间的相对位姿有 6 个自由度但相邻两根关节轴之间的相对位姿只需要 4 个参数描述。原因很朴素一条关节轴在空间里是一条直线两条直线的相对关系由四件事唯一确定——两条轴之间的公垂线长度 a、公垂线在两根轴上的垂足位置其中沿本轴的偏移记为 d、两根轴的夹角 α、绕本轴转过的角度 θ。直线没有“自转”这个自由度所以两轴的相对位姿就少掉两个自由度。教材里反复出现“公垂线”“垂足”这些几何词不是因为喜欢古典几何而是因为只有定义清楚公垂线4 个参数才唯一。这也解释了 DH 表为什么看起来能“套公式”——一旦你把坐标系原点选在公垂线与第 i 根轴的交点上z 轴沿着关节轴、x 轴沿着公垂线剩下的事就机械化了绕 z 转 θ、沿 z 移 d、沿 x 移 a、绕 x 转 α四次基本变换连乘得到固定的矩阵模板。需要留意的是标准 DH 与改进 DH 的区别标准 DH 把连杆坐标系 i 的原点建在关节 i1 的轴上关节变量 θᵢ 是绕 zᵢ₋₁ 转的改进 DH 把坐标系 i 建在关节 i 上。两套约定各自自洽混用则第一根和最后一根连杆的变换必然对不上。习题答案里出现“只差一个末端常矩阵”的情况通常就是这种混用。2.3 用代码验证一次链式相乘光看矩阵模板记不住写一遍并与手推解析式对照是最省时间的理解方式。import numpy as np def dh(a, alpha, d, theta): 标准 DHRz(theta) · Tz(d) · Tx(a) · Rx(alpha) 的展开形式 ct, st np.cos(theta), np.sin(theta) ca, sa np.cos(alpha), np.sin(alpha) return np.array([ [ct, -st * ca, st * sa, a * ct], [st, ct * ca, -ct * sa, a * st], [0.0, sa, ca, d], [0.0, 0.0, 0.0, 1.0], ]) # 平面两连杆a10.5, a20.4两根关节轴平行 - alpha0无偏距 - d0 q1, q2 0.3, 0.7 T01 dh(0.5, 0.0, 0.0, q1) T12 dh(0.4, 0.0, 0.0, q2) T02 T01 T12 # 链式相乘顺序不能反 x 0.5 * np.cos(q1) 0.4 * np.cos(q1 q2) y 0.5 * np.sin(q1) 0.4 * np.sin(q1 q2) print(np.allclose(T02[:2, 3], [x, y], atol1e-12)) # True print(T02[:2, 2]) # [0, 0]平面臂的 z 轴未被转走参数a是公垂线长度连杆长度alpha是相邻两轴的扭转角d是沿 z 轴的偏距theta是绕 z 轴的关节角。函数返回的矩阵前三列是末端坐标系三个轴在基座系下的方向第四列是末端原点位置。这段代码的验证点在于矩阵第三列的 z 分量应当为 1——平面臂所有关节轴都平行于基座 z 轴末端姿态只可能绕 z 转动。顺着这个模板往下走六自由度机械臂的 DH 表就是一个 6×4 的数组正运动学是一次 for 循环连乘。真正的难点从来不在乘法本身而在于你手里那张表的第 i 行到底对应哪根连杆的哪根轴。3. 逆运动学为什么解析解只属于少数结构正向运动学永远只有一个答案给定关节角末端位姿唯一确定。逆运动学则完全反过来可能无解目标超出工作空间可能多解肘上肘下、腕部翻转也可能无穷多解冗余臂。这份不对称是机器人运动学所有麻烦的源头也是习题里最值得花时间的一类题。3.1 解的个数从哪来8 组解不是随口说的一个 6 自由度串联臂在满足一定几何条件下最多有 8 组逆解。这个 8 的来源是分支组合肩部左/右 2 种肘部上/下 2 种腕部翻转 2 种2×2×2 8。每一组都对应一个真实的物理构型而不是数学上的重复根。习题答案只给出一组时很多人的第一反应是“答案不全”。但教材上的答案往往只列出落在特定关节限位内的那一组或者有意选了“肘上”分支。判断答案是否合理不能只比数字要先比构型把解代回正运动学末端位姿一致就是对的剩下的差异是分支选择问题。工程里最终选哪一组取决于关节行程、避障和与前一路径点的距离——这是一个带约束的优化问题不是运动学问题。3.2 解析解的前提Pieper 准则与几何消元解析解不是所有结构都有的。能写成封闭形式的一个重要充分条件是后三个关节轴交于一点。这时位置和姿态解耦——前三个关节决定腕心位置后三个关节决定末端姿态。位置解可以从腕心坐标反解通常化为一个三角形或二次方程姿态解则是一次旋转矩阵的逆运算。球形腕之所以在教材里被反复强调正是因为它是让解耦成立的机械设计。这不是数学上的权宜之计而是设计和推导互相迁就的结果为了让控制器的逆解能算机械结构主动让出三个正交相交的关节轴。理解这一点之后再看 DH 表里那几行看起来“凑巧”的参数就知道它们其实是设计约束的产物。位置解的消元过程通常会得到一个形如 A cos θ B sin θ C 的方程用半角替换 t tan(θ/2) 化为二次方程两个根对应肘上肘下两个分支判别式小于零就是超出工作空间。3.3 数值解雅可比迭代与阻尼最小二乘结构不满足 Pieper 条件时解析解要么不存在要么推导成本高到不值得。这时改用迭代从当前关节角出发反复计算末端误差把误差映射回关节空间的增量直到收敛。import numpy as np def solve_ik(fk, jac, q0, target, iters300, tol1e-6, lam1e-3): q np.array(q0, dtypefloat) for k in range(iters): T fk(q) e pose_error(T, target) # 6×1位置差 姿态的轴角差 if np.linalg.norm(e) tol: return q, k, True J jac(q) # 6×n 雅可比 # 阻尼最小二乘lam 越大越稳收敛越慢 dq J.T np.linalg.solve(J J.T lam**2 * np.eye(6), e) q q dq return q, iters, Falsefk是正运动学函数jac返回 6×n 的雅可比矩阵target是期望位姿lam是阻尼因子。为什么不用伪逆因为伪逆在雅可比接近奇异时会产生极大的关节增量一步就把关节角推到限位之外。加上 lam²I 之后矩阵最小特征值被抬高增量被压住代价是收敛变慢、末端精度略降。这就是 Levenberg-Marquardt 那套思想在运动学里的直接应用。pose_error的姿态部分通常用旋转矩阵转轴角而不是直接减欧拉角——欧拉角在 ±π 附近有跳变直接相减会让误差突然翻倍迭代随即发散。这个细节在习题里不显眼在真机上就是那种“偶尔卡住”的现象。3.4 雅可比矩阵速度映射与奇异位形雅可比 J 是机器人学的核心工具它把关节速度线性映射为末端速度。位置部分占据前三行姿态部分占据后三行。J 是 q 的函数随构型变化这也是机器人控制和运动学比线性系统麻烦得多的根本原因。奇异位形指 J 秩亏的位置物理上意味着某个方向的末端速度无法由关节速度合成反过来说要达到该方向的速度就需要无穷大的关节速度。常见例子是手臂完全伸直、腕部两轴共线。数学判据是 det(J) 0方阵情形工程上更常用条件数或最小奇异值因为它们能给出“离奇异还有多远”的连续度量而行列式只回答“是不是”。注意det(J) 0 只是奇异的一个充分观察冗余臂的 J 不是方阵根本没有行列式此时应看奇异值分解的最小奇异值。4. 动力学方程控制律为什么非要“抵消”那三项运动学只关心几何动力学才关心力和力矩。习题里那些看起来吓人的偏导数和求和最终都收敛到一个固定结构惯性矩阵乘加速度加上科氏离心项加上重力项等于关节力矩。认清这个结构控制律的设计动机就一目了然了。4.1 拉格朗日法从能量到方程的推导链拉格朗日法的出发点是标量动能减去势能。定义 L K − P代入 d/dt(∂L/∂q̇) − ∂L/∂q τ得到的就是动力学方程。推导过程机械但费力动能需要对每个连杆的速度求平方而连杆速度又由雅可比乘以关节速度给出所以 K ½ q̇ᵀ D(q) q̇其中 D(q) Σ (mᵢ Jᵥᵢᵀ Jᵥᵢ Jωᵢᵀ Rᵢ Iᵢ Rᵢᵀ Jωᵢ)。这一步是整道题的核心几乎所有错误都出在雅可比写错或者惯量张量没有旋转到基座系。最终形式是 τ D(q) q̈ C(q, q̇) q̇ g(q)。三项各有物理含义D 描述“当前构型下各关节的等效惯量”随构型变化C 项描述速度耦合包括离心力和科氏力g 描述重力在各关节上的投影。为什么不能简单地把 D 当常数处理因为机器人不是刚体质量分布在多个连杆上转动时等效惯量随姿态剧烈变化。4.2 牛顿-欧拉递推O(n) 的工程选择拉格朗日法给出的是闭式表达式但展开后的符号复杂度随自由度增长很快做符号推导时会看到大量重复项。牛顿-欧拉法换了个思路先沿链从基座向末端外推每个连杆的角速度和角加速度再从末端向基座内推每个连杆的力和力矩。两趟递推的复杂度是 O(n)与自由度数线性相关。两种方法在数学上完全等价工程上却常常选牛顿-欧拉——因为它天然适合递归实现中间量物理意义明确每个连杆受什么力而且不需要对惯性矩阵做符号展开。拉格朗日法更适合做理论分析因为它把 D、C、g 显式分离出来方便证明稳定性。习题答案通常两种都给。看到答案里出现形如 fᵢ R fᵢ₊₁ … 的递推式那就是牛顿-欧拉看到 d/dt(∂K/∂q̇) 字样就是拉格朗日。4.3 惯性矩阵的性质与控制律的构造D(q) 有三条性质值得记住对称、正定、并且 Ḋ − 2C 是反对称矩阵。前两条来自动能恒为正第三条看似纯数学其实是构造 Lyapunov 函数的关键——正是因为这一项反对称误差能量的导数里那个“麻烦的耦合项”才会自动消掉。理解了结构控制律就顺理成章。最朴素的做法是 PD 加补偿tau Kp (qd - q) Kd (dqd - dq) g(q) # 只补重力项这一形式在低速、低加速度场景下够用因为惯量项和速度耦合项的影响较小。要求更高时用计算力矩控制def computed_torque(q, dq, qd, dqd, ddqd, Kp, Kd, dyn): 计算力矩τ D(q)·v C(q,dq)·dq g(q) e qd - q de dqd - dq v ddqd Kd de Kp e # 期望的关节加速度 D, C, g dyn(q, dq) # 动力学三项由模型给出 return D v C dq gdyn返回当前构型下的 D、C、gv是把误差按 PD 规律“捏”出来的期望加速度。把这个 τ 代入动力学方程两边消掉 D、C、g得到的误差方程是 ė̈ Kd ė Kp e 0一个线性二阶系统。这就是所谓的反馈线性化用模型把非线性项精确抵消把闭环变成两个解耦的线性系统。注意这套推导的前提是模型准确。D、C、g 中任何一个有偏差抵消就不完全误差方程多出一个扰动项。真机上留 10% 到 20% 的 PD 增益裕度就是为了吸收这部分。5. 避坑与排查习题答案最容易出错的五处把答案抄对不难难的是错的时候知道错在哪。下面五条是这类题目反复出现的问题每条都按“现象 → 原因 → 解决”给出排查路径。5.1 角度单位第三位小数异常往往源于度与弧度混用现象正运动学结果和答案只差一点点位置误差在 1e-3 量级改权重、改精度都没用。原因某个关节角以度为单位传入而正弦函数按弧度解读。0.3 弧度约等于 17°两者相差三个数量级但混合在链式相乘里往往只体现在末端位置的细微偏差上。解决在函数入口统一做一次断言或转换如theta np.deg2rad(theta)并且整个项目只保留一种内部单位。习题答案里的角度标注要看清楚教材常用弧度但某些题面会给度数。5.2 DH 约定混用末端差一个常矩阵现象把解的最后一个变换或第一个变换调整一下结果就对但不知道为什么。原因标准 DH 与改进 DH 的原点位置不同前者把坐标系挂在下一关节轴上。两套表混填时误差表现为整条链多出或少掉一个固定的齐次矩阵。解决先看 DH 表的 theta 列对应的是哪个关节角再看表头写的是 standard 还是 modified。一次性把整张表统一不要逐行判断。5.3 奇异点判定行列式为零不等于不可达现象某目标位姿明明在工作空间内数值迭代却发散或者关节速度爆炸。原因目标靠近奇异位形雅可比接近秩亏伪逆产生巨大增量。此时位姿可达问题出在求解方法本身。解决把伪逆换成阻尼最小二乘并在代码里监视最小奇异值低于阈值时提高阻尼或直接拒绝该路点。判断“能不能到”用工作空间判断“好不好算”用条件数两者不是一回事。5.4 惯量参数漏项动力学结果系统性偏小现象算出的关节力矩恒比答案小一截比例大致稳定。原因漏掉了电机转子惯量、减速器惯量或者质心位置没有按平行轴定理折算到连杆坐标系原点。惯量项对平移不敏感、对偏移非常敏感这是血泪经验。解决把每个连杆的质量、质心位置、绕质心的惯量张量列成表逐项对照换算到统一坐标系后再求和并检查 D 矩阵是否对称正定。不对称就一定是算错了。5.5 数值 IK 不收敛按顺序查这三件事现象迭代跑满次数仍未达到容差误差曲线震荡不下。原因排序通常是初值离解太远、姿态误差定义有跳变、关节增量步长过大。解决先用解析解在一条轨迹上采样做初值姿态误差改用轴角表示而非欧拉角差步长加入线搜索或固定缩放因子。逐项排除不要在没定位时同时改三个参数。6. 解析解还是数值解从习题答案到真机代码的取舍习题答案里两类解法常常并列给出看上去只是“两种做法”。真正落到代码里它是一道关于可预测性的取舍题。维度解析解数值解单次求解耗时微秒级且稳定可预测毫秒级随初值波动多解覆盖一次给出全部 8 组只收敛到一个且依赖初值结构依赖强需球形腕或满足 Pieper 条件无任意结构可用奇异附近无定义或跳变加阻尼后稳定精度下降调试成本推导错一处全盘皆错不收敛时可按初值、步长、阻尼逐项定位我的取舍原则是离线轨迹规划用解析解因为它必须给出确定的分支且要能在毫秒内评估成千上万个路点在线伺服和冗余臂用数值解因为实时性允许一次迭代而结构未必友好。两者并不互斥——常见做法是数值解配上解析解生成的初值收敛次数能从几十次压到三五次。模型精度是另一层取舍。计算力矩控制假设 D、C、g 都准一旦实际负载变化、摩擦未建模抵消掉的部分就会反过来变成扰动。所以真机代码里通常从 PD 加部分补偿起步观察误差量级再决定是否升级到全补偿而不是一上来就照抄答案里那个“完美”的公式。这也是我理解的习题答案的正确用法它给出的是理想条件下的完整推导不是可以直接搬上机器的参数表。从那以后我每次做这类题都会强制走一遍“代回正运动学验证、检查 D 矩阵对称正定、确认角度单位为弧度”这三步哪怕答案就摆在旁边。这三步花不到五分钟但能省掉一整个下午的返工。希望帮到你。本文还有配套的精品资源点击获取

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑