一句话定位

MuJoCo(Multi-Joint dynamics with Contact)是一台用广义坐标(关节坐标)表示多体动力学、用凸且可逆的接触模型求解接触力的纯 C 刚体物理引擎;Todorov/Erez/Tassa 的 IROS 2012 论文奠基,专为模型驱动控制 / 通过接触做轨迹优化而从零设计。DeepMind 于 2021-10 收购并免费开放(先发预编译库)2022-05 完成全量开源(Apache 2.0,github.com/google-deepmind/mujoco)。论文实测在 12 核机器上对 18-DOF、6 接触点的 3D 人形可跑 ~40 万次动力学求值/秒(约 5000× 实时)。它是当今绝大多数运动/操作类 RL 仿真(Gym MuJoCo tasks、dm_control、OpenAI 灵巧手)的事实底座。

背景与定位

论文坐实的范式是 “为模型驱动优化而生的全功能物理引擎”——不是把游戏引擎调得更准一点,而是第一台从底层就以”optimization through contacts(穿过接触做优化)“为设计目标的仿真器(mujoco.org 官方定位原话)。

作者点名当时两类引擎都不够用:

  • 游戏 / Cartesian 坐标系引擎(ODE、NVIDIA PhysX、Bullet)——用过完备的笛卡尔坐标表示状态、数值方式强制关节约束;仿真大量互不相连的刚体时合理,但对人形这种精密多关节系统既不准也不高效;接触被表述为 LCP(线性互补问题)的(近似),需人工调参和极小时间步。
  • 关节坐标系引擎(SD/FAST、OpenSim)——在关节坐标下运算、无需数值强制关节约束,但要么忽略接触,要么用弹簧–阻尼器,导致大穿透或刚性难积分。

MuJoCo 的取舍就是关节坐标 + 一套”跟 LCP 相关但更好”的接触仿真,故得名。它把接触视为仍在演进的活跃研究,因此提供多套接触求解器让用户按系统选择。动机上引用 Karl Sims(1994)的经典观察——只要引擎允许”作弊”,优化算法一定会找到并利用它,产出物理上不真实的控制器;这正是控制优化对精度的苛刻要求所在(控制器被”调”去适配引擎,而非相反)。

在本 vault 的仿真基础设施谱系里,MuJoCo 是最早的一环:后来 NVIDIA 的 isaac-gym(PhysX 整块搬上 GPU)、Google 的 brax(JAX/XLA 全程 JIT + 可微)、sapien 等”加速器批量化 RL”引擎,以及 learning-to-walk-in-minutes-massively-parallel-rlcalvin 这类基准,都把 MuJoCo 或其思想作为对照/前身;Isaac Gym 论文本身就把 mujoco 列为它要超越的 CPU 仿真代表。

需要澄清:这是仿真引擎论文 / 工程报告,没有 backbone、tokenizer、policy head 之类神经网络架构可谈;下文”模型架构”栏解读为引擎的系统与算法架构,“数据""训练方法”两栏在物理引擎语境下不适用,据实标注并填入对应的建模系统 / 数值求解内容。

模型架构

不是神经网络,而是物理引擎的系统架构(IROS 2012 论文 + mujoco.org 现代特性)。

状态表示(广义坐标)

  • 多关节动力学在广义坐标下表示、用递归算法计算。位置 q、速度 v 分开;3D 旋转(ball 关节、浮动基座朝向)用单位四元数表示,其角速度用 3D 向量,故一般 dim(v) < dim(q),论文因此写 v 而非
  • 好处(官方”key features”):在广义坐标下仿真天然不会违反关节约束;且逆动力学即便有接触也良好定义

光滑动力学求解管线(单个时间步,论文 §II)

  1. 前向运动学求所有刚体的笛卡尔位姿 + 碰撞检测(带安全间距)+ 构造约束/接触 Jacobian。
  2. Composite Rigid Body(CRB)算法算惯性矩阵 M、用 Recursive Newton–Euler(RNE)算法算偏置力 b(Coriolis / 离心 / 重力 / 弹簧),并做 M稀疏 LᵀDL 分解
  3. 把等式约束冲量表示为(未知的)接触冲量的函数,投影到等式约束流形的切空间,并施加约束稳定化(类 Baumgarte,但把期望下一步速度 v* 直接在下一步强制,更准)。
  4. 进一步投影到接触坐标,求接触冲量 f 与接触速度 ω
  5. 数值积分得下一状态。

