本章要回答的三个问题:MuJoCo 每一步到底在算什么,多刚体动力学的方程长什么样、为什么可以这样算?接触这个「老大难」它用什么思路求解,为什么软约束反而比硬约束更稳?mjModel 与 mjData 各存了什么,一次 mj_step 内部的流水顺序是什么?三问对应 3.1 与 3.2 的原理、3.3 的时间离散,以及 3.4 与 3.5 的数据结构。
第二章结束时你手里有一台能跑的机械臂,但「能跑」和「知道为什么这样跑」是两回事。这一章的价值要在两种时刻兑现。第一种是调参时刻:接触发抖该动 solref 还是动步长?能量凭空膨胀是积分器的锅还是模型的锅?第六章的排错方法全部以本章的原理为路标,跳过本章直接背排错口诀,现象一变就抓瞎。第二种是读论文与做选型的时刻:论文里「软约束」「凸优化」「半隐式积分」这些词,指的就是本章的内容;判断一个引擎方案可不可信,看的就是这些底层选择。
把引擎讲成试车场的话,本章是掀开机盖看传动轴的一章。机盖下没有魔法:每一步仿真就是「组装方程、求解方程、推进一步时间」三件事,外加一本记录不变属性的账本和一本记录每步状态的账本。听上去朴素,难点全在细节里——接触怎么进方程、方程怎么解得又快又稳、时间怎么切才不失真。本章五节就是把这些细节一层层剥开。
还有个现实理由:MuJoCo 的文档把参数讲得很清楚,但参数之间的因果关系要靠原理串起来。solref 的两个数字、solimp 的五个数字、impratio 的比值,单独背毫无意义;理解了软约束模型,它们各自「拧的是哪颗螺丝」一目了然。原理不是装饰,是调参的坐标系。
对照开头三问,读完本章你应当能够:
| 节号 | 回答的问题 | 关键产出 |
|---|---|---|
| 3.1 | 一步的力学方程从哪来 | 多刚体动力学的组件清单与装配逻辑 |
| 3.2 | 接触力怎么算才又稳又可信 | 软约束凸优化模型与参数语义 |
| 3.3 | 时间怎么切、方程怎么推进 | 步长估算方法与积分器选型依据 |
| 3.4 | 引擎的数据放在哪 | mjModel 与 mjData 的字段地图 |
| 3.5 | 一步内部顺序是什么 | mj_step 前后半步流水与采样时机 |
五节的依赖是一条直线:3.1 的方程是地基,3.2 把最难的接触项装进方程,3.3 把方程沿时间轴推进,3.4 与 3.5 回到工程视角看这套计算落在什么数据结构上、按什么顺序执行。3.4 与 3.5 相对独立,做工程接口的读者可以先读。
这张图就是 mj_step 的骨架,本章五节都挂在上面的节点上:3.1 讲 B 与 C 怎么装配,3.2 讲 D 与 E 的接触细节,3.3 讲 G 的数值方法,3.4 讲整条流水线用了哪些容器,3.5 把 A 到 I 的顺序完整走一遍并标出采样点。看懂它,第六章的每个排错手段都能对号入座到某个节点。
本章结束,你应该对引擎的「为什么」有了成体系的答案。接下来两条路:急着上应用的读者可直接跳第五章,用 RL 与控制任务把原理用起来,遇到问题再回本章查;按部就班的读者进第四章看高级特性——流体、柔体、插件与渲染,它们全是本章约束框架与数据结构之上的扩展。无论哪条路,第六章排错时你都会回来翻这一章,它试车场手册里「机械原理」的那一册。