一句话定位
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-rl、calvin 这类基准,都把 MuJoCo 或其思想作为对照/前身;Isaac Gym 论文本身就把 mujoco 列为它要超越的 CPU 仿真代表。
需要澄清:这是仿真引擎论文 / 工程报告,没有 backbone、tokenizer、policy head 之类神经网络架构可谈;下文”模型架构”栏解读为引擎的系统与算法架构,“数据""训练方法”两栏在物理引擎语境下不适用,据实标注并填入对应的建模系统 / 数值求解内容。
模型架构
不是神经网络,而是物理引擎的系统架构(IROS 2012 论文 + mujoco.org 现代特性)。
状态表示(广义坐标)
- 多关节动力学在广义坐标下表示、用递归算法计算。位置
q、速度v分开;3D 旋转(ball 关节、浮动基座朝向)用单位四元数表示,其角速度用 3D 向量,故一般dim(v) < dim(q),论文因此写v而非q̇。 - 好处(官方”key features”):在广义坐标下仿真天然不会违反关节约束;且逆动力学即便有接触也良好定义。
光滑动力学求解管线(单个时间步,论文 §II)
- 前向运动学求所有刚体的笛卡尔位姿 + 碰撞检测(带安全间距)+ 构造约束/接触 Jacobian。
- 用 Composite Rigid Body(CRB)算法算惯性矩阵
M、用 Recursive Newton–Euler(RNE)算法算偏置力b(Coriolis / 离心 / 重力 / 弹簧),并做M的稀疏 LᵀDL 分解。 - 把等式约束冲量表示为(未知的)接触冲量的函数,投影到等式约束流形的切空间,并施加约束稳定化(类 Baumgarte,但把期望下一步速度
v*直接在下一步强制,更准)。 - 进一步投影到接触坐标,求接触冲量
f与接触速度ω。 - 数值积分得下一状态。
接触求解器(论文给了三套,可按系统选)
- 隐式互补求解器(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,作者眼中最好的前代多关节引擎;含 M、b、前向运动学、各刚体 Jacobian):
| 模型 (DOF) | SD/FAST | MuJoCo | +稀疏分解 M\ |
|---|---|---|---|
| Isolated (34) | 122,000 | 151,000 | 133,000 |
| Chain (31) | 128,000 | 103,000 | 41,000 |
| Hand (32) | 89,000 | 101,000 | 76,000 |
| Humanoid (29) | 130,000 | 123,000 | 75,000 |
结论:MuJoCo 与 SD/FAST 相当(作者本预期 SD/FAST 生成模型专用 C 代码会更快,但现代编译器抹平了差距);稀疏 M 的 Hand/Humanoid 快于稠密 M 的 Chain,但慢于块对角 M 的 Isolated。
表 3 — 含接触的轨迹优化吞吐,求值次数/秒(18-DOF 3D 人形,中心有限差分):
| 线程 | 6 接触 | 4 接触 | 0 接触 |
|---|---|---|---|
| 1 | 42,000 | 63,000 | 200,000 |
| 24 | 390,000 | 549,000 | 1,320,000 |
24 线程 6 接触下近 40 万/秒(对应约 100 次准 Newton 轨迹优化步/秒,用 Gauss–Newton 近似 Hessian)。
精度:光滑动力学与 SD/FAST 之差在机器精度/舍入误差量级内;接触精度当时尚未系统验证,但隐式互补法自带精度校验(残差 0 即精确),凸求解器精度应与 Drumwright–Shell 研究的相当(与 LCP 解不可区分却更快)。作者坦言尚未与游戏引擎做系统对比,仅据文献判断游戏引擎在同场景下明显更慢。
创新点与影响
核心贡献
- 广义坐标 + 把接触做对的引擎:既避开游戏引擎的坐标/约束数值化之弊,又补上关节坐标引擎缺失的接触能力。
- 凸、光滑、可逆的接触模型(基于 Gauss 最小约束原理):凸性给唯一解,可逆性给良定义逆动力学,光滑性利于优化却仍产生”现象学上的硬接触”。
- 始终可算的逆动力学——即便有接触与等式约束、即便状态违背约束;直接支撑轨迹优化。
- 同一系统对不同状态/控制并行求值,为有限差分求导 → 数值优化 / 采样类 RL 服务,这是它相对通用引擎在控制场景快 ~3 个量级的关键之一。
- MJCF 人可读可编辑的场景语言 + 内建编译器 + 三级模型描述。
改变了什么:MuJoCo 成为运动控制与灵巧操作研究的事实标准仿真器——OpenAI Gym 的 MuJoCo 连续控制任务、DeepMind 的 dm_control/PyMJCF、OpenAI 解魔方/灵巧手、以及后续大批 legged locomotion 与 manipulation 工作都建在其上。DeepMind 2021 收购 + 2022 全量 Apache-2.0 开源,把一款”有公司背书又真开源”的全功能引擎交给社区(此前物理引擎非闭源商业即学术小众、维护者毕业即衰),并催生 MJX(GPU/TPU 批量可微分支),进一步与 isaac-gym、brax 汇入”加速器批量化 RL 仿真”浪潮。
作者自陈的局限(论文 §V):接触动力学精度尚未系统验证;底层问题 NP-hard,隐式求解器不保证总能精确求解;未与游戏引擎做系统性对比;集群版与 GPU/OpenCL 版当时仍是未来工作;凸求解器的具体实现与文献版本不同、仍需测试。
原始链接
- 官方主页(canonical):https://mujoco.org/
- IROS 2012 论文《MuJoCo: A physics engine for model-based control》PDF:https://roboti.us/lab/papers/TodorovIROS12.pdf (DOI 10.1109/IROS.2012.6386109)
- GitHub(Apache 2.0):https://github.com/google-deepmind/mujoco
- 文档:https://mujoco.readthedocs.io/
- DeepMind 收购博客(2021-10-18):https://deepmind.google/discover/blog/opening-up-a-physics-simulator-for-robotics/
- DeepMind 开源博客(2022-05-23):https://deepmind.google/blog/open-sourcing-mujoco/
- 相关求解器原始论文:Todorov ICRA 2010(隐式互补)、Todorov ICRA 2011(凸可逆接触模型)
一手源存档(sources/)
- mujoco—github-readme — GitHub README(google-deepmind/mujoco,raw main)
- mujoco—acquisition-blog — DeepMind 2021-10 收购博客快照
- mujoco—opensourcing-blog — DeepMind 2022-05 全量开源博客快照
- mujoco—project-page — mujoco.org 官方主页(key features 列表)
- IROS 2012 论文 PDF(https://roboti.us/lab/papers/TodorovIROS12.pdf,全文原文,不入 git)