接触求解器(论文给了三套,可按系统选)

  • 隐式互补求解器(Implicit complementarity,最准):基于 Todorov ICRA 2010。把力与速度都表示成一个混合变量 x 的函数(借互补条件),把非线性方程转成无约束优化 min‖f(x)+ω₀−ω(x)‖²,用定制的非光滑 Newton 法;带内建精度校验——残差为 0 即知精确求解。因底层问题 NP-hard 不保证总能精确,但几乎总能,且 Newton 迭代次数出奇地少。
  • 凸求解器(速度/精度折中,默认路线):基于 Todorov ICRA 2011。核心思想是接触冲量意在减小接触面相对速度,于是在接触空间最小化动能 ½ ωᵀA⁻¹ω,服从摩擦锥(硬约束)与非穿透(以代价 R(ω) 软施加),加一个小的对角正则项 R(式 6)。该接触动力学可逆(invertible),这是逆动力学良好定义的关键;正则项还允许”隔空接触”用于优化中的 continuation。凸求解器是一个:内点法 / 投影 Newton / 共轭梯度 / Gauss–Seidel 都可,论文当时最爱锥投影 Gauss–Seidel
  • 对角求解器(最快最糙):一个”质量感知的弹簧–阻尼器”——用 A 的对角在线整定弹簧–阻尼系数、保证各接触临界阻尼,忽略接触间耦合。

接触模型的数学根(收购博客点明):MuJoCo 用凸的 Gauss 最小约束原理解接触力;凸性保证解唯一 + 逆动力学良好定义。它是二阶连续时间仿真器,实现完整运动方程,不走游戏引擎的捷径(不忽略陀螺力、不直接改速度),故 Newton 摆、Dzhanibekov 效应(网球拍定理)、Tippe 陀螺翻身等都能自然涌现。

积分器:语义隐式 Euler(用下一步速度,比显式更准、是 velocity-stepping 的关键)与改造版 4 阶 Runge–Kutta(也用下一步速度而非加速度)。现代版另有 pyramidal / elliptic 摩擦锥、稠密/稀疏 Jacobian、Newton / 共轭梯度 / 投影 Gauss–Seidel 三选一(mujoco.org)。

建模元素(论文 §III):kinematic tree 由 body 构成(仅含质量/惯量的坐标系,可浮动基座);joint 定义在 body 内、赋予运动自由度(与 ODE 相反——那里关节是约束运动),四种原语 slide / hinge / ball(四元数)/ free,且原语可组合成复杂关节而无需插入 dummy body;DOF 有阻尼、限速、armature 惯量、(经冲量求解器的)关节摩擦;geom 是无质量几何体(plane / sphere / capsule / ellipsoid / box / cone / mesh),碰撞用专用两两函数、否则退回通用凸碰撞器(libccd),非凸网格需用户凸分解;site(路由 tendon / 施力 / 传感器位);constraint(loop joint、位置/关节角/tendon 长度等式约束、用户自定义 callback);tendon(穿过 site、绕 geom 的最短路径,可作动或施加长度限制);actuator(可带一阶激活态以建肌肉/气缸,增益可随位置/速度变化以模拟肌肉力–长–速特性,经关节/tendon/滑块曲柄传力)。

三级模型描述 + 编译:① MJCF(新的 XML 格式,级联默认值、可从 URDF 转入);② 一串 C++ 建模 API 调用;③ 内建编译器生成、可存/载二进制的低层 C 结构(供运行时所有计算)。场景描述与仿真状态被完全封装进两个数据结构(后来的 mjModel + mjData),确定性、可完整重建仿真中间态。

数据

物理引擎无训练语料——此栏在本工作不适用。与”数据”对应的是 MuJoCo 的建模/资产系统

  • MJCF 场景描述:级联默认值避免重复;可从 geom 形状 + 默认材料密度自动推断 body 的惯性属性(一个 body 可挂多个 geom,引擎合并质量与惯量);支持局部/全局坐标、多种朝向指定方式。
  • 可转入格式:URDF 等外部 XML 可转成原生 MJCF(README 生态还列出 MJCF↔SDFormat 双向转换 gz-mujoco、obj2mjcf、onshape-to-robot 等)。
  • 生物力学资产:空间 tendon 路由(可绕骨骼、产生随姿态变化的力臂)+ 含激活态与力–长–速曲线的肌肉模型,支撑人/动物骨骼肌模型(收购博客以股骨–胫骨滑动的仿真腿为例,基于 Lai/Arnold/Wakeling 2017)。

训练方法

无神经网络训练——此栏解读为引擎的数值/求解方法(论文 §II 的核心)。

  • 离散时间、基于速度的公式(velocity-stepping):不对连续时间方程除以 dt,因约束/接触力是冲量、与连续时间公式一般不相容(Painlevé 佯谬)。为建硬接触(而非弹簧–阻尼近似),采用现已成为游戏引擎标准的离散时间速度法(Stewart–Trinkle 1996)。
  • 互补条件:法向 ω_N ≥ 0, λ_N ≥ 0, λ_N·ω_N = 0(不能相吸、不能穿透、分离则无冲量);切向 Coulomb 摩擦——滑动时摩擦力反平行滑动速度且落在摩擦锥内 ‖f_F‖ ≤ μλ_N。条件(5)含非线性、不落入 LCP 框架;传统做法把摩擦锥近似成棱锥转 LCP(Lemke / PATH),但规模大时不扩展(问题 NP-hard)且引入误差——故 MuJoCo 改走上述三套新算法。
  • 逆动力学(MuJoCo 的独有特性):可对任意 (q, v, v̇) 计算,即便存在约束违背或穿透(录制数据、轨迹优化早期都会有);做法是”posthoc 模式”——所有冲量按 τ=0 算,再在步末以 M⁻¹τ 加回下一步速度,并在违背子空间放大所见惯量(系数用户可调)。当无等式约束且接触求解器可逆(凸求解器即是)时,逆动力学可不走 posthoc、直接解一个二次目标的凸问题。这一特性支撑直接轨迹优化(space-time optimization):优化变量是位置序列 q,速度由数值微分、控制力由逆动力学得到。
  • 并行求值:同一动力学系统可对不同 (状态, 控制) 并行求值(共享内存或分布式),专为有限差分近似导数→数值优化服务。

Infra(训练 / 推理工程)

  • 实现:运行时全部用 ANSI/纯 C 手工调优、避免外部库(从第一天就为将来移植 GPU/OpenCL 铺路);线程安全、已多线程无动态内存分配(2022 开源博客强调这是它极快的原因);确定性输出。
  • IROS 2012 计时硬件:光滑动力学对比在四款 Intel CPU 上跑(X9650 3GHz、X5570 2.93GHz、i7-940 2.93GHz、X5860 3.33GHz),结果取 100 次均值;接触/轨迹优化实验用双路 6 核 Intel X5860(3.33GHz)+ 超线程 = 24 虚拟核,对比 1 vs 24 线程。
  • 吞吐(论文头条):单台桌面机含接触动力学近 40 万求值/秒(18-DOF 人形,6 接触点,3 接触点/脚,30 步轨迹)。de novo 人形跑步步态合成需 ~2 亿次求值、12 核 <10 分钟;时间步 15 ms 下约 5000× 实时——比仅达实时的 ODE 类引擎快约 3 个数量级(作者拆解:计算快 1 个量级 + 并行满载 1 个量级 + 精度/稳定性允许更大步长 1 个量级;ODE 稳定运动需 <1 ms 步长)。
  • 加速路线(论文当时的未来工作 → 后来落地):集群版(中央调度器分发状态子集,预计再提速 1 量级)、把关键代码移植 OpenCL 上 GPU。这些在 DeepMind 接手后演化为 MJX(MuJoCo XLA,用 JAX 重写的分支,可在 GPU/TPU 上批量、可微)、多线程 rollout 模块、以及”原生物理导数(解析 + 有限差分)“(2022 路线图)。
  • 2022 开源基准:Humanoid 与 AnyMAL 两模型在 AMD Ryzen 9 5950X / Windows 10、1/16/32 线程下测 kSteps/s(注入 actuator 噪声避免系统静止,代表真实性能)——具体数字仅以图片给出,正文未披露
  • 说明:MuJoCo 非训练模型,无 GPU-hours / 训练精度等指标;推理”控制频率”取决于用户模型(如现代 RL 常配 dt=1/120~1/200 s、控制 50~100 Hz,见 isaac-gym 各任务表),引擎本身不设固定 FPS。

评测 benchmark

一手数据均来自 IROS 2012 论文,均为引擎吞吐/精度而非模型精度。

表 1 — 光滑多体动力学,单线程求值次数/秒(对比 SD/FAST,作者眼中最好的前代多关节引擎;含 Mb、前向运动学、各刚体 Jacobian):

模型 (DOF)SD/FASTMuJoCo+稀疏分解 M\
Isolated (34)122,000151,000133,000
Chain (31)128,000103,00041,000
Hand (32)89,000101,00076,000
Humanoid (29)130,000123,00075,000

结论:MuJoCo 与 SD/FAST 相当(作者本预期 SD/FAST 生成模型专用 C 代码会更快,但现代编译器抹平了差距);稀疏 M 的 Hand/Humanoid 快于稠密 M 的 Chain,但慢于块对角 M 的 Isolated。

表 3 — 含接触的轨迹优化吞吐,求值次数/秒(18-DOF 3D 人形,中心有限差分):

线程6 接触4 接触0 接触
142,00063,000200,000
24390,000549,0001,320,000

24 线程 6 接触下近 40 万/秒(对应约 100 次准 Newton 轨迹优化步/秒,用 Gauss–Newton 近似 Hessian)。

精度:光滑动力学与 SD/FAST 之差在机器精度/舍入误差量级内;接触精度当时尚未系统验证,但隐式互补法自带精度校验(残差 0 即精确),凸求解器精度应与 Drumwright–Shell 研究的相当(与 LCP 解不可区分却更快)。作者坦言尚未与游戏引擎做系统对比,仅据文献判断游戏引擎在同场景下明显更慢。

创新点与影响

核心贡献

  1. 广义坐标 + 把接触做对的引擎:既避开游戏引擎的坐标/约束数值化之弊,又补上关节坐标引擎缺失的接触能力。
  2. 凸、光滑、可逆的接触模型(基于 Gauss 最小约束原理):凸性给唯一解,可逆性给良定义逆动力学,光滑性利于优化却仍产生”现象学上的硬接触”。
  3. 始终可算的逆动力学——即便有接触与等式约束、即便状态违背约束;直接支撑轨迹优化。
  4. 同一系统对不同状态/控制并行求值,为有限差分求导 → 数值优化 / 采样类 RL 服务,这是它相对通用引擎在控制场景快 ~3 个量级的关键之一。
  5. MJCF 人可读可编辑的场景语言 + 内建编译器 + 三级模型描述。

改变了什么:MuJoCo 成为运动控制与灵巧操作研究的事实标准仿真器——OpenAI Gym 的 MuJoCo 连续控制任务、DeepMind 的 dm_control/PyMJCF、OpenAI 解魔方/灵巧手、以及后续大批 legged locomotion 与 manipulation 工作都建在其上。DeepMind 2021 收购 + 2022 全量 Apache-2.0 开源,把一款”有公司背书又真开源”的全功能引擎交给社区(此前物理引擎非闭源商业即学术小众、维护者毕业即衰),并催生 MJX(GPU/TPU 批量可微分支),进一步与 isaac-gymbrax 汇入”加速器批量化 RL 仿真”浪潮。

作者自陈的局限(论文 §V):接触动力学精度尚未系统验证;底层问题 NP-hard,隐式求解器不保证总能精确求解;未与游戏引擎做系统性对比;集群版与 GPU/OpenCL 版当时仍是未来工作;凸求解器的具体实现与文献版本不同、仍需测试。

原始链接

一手源存档(sources/)