Skip to content

01. GPU 仿真生态全景与双框架选型

前置自测

📋 答不出 \(\ge\) 2 题 → 建议先浏览 MuJoCo 官方文档和一篇 PPO 教程

  1. 强化学习的基本闭环是什么?请写出 policy-environment 交互的四个核心量(observation, action, reward, next_observation)之间的因果关系。
  2. sim.step()env.step() 在机器人 RL 任务里有什么区别?前者只推进物理状态,后者还包含哪些额外计算?
  3. 接触动力学为什么比无接触刚体运动更难仿真?提示:考虑接触力的非光滑性和互补性条件。
  4. 为什么"渲染漂亮"不等于"适合大规模 RL 训练"?试从吞吐量和计算资源两个角度回答。
  5. 你能否描述 GPU 并行仿真与 CPU 多进程仿真的本质区别?(提示:不只是"GPU 更快")

本章目标

学完本章后,你应该能够:

  1. 解释机器人 RL 为什么高度依赖仿真,以及仿真在训练闭环中承担的三个角色
  2. 区分从 MuJoCo CPU 到 mjlab 的完整生态演进中,每个框架解决的核心问题
  3. 对比 mjlab 与 Isaac Lab 在物理后端、安装复杂度、社区规模和适用场景上的工程差异
  4. 使用双框架选型决策树为一个新的研究项目选择合适的框架

前置知识桥接

本章假设你了解以下概念(来自 RL 基础课程或自学):

前置概念 需要知道的程度 不需要知道的
MDP(马尔可夫决策过程) 知道 \((S, A, P, R, \gamma)\) 五元组 不需要证明收敛性
PPO 算法 知道 rollout → GAE → clip update 的基本流程 不需要推导 surrogate objective
PyTorch 能写简单的前向传播和反向传播 不需要自定义 autograd
URDF 知道它描述机器人的关节和连杆结构 不需要手写 URDF
GPU/CUDA 知道 GPU 有很多核心可以并行计算 不需要写 CUDA kernel

阅读时间提示:精读本章(含练习)约需 3-4 小时。如果你已有框架使用经验,速读(跳过练习、重点看表格和陷阱)约需 1.5 小时。

如果你对 PPO 的理解停留在"知道名字但不确定它怎么工作",建议先阅读 SpinningUp 的 PPO 教程(20 分钟即可建立基本直觉),然后回来继续。本教材从 Ch04 开始会结合框架代码重新讲解 PPO 的工程实现,但不会从零推导算法。

如果跳过本章会怎样

Ch01 是一个"地图章节"——它不教你具体操作,但帮你建立全局视角。如果跳过:

  • 你可能在 Ch03 讨论 MuJoCo vs PhysX 时不理解为什么需要两个引擎
  • 你可能在 Ch04 精读 Manager-Based 架构时不理解它为什么比 legged_gym 的单体架构好
  • 你可能在 Ch07 选择 RL 后端时不知道 RSL-RL / RL Games / SKRL 的定位差异
  • 你可能在 Ch08 配置 DR 时不理解 EventManager 的 4 种 mode 是在解决什么问题

如果你已经有丰富的 Isaac Lab 或 mjlab 使用经验,可以快速浏览本章的表格和陷阱框,重点关注 §1.3 的 Newton benchmark 数据和 §1.4 的 Isaac Lab 3.0 变更概览——这些是 2026 年的新内容。

预计阅读时间

阅读方式 时间 适合谁
精读(含练习) 3-4 小时 初次接触机器人 RL 仿真的读者
速读(跳过练习) 1.5-2 小时 有 Isaac Gym/Gym 经验但不了解 mjlab/Newton 的读者
速查(只看表格和陷阱) 30 分钟 有丰富双框架经验,只查最新变化

本教材的版本锚定:本章涉及的所有版本信息以 mjlab 1.2.0 + Isaac Lab 2.3.0 为准。Isaac Lab 3.0 Beta 的变更以注释框标注。详见 §1.7 的版本锚定策略。


1.1 机器人 RL 为什么需要仿真 ⭐

这一节解决什么问题:建立"仿真不是可选背景组件,而是训练基础设施"的认知。

动机:数据需求与真实世界成本的矛盾

机器人强化学习的核心矛盾,可以用一句话概括:策略学习需要海量试错数据,而真实世界的每一次试错都有物理代价。这个矛盾不是程度上的差异,而是数量级上的鸿沟。

以四足 locomotion 为例,一个 PPO 策略从随机初始化到学会稳定行走,典型地需要 \(10^8\)\(10^9\) 个环境 step。这是什么概念?假设策略控制频率是 50 Hz(即每秒做 50 次决策),那么 \(10^8\) 个 step 意味着 200 万秒(约 23 天)的等效真实时间。而这仅仅是训练一组超参数的数据量——一个典型的研究项目可能需要跑 50-200 组实验来调优 reward 权重和 DR 参数。

初始策略输出接近随机噪声,会导致机器人膝关节打到限位、向侧面倒地、电机温度过高——如果每一次这样的探索都发生在真机上,硬件维修、安全风险和时间消耗会迅速超出任何实验室的承受范围。

一个跨领域类比可以帮助理解:仿真器之于机器人 RL,就像编译器和单元测试之于软件工程。你当然最终要在真机上运行控制器(就像最终要把软件部署到生产环境),但你不会把每一次语法错误都部署到生产系统上才发现。同样,你不应该把每一次奖励设计错误都拿真机摔一遍才知道。

这个类比有明确的边界:编译器通常给出确定性的错误信息,而仿真器给出的是对物理世界的近似。编译通过 \(\approx\) 代码语法正确;仿真成功 \(\ne\) 真机成功。仿真能降低成本,但不会消除 sim-to-real gap。理解这个边界是后续所有章节的前提。

为了把这个直觉量化,考虑以下估算:

参数 说明
控制频率 50 Hz 每秒 50 个 policy step
训练所需 step \(10^8\) 典型 PPO 四足任务
单环境实时运行时间 \(10^8 / 50 = 2 \times 10^6\)\(\approx\) 23 天 不停机、不维修
4096 并行环境 \(2 \times 10^6 / 4096 \approx 500\)\(\approx\) 8 分钟 GPU 并行的数量级优势

当然真实吞吐不会线性扩展(GPU kernel 调度、重置、传感器模拟都有开销),但数量级上的差异已经足够说明为什么 GPU 并行仿真对机器人 RL 不是锦上添花而是刚需

如果不用仿真会怎样

反面案例 A:直接真机探索。 想象你要训练四足机器人站立。初始策略输出随机,第一次 rollout 机器人膝关节打到限位,第二次向侧面倒地,第三次电机温度过高。你调整 reward 后重新来,然后同样的错误以不同方式出现。这种流程的问题不只是"慢一点"——问题是反馈回路被物理成本截断了

  • 你不敢让策略充分探索(因为真机失败代价高),导致 policy 学不到恢复动作
  • 单机实时运行导致数据量不足,PPO 方差大,reward 曲线像随机游走
  • 只能读传感器意味着你无法直接观测完整动力学状态,难以定位奖励项到底哪里设错了

反面案例 B:CPU 多进程仿真。 在 GPU 并行仿真出现之前(2021 年以前),主流做法是用 CPU 多进程运行 MuJoCo。这比真机好很多,但受限于 CPU 核心数——一台 32 核工作站最多并行 32 个环境。对比 GPU 并行的 4096-8192 个环境,差距是两个数量级。ETH RSL 在 2021 年之前的四足训练(legged_gym 的前身)在 CPU 上需要数小时,而迁移到 Isaac Gym 后降至十分钟级别。这个量级差异直接改变了研究迭代速度——从"一天跑一组实验"变成"一小时跑十组"。

反面案例 C:只用仿真不做 sim-to-real。 另一种常见误区是过度依赖仿真——在仿真中训练出完美策略后直接部署到真机,不做任何 sim-to-real 适配。结果通常是真机表现远不如仿真。这是因为仿真中的接触模型、执行器响应、传感器噪声都与真实世界有差异(即 sim-to-real gap)。正确的做法是"仿真训练 + 域随机化 + sim-to-real 适配"的组合,这将在 Ch08(Domain Randomization)和 Ch23(Sim2Real 部署)中详细讲解。

仿真在训练闭环中的三个角色

理解仿真不只是"一个跑得快的环境",而是同时扮演三个角色,对后续所有章节的学习都至关重要:

角色一:物理世界(Physics Simulator)

仿真器的最基本功能是模拟物理世界——给定关节力矩,计算下一时刻的关节位置、速度和接触力。这由底层的物理引擎完成:

物理引擎 坐标体系 接触模型 使用框架
MuJoCo 广义坐标 凸优化(CG/Newton 求解器) mjlab
PhysX 笛卡尔坐标 TGS 迭代求解器 Isaac Lab(默认)
Newton 多求解器统一 可选 MuJoCo Warp / Kamino / XPBD Isaac Lab 3.0 Beta

物理引擎的选择直接决定仿真的真实度——特别是接触行为。Ch03 将深入讨论三种引擎的差异和选型方法。

角色二:MDP 机器(MDP Factory)

物理引擎只负责 sim.step()(前进一个物理时间步),而 RL 需要的是 env.step()——它在物理 step 之上封装了一整套 MDP 逻辑:

env.step(action):
    1. 处理 action(scaling, clipping, offset)
    2. 调用 sim.step() 一次或多次(action repeat)
    3. 计算 observation(从物理状态中提取策略需要的信息)
    4. 计算 reward(评估当前行为的好坏)
    5. 判断 termination(是否需要终止当前 episode)
    6. 执行 reset(对终止的环境重新初始化)
    7. 返回 (obs, reward, done, info)

这些 MDP 组件的组织方式就是所谓的 Manager-Based 架构——Isaac Lab 首创,mjlab 借鉴。每个组件由独立的 Manager 管理(ObservationManager、RewardManager、TerminationManager 等),使得研究者可以像搭积木一样组合 MDP 组件。Ch04 将对此做源码级精读。

本质洞察sim.step()env.step() 的区别是理解整个框架架构的起点。物理引擎负责"世界如何运转",框架负责"如何把物理世界包装成 RL 算法可以消费的 MDP"。很多初学者把两者混为一谈,导致在调试时不知道问题出在物理层还是 MDP 层。

角色三:调试仪器(Debug Instrument)

仿真相比真机有一个常被忽视的优势:你可以读取完整的物理状态。在真机上,你只能通过传感器获得有噪声的部分观测;在仿真中,你可以直接读取每个关节的精确位置和速度(qpos/qvel)、每个接触点的力和位置、每个物体的质心位置和速度。这对调试奖励函数和诊断策略行为至关重要。

调试能力 真机 仿真
关节角/速度 编码器(有噪声) 精确 qpos/qvel
接触力 力传感器(如果有) 精确接触法向力/摩擦力
质心位置 需要状态估计器 直接读取
地形信息 无法获取 heightfield 精确数据
录像回放 需要外部相机 内置录制 + 任意角度回放
状态保存/恢复 不可能 可以保存完整状态并从任意点恢复

可视化工具是调试仪器的一部分:mjlab 使用 Viser(基于 web 的 3D 可视化,支持远程访问),Isaac Lab 使用 Isaac Sim Viewer(基于 Omniverse 的工业级 GUI)。两者都支持实时查看训练过程中的机器人行为。

真实世界的训练数据量参考

为了让上述讨论更具体,以下是几个已发表工作中实际使用的训练数据量:

工作 任务 总 step 数 环境数 GPU 训练时间
legged_gym (CoRL'21) ANYmal 速度跟踪 ~\(2 \times 10^9\) 4096 1\(\times\)RTX 3090 ~20 分钟
walk-these-ways (RSS'23) Go1 多步态 ~\(5 \times 10^9\) 4096 1\(\times\)A100 ~1 小时
ProtoMotions G1 全身 motion tracking ~\(10^{10}\) \(4096\times4\) GPU 4\(\times\)A100 ~12 小时
KungfuBot (NeurIPS'25) G1 功夫动作 ~\(10^{10}\) 4096 1\(\times\)A100 ~8 小时

这些数据量在 CPU 仿真下是不可想象的——以 legged_gym 为例,\(2 \times 10^9\) 个 step 在单核 CPU MuJoCo(~1000 step/s)上需要约 23 天,而 GPU 并行在 20 分钟内完成。

仿真的局限性:Sim-to-Real Gap

仿真不是万能的。仿真中训练的策略不能直接部署到真机——仿真与真实之间存在不可消除的差异(sim-to-real gap)。理解这些差异的来源,是后续章节(特别是 Ch08 DR、Ch12 Actuator 建模、Ch23 Sim2Real 部署)的前提。

sim-to-real gap 的四个维度:

维度 仿真中 真实中 Gap 来源
动力学 理想化的接触模型(凸优化/TGS) 复杂的真实接触(变形、摩擦各向异性) 接触模型简化
执行器 理想 PD 控制,瞬时响应 电机有延迟、反电动势、温度限制 Actuator 建模精度
感知 精确 qpos/qvel,无噪声 编码器噪声、IMU 漂移、视觉延迟 传感器模型精度
环境 固定地形、无风、无干扰 地面不平、有风、有人推 环境多样性

本质洞察:sim-to-real gap 不是一个可以通过"把仿真做得更真实"来完全消除的问题。即使是世界上最精确的仿真器,也无法完美模拟真实世界的所有细节。正确的策略是:让策略对仿真参数的变化足够鲁棒(Domain Randomization,Ch08),使得真实世界成为随机化范围内的一个点。ASAP(RSS'25)更进一步——用残差动力学网络学习仿真和真实之间的差异。

如果不考虑 sim-to-real gap 会怎样? 一个在仿真中可以在粗糙地形上完美行走的四足策略,直接部署到真机后可能: - 足端滑移(仿真摩擦 > 真实摩擦) - 关节响应迟缓(理想 PD vs 真实电机延迟) - 对小的地面不平整过度反应(训练时从未见过真实地面纹理)

这些问题在 Ch08(DR)、Ch09(Teacher-Student)和 Ch23(Sim2Real)中会逐一解决。

Sim-to-Real Pipeline 概览

仿真不是终点——最终目标是把仿真训练的策略部署到真机上。完整的 sim-to-real pipeline 是:

Sim 训练 → Domain Randomization(Ch08)→ Teacher-Student 蒸馏(Ch09)
         → Sim2Sim 验证(Ch23)→ ONNX 导出(Ch07/Ch23)
         → 真机部署(Ch23)→ 在线微调(可选)

本章只给出这个全景概览,每个步骤会在后续对应章节中详细展开。理解这条完整的管线很重要——它说明仿真是一个起点而非终点,后续所有章节都是在这条管线的不同环节上深入。

让我们更具体地理解这条管线中每个步骤在做什么:

步骤 做什么 为什么需要 对应章节
Sim 训练 在 GPU 并行仿真中用 PPO 训练策略 获取初始策略 Ch07
Domain Randomization 在训练中随机化物理参数(质量/摩擦/延迟等) 让策略对参数变化鲁棒 Ch08
Teacher-Student 蒸馏 训练时用 privileged info,部署时用传感器输入 弥合仿真 ground truth 和真机传感器的差距 Ch09
Sim2Sim 验证 在不同的仿真器中验证策略(如 Isaac Lab → MuJoCo) 如果策略在两个仿真器中都表现良好,在真机上也更可能成功 Ch23
ONNX 导出 把 PyTorch 模型导出为 ONNX 格式 真机上通常用 C++ 推理,ONNX 是跨语言的模型格式 Ch07/Ch23
真机部署 在真实硬件上运行策略 最终目标 Ch23

这条管线中最关键的洞察是:每一步都在缩小 sim-to-real gap。Sim 训练给出基础策略,DR 让它鲁棒,Teacher-Student 让它适应真实传感器,Sim2Sim 验证筛掉仿真器特定的行为,最终在真机上验证。

一个跨领域类比:这条管线类似于软件工程中的 CI/CD(持续集成/持续部署)。Sim 训练 = 开发,DR = 单元测试,Sim2Sim = 集成测试,真机 = 生产环境。每一层测试都在更接近真实环境的条件下验证代码。

双重解读:Sim-to-real pipeline 可以从两个角度理解:

角度 1(风险管理):每一步在更接近真实的条件下验证,逐步降低真机部署的风险。如果 sim2sim 都失败了,就不要浪费时间上真机。

角度 2(信息压缩):仿真中的 privileged information(地形高度图、精确接触力)通过 Teacher-Student 蒸馏压缩为传感器可观测的信息,最终策略只依赖真机上实际可用的传感器输入。

练习

  1. 估算你自己的研究任务所需的训练 step 数(可参考相关论文的实验设置),计算单环境实时运行所需时间,再计算 4096 并行环境下的理论加速比。
  2. 列出 3 个仿真无法完美模拟的物理现象(如柔性绳索、液体、软体接触),并思考这些任务是否仍然可以用 sim-to-real RL 的范式来解决。
  3. 在 sim-to-real gap 的四个维度(动力学/执行器/感知/环境)中,你认为哪个维度对你的研究任务影响最大?为什么?查找一篇相关论文,看看他们如何处理这个 gap。

仿真的必要性和三重角色已经清楚了——机器人 RL 离不开仿真。但一个自然的追问是:为什么必须是 GPU 并行仿真?CPU 多进程不行吗?这就是下一节要回答的核心工程问题。

1.2 GPU 并行仿真的核心思想 ⭐⭐

这一节解决什么问题:理解为什么 GPU 并行仿真能比 CPU 多进程快 100 倍以上,以及这个加速的本质来源。

动机

上一节我们看到,4096 个并行环境可以把 23 天的训练压缩到 8 分钟。但为什么 CPU 做不到这个并行度,而 GPU 可以?答案不只是"GPU 核心多"——它涉及到计算模型的根本差异。

CPU 多进程 vs GPU 并行:两种范式

CPU 多进程范式(2021 年以前的主流)

Process 0: MuJoCo env_0.step() → obs_0, reward_0
Process 1: MuJoCo env_1.step() → obs_1, reward_1
...
Process 31: MuJoCo env_31.step() → obs_31, reward_31

每个进程独立运行一个 MuJoCo 实例,操作系统负责调度。并行度受限于 CPU 物理核心数(通常 16-64)。每个进程有独立的地址空间,数据交换需要进程间通信(共享内存或管道)。

GPU 并行范式(2021 年 Isaac Gym 首创,后续 mjlab / Newton 继承)

GPU Kernel: step(env_0, env_1, ..., env_4095) → (obs_all, reward_all)

所有环境的状态存储在一块连续的 GPU 显存中。一个 CUDA kernel 同时对所有环境执行 step()。环境之间共享相同的物理引擎代码(SIMT 模型),但操作各自独立的状态数据。

维度 CPU 多进程 GPU 并行
并行度 16-64(受核心数限制) 4096-65536(受显存限制)
数据位置 各进程独立内存 连续 GPU 显存
通信开销 进程间通信(微秒级) 无通信(同一显存空间)
与 RL 算法交互 需要 CPU→GPU 数据搬运 数据已在 GPU 上,零搬运
编程模型 标准 Python 多进程 CUDA kernel / Warp

本质洞察:GPU 并行仿真的核心优势不只是"核心多",而是数据零搬运——obs/reward/action 全程在 GPU 上,从环境生成到策略网络推理再到梯度计算,没有任何 CPU-GPU 数据搬运。在 CPU 多进程范式中,即使你有无限多的 CPU 核心,每次 rollout 后仍然需要把数据从 CPU 搬到 GPU 来做策略前向传播和梯度更新,这个搬运延迟是无法消除的瓶颈。

GPU 并行仿真的技术演进

GPU 并行仿真并不是凭空出现的。它的出现依赖三个技术前提的成熟:

  1. GPU 通用计算(CUDA)的成熟:物理引擎的核心计算(矩阵分解、接触求解、积分器)可以映射为 GPU kernel
  2. 大显存 GPU 的普及:4096 个环境的状态数据需要数 GB 显存,A100/H100 的 40-80 GB 显存使之可行
  3. PyTorch 与 GPU 张量的无缝互操作:MuJoCo Warp 的 TorchArray 和 Isaac Lab 的 torch.Tensor 都支持零拷贝桥接,使得物理引擎的输出可以直接被 PyTorch 消费

SIMT 执行模型与环境并行

GPU 的编程模型是 SIMT(Single Instruction, Multiple Threads):同一条指令同时在数千个线程上执行,每个线程操作不同的数据。这天然适合环境并行——每个环境的 step() 执行完全相同的计算流程(同一条指令),但操作各自独立的状态数据(不同数据)。

Thread 0: step(state[0]) → next_state[0], reward[0]
Thread 1: step(state[1]) → next_state[1], reward[1]
...
Thread 4095: step(state[4095]) → next_state[4095], reward[4095]

这种"相同计算、不同数据"的模式在 GPU 上极其高效,因为: - 所有线程共享同一份物理引擎代码(instruction cache 命中率高) - 状态数据连续排列在显存中(memory coalescing,连续内存访问) - 没有线程间通信需求(各环境完全独立)

SIMT 模型对环境设计的工程约束:理解 SIMT 很重要,因为它直接约束了你如何设计环境。以下两种做法在 GPU 并行中是不允许或低效的

做法 为什么有问题 正确替代方案
if env_id == 0: do_special() 分支导致线程发散(warp divergence),GPU 效率骤降 用 mask 张量控制行为:result = mask * special + (1-mask) * normal
不同环境用不同的 reward 函数 违反"同一指令"原则 所有环境计算相同的 reward,但通过权重 mask 控制哪些项生效
环境之间共享信息(如多智能体通信) 需要线程间通信,打破独立性 使用 shared memory 或 reduction 操作,但会增加延迟

这些约束看起来很严格,但实际上 Manager-Based 架构已经帮你处理了大部分问题——你在 config 中定义的 ObsTermRewTermEventTerm 都被框架自动转换为符合 SIMT 模型的张量操作。你不需要手动写 CUDA kernel。

数据布局:SoA vs AoS

GPU 并行仿真中一个容易被忽视但极其重要的工程细节是数据布局(data layout)。对于 N 个环境、每个环境 D 维状态:

AoS(Array of Structures)

[env0_dim0, env0_dim1, ..., env0_dimD, env1_dim0, env1_dim1, ..., env1_dimD, ...]

SoA(Structure of Arrays)

[env0_dim0, env1_dim0, ..., envN_dim0, env0_dim1, env1_dim1, ..., envN_dim1, ...]

GPU 偏好 SoA 布局,因为当所有线程同时读取同一个维度(如 dim0)时,SoA 布局下这些数据是连续的,可以合并为一次显存读取(memory coalescing)。AoS 布局下这些数据是间隔分布的,每个线程的读取请求无法合并,导致显存带宽浪费。

mjlab 和 Isaac Lab 都使用 SoA 布局——这就是为什么你在代码中看到的张量形状通常是 (num_envs, dim) 而非 (dim, num_envs)。这不是偶然的约定,而是 GPU 内存访问模式的直接要求。

Action Repeat 与物理时间步

另一个与 GPU 并行相关的重要工程概念是 action repeat(也叫 decimation)。RL 策略的决策频率(如 50 Hz)通常低于物理仿真的时间步频率(如 200 Hz)。这意味着每次 env.step() 内部会调用多次 sim.step()

env.step(action):           # 策略频率 50 Hz
    for _ in range(4):       # action repeat = 4
        apply(action)
        sim.step()           # 物理频率 200 Hz(= 50 Hz × 4)
    compute_obs()
    compute_reward()
    return obs, reward, done
参数 含义 典型值
dt 物理时间步长 0.005 秒(200 Hz)
decimation action repeat 次数 4
policy_dt 策略决策周期 = dt × decimation 0.02 秒(50 Hz)

action repeat 的选择直接影响训练效果: - 太小(如 1):策略需要在每个物理 step 做决策,频率过高,策略网络的输出变化太细碎 - 太大(如 20):策略对环境的反应太慢,无法及时修正误差 - 典型值:locomotion 任务通常用 4(策略 50 Hz),操作任务可能用 2-8 取决于任务精度要求

本质洞察:action repeat 是策略决策频率和物理仿真精度之间的桥梁。策略不需要每个物理时间步都做决策——就像人类走路时大脑不会以 200 Hz 控制每块肌肉,而是以较低频率发出高层指令,底层的反射回路负责高频调节。

端到端 GPU 训练的数据流

把 GPU 并行仿真和 RL 训练放在一起看,整个数据流是:

步骤 模块 位置
1. env.step(action) 环境 step GPU
 ├ sim.step() \(\times\) decimation 物理引擎 GPU
 ├ compute_obs() ObservationManager GPU
 ├ compute_reward() RewardManager GPU
 └ check_termination() TerminationManager GPU
2. policy.forward(obs) → action PyTorch 策略网络 GPU
3. storage.add(obs, action, reward) Rollout Buffer GPU
4. ppo.update(storage) PPO 梯度更新 GPU

注意整个流程从头到尾都在 GPU 上——没有任何 CPU-GPU 数据搬运。这就是为什么 GPU 并行仿真能比 CPU 多进程快 100 倍以上的根本原因。

在 CPU 多进程方案中,env.step() 的结果在 CPU 内存上,需要搬到 GPU 才能做 policy.forward()policy.forward() 的结果又需要搬回 CPU 才能做下一次 env.step()——这些搬运操作的延迟(微秒级)在 4096 个环境的规模下累积成巨大的瓶颈。

CUDA Graph:减少 Kernel 启动开销

即使数据全在 GPU 上,每次 env.step() 仍然需要启动多个 CUDA kernel(接触检测、力计算、积分、obs 拼接、reward 计算等)。每个 kernel 的启动都有微秒级的 CPU 端开销(driver overhead)。当 kernel 计算本身很快(如简单的 obs 拼接只需微秒级 GPU 时间)时,kernel 启动开销可能占总时间的 50% 以上。

CUDA Graph 解决这个问题——它把一系列 kernel 的启动序列"录制"下来,之后每次只需一次 CPU 调用就能重放整个序列:

不用 CUDA Graph:
  CPU: launch_kernel_1 → wait → launch_kernel_2 → wait → ... → launch_kernel_20
  每次 step 有 20 次 CPU-GPU 交互

用 CUDA Graph:
  首次:录制 kernel_1 → kernel_2 → ... → kernel_20 的执行图
  后续:CPU: replay_graph(一次调用重放全部 20 个 kernel)
  每次 step 只有 1 次 CPU-GPU 交互

mjlab 和 Isaac Lab 都支持 CUDA Graph 加速。但 CUDA Graph 有一个重要限制:计算图必须是静态的——不允许动态分支。这在环境仿真中是一个挑战,因为:

  • 不同环境可能在不同时刻 reset(episode 长度不同)
  • 某些环境可能触发特殊事件(如地形切换、curriculum 升级)
  • 动态传感器(如 RayCast)的计算量取决于地形复杂度

框架通常通过"延迟 reset"(记录需要 reset 的环境 ID,在所有环境 step 完成后统一 reset)来解决第一个问题。但复杂的动态行为仍然可能导致 CUDA Graph 失效。Ch24 会详细讨论 CUDA Graph 的失效条件和排查方法。

mjlab 的 expand_model_fields 机制:当 Domain Randomization(Ch08)需要修改物理参数(如质量、摩擦系数)时,这些参数原本是所有并行环境共享的(存储在 MjModel 中)。mjlab 的 expand_model_fields 会把这些共享参数"展开"为 per-world 数组(每个环境一份独立的值),并重建 CUDA Graph 以反映新的内存布局。这个过程在 DR 首次触发时自动发生,后续不再需要——但它意味着第一次 DR 触发后的 step 会比平时慢(因为 graph 重建),这是正常行为而非 bug。

mjlab 在展开参数时还使用了 Rucker-Wensing (2022) 的 pseudo-inertia 参数化——确保 mass、CoM 和 inertia 三者的随机化始终保持物理一致性。例如,如果你随机化了某个 link 的质量,其惯性矩阵会自动按照物理约束调整,而不是独立随机化(独立随机化可能产生物理上不可能的惯性参数,导致仿真不稳定)。这个细节在 Isaac Lab 中需要手动处理——mjlab 的 EventManager 内建了这个保障。

GPU 并行仿真的吞吐量 benchmark

不同框架在相同硬件上的吞吐量差异是显著的。以下是一些参考数据(注意:具体数值取决于任务复杂度和硬件配置,这里给出的是量级参考):

框架 物理引擎 任务 环境数 GPU 吞吐量(steps/s) 来源
CPU MuJoCo MuJoCo Ant 1 ~1,000 社区 benchmark
mjlab MuJoCo Warp Ant 4096 A100 ~500,000 mjlab 论文
Isaac Lab PhysX Ant 4096 A100 ~400,000 Isaac Lab 论文
MuJoCo Playground MJX (JAX) Ant 4096 A100 ~300,000 MJX benchmark

这些数字说明: - GPU 并行相比 CPU 单核有 300-500 倍的吞吐提升 - mjlab(MuJoCo Warp)和 Isaac Lab(PhysX)的吞吐量在同一数量级,差异不大 - 吞吐量不是选框架的主要依据——物理精度、API 设计、生态支持更重要

GPU 显存与最大环境数

GPU 并行的上限不是 CPU 核心数,而是显存。每个并行环境需要存储:机器人状态(qpos/qvel)、接触缓冲区、obs 张量、action 张量和 reward 张量。以下是不同机器人在不同 GPU 上的大致最大环境数参考:

机器人 DOF 每环境显存 RTX 4090 (24GB) A100 (80GB) H100 (80GB)
Go2 (四足) 12 ~1.5 MB ~8192 ~32768 ~32768
G1 (人形) 29 ~3 MB ~4096 ~16384 ~16384
Franka (机械臂) 7 ~1 MB ~16384 ~65536 ~65536
G1 + 4 相机 29 + 视觉 ~50 MB ~256 ~1024 ~1024

注意最后一行:当任务包含视觉传感器(RGB/Depth 相机)时,显存占用会增加 10-50 倍——这是 Ch18(视觉策略)必须用 80GB GPU 的原因。

实用估算公式(粗略值,用于快速判断):

max_envs ≈ (GPU_VRAM_GB - 2) × 1000 / per_env_MB

其中 2 GB 预留给 PyTorch 框架和策略网络。这个公式不精确,但足以让你在训练前判断"4096 环境在我的 GPU 上跑不跑得动"。

Ch02 会给出更精确的显存估算方法,包括 torch.cuda.memory_summary() 的实际使用。

⚠️ 常见陷阱

  1. 认为 GPU 并行仿真总是更快。 对于非常简单的任务(如 CartPole),GPU kernel 的启动开销可能超过计算本身,此时 CPU 多进程反而更快。GPU 并行的优势在高 DOF 机器人(四足/人形)上才真正体现。
  2. 忽视 CUDA Graph 的限制。 CUDA Graph 可以减少 kernel 启动开销,但它要求计算图是静态的——如果你的环境有动态分支(如不同环境在不同时刻 reset),CUDA Graph 可能失效。Ch03 会详细讨论。
  3. 混淆"环境数量"和"有效样本量"。 4096 个并行环境不代表 4096 倍的样本效率。如果这 4096 个环境的初始条件相同且没有域随机化,它们产生的数据高度相关,对策略更新的贡献远小于 4096 个独立样本。

练习

  1. 解释为什么在 CPU 多进程范式中,即使有 4096 个 CPU 核心,训练速度仍然无法与 GPU 并行匹配。提示:考虑 CPU→GPU 数据搬运延迟。
  2. 查找你常用的 GPU 的显存大小,估算在该显存下最多能并行运行多少个 Unitree G1 人形环境(假设每个环境占用约 2 MB 状态数据)。
  3. 一个四足 locomotion 任务使用 dt=0.005(200 Hz 物理频率)和 decimation=4。计算策略的决策频率是多少 Hz?如果你把 decimation 改为 8,策略频率变为多少?这对训练效果可能有什么影响?
  4. (思考题)CUDA Graph 要求计算图是静态的。如果你的环境中有一些环境需要 reset 而另一些不需要,这导致了动态分支。你能想到一个不违反 CUDA Graph 限制的方法来处理 reset 吗?提示:所有环境都执行 reset 逻辑,但只有标记为需要 reset 的环境真正使用 reset 的结果。

现在你理解了 GPU 并行仿真的技术本质——数据零搬运、SIMT 执行模型、SoA 内存布局。但一个具体的问题是:GitHub 上有这么多框架(Isaac Gym、Isaac Lab、mjlab、MuJoCo Playground……),它们之间是什么关系?我该用哪个?要回答这个问题,必须理解它们的演进脉络。

1.3 生态演进脉络 ⭐⭐⭐

这一节解决什么问题:理解从 MuJoCo CPU 到 mjlab 的完整生态演进,知道每个框架为什么存在、解决了什么问题、又留下了什么问题。

动机

现在 GitHub 上至少有 6 个活跃的机器人 RL 仿真框架。一个博士新生面对这个生态会非常困惑:"它们之间是什么关系?我该用哪个?"要回答这个问题,必须理解这些框架的演进脉络——每一代框架都是为了解决上一代的痛点而诞生的。

如果不理解演进会怎样

你会在论文和 GitHub 上看到大量混用不同框架的代码,却不知道为什么 2023 年的论文用 Isaac Gym 而 2026 年的论文用 mjlab。你可能花几天时间配好一个框架,然后发现它已经停止维护。更糟糕的是,你可能在一个不适合你任务的框架上浪费数月时间。

演进全景

以下按时间线梳理关键节点。每个节点标注了它解决的核心问题它留下的局限

第一阶段:CPU MuJoCo(2012-2021)

MuJoCo(Multi-Joint dynamics with Contact)由 Emo Todorov 在 2012 年发表论文(IROS 2012),2015 年起通过 Roboti LLC 作为商业软件销售(年许可费约 $500)。2021 年 10 月 Google DeepMind 收购 Roboti LLC 后免费开放预编译包,2022 年 5 月完整源代码在 GitHub 开源(Apache 2.0 许可),这对整个社区产生了深远影响——之前很多学生和小团队因为许可费而转向其他引擎(如 PyBullet),开源后 MuJoCo 迅速成为机器人 RL 最广泛使用的物理引擎。

MuJoCo 的核心创新是使用广义坐标 + 凸优化接触模型,在接触密集的多关节系统中实现了当时最好的精度-速度平衡。它的接触求解器不像传统方法(如 LCP)那样求解互补性问题,而是把接触约束松弛为凸优化问题——这意味着求解总是成功的,不会像 LCP 那样在病态情况下发散。这个设计决策使得 MuJoCo 在足式机器人(接触点频繁建立和断开)和灵巧手操作(手指与物体的复杂接触)中表现出色。

属性
物理后端 广义坐标 + 凸优化接触(CG/Newton 求解器)
运行方式 单线程 CPU
模型格式 MJCF(XML-based,表达力强——支持 tendon、equality constraint 等高级特性)
典型用途 OpenAI Gym 环境(Ant/Humanoid/HalfCheetah)、DeepMind Control Suite
核心优势 接触精度高、API 优雅、模型格式表达力强
核心局限 单线程 CPU,吞吐量低——训练四足需要数小时到数天

如果不了解 MuJoCo 的历史会怎样:你可能不理解为什么 mjlab 要"回到 MuJoCo 物理"——因为 PhysX 的接触模型在接触密集任务中的精度确实不如 MuJoCo。mjlab 的 MuJoCo Warp 本质上是"保持 MuJoCo 的接触精度,但在 GPU 上跑"。

MuJoCo 接触模型入门预览

MuJoCo 的接触模型与游戏引擎(PhysX/Bullet/ODE)有本质区别。理解这个区别对后续的物理引擎选型(Ch03)和接触参数调优至关重要,这里先给出直觉。

传统游戏引擎使用硬接触模型——当两个物体接触时,求解器试图找到一组力使得穿透量为零。这是一个 LCP(线性互补问题),在数学上是 NP-hard 的,求解器只能做近似(如 PhysX 的 TGS 迭代求解器),当接触点多或几何复杂时可能无法收敛。

MuJoCo 使用软接触模型——允许微小的穿透,通过凸优化计算使穿透最小化的接触力。这意味着求解器总是能成功(凸优化有全局最优解),代价是接触面之间会有极微小的穿透和微滑(slip)。

控制接触行为的两个核心参数是 solref(接触刚度/阻尼)和 solimp(约束阻抗函数):

材质 solref(参考值) 物理直觉 典型场景
金属 [0.005, 1.0] 极硬,几乎无变形 关节轴承、金属工具
硬塑料 [0.01, 1.0] 硬且稳,略"软"于金属以增强仿真稳定性 机器人外壳、地面
橡胶 [0.02, 1.5] 有弹性,接触面积大 轮胎、足底垫
海绵 [0.05, 2.0] 明显变形 软体操作、缓冲垫

以上参考值来自 ROBOLAWEB solref/solimp Cheat Sheet。对于大多数 locomotion 任务,MuJoCo 默认值已经足够好;只有在接触行为明显不符合预期时才需要手动调整。Ch03 将深入讲解 solref/solimp 的完整参数空间和调优方法。

如果接触参数选错会怎样? 三种典型症状: - 穿透(solref 太软):足端穿过地面,机器人"沉"入地下 - 弹跳(solref 太硬 + solimp 阻尼不足):物体在接触面上来回振荡 - 微滑(MuJoCo 软接触的固有特性):静止的物体在斜面上缓慢滑动——可通过增加 impratio 参数缓解

反事实推理:如果 MuJoCo 不用软接触而用硬接触(像 PhysX 一样),它在接触密集场景中的求解稳定性会大幅下降——这正是 MuJoCo 论文(Todorov 2012)选择凸优化路线的核心理由。

第二阶段:Isaac Gym(2021-2024)

NVIDIA 在 NeurIPS 2021 发布 Isaac Gym(论文:Isaac Gym: High Performance GPU-Based Physics Simulation for Robot Learning),首次实现了 GPU 并行仿真 + 端到端 GPU 训练。这是机器人 RL 工程化的分水岭。

属性
物理后端 PhysX(NVIDIA 自研,笛卡尔坐标 + TGS 求解器)
运行方式 GPU 并行(数千环境同时 step)
典型用途 足式机器人 locomotion、灵巧手操作
核心优势 吞吐量跨越两个数量级、obs/action 全程在 GPU 上
核心局限 任务编写全在一个巨大的类中legged_robot.py 数千行,obs/reward/reset 混在一起)、接触精度不如 MuJoCo、仅支持 PhysX

Isaac Gym 对社区的影响是巨大的。ETH RSL 的 legged_gym(CoRL 2021,Learning to Walk in Minutes)在 Isaac Gym 上实现了四足 locomotion 的标准训练范式,后续几乎所有足式机器人 RL 论文都以它为基础。直到 2026 年,legged_gym 仍有约 1.8k GitHub Stars,是引用最多的开源项目之一。

但 Isaac Gym 的单体架构问题很快暴露出来。当一个任务文件超过 2000 行时,obs 计算、reward 函数、reset 逻辑、域随机化全部耦合在一起,修改任何一个组件都可能引入隐蔽的 bug。

legged_gymlegged_robot.py 为例,一个典型的四足任务文件包含了所有逻辑:

# legged_gym 的单体架构(简化示意)
class LeggedRobot(BaseTask):
    def step(self, actions):
        self.pre_physics_step(actions)           # action 处理
        self.gym.simulate(self.sim)               # 物理 step
        self.post_physics_step()                  # obs/reward/reset 全部混在这里

    def compute_observations(self):
        # 200+ 行 obs 计算代码
        self.obs_buf = torch.cat([...], dim=-1)

    def compute_reward(self):
        # 300+ 行 reward 计算代码
        self.rew_buf = ...

    def reset_idx(self, env_ids):
        # 150+ 行 reset 逻辑
        ...

    def _push_robots(self):
        # 域随机化逻辑也在这个类里
        ...

这种"一个类包含所有逻辑"的架构在任务简单时没问题,但当你需要: - 对比不同的 obs 组合 → 需要修改 compute_observations() 内部逻辑 - 添加一个新的 reward 项 → 需要在 compute_reward() 中间插入代码 - 实验不同的 DR 策略 → 需要修改分散在多处的随机化代码

每次修改都可能影响其他逻辑,而且很难通过 config 来控制——大量行为是硬编码的。

Isaac Lab 的 Manager-Based 架构解决了这个问题。它把 MDP 的每个组件拆分到独立的 Manager 中:

# Isaac Lab / mjlab 的 Manager-Based 架构(简化示意)
@configclass
class MyEnvCfg(ManagerBasedRlEnvCfg):
    observations = ObservationGroupCfg(
        policy=ObservationGroupCfg(
            joint_pos=ObsTerm(func=joint_pos_rel),
            joint_vel=ObsTerm(func=joint_vel_rel),
            ...
        )
    )
    rewards = RewardsCfg(
        track_lin_vel=RewTerm(func=track_lin_vel_xy_exp, weight=1.0),
        track_ang_vel=RewTerm(func=track_ang_vel_z_exp, weight=0.5),
        ...
    )
    events = EventCfg(
        push_robot=EventTerm(func=push_by_setting_velocity, mode="interval"),
        randomize_mass=EventTerm(func=randomize_rigid_body_mass, mode="startup"),
    )

每个 Manager(ObservationManager、RewardManager、EventManager 等)独立运行,通过 config 组合。修改 obs 不影响 reward,修改 DR 不影响 reset。这个架构差异是从 Isaac Gym 到 Isaac Lab/mjlab 的核心技术跃迁,也是本教材的核心教学内容之一(Ch04 将做源码级精读)。

为什么 Manager-Based 架构对研究者如此重要? 考虑一个典型的研究工作流:

研究活动 单体架构(legged_gym) Manager-Based(mjlab/Isaac Lab)
添加一个新 reward 项 修改 compute_reward() 函数内部,可能影响其他 reward 的计算顺序 在 config 中添加一行 RewTerm(),其他 reward 完全不受影响
对比两组不同的 obs 复制整个 compute_observations() 函数,手动管理两个版本 在 config 中注释/取消注释 ObsTerm()
实验不同的 DR 策略 在多处(_push_robots()_randomize_dof_props()…)修改代码 修改 EventCfg 中的 EventTerm() 列表
切换到新机器人 可能需要修改大量硬编码的 DOF 索引和常数 切换 EntityCfg / ArticulationCfg,其他逻辑自动适配

双重解读:Manager-Based 架构的价值可以从两个角度理解:

角度 1(软件工程):它实现了关注点分离(Separation of Concerns)——每个 Manager 只负责一件事,降低了代码的认知复杂度。

角度 2(科学研究):它让消融实验(ablation study)变得容易——你可以只改动一个 config 行就得到一个新的实验条件,确保对比是公平的。

第三阶段:Isaac Lab(2024-至今)

NVIDIA 在 2024 年发布 Isaac Lab 框架(论文 Isaac Lab: A GPU-Accelerated Simulation Framework for Multi-Modal Robot Learning,arXiv:2511.04831),作为 Isaac Gym 的继任者。它的核心创新是 Manager-Based 架构——把 MDP 的每个组件(obs、action、reward、termination、event、command、curriculum)拆分到独立的 Manager 中,实现了关注点分离。

属性
物理后端 PhysX(默认)、Newton + MuJoCo Warp(3.0 Beta)
运行方式 GPU 并行 + Isaac Sim / kit-less 模式
Stars 7.3k(截至 2026-05-26)
核心优势 Manager-Based 架构、多物理后端、RTX 渲染(视觉任务)、社区最大
核心局限 安装复杂(需要 Isaac Sim / Omniverse 或 kit-less 配置)、启动延迟较大、对 MuJoCo 物理的支持仍在 Beta

Isaac Lab 定义了八大公开 Manager,每个 Manager 负责 MDP 的一个维度(mjlab 在此基础上额外增加了第九个 MetricsManager):

Manager 职责 你在什么时候会修改它 框架支持
ObservationManager 计算 obs 并拼接为张量 修改策略的输入信息 双框架
ActionManager 处理 action(scaling/clip/offset)并发送到执行器 修改动作空间 双框架
RewardManager 计算各 reward 项并加权求和 修改奖励函数 双框架
TerminationManager 判断 episode 是否结束 修改终止条件 双框架
EventManager 处理域随机化和事件(push/randomize) 修改 DR 策略 双框架
CommandManager 生成指令(如速度指令)并管理其生命周期 修改指令采样范围 双框架
CurriculumManager 根据训练进度调整难度 修改课程策略 双框架
RecorderManager 录制可视化视频和状态 添加录制需求 Isaac Lab
MetricsManager 统计跨 Manager 的任务级指标(成功率/tracking 误差) 添加自定义日志 mjlab 独有

注意:Isaac Lab 的公开 API 没有独立的 MetricsManager 类——episode-level 统计由 RewardManager 和各 Manager 的内部 bookkeeping 处理。mjlab 将其提取为独立 Manager 是因为任务级指标(如 success rate、tracking RMSE)不属于任何单一 Manager 的职责范围。

这九个 Manager 的详细工程实现将在 Ch04(Manager-Based 架构精读)中逐一展开。这里你只需要知道:每个 Manager 对应 MDP 的一个组件,修改任何一个不影响其他的——这是 Manager-Based 架构的核心价值。

Isaac Lab 的内置任务生态是选择它的重要理由之一。截至 2026 年,Isaac Lab 内置了 30+ 任务,覆盖:

类别 示例任务 对应本教材章节 说明
Classic Control CartPole、Ant、Humanoid Ch04(教学用) 快速验证 RL 管线是否正常
四足 locomotion ANYmal-B/C/D、Go1/Go2、Spot Ch13 flat + rough terrain 变体
人形 locomotion H1、G1、Digit Ch14 flat terrain,含 closed-loop kinematics (Digit)
机械臂操作 Franka Lift/Reach/Stack Ch17 joint pos / IK-abs / IK-rel 三种 action space
灵巧手操作 DexSuite(Kuka+Allegro Lift/Reorient) Ch17 含 ADR + PBT
人形操作 G1 LocoManip Ch20 2.3.0 新增
工厂装配 Factory PegInsert/GearMesh/NutBolt Ch17(高级) contact-rich manipulation

mjlab 的内置任务相对精简(velocity tracking / motion imitation / lift_cube / tennis),但每个都经过框架开发者的深度打磨。Isaac Lab 的任务数量更多,但部分任务的维护程度不一——选择任务时建议先确认其最近的更新日期。

Isaac Lab 的 Manager-Based API 是一个关键的架构创新,它让研究者可以像搭积木一样组合 MDP 组件。这个 API 设计影响了后续所有框架——包括 mjlab。

第四阶段:MuJoCo Playground / MJX(2024-2025)

Google DeepMind 在 2024 年推出了 MuJoCo 的 JAX 加速版本(MJX)和基于它的 MuJoCo Playground,实现了 MuJoCo 物理的 GPU 加速。MJX 基于 JAX 的 vmap 实现批量仿真,物理精度与 CPU MuJoCo 一致。

属性
物理后端 MuJoCo(通过 JAX vmap 加速)
优势 MuJoCo 物理精度 + GPU 吞吐 + 可微分
局限 JAX 生态(与 PyTorch RL 算法库不直接兼容)、缺乏成熟的 RL 框架封装

MJX/Playground 的定位更偏研究原型——它适合需要可微分仿真或 JAX 生态的用户,但对于大多数使用 PyTorch 的 RL 研究者来说,集成成本较高。

MuJoCo Playground 的一个独特能力是基于 Madrona 的批量渲染——它可以在 GPU 上同时为数千个并行环境生成 RGB/Depth 图像,实现端到端的视觉策略训练而不需要 teacher-student 蒸馏。这在视觉 locomotion 和 vision-based manipulation 中有重要价值。但需要注意,Madrona 的渲染质量不如 Isaac Sim 的 RTX 光追——它更适合功能性视觉输入(如深度图、语义分割),而非需要逼真光照和纹理的场景。

Playground 的 sim-to-real 成功案例覆盖了多种机器人平台:Berkeley Humanoid(双足 locomotion)、Unitree Go1(四足 locomotion)、Unitree G1(人形 locomotion)、LEAP Hand(灵巧手操作)和 Franka Arm(机械臂操作)——这些案例表明 MuJoCo 的物理精度在零样本 sim-to-real 迁移中是可靠的。

第五阶段:Newton(2025-至今)

Newton 由 NVIDIA、Google DeepMind 和 Disney Research 联合发起,2025 年 9 月 29 日由 Linux Foundation 宣布为开源项目(Apache 2.0),Newton 1.0 GA 于 GTC 2026(2026 年 3 月 16 日)正式发布。Newton 的目标是统一多个物理求解器在一个 API 下,使用户可以在同一个任务中切换不同的物理后端而不需要改动 MDP 代码。

属性
物理后端 多求解器统一 API(7 个求解器)
治理 Linux Foundation 开源项目
许可证 Apache 2.0(代码)/ CC-BY-4.0(文档)
Isaac Lab 集成 Isaac Lab 3.0 Beta 通过 isaaclab_newton extension 支持
安装 pip install "newton[examples]"(< 2 分钟)

Newton 1.0 包含的 7 个求解器及其适用场景:

求解器 来源 适用场景 说明
MuJoCo Warp Google DeepMind 双足/四足 locomotion、通用刚体 主求解器,凸优化接触
Kamino Disney Research 闭环机构(平行连杆腿、灵巧手) maximal-coordinate + Proximal-ADMM,首个 GPU 仿真闭环机构的求解器
XPBD 社区 软体/接触(小规模) Position-Based Dynamics,适合软体机器人
VBD Style3D 线缆/布料/线性可变形体 Vertex Block Descent,可与 MuJoCo Warp 双向耦合
Featherstone 标准算法 机械臂/clean 运动链 reduced-coordinate articulation
Implicit MPM 研究 颗粒材料、沙地/雪地越野 Material Point Method
SemiImplicit 基础 通用 baseline 半隐式积分

Newton 还提供 SDF collision library(有符号距离场碰撞检测)和 hydroelastic contact modeling(基于压力片的接触建模)。

Newton 1.0 性能 benchmark

据 NVIDIA Technical Blog "Newton Adds Contact-Rich Manipulation and Locomotion Capabilities for Industrial Robotics"(2026 年 3 月):

对比 任务类型 硬件 加速比
MuJoCo Warp vs MJX Locomotion RTX PRO 6000 Blackwell 252\(\times\)
MuJoCo Warp vs MJX Manipulation RTX PRO 6000 Blackwell 475\(\times\)
MuJoCo Warp vs MJX Locomotion RTX 4090 152\(\times\)
MuJoCo Warp vs MJX Manipulation RTX 4090 313\(\times\)
MuJoCo Warp vs PhysX 灵巧手操作 快 65%

注意:以上数据中的"up to"是峰值而非平均值,具体性能取决于任务复杂度和硬件配置。教材引用这些数字时应标注来源和条件。对于教学选型来说,性能差异不是选框架的主要依据——物理精度、API 设计和安装便利性更重要。

Newton 的价值不仅在于"多一个引擎选项",而在于它让跨引擎对比变得容易。在 Newton 之前,如果你想验证你的策略在 MuJoCo 和 PhysX 上是否表现一致,需要维护两套完全不同的环境代码。Newton 之后,你只需要切换一个配置参数。这对 sim-to-real 研究特别重要——ASAP(RSS'25)的核心发现就是同一个策略在不同引擎上的真机表现差异很大。

Newton 的出现正在让 Isaac Lab 和 mjlab 在物理后端层面趋同——这是我们选择双框架教学的核心理由之一。未来,选 mjlab 还是 Isaac Lab 可能不再取决于物理引擎(因为两者都可以用 MuJoCo Warp),而更多取决于 API 偏好、安装便利性和社区生态。

第六阶段:mjlab(2026-至今)

UC Berkeley 的 Pieter Abbeel 和 Koushil Sreenath 团队在 2026 年 1 月发布 mjlab(论文:mjlab: A Lightweight Framework for GPU-Accelerated Robot Learning)。mjlab 的设计哲学可以用一句话概括:Isaac Lab 的 Manager-Based API + MuJoCo Warp 的 GPU 物理 + 一条命令安装

属性
物理后端 MuJoCo Warp(Google DeepMind 与 NVIDIA 共同维护的 MuJoCo GPU 加速版)
版本 v1.2.0(2026-03-06),首个 Beta v0.1.0(2025-09-29)
Stars 2,191(截至 2026-04-22,338 forks,增长极快)
安装 pip install mjlab(一条命令,v1.0 起不再需要 git pin MuJoCo Warp)
核心优势 轻量、MuJoCo 原生精度、Isaac Lab 风格 API、直接访问 MuJoCo 数据结构(MjModel/MjData)
核心局限 社区规模和内置任务数量不如 Isaac Lab、不支持 RTX 渲染、仅支持 RSL-RL(PPO)

mjlab 与 Isaac Lab 共享 Manager-Based API 设计哲学。这意味着学会一个框架后,迁移到另一个的认知成本很低——核心概念(ObservationManager、RewardManager、EventManager 等)是一一对应的,只是 API 细节略有不同。

演进时间线总结

2012 MuJoCo CPU 发布(Todorov)— 痛点:单线程 CPU,吞吐低
2021 Isaac Gym 发布(NVIDIA,NeurIPS'21)— └ legged_gym(ETH RSL,CoRL'21,1.8k Stars)— 痛点:单体架构,代码不可组合
2024 Isaac Lab 发布(NVIDIA,6.5k Stars)— └ Manager-Based 架构创新
2024 MuJoCo Playground / MJX(DeepMind,JAX 加速)— 痛点:Isaac Lab 安装复杂;MJX 是 JAX 生态
2025-09 Newton 开源(NVIDIA + DeepMind + Disney,Linux Foundation)→ 2026-03 Newton 1.0 GA(GTC 2026)
2026-01 mjlab 发布(UC Berkeley,2.2k Stars)— Isaac Lab API + MuJoCo Warp + pip install

⚠️ 常见陷阱

  1. 认为 Isaac Gym 还是主流。 截至 2026 年,Isaac Gym 已被 Isaac Lab 和 mjlab 取代。新项目不应再基于 Isaac Gym 开发。但很多高星开源项目(如 walk-these-ways、humanoid-gym)仍然基于 Isaac Gym,阅读它们的代码时需要理解其架构限制。
  2. 认为 MJX 和 MuJoCo Warp 是同一个东西。 MJX 基于 JAX,MuJoCo Warp 基于 NVIDIA Warp。前者在 JAX 生态中使用,后者在 PyTorch 生态中使用(通过 mjlab)。两者的物理精度相近(都是 MuJoCo 算法的 GPU 实现),但编程模型完全不同。
  3. 混淆"框架"和"物理引擎"。 Isaac Lab 是框架,PhysX/MuJoCo Warp 是物理引擎。Isaac Lab 可以使用不同的物理引擎(PhysX 或通过 Newton 使用 MuJoCo Warp)。同样,MuJoCo Warp 这个物理引擎可以被不同框架使用(mjlab 直接使用,Isaac Lab 通过 Newton 间接使用)。

练习

  1. 画一个框架-引擎对应关系图,标明 mjlab、Isaac Lab、legged_gym、MuJoCo Playground 各自使用什么物理引擎。
  2. 找到一篇 2024 年的足式机器人论文和一篇 2026 年的,对比它们使用的仿真框架,分析框架迁移的技术原因。
  3. 在 legged_gym 的单体架构中,假设你要同时实验 3 种不同的 reward 配置。你需要怎么组织代码?在 Manager-Based 架构中呢?对比两种方案的工程成本。
  4. Newton 1.0 GA 的 7 个求解器中,哪个最适合仿真一个带平行连杆腿的双足机器人?为什么其他求解器(如 MuJoCo Warp)在这种情况下会有问题?提示:查阅 Kamino 论文的摘要。
  5. (思考题)如果 MuJoCo Warp 的可微分功能在未来版本中实现了(目前官方不支持、暂无明确计划),这会对 mjlab 和 MuJoCo Playground/MJX 的竞争格局产生什么影响?可微分仿真对 RL 训练有什么潜在价值?

生态演进讲清楚了"有哪些框架、每代解决了什么痛点"。但对于你——一个即将开始研究的博士生——最紧迫的问题是:mjlab 和 Isaac Lab 我该选哪个?它们的技术差异到底在哪?本节用系统性对比来回答这个工程选型问题。

1.4 双框架对比:mjlab vs Isaac Lab ⭐⭐⭐

这一节解决什么问题:系统性对比两个框架的技术差异,建立选型直觉。

动机

既然 mjlab 和 Isaac Lab 共享 Manager-Based API,为什么需要两个框架?因为它们在物理后端、安装方式、视觉能力和社区生态上有本质差异,适合不同的研究场景。理解这些差异,是为你的研究课题选择正确工具的前提。

全方位对比表

维度 mjlab Isaac Lab
物理后端 MuJoCo Warp(广义坐标 + 凸优化接触) PhysX(默认)/ Newton + MuJoCo Warp(3.0 Beta)
安装 pip install mjlab(<1 分钟) conda/pip + Isaac Sim 或 kit-less(10-30 分钟)
启动延迟 ~2 秒 ~15-30 秒(Isaac Sim 加载时间)
Stars 2.2k(2026-01 发布,v1.2.0 稳定版) 6.5k(2024 发布,社区最大)
模型格式 MJCF(MuJoCo 原生) USD(NVIDIA Omniverse 原生),支持 URDF 转换
视觉渲染 Viser(web-based,轻量) Isaac Sim(RTX 实时光追,工业级)
RL 后端 RSL-RL(默认且唯一) RSL-RL / RL Games / SKRL / Stable Baselines
可视化 Viser(浏览器内、远程友好) Isaac Sim Viewer / Omniverse
内置任务数 ~10(velocity/tracking/lift_cube/tennis 等) ~30(locomotion/manipulation/dexterous/navigation 等)
内置机器人数 依赖 MuJoCo Menagerie(50+ MJCF 模型) 16+(USD 格式,ANYmal/Go2/H1/G1/Franka 等)
MuJoCo 数据直接访问 ✅(可直接读写 mjDatamjModel ❌(需通过 Isaac Lab API 间接访问)
多后端 RL ❌(仅 RSL-RL) ✅(可切换 RL 后端)
RTX 渲染 ✅(视觉任务的核心优势)
Docker 支持
Colab 支持 ✅(官方 Colab 模板) ❌(需要 GPU 实例)

从两个角度理解差异

角度 1:工程哲学。 mjlab 追求"minimal viable framework"——用最少的代码和依赖提供最核心的功能。它的设计者认为,大多数 RL 研究者只需要一个物理引擎 + 一个 Manager-Based API + 一个 RL 算法,不需要 Omniverse 的完整生态。Isaac Lab 追求"comprehensive platform"——在一个统一的平台上提供物理仿真、视觉渲染、多种 RL 后端、丰富的内置任务。

角度 2:物理后端。 mjlab 使用 MuJoCo Warp,它继承了 MuJoCo 的广义坐标方法和凸优化接触模型。这意味着在接触密集的任务(足式机器人抓地、灵巧手操作)中,MuJoCo 的接触精度通常优于 PhysX。而 Isaac Lab 默认使用 PhysX,它在大量刚体堆叠的场景(桌面操作、物流仓储)中有优势。Newton 引擎的出现正在模糊这个差异——Isaac Lab 3.0 可以通过 Newton 使用 MuJoCo Warp 物理。

选什么?——工程决策树

你的任务需要视觉输入(RGB/Depth)吗?
  ├── 是 → Isaac Lab(RTX 渲染是核心优势)
  └── 否 → 继续
      你需要对比多种 RL 算法吗?
        ├── 是 → Isaac Lab(支持 RSL-RL/RL Games/SKRL/SB3)
        └── 否 → 继续
            你需要快速原型和轻量部署吗?
              ├── 是 → mjlab(pip install + 2 秒启动)
              └── 否 → 继续
                  你的任务接触密集(足式/灵巧手)吗?
                    ├── 是 → mjlab(MuJoCo 接触精度更好)
                    └── 否 → 两者皆可,选社区 baseline 更多的

mjlab 的独特设计:Entity 编译模型与 Actuator 层叠

mjlab 有两个独特的设计值得在选型时了解(Isaac Lab 没有对应物):

Entity 的"先 compile 再 run"模式:mjlab 的 Entity 不是直接加载一个 MJCF 文件——而是遵循"先编译再运行"的流程:多个 Entity 的 MJCF 描述通过 MjSpec 合成为一个统一的 MjModel,在 CPU 上编译后,用 MuJoCo Warp 的 put_model / put_data 传输到 GPU。这意味着你可以在 Python 中动态组合多个 Entity(如机器人 + 桌子 + 物体),而不需要手动编辑 MJCF 文件。

Actuator 层叠系统(arXiv:2601.22074 §3.4):mjlab 支持五层 actuator,从低级到高级:

层级 类型 说明
1 XmlActuator 直接读 MJCF <actuator> 定义(motor/position/velocity/muscle)
2 IdealPD GPU 上以 PyTorch 计算 PD 力矩(不进入 MuJoCo solver)
3 DCMotor DC 电机模型,含 velocity-dependent 力矩饱和
4 MLP Actuator 从真机数据学习的 actuator network(如 walk-these-ways 的做法)
5 ActuationDelayWrapper 缓冲控制信号并按 physics timestep 量化延迟回放

这五层可在同一个 Entity 内共存——比如上肢用 IdealPD(足够精确),下肢用 MLP Actuator(需要更精确的电机建模)。ActuationDelayWrapper 可以包裹在任何一层外面,模拟通信/驱动器时延。这对 sim-to-real 极其重要——Ch12(Actuator 建模)将深入讲解。

mjlab 还内置了 DifferentialInverseKinematicsActionCfg,支持 damped least-squares + null-space posture regularization + soft joint-limit avoidance——这对操作任务(Ch17)很有价值,而 Isaac Lab 的 DiffIK 实现较为基础。

双框架 CLI 对比实例

两个框架的日常使用体验差异集中体现在 CLI 操作上。以"训练一个 G1 人形速度跟踪任务"为例:

mjlab 的操作流程

# 安装(一次性,<1 分钟)
pip install mjlab

# 训练(2 秒内启动,直接开始训练)
uv run train Mjlab-Velocity-Flat-Unitree-G1 \
    --env.scene.num-envs 4096

# 评估(从 WandB 拉取最新 checkpoint)
uv run play Mjlab-Velocity-Flat-Unitree-G1 \
    --wandb-run-path your-org/mjlab/run-id

# 零动作测试(检查模型是否正确加载)
uv run play Mjlab-Velocity-Flat-Unitree-G1 --agent zero

# 随机动作测试(检查动作空间是否合理)
uv run play Mjlab-Velocity-Flat-Unitree-G1 --agent random

Isaac Lab 的操作流程

# 安装(需要 conda 环境,10-30 分钟)
conda create -n isaaclab python=3.10
conda activate isaaclab
pip install isaacsim-rl isaacsim-replicator isaacsim-extscache-physics
git clone https://github.com/isaac-sim/IsaacLab.git
cd IsaacLab && ./isaaclab.sh --install

# 训练(15-30 秒 Isaac Sim 初始化后开始训练)
python scripts/reinforcement_learning/rsl_rl/train.py \
    --task Isaac-Velocity-Flat-H1-v0 \
    --num_envs 4096 --headless

# 评估
python scripts/reinforcement_learning/rsl_rl/play.py \
    --task Isaac-Velocity-Flat-H1-v0 \
    --checkpoint /path/to/model.pt

从 CLI 对比可以看出两个框架的设计哲学差异: - mjlab 使用 uv run(Python 包管理器直接运行)+ tyro CLI(支持任意深度的配置覆盖),不需要额外的环境配置 - Isaac Lab 需要 conda 环境 + Isaac Sim 依赖,启动时间更长但提供更丰富的功能 - mjlab 原生集成 WandB(--wandb-run-path 直接拉取 checkpoint),Isaac Lab 需要手动指定 checkpoint 路径 - 两者都支持 --num-envs / --env.scene.num-envs 来控制并行环境数

Manager-Based 架构预览:为什么两个框架可以互通

两个框架能够互通的根本原因是它们共享相同的 Manager-Based 架构。以下是同一个"Go2 速度跟踪"任务在两个框架中的配置对比(简化版):

mjlab 配置

# mjlab: velocity_env_cfg.py
@configclass
class Go2VelocityEnvCfg(ManagerBasedRlEnvCfg):
    scene = SceneCfg(
        robot=EntityCfg(name="go2", spec_fn=go2_spec),
        terrain=TerrainCfg(terrain_type="plane"),
    )
    observations = ObservationGroupCfg(
        actor=ObservationGroupCfg(
            base_lin_vel=ObsTerm(func=mdp.base_lin_vel),
            base_ang_vel=ObsTerm(func=mdp.base_ang_vel),
            joint_pos=ObsTerm(func=mdp.joint_pos_rel),
            joint_vel=ObsTerm(func=mdp.joint_vel_rel),
        ),
    )
    rewards = RewardsCfg(
        track_lin_vel=RewTerm(func=mdp.track_lin_vel_xy_exp, weight=1.5),
        track_ang_vel=RewTerm(func=mdp.track_ang_vel_z_exp, weight=0.75),
    )

Isaac Lab 配置

# Isaac Lab: rough_env_cfg.py
@configclass
class AnymalCRoughEnvCfg(LocomotionVelocityRoughEnvCfg):
    scene = InteractiveSceneCfg(
        robot=ArticulationCfg(prim_path="{ENV_REGEX_NS}/Robot", ...),
        terrain=TerrainImporterCfg(prim_path="/World/ground", ...),
    )
    observations = ObservationsCfg(
        policy=ObservationsCfg.PolicyCfg(
            base_lin_vel=ObsTerm(func=mdp.base_lin_vel),
            base_ang_vel=ObsTerm(func=mdp.base_ang_vel),
            joint_pos=ObsTerm(func=mdp.joint_pos_rel),
            joint_vel=ObsTerm(func=mdp.joint_vel_rel),
        ),
    )
    rewards = RewardsCfg(
        track_lin_vel_xy_exp=RewTerm(func=mdp.track_lin_vel_xy_exp, weight=1.5),
        track_ang_vel_z_exp=RewTerm(func=mdp.track_ang_vel_z_exp, weight=0.75),
    )

注意两者的结构几乎一一对应:

组件 mjlab Isaac Lab
环境配置基类 ManagerBasedRlEnvCfg LocomotionVelocityRoughEnvCfg(继承自 ManagerBasedRLEnvCfg
场景 SceneCfg + EntityCfg InteractiveSceneCfg + ArticulationCfg
观测 ObservationGroupCfgObsTerm ObservationsCfgObsTerm
奖励 RewardsCfgRewTerm RewardsCfgRewTerm
观测函数 mdp.base_lin_vel mdp.base_lin_vel

命名差异很小(actor vs policyEntityCfg vs ArticulationCfg),底层概念完全一致。这就是为什么掌握了一个框架后,迁移到另一个只需要 1-2 天适应期。Ch04 将对这个架构做源码级的深入解析。

本质洞察:选框架不是选"更好的",而是选"更适合你当前任务的"。很多博士生的第一个项目用 mjlab 快速验证想法,然后在需要视觉输入或对比多种算法时切换到 Isaac Lab。因为两者共享 Manager-Based API,迁移成本很低。

env.step() 内部时序预览

Manager-Based 架构的核心是 env.step() 内部的执行时序——它决定了 obs/reward/termination/reset 的计算顺序。以下是简化为 7 步的时序概览(完整的 18 步精确时序见 Ch04 §4.2):

步骤 操作 说明
1 action_manager.process_action(action) 接收策略输出,裁剪/缩放
2 for _ in range(decimation): 循环 N 次物理子步
2a  action_manager.apply_action() 通过 actuator 计算力矩
2b  scene.write_data_to_sim() 写控制信号到 MjData/PhysX
2c  sim.step(render=False) 物理引擎推进一个 dt
2d  entity.update() 同步 GPU buffer
3 termination_manager.compute() 检查终止条件(含 NaN/Inf)
4 reward_manager.compute(dt=step_dt) 计算 reward(已按 dt 归一化)
5 reset(env_ids) 对终止的环境执行 reset
5a  curriculum_manager.compute() 更新课程难度
5b  event_manager.apply(mode="reset") 执行 reset 级 DR
6 event_manager.apply(mode="interval") 执行周期性事件(如 push)
7 observation_manager.compute() 计算并返回 obs dict

为什么时序顺序很重要? 注意 termination(步骤 3)在 reward(步骤 4)之前——这意味着被终止的环境的最后一步 reward 仍然会被计算和使用。如果你的 termination 条件检测到"机器人倒地",reward 计算会在倒地状态下执行,给出一个很低的 reward——这是正确的行为。如果顺序反过来(先 reward 后 termination),倒地前的最后一步可能获得一个正常的 reward,导致策略低估倒地的代价。

同样,observation(步骤 7)在 reset(步骤 5)之后——这确保了 reset 后的环境返回的是新 episode 的初始 obs,而非旧 episode 的最后一帧 obs。

Ch04 将对这个时序做源码级精读,包括 decimation 循环内部的 actuator 延迟处理和 CUDA Graph 捕获时机。

Isaac Lab 3.0 变更概览

Isaac Lab 3.0 Beta(基于 Isaac Sim 6.0 + Newton 1.0)引入了几个破坏性变更,虽然本教材以 Isaac Lab 2.3.0 为主线,但你需要知道这些变更的存在:

变更 2.x 3.0 Beta 影响
物理后端 仅 PhysX PhysX + Newton(多后端工厂) 可选 MuJoCo Warp 作为后端
Quaternion wxyz xyzw 所有硬编码的四元数需更新
数据管线 .data.* 返回 torch tensor .data.* 返回 wp.array(需 wp.to_torch() 所有访问 .data 的代码需包装
安装 必须 Isaac Sim kit-less 模式可选(无需 Isaac Sim) 大幅降低安装复杂度
可视化 Isaac Sim Viewer 三种:Isaac RTX / OVRTX / Newton Warp kit-less 模式可用 viser/rerun
Config API omni.isaac.lab.* isaaclab.* 模块前缀重命名

本教材正文以 Isaac Lab 2.3.0(稳定版)为准。涉及 3.0 变更的地方用注释框标注。当 3.0 final GA 发布后(预计 2026 Q3),教材将发布更新版。

双框架教学的核心理由

我们选择同时教 mjlab 和 Isaac Lab,而不是只教一个,有三个原因:

  1. API 设计趋同:两者共享 Manager-Based 架构,学会一个后迁移到另一个只需理解 API 细节差异。这意味着双框架教学的边际成本很低
  2. 互补覆盖:mjlab 适合轻量/接触密集任务,Isaac Lab 适合视觉/多算法任务。研究者在职业生涯中大概率需要两者。
  3. 跨框架思维:掌握两个框架的学生,面对未来任何新框架(如 Newton 的直接使用)都能快速上手——因为底层的 MDP 设计方法论是通用的。

实际研究场景中的框架选择案例

以下是几个真实研究场景的框架选择分析,帮助你建立直觉:

场景 1:博士一年级,研究人形 locomotion

你的导师让你复现 humanoid-gym(RSS 2024)的结果,然后在此基础上做改进。

  • humanoid-gym 基于 Isaac Gym → 但 Isaac Gym 已停止维护
  • 你有两个选择:(a) 用 Isaac Gym 快速复现原论文,(b) 用 mjlab/Isaac Lab 重实现
  • 推荐:先用 mjlab 重实现(因为 mjlab 内置了 G1 velocity task,与 humanoid-gym 的任务最接近),然后在 mjlab 上做你的改进
  • 如果你的改进涉及视觉输入 → 切换到 Isaac Lab

场景 2:做四足+机械臂的移动操作

你需要训练一个 Go2+Z1 的移动操作策略。

  • mjlab 没有内置四足+臂的组合任务,但有 velocity task(四足)和 lift_cube(机械臂)
  • Isaac Lab 也没有现成的 Go2+Z1 任务,但有四足和操作的独立任务
  • awesome-loco-manipulation 提供了 Go2+Z1 的 URDF
  • 推荐:在 mjlab 中组合 velocity + lift_cube 的 reward/obs 设计(Ch19 将详细讲解)

场景 3:对比 PPO 和 SAC 在灵巧手操作上的表现

你需要在相同的环境上运行两种不同的 RL 算法。

  • mjlab 默认只接 RSL-RL(RL 算法为 PPO,无 SAC/TD3 等)→ 无法直接用 mjlab 切换到 off-policy 算法
  • Isaac Lab 支持 RSL-RL + RL Games + SKRL + SB3 → 可以在同一环境上切换算法
  • 推荐:使用 Isaac Lab,利用其 DexSuite(灵巧手操作任务)+ 多 RL 后端

场景 4:需要在 Google Colab 上做 demo 给审稿人看

你的论文投稿需要一个可复现的 Colab notebook。

  • mjlab 有官方 Colab 模板,pip install mjlab 后即可运行
  • Isaac Lab 需要 GPU 实例 + Isaac Sim → Colab 免费 GPU 不够
  • 推荐:使用 mjlab,训练可以在 Colab 的 T4 GPU 上完成

如果不这样选会怎样:一个真实的案例——某同学在 Isaac Lab 上花了三天配置环境(Isaac Sim 版本冲突 + CUDA 版本不匹配),最后发现他的任务是纯四足 locomotion、不需要视觉、不需要多算法对比。如果他一开始就选 mjlab,pip install mjlab + uv run train 就能在 10 分钟内开始训练。

⚠️ 常见陷阱

  1. 在 Isaac Lab 上做 MuJoCo 擅长的接触密集任务。 如果你的任务是纯四足 locomotion 且不需要视觉,用 Isaac Lab 的 PhysX 后端可能需要更多的接触参数调优才能达到 MuJoCo 的精度。
  2. 在 mjlab 上尝试视觉策略训练。 mjlab 的 Viser 渲染器不支持 RTX 实时光追,视觉 sim-to-real 的纹理/光照随机化能力有限。视觉密集任务应选 Isaac Lab。
  3. 认为"Stars 多 = 更好"。 Isaac Lab 的 6.5k Stars 反映的是社区规模,不是代码质量。mjlab 发布于 2026 年 1 月,Stars 增长速度很快(不到 4 个月即突破 2k),反映了社区对轻量级框架的强烈需求。

练习

  1. 为以下三个研究课题选择推荐框架,并说明理由:
  2. (a) G1 人形在粗糙地形上的速度跟踪
  3. (b) Franka 机械臂的 RGB-based 抓取策略
  4. (c) 对比 PPO vs SAC vs Diffusion Policy 在四足 locomotion 上的表现
  5. 查找 Isaac Lab 3.0 的 Newton 后端支持情况,讨论 Newton 是否会消除 mjlab 和 Isaac Lab 在物理后端上的差异。
  6. 仔细对比本节中 mjlab 和 Isaac Lab 的 config 代码片段。找出至少 3 个命名差异(如 actor vs policy),并尝试解释每个差异背后的设计考量。
  7. (跨章综合题)结合 1.1 节的 sim-to-real pipeline 和 1.4 节的框架对比,回答:如果你的最终目标是把策略部署到 Unitree Go2 真机上,你在 pipeline 的哪些步骤应该使用 mjlab,哪些步骤应该使用 Isaac Lab?有没有需要同时使用两者的步骤?(提示:考虑 sim2sim 验证。)
  8. 本节介绍了 mjlab 的 5 层 Actuator 系统。在以下三种场景中,你会选择哪一层?(a) 快速原型验证一个新 reward 设计;(b) 准备部署到 Go2 真机;(c) 需要精确模拟 G1 的腰部电机特性。
  9. env.step() 的 7 步时序中,为什么 observation 是最后计算的而不是最先?如果 observation 在 reset 之前计算会发生什么?

mjlab 和 Isaac Lab 的对比建立了你的选型直觉。但在实际研究中,你不可避免地还会遇到其他名词——MJX、Brax、Genesis、RSL-RL、WandB——它们不是本教材的核心,但知道它们的定位可以避免你走弯路。

1.5 其他框架与工具简介 ⭐

这一节解决什么问题:简要介绍不在本教材核心覆盖范围内但你在研究中一定会遇到的框架和工具。

动机

除了 mjlab 和 Isaac Lab 之外,你在阅读论文和开源代码时会遇到多个其他框架。不需要深入学习它们,但需要知道它们的定位,以避免在选型时浪费时间。

Brax / MuJoCo Playground

Google DeepMind 维护。Brax 是基于 JAX 的可微分物理仿真引擎,MuJoCo Playground 是基于 MJX(MuJoCo 的 JAX 加速版)的 RL 训练框架。

属性
物理后端 MuJoCo(通过 JAX vmap 批量化)
编程框架 JAX(非 PyTorch)
核心优势 端到端可微分——可以直接反向传播穿过物理引擎
核心局限 JAX 生态与主流 RL 算法库(RSL-RL/RL Games)不兼容
适合谁 需要可微分仿真的研究者、JAX 生态用户

如果不了解会怎样:你可能在论文中看到"trained in MJX"然后试图用 PyTorch 复现,结果发现整个训练管线是 JAX 的。正确做法是:如果论文只在 MJX 上有结果,且你使用 PyTorch,应该在 mjlab(同为 MuJoCo 物理)或 Isaac Lab 上重实现。

MJX 与 MuJoCo Warp 的关键区别

维度 MJX MuJoCo Warp
编程框架 JAX(jax.vmap 批量化) NVIDIA Warp(PyTorch 互操作)
可微分 ✅(MJX-JAX:JAX autograd 原生支持) ❌(MJX-Warp/MuJoCo Warp 当前不支持自动微分,官方称暂无明确计划,仅有 GitHub issue 跟踪)
使用的框架 MuJoCo Playground mjlab / Isaac Lab(via Newton)
典型用户 需要可微分仿真的研究者 大多数 PyTorch RL 研究者
与 RSL-RL 兼容

两者的物理精度几乎相同(都是 MuJoCo 算法的 GPU 实现),但因为 solref/solimp 参数在 GPU 上的数值行为与 CPU 略有差异,MJX 训练的策略直接在 MuJoCo CPU 上 sim2sim 时可能行为不完全一致(GitHub issue google-deepmind/mujoco#2548)。这也是 ASAP 论文研究跨仿真器 gap 的动机之一。

Genesis

LeCAR-Lab(CMU Guanya Shi 团队)开发。Genesis 的目标是成为一个多仿真器统一框架——同一套任务代码可以在 Isaac Gym、Isaac Lab 和 Genesis 自身的物理后端上运行。

属性
核心优势 跨仿真器对比(同一任务在不同引擎上运行)
配置系统 Hydra(声明式配置,单行切换仿真器)
相关项目 HumanoidVerse(~432 Stars,多仿真器人形训练管线)、ASAP(RSS'25)
适合谁 需要验证策略是否对物理引擎鲁棒的研究

CMU LeCAR-Lab 的 ASAP 项目(He et al.,RSS 2025,使用 Isaac Gym、Isaac Sim 和 Genesis 做跨仿真器对比)展示了跨引擎迁移的价值——同一个策略在不同仿真器上训练后,真机表现差异很大,而 ASAP 的 delta action model 可以弥补这个差异。这说明物理引擎的选择对 sim-to-real 有实质影响——这是 Ch03 的核心话题。

Genesis/HumanoidVerse 的架构设计(simulator/task/algorithm 三层解耦 + Hydra 配置)对于需要做跨仿真器对比的研究很有参考价值,但对于大多数研究者来说,选择 mjlab 或 Isaac Lab 并在单一框架内深度开发是更高效的路径。

MuJoCo Menagerie

不是仿真框架,而是机器人模型库——由 Google DeepMind 维护,收集了 50+ 机器人的高质量 MJCF 描述文件。mjlab 直接使用 Menagerie 的模型。

常用模型 MJCF 文件名 自由度
Unitree Go1 unitree_go1/go1.xml 12
Unitree Go2 unitree_go2/go2.xml 12
Unitree G1 unitree_g1/g1.xml 29
Unitree H1 unitree_h1/h1.xml 19
ANYmal C anybotics_anymal_c/anymal_c.xml 12
Franka Emika Panda franka_emika_panda/panda.xml 9(7 臂 + 2 夹爪)

当你需要一个新机器人的 MJCF 时,首先检查 Menagerie 是否已有——直接使用经过社区验证的模型比自己从零建模可靠得多。如果 Menagerie 没有你需要的模型,Ch11 将讲解如何从 SolidWorks CAD 文件导出 URDF 并转换为 MJCF。

RSL-RL

RSL-RL 是 ETH RSL(Robotic Systems Lab)和 NVIDIA 共同维护的轻量级 RL 算法库,专门为机器人 locomotion 任务设计(论文:RSL-RL: A Learning Library for Robotics Research,Schwarke, Mittal, Rudin, Hoeller, Hutter,arXiv:2509.10771,2025)。

属性
算法 PPO + Distillation(Teacher-Student 蒸馏)
扩展 RND(Random Network Distillation,好奇心驱动探索)、Symmetry Augmentation(左右对称数据增广)
模型 MLPModel / CNNModel / RNNModel(统一抽象,actor 和 critic 可用不同模型类型)
使用者 mjlab(默认且唯一 RL 后端)、Isaac Lab(可选后端之一)
导出 JIT + ONNX(含 obs normalization 烘焙)

了解 RSL-RL 很重要,因为它是 mjlab 的唯一 RL 后端——你在 mjlab 中的所有训练都通过 RSL-RL 的 PPO 实现。Isaac Lab 支持多个 RL 后端(RSL-RL / RL Games / SKRL / SB3),Ch07 会详细讲解如何切换。

rsl_rl \(\ge\) 4.0 的核心变化:从 4.0 版本开始,actor 和 critic 的配置被拆分为独立的 model config——这允许 actor 用 MLP 而 critic 用 CNN(非对称 actor-critic),是视觉策略和 teacher-student 蒸馏的工程基础:

# 旧版(rsl_rl < 4.0,已废弃)
RslRlPpoActorCriticCfg(
    actor_hidden_dims=[512, 256, 128],
    critic_hidden_dims=[512, 256, 128],
)

# 新版(rsl_rl >= 4.0,本教材使用此格式)
actor = RslRlMLPModelCfg(hidden_dims=[512, 256, 128], obs_normalization=True)
critic = RslRlMLPModelCfg(hidden_dims=[512, 256, 128], obs_normalization=True)

"只有 PPO"是不是太局限了? 对于 locomotion 任务来说,答案是"通常不是"。PPO 之所以统治 locomotion RL,有以下工程原因:

  1. On-policy 稳定性:locomotion 任务的 reward 分布在训练过程中剧烈变化(从倒地 → 站立 → 行走),off-policy 算法的 replay buffer 中充满了过时数据
  2. GPU 并行友好:PPO 只需要前向传播收集数据,数据收集和梯度更新可以完全分离。SAC 需要在收集数据时更新 Q 网络,与 GPU 并行的数据流模式不太匹配
  3. 简单可调:PPO 的超参数相对少且有明确的物理直觉(Ch07 详解)
  4. Symmetry Augmentation 兼容:RSL-RL 的对称数据增广只与 on-policy 算法兼容——它在 rollout buffer 中把每个 transition 左右镜像,等效于将 batch size 翻倍

当然,在操作任务中,SAC 或 Diffusion Policy 可能更合适——这就是为什么 Isaac Lab 支持多种 RL 后端。Ch07 会讨论算法选型的工程决策。

RSL-RL 的 ONNX 导出是 sim-to-real 的关键环节。导出时,obs normalization 的 running mean/std 会被烘焙(bake)进 ONNX 模型——部署时不需要额外的 Python 归一化代码。但有一个已知 bug:ONNX exporter 硬编码了 LSTM,如果你使用 GRU 模型会报错(Isaac Lab issue #3008)。Ch07 会详细讲解这个问题的 workaround。

WandB(Weights & Biases)

不是仿真工具,而是实验管理平台。mjlab 原生集成 WandB——训练曲线、checkpoint、视频、超参数全部自动上传。Isaac Lab 也支持 WandB,但需要额外配置。

为什么实验管理对机器人 RL 如此重要? 因为机器人 RL 的实验参数空间极其庞大:

参数类别 典型维度 示例
RL 超参数 8-10 个 lr, gamma, lam, clip_range, epochs, mini_batches, entropy_coef, desired_kl
Reward 权重 5-20 个 tracking, regularization, style, contact 各项权重
DR 参数 10-15 个 mass_range, friction_range, push_velocity, delay, noise
网络架构 3-5 个 hidden_dims, activation, rnn_type, rnn_hidden_size
环境参数 5-10 个 num_envs, terrain_type, command_range, decimation

一个典型的四足任务有 30-60 个可调参数。如果你不使用实验管理工具,几天后就会忘记"那个训练成功的实验用的什么参数"。

WandB 在后续章节中的五个核心用途:

功能 用途 对应章节
Run Compare 在同一图表上叠加多个实验的训练曲线 Ch06 reward 设计消融
Sweep 自动化超参数搜索(grid/random/bayes) Ch07 超参调优
Artifact 存储和版本化 checkpoint、ONNX 模型 Ch07/Ch23 模型管理
Run Table 按指标排序所有实验,快速找到最佳配置 Ch25 调参地图
Report 生成可分享的实验报告 论文写作

如果不用 WandB 会怎样:真实案例——某同学训练了 200 个实验,结果散落在 logs/ 目录的 200 个子文件夹中。三周后他需要复现"那个在粗糙地形上走得最稳的策略",但已经找不到对应的文件夹了。从第一次训练开始就使用 WandB 是一个零成本高回报的好习惯。

Rerun

Rerun(rerun.io)是一个新兴的数据流可视化工具,与 Viser 和 Isaac Sim Viewer 互补。它的核心能力是录制并回放任意数据流——3D 点云、关节轨迹、接触力时间序列、图像帧都可以在同一个时间轴上对齐查看。

属性
定位 时间序列数据可视化与调试
与框架的关系 跨框架兼容(mjlab 和 Isaac Lab 3.0 kit-less 都支持作为 visualizer)
核心优势 录制→回放→慢放→对齐多数据源
典型用途 回放某个 episode 的完整状态、对齐接触力和关节角轨迹、调试 reward hacking

Rerun 不替代 Viser(实时 3D 可视化)或 WandB(实验管理),而是补充了一个"时间序列级调试"的能力——当你需要回答"这个 episode 的第 137 步到底发生了什么"时,Rerun 是最合适的工具。

框架-引擎-工具 关系图

┌─────────────────────────────────────────────────────┐
│                    RL 算法层                          │
│  RSL-RL (PPO)  │  RL Games  │  SKRL  │  SB3        │
├─────────────────────────────────────────────────────┤
│                    框架层                             │
│     mjlab      │         Isaac Lab                   │
│   (MuJoCo Warp)│   (PhysX / Newton / MuJoCo Warp)  │
├─────────────────────────────────────────────────────┤
│                    物理引擎层                         │
│  MuJoCo Warp  │  PhysX  │  Newton  │  MJX (JAX)    │
├─────────────────────────────────────────────────────┤
│                    模型层                             │
│  MuJoCo Menagerie (MJCF)  │  Isaac Lab Assets (USD) │
├─────────────────────────────────────────────────────┤
│                    工具层                             │
│  WandB  │  Viser  │  Isaac Sim Viewer  │  Rerun     │
└─────────────────────────────────────────────────────┘

这个分层图的关键洞察是:每一层都可以独立替换。你可以在 Isaac Lab 框架上把物理引擎从 PhysX 换成 MuJoCo Warp(通过 Newton),而不需要修改任何 MDP 代码。你可以在 mjlab 框架上把 RL 算法从 RSL-RL 换成自定义的 PPO 实现(通过实现相同的 VecEnv 接口),而不需要修改环境代码。

理解这种分层替换性是理解整个生态的关键——它解释了为什么可以有这么多框架/引擎/工具的组合,以及为什么选择任何一层不会锁死其他层的选择空间。

这也解释了为什么本教材选择"双框架"而非"双引擎"或"双算法"作为教学轴线——因为框架层是连接 RL 算法和物理引擎的桥梁,是研究者日常交互最多的层级。学会了框架层的 Manager-Based API,就自然获得了对上层(RL 算法接入)和下层(物理引擎切换)的控制能力。

⚠️ 常见陷阱

  1. 把 RSL-RL 当作通用 RL 库。 RSL-RL 的 RL 算法只有 PPO(外加 Student-Teacher Distillation 流程),没有 off-policy 算法;如果你需要 SAC/TD3/Diffusion Policy,必须使用 Isaac Lab + 其他 RL 后端。
  2. 忽略 WandB 的价值。 很多初学者不配置 WandB,导致实验结果散落在本地文件系统中,几周后就找不到了。从第一次训练开始就使用 WandB 是一个零成本高回报的好习惯。
  3. 在 Menagerie 中找不到模型就从零建模。 先在 GitHub 上搜索 机器人名 + URDF机器人名 + MJCF,很可能已有人做过。awesome-loco-manipulation 仓库收集了多种复合机器人的 URDF(Go2+Arx、B1+Z1 等)。
  4. 混淆"框架"和"RL 算法库"。 mjlab/Isaac Lab 是环境框架(提供 env.step()),RSL-RL/RL Games/SKRL 是 RL 算法库(提供 ppo.update())。框架和算法库通过 VecEnv wrapper 连接——这个连接层在 Ch07 中会详细讲解。

练习

  1. 访问 MuJoCo Menagerie 的 GitHub 仓库(github.com/google-deepmind/mujoco_menagerie),找到 Unitree Go2 的 MJCF 文件,列出它定义了多少个 body、joint 和 actuator。
  2. 画一个你自己研究项目的框架-引擎-工具依赖图,标明每一层你计划使用什么。
  3. RSL-RL 只实现了 PPO。如果你想在 mjlab 环境上跑 SAC,你有什么选择?提示:考虑 Isaac Lab 的 VecEnv wrapper 是否可以包装 mjlab 环境。

框架、引擎和工具的分层关系已经清楚。下一个问题是:在这个生态中,有哪些已经被顶会验证过的高质量开源项目?它们将成为你学习工程最佳实践的重要参考。

1.6 顶会开源项目速览 ⭐⭐

这一节解决什么问题:建立对该领域高质量开源工作的初步认知,知道"好的工程代码长什么样",为后续章节的项目精读做铺垫。

动机

机器人 RL 领域的一个独特优势是:顶级会议论文(RSS、NeurIPS、CoRL 等)通常附带完整的开源代码。这些代码不仅是论文结果的复现工具,更是学习工程最佳实践的教材。一个有经验的研究者在开始新项目时,通常不会从零写代码——而是先找到最相关的开源项目,理解其设计决策,然后在其基础上修改。

如果不了解顶会项目会怎样

你可能花两周从零实现一个速度跟踪 reward 函数,结果和 legged_gym 里经过两年社区验证的版本完全一样——但你的版本多了 3 个 bug。更糟糕的是,你可能在 reward 设计上做了一个违反常识的选择(比如把 tracking reward 的 sigma 设得太大),而这个错误在社区的标准实现中早已被修复。

分层理解:项目的三层价值

层次 你应该从中学到什么 示例
算法层 这篇论文的核心算法创新是什么? walk-these-ways 的 Multiplicity of Behavior——同一个网络输出多种步态
工程层 这个实现用了什么框架特性?reward 怎么设计的?DR 怎么配的? HOVER 的 mask-conditioned obs group,实现了多模态控制
部署层 怎么从仿真到真机?用了什么硬件接口? unitree_rl_lab 的 Isaac Lab → MuJoCo sim2sim → C++ SDK → 真机管线

后续每个章节会选择 1-2 个项目做"精读"——带你逐行阅读关键代码段(50-100 行),理解其设计决策。这里先给出全景索引。

按框架和会议层级分类

基于 mjlab 的顶会/顶尖组项目

项目 会议 机器人 核心贡献 教学用途
HUSKY RSS'26 G1+滑板 器具耦合全身控制、非完整约束 Ch22 DIY、Ch26 网球
KungfuBot NeurIPS'25 G1 物理动作过滤、adaptive tracking Ch15 Motion Imitation、Ch20 人形全身
TextOp arXiv'26 (TeleAI) G1 实时文生动作 + BeyondMimic Ch16 文生动作

基于 Isaac Lab 的顶会项目

项目 会议 机器人 核心贡献 教学用途
HOVER ICRA'25 H1 多模态 obs group、extension 范式 Ch05 Obs、Ch14 人形、Ch22 DIY
ExBody RSS'24 H1 上下肢解耦控制 Ch20 人形全身
AGILE arXiv'26 (NVIDIA) 人形 工业级 prepare→train→eval→deploy Ch24 大规模训练

基于 Isaac Gym 的经典项目(历史参考,不推荐新项目使用):

项目 会议 Stars 核心贡献 为什么仍然重要
legged_gym CoRL'21 2.8k locomotion RL 标准范式 理解 Manager-Based 的动机(Ch04)
walk-these-ways RSS'23 1.4k MoB + 完整 Jetson 部署 actuator network(Ch12)、部署参考
humanoid-gym RSS'24 1.9k 人形零射 sim-to-real sim-to-sim 验证方法(Ch14)
ASAP RSS'25 1.8k delta action model、跨仿真器 DR 进阶(Ch08)、sim-to-real(Ch23)

跨框架的关键项目

项目 会议 Stars 核心贡献 教学用途
ProtoMotions NVIDIA 1.4k AMP/ASE/CALM/MaskedMimic 集成 Ch10 模仿学习、Ch15 Motion Imitation、Ch16 文生动作
PHC ICCV'23 1.2k PNN、大规模 AMASS Ch15 Motion Imitation
WoCoCo CoRL'24 接触阶段分解 Ch20 人形全身、Ch28 网球
HumanPlus CoRL'24 单 RGB 相机 → 全身控制 Ch16 视频学习

每个项目的完整论文名、GitHub 仓库地址和 Stars 数见附录 A

项目技术演化关系图

这些项目不是孤立存在的——它们构成了一棵技术演化树。理解这棵树可以帮你在阅读新论文时快速定位其技术传承:

Locomotion 分支: - legged_gym(CoRL'21)→ 定义了四足 RL 的标准范式(obs/reward/DR 配置) - → walk-these-ways(RSS'23)→ 引入 Multiplicity of Behavior + actuator network + 完整 Jetson 部署 - → humanoid-gym(RSS'24)→ 从四足迁移到人形,引入 sim-to-sim 验证方法 - → ASAP(RSS'25)→ 跨仿真器 delta action model - → extreme-parkour(ICRA'24)→ 三阶段 teacher-student 视觉蒸馏

Motion Imitation 分支: - AMP(SIGGRAPH'22)→ 对抗式 motion prior - → ASE(SIGGRAPH'22)→ 潜在空间 + 下游 RL - → CALM(SIGGRAPH'23)→ 条件式 latent + 语言 prompt - → MaskedMimic(SIGGRAPH Asia'24)→ 部分 mask tracking - → ProtoMotions(NVIDIA 集成)→ 统一框架 - → PHC(ICCV'23)→ Progressive Neural Compositor + 大规模 AMASS - → KungfuBot(NeurIPS'25)→ 物理动作过滤 + adaptive tracking - → HUSKY(RSS'26)→ 器具耦合(滑板)+ mjlab

Manipulation 分支: - DexPBT(NVIDIA)→ Population-Based Training for 灵巧手 - → Isaac Lab DexSuite(2.3.0)→ ADR + PBT 内置 - YAM(mjlab 内置)→ 轻量操作 baseline

为什么这张图对你有用? 当你要做一个新项目时,先在这张图上定位最相关的节点,然后从该节点开始读代码,而不是从零开始。比如你要做"人形 motion imitation"——在图上找到 PHC → KungfuBot 分支,KungfuBot 就是你的起点。

项目代码质量的评判标准

当你打开一个开源项目时,如何判断其代码质量值得精读?以下是我们推荐的五个检查点:

检查点 好的项目 差的项目
README 安装步骤清晰、有训练/评估命令、有结果截图 README 只有标题和一行描述
Config 分离 超参数在 config 文件中,不硬编码在训练脚本里 数值直接写在 train.py 的第 157 行
Reward 设计 每个 reward 项有注释说明物理意义 reward = 0.5*a + 0.3*b - 0.1*c,无注释
可复现性 指定了精确的依赖版本、提供了训练 seed pip install torch(不指定版本)
部署代码 有从训练到真机的完整管线 只有训练代码,部署是"留给读者的练习"

以一个具体的例子来说明。当你打开 walk-these-ways(RSS'23,1.4k Stars)的仓库时,你会注意到:

  1. README 结构清晰:Installation → Training → Deployment → Citation,每步都有命令可复制
  2. Config 文件组织legged_gym/envs/a1/a1_field_config.py 中所有超参数都用 @configclass 组织,每个参数有注释
  3. Reward 设计透明reward_scales 字典列出了每个 reward 项的权重,旁边有注释说明物理意义
  4. 完整部署代码deployment/ 目录包含了 Jetson 上的推理代码(C++/Python)
  5. Actuator Networkgo1_constants.py 包含了经过系统辨识校准的 actuator network 参数

相比之下,一些质量较低的仓库可能只有训练代码和一个简短的 README,没有部署代码,超参数硬编码在训练脚本中——虽然论文结果可能不错,但工程复用价值有限。

项目精读的推荐方法

在后续章节中,我们会用以下流程精读每个参考项目:

  1. 先跑通:按 README 安装并运行,确认结果与论文一致
  2. 再读 config:理解所有 obs/reward/action/DR 的配置选择
  3. 然后读关键函数:聚焦 50-100 行核心代码(如 reward 计算函数、obs 拼接函数)
  4. 最后做消融:修改一个参数,重新训练,观察行为变化

这个流程强调的是"从外向内"——先建立对整体行为的直觉,再深入代码细节。而不是"从内向外"——不要一行一行地从头读到尾。

⚠️ 常见陷阱

  1. 直接 clone 顶会项目就开始训练,不理解其设计。 这些项目的价值不在于"能跑",而在于"为什么这样设计"。在你理解了 Manager-Based 架构(Ch04)之后再读这些代码会事半功倍。
  2. 认为只有顶会论文的代码才值得读。 框架自身的内置任务(如 mjlab 的 velocity_env_cfg.py、Isaac Lab 的 Isaac-Velocity-Rough-Anymal-C-v0)通常是框架开发者写的,代码质量极高,是最好的入门阅读材料。
  3. 忽略项目的框架版本。 一个基于 Isaac Gym 的项目不能直接在 Isaac Lab 中运行——虽然概念相似,但 API 完全不同。在精读代码时要先确认其使用的框架版本。

练习

  1. 选择附录 A 中的一个 ✅ 项目,clone 其仓库,阅读 README,回答:它使用什么框架?训练命令是什么?训练结果的评估指标是什么?
  2. 对比 legged_gym 的 legged_robot.py 和 mjlab 的 velocity_env_cfg.py,列出 3 个你注意到的结构差异。(不需要理解每一行——关注文件组织方式的差异)
  3. (跨章综合题)回顾本章 1.1 节的"仿真三角色"和 1.3 节的"演进脉络",用自己的话解释:为什么从 legged_gym 到 Isaac Lab/mjlab 的架构变化(单体→Manager-Based)是不可避免的?提示:思考当任务复杂度增加时,"MDP 机器"角色的组织方式如何影响研究者的迭代效率。

如何从 README 判断一个项目的代码质量

在 GitHub 上找到一个相关项目后,花 5 分钟做以下快速评估,判断是否值得深度阅读:

信号 高质量项目 低质量项目
README 有安装命令、训练命令、结果截图、论文链接 只有论文标题和一句"Code coming soon"
最近更新 3 个月内有 commit,issues 有作者回复 超过 1 年无更新,issues 全部无回复
代码结构 config 和逻辑分离,文件命名清晰,有 __init__.py 导出 所有逻辑在一个 2000+ 行文件中
依赖管理 requirements.txt / pyproject.toml / Dockerfile 只在 README 中零散写 pip install ...
可复现性 一条命令跑通训练,checkpoint 有下载链接 需要手动修改多处路径和参数
测试 有 CI/CD 或至少有 smoke test 脚本 无任何测试
文档 config 文件有注释说明每个参数的含义 魔法数字遍布代码

这个评估不是绝对的——有些优秀的研究代码因为是"一次性发布"而缺少长期维护。但对于学习来说,优先选择维护活跃、可复现性强的项目。本教材附录 A 中标记 ✅ 的项目都经过了这个标准的筛选。


1.7 本书的双框架教学方法 ⭐

这一节解决什么问题:说明本教材后续章节的组织方式——如何在每一章中同时覆盖 mjlab 和 Isaac Lab,以及你应该如何阅读。

动机

你可能会想:"既然两个框架 API 这么像,为什么不只教一个?"或者"同时学两个会不会增加认知负担?"这一节解释我们的教学设计——为什么双框架教学的收益远大于成本。

如果只学一个框架会怎样

如果你只学了 mjlab:当你的研究需要视觉策略(RGB/Depth 输入)时,发现 mjlab 没有 RTX 渲染——不得不从零学习 Isaac Lab 的安装和 API,此时你没有任何跨框架迁移的经验。如果你只学了 Isaac Lab:当你想快速验证一个新的 reward 设计思路时,Isaac Lab 30 秒的启动延迟让你每次迭代都很痛苦——而如果你会 mjlab,2 秒就能启动。

前半程:双框架深度对比(Part I-III, Ch01-12)

Part I-III 的每个概念都会做双框架对比:

  1. 先讲概念本身(如 ObservationManager 的设计动机)
  2. 然后展示 mjlab 的实现(源码精读)
  3. 再展示 Isaac Lab 的对应实现
  4. 最后列出差异表(命名差异、API 差异、行为差异)

这种对比不是为了"评判谁好",而是让你通过差异来更深刻地理解概念本身。当你看到两个独立团队对同一个问题做出略有不同的设计选择时,你会自然地思考"为什么要这样做"——这比只看一个实现的理解深度要高得多。

举个具体例子:在 Ch05(Observation 设计)中,mjlab 的 obs group 叫 actorcritic,而 Isaac Lab 的叫 policycritic。这不只是命名差异——它反映了两个框架对"谁消费 obs"这个问题的不同理解:mjlab 认为消费者是 actor(强调动作输出),Isaac Lab 认为消费者是 policy(更抽象的概念)。理解这种差异可以帮助你更深入地理解非对称观测的设计空间。

后半程:按任务特征选框架(Part IV-VII, Ch13-28)

Part IV-VII 的实战章节会根据任务特征选择一个框架做主线深度实战,另一个做辅助对照:

章节 主线框架 选择理由 另一框架的角色
Ch13 四足 mjlab MuJoCo 接触精度适合足式 Isaac Lab 对照(basic-locomotion-isaaclab)
Ch14 人形 并重 两个框架都有强大的人形支持 互相对照
Ch15 Motion Imitation 并重 mjlab tracking + ProtoMotions 互相对照
Ch16 文生动作/视频 mjlab(TextOp) TextOp 基于 BeyondMimic (mjlab) Isaac Lab(ProtoMotions CALM)
Ch17 操作 并重 mjlab YAM + Isaac Lab DexSuite 互相对照
Ch18 视觉 Isaac Lab RTX 渲染是视觉任务刚需 mjlab 辅助(简单 depth)
Ch19-21 复合形态 按任务选 接触密集→mjlab,视觉→Isaac Lab 另一框架做对照
Ch22 DIY 并重 两个框架都需要掌握自定义环境 互相对照
Ch26-28 网球 mjlab mjlab 内置 Tennis 任务 Isaac Lab 对照

你应该如何阅读

如果你时间充裕:每章的 mjlab 和 Isaac Lab 内容都读。这会给你最强的跨框架工程能力。

如果你时间有限:选择与你当前研究更相关的框架作为主线,另一个框架的内容快速浏览差异表和陷阱即可。

一个有效的阅读策略:先在 mjlab 中跑通 demo(因为安装快、启动快),建立对概念的直觉后,再在 Isaac Lab 中对照理解差异。这比"先读完理论再动手"的效率高得多。

迁移成本评估

如果你已经在一个框架上完成了训练,迁移到另一个框架的成本是多少?

迁移方向 成本 主要工作
mjlab → Isaac Lab 低(1-2 天) 改 config 格式、EntityCfg → ArticulationCfg、调整 USD 模型路径
Isaac Lab → mjlab 低(1-2 天) 改 config 格式、ArticulationCfg → EntityCfg、调整 MJCF 模型路径
Isaac Gym → mjlab/Isaac Lab 中(3-5 天) 单体类拆分为 Manager config,需要理解旧代码的 obs/reward 逻辑
非 PyTorch → mjlab/Isaac Lab 高(1-2 周) 整个训练管线需要重写(如从 JAX/MJX 迁移)

版本锚定策略

机器人 RL 生态演进极快——2025 年到 2026 年,mjlab 从零发布到 v1.2.0,Isaac Lab 从 2.0 演进到 3.0 Beta,Newton 从公告到 1.0 GA。如果教材追踪最新版本,读者在不同时间阅读可能面对完全不同的 API。

本教材的版本锚定策略:

组件 锚定版本 理由
mjlab 1.2.0 最新稳定版,PyPI 直装
Isaac Lab 2.3.0(主线) 稳定版,社区验证充分
Isaac Lab 3.0 注释框标注 Beta,API 可能变化
rsl_rl \(\ge\) 4.0.0 新 config 格式已稳定
Newton 1.0 GA 可用但 Isaac Lab 集成仍 Beta

当框架更新导致你的代码报错时: 1. 查 CHANGELOG / Release Notes 确认哪些 API 变了 2. 对 mjlab:git diff v1.1.0..v1.2.0 -- src/mjlab/ 可以看到所有变化 3. 对 Isaac Lab:查阅迁移指南(isaac-sim.github.io/IsaacLab/.../migration.html) 4. 锁定版本:在 pyproject.tomlrequirements.txt 中指定精确版本号

反事实推理:如果不做版本锚定会怎样?你按教材第三章的步骤操作,但框架已经更新了 API——你得到一个 AttributeError,不知道是自己写错了还是框架变了。版本锚定消除了这种不确定性。

⚠️ 常见陷阱

  1. "我先只学一个框架,以后再学另一个"。 这个策略看起来合理,但问题是:当你"以后"需要另一个框架时,你已经在第一个框架上积累了大量惯性(代码、配置、经验),迁移的心理成本远大于一开始就建立双框架心智模型的成本。
  2. 在两个框架之间频繁切换。 双框架不意味着每个实验都要在两个框架上各跑一遍。选定一个主线框架做深度开发,另一个用于对照验证和特定功能(如 Isaac Lab 的视觉渲染)。
  3. 认为"两个框架代码可以直接复制粘贴"。 API 虽然结构类似,但命名和细节不同。直接复制 mjlab config 到 Isaac Lab 会报错——你需要理解映射关系(见 writing_guide.md §5.3 的 API 对应表)。

练习

  1. 在 writing_guide.md 的 §5.3 API 对应表中,找出 mjlab 和 Isaac Lab 在以下三个概念上的命名差异:(a) 机器人实体配置、(b) 观测分组名称、(c) 任务注册方式。
  2. 为你自己的研究课题,制定一个"主线框架 + 辅助框架"的使用计划——什么场景用主线,什么场景切换到辅助?

向后预告:Ch02 将带你在两个框架中各跑通一个 demo——这是验证你的环境正确安装的第一步,也是所有后续训练的基础。从 Ch02 开始,你将亲身体验本节描述的"双框架对比"教学方法。


双框架教学方法已经清楚,最后一个问题是:整本书 28 章的知识是如何组织的?你在知识树的什么位置?这个全景视图帮助你在开始逐章学习前看到整片森林。

1.8 全书知识地图 ⭐

这一节解决什么问题:给出本教材 28 章的完整知识结构图,让你知道"一共要学什么、现在学到哪里"。

动机

开始一段长距离学习之前,你需要一张地图。没有地图的学习就像在森林里不带指南针行走——每棵树你都认识,但不知道自己在哪、要去哪。这张知识地图帮你建立全局视角,使后续每一章的学习都能定位在整体结构中。

如果不看全景地图会怎样

你可能花三周学完 Ch04-Ch09(RL 工程基础),然后发现 Ch13(四足实战)才是你真正需要的——而 Ch13 的大部分内容其实只依赖 Ch04-07,Ch08-09 可以后读。一张依赖关系图可以帮你找到最短学习路径,避免不必要的时间投入。

本教材的知识树

机器人 RL 工程知识树

  • Part I 仿真基础设施(Ch01-03)
  • Ch01 生态选型 ← 你在这里
  • Ch02 环境搭建
  • Ch03 物理引擎工程
  • Part II RL 工程方法论(Ch04-10)——全书核心骨架
  • Ch04 Manager-Based 架构精读
  • Ch05 Observation / Action 设计
  • Ch06 Reward / Curriculum / Termination 设计
  • Ch07 训练管线 / 超参 / 网络
  • Ch08 Domain Randomization
  • Ch09 Teacher-Student 蒸馏
  • Ch10 模仿学习工程(AMP/ASE/BC/DAgger)
  • Part III 机器人建模(Ch11-12)
  • Ch11 SolidWorks → URDF → MJCF/USD
  • Ch12 Actuator 建模与系统辨识
  • Part IV 单形态实战(Ch13-18)
  • Ch13 四足 Locomotion / Ch14 人形 Locomotion
  • Ch15 Motion Imitation / Ch16 文生动作与视频学习
  • Ch17 机械臂与灵巧手 / Ch18 视觉感知运动控制
  • Part V 复合形态与自定义(Ch19-23)
  • Ch19 四足+臂 / Ch20 人形全身 / Ch21 轮式+臂
  • Ch22 DIY 自定义机器人 / Ch23 Sim2Real 部署
  • Part VI 大规模训练与调试(Ch24-25)
  • Ch24 多 GPU / NaN / 性能优化 / Ch25 训练诊断与调参地图
  • Part VII 网球机器人综合项目(Ch26-28)
  • Ch26 场环境 / Ch27 感知 / Ch28 击球控制

知识流动方向

从上到下是递进关系——每一层依赖上一层的知识。从左到右是平行关系——同一层的章节可以独立阅读,但组合起来形成完整覆盖。

特别注意 Part II(Ch04-10)是整本书的核心骨架——所有后续章节的 obs 设计、reward 设计、DR 策略、训练管线都来自这里。如果你时间只够读一部分,Part I + Part II + 你感兴趣的一个实战章节是最高效的组合。

章节依赖关系详解

目标章节 硬依赖(必须先读) 软依赖(建议先读但可跳过)
Ch03 物理引擎 Ch01-02
Ch04 Manager 架构 Ch01-02 Ch03(理解物理引擎选型)
Ch05 Obs/Action Ch04 Ch03(理解传感器来源)
Ch06 Reward Ch04-05
Ch07 训练管线 Ch04-06
Ch08 DR Ch04-07 Ch03(理解物理参数含义)
Ch09 Teacher-Student Ch05, Ch08 Ch07(理解训练管线)
Ch10 模仿学习 Ch04-07
Ch13 四足实战 Ch04-08 Ch03, Ch09
Ch14 人形实战 Ch04-08 Ch09-10, Ch13
Ch17 操作实战 Ch04-07 Ch05(DiffIK action space)
Ch18 视觉策略 Ch05, Ch07, Ch09 Ch17(manipulation baseline)
Ch22 DIY 机器人 Ch04-08, Ch11-12 至少一个实战章节
Ch23 Sim2Real Ch08-09, 至少一个实战 Ch12(actuator 建模)

五种推荐学习路径

根据你的研究方向,选择最适合的路径:

路径 A:四足 locomotion 研究者(最短 ~3 周)

Ch01 → Ch02 → Ch04 → Ch05 → Ch06 → Ch07 → Ch08 → Ch13

路径 B:人形全身控制研究者(~5 周)

Ch01 → Ch02 → Ch04 → Ch05 → Ch06 → Ch07 → Ch08 → Ch09 → Ch10 → Ch14 → Ch15 → Ch20

路径 C:操作/灵巧手研究者(~4 周)

Ch01 → Ch02 → Ch04 → Ch05 → Ch06 → Ch07 → Ch17 → Ch18

路径 D:sim-to-real 工程师(~6 周)

Ch01 → Ch02 → Ch03 → Ch04-07 → Ch08 → Ch09 → Ch11 → Ch12 → Ch13 或 Ch14 → Ch23

路径 E:全栈(完整阅读)(~12 周)

Ch01-28 按顺序

与本章的关系

本章(Ch01)是全景入口——你现在已经知道了"有哪些框架、为什么需要仿真、如何选型"。但你还不知道"框架内部是怎么工作的"——这就是 Ch02-10 要解决的问题。

⚠️ 常见陷阱

  1. 从 Part IV 开始读(跳过 Part II)。 Part II 是所有后续章节的基础——obs 设计、reward 设计、DR 策略都来自这里。跳过 Part II 直接读 Ch13(四足实战)会导致你不理解 config 中每个参数的含义。
  2. 线性地从 Ch01 读到 Ch28。 28 章全部线性读完需要 12-16 周。如果你只需要做四足 locomotion,最高效的路径是 Ch01-07 + Ch13,总共约 3-4 周。用 §1.8 的依赖关系图找到你的最短路径。
  3. 忽略 Part III(机器人建模)。 如果你只用框架内置机器人(Go2/G1/ANYmal),Ch11-12 可以暂时跳过。但当你需要接入自己的机器人时——这在博士阶段几乎一定会发生——这两章是必经之路。

练习

  1. 在上面的知识树中,标出你目前已经了解的节点(即使只是粗略了解)和完全陌生的节点。你的"已知"和"未知"分布是什么样的?
  2. 根据你的研究方向,在 §1.8 的五种推荐学习路径中选择最适合你的一条。如果没有完全匹配的,自定义一条并标注依赖关系。
  3. 在依赖关系表中,找出 Ch23(Sim2Real 部署)的所有硬依赖。如果你跳过了 Ch09(Teacher-Student),对 Ch23 的学习会产生什么影响?
  4. (跨章综合题)结合 1.1(仿真必要性)、1.2(GPU 并行)、1.3(生态演进)和 1.4(双框架对比),用 300 字以内回答:如果你在 2020 年开始一个四足 RL 项目,你的技术栈会是什么?如果在 2026 年开始同样的项目,技术栈会如何不同?这种变化背后的驱动力是什么?
  5. (高级思考题)本章介绍的 6 个生态阶段(MuJoCo CPU → Isaac Gym → Isaac Lab → MJX → Newton → mjlab)之间有一个共同模式:每一代都在前一代的基础上保留核心优势、消除核心痛点。你认为下一个可能出现的"第七阶段"会解决什么问题?会长什么样?提示:当前哪些痛点(如多模态任务的渲染+物理统一、真正的端到端可微分训练、分布式多节点训练等)还没有被完美解决?

本章常见误解汇总

在结束本章之前,让我们集中澄清一些贯穿全章的常见误解。如果你在阅读过程中有过这些想法,现在是纠正的时候:

误解 正确理解
"仿真越真实越好" 足够真实 + 域随机化 > 极致真实。过度精细的仿真牺牲吞吐量但收益递减
"GPU 并行就是核心多所以快" 核心优势是数据零搬运——obs/action/gradient 全程在 GPU 显存上
"Isaac Gym 还能用" 可以用来读旧代码,但新项目应使用 Isaac Lab 或 mjlab
"MJX = MuJoCo Warp" MJX 基于 JAX(Google),MuJoCo Warp 基于 NVIDIA Warp(Google DeepMind + NVIDIA 共同维护)
"MuJoCo Warp 是 NVIDIA 的" 由 Google DeepMind 和 NVIDIA 共同维护,不是某一方独有
"框架 = 物理引擎" 框架(mjlab/Isaac Lab)\(\ne\) 物理引擎(MuJoCo Warp/PhysX)\(\ne\) RL 算法库(RSL-RL)
"Stars 多 = 质量好" Stars 反映社区规模而非代码质量。mjlab 发布晚但增速快
"Sim-to-real 不可能成功" 已有数十个成功案例(walk-these-ways/humanoid-gym/ASAP 等)
"选一个框架学就够了" 双框架边际成本低(API 趋同),但覆盖面互补
"只看顶会代码" 框架内置任务是最好的入门阅读材料,代码质量极高
"RSL-RL 只有 PPO" rsl_rl \(\ge\) 4.0 支持 PPO + Distillation + RND + Symmetry Augmentation
"Newton 求解器只有 4 个" Newton 1.0 GA 有 7 个求解器(MuJoCo Warp/Kamino/XPBD/VBD/Featherstone/iMPM/SemiImplicit)
"MuJoCo Playground 只适合 JAX 用户" Playground 在 sim-to-real 方面有独特能力(Madrona 批量渲染),但确实需要 JAX 生态
"具身智能只需要 RL 训练" VLA 基础模型正在改变范式,但仿真在数据生成和验证中仍不可替代
"Isaac Lab 3.0 和 2.x API 兼容" 3.0 有多个破坏性变更(quaternion xyzw、warp-native data、模块重命名)
"MetricsManager 两个框架都有" MetricsManager 是 mjlab 独有的第 9 个 Manager,Isaac Lab 只有 8 个公开 Manager

本章建立的心智模型

读完本章后,你脑中应该有以下心智模型:

"我的研究任务"
      ↓
[选型决策树] → mjlab 或 Isaac Lab
      ↓
[仿真三角色] → 物理世界(sim.step)
             → MDP 机器(env.step = Manager-Based 架构)
             → 调试仪器(ground truth 状态 + 可视化)
      ↓
[训练管线] → GPU 并行 rollout → PPO update → 全程在 GPU 上
      ↓
[sim-to-real] → DR + Teacher-Student + Sim2Sim + ONNX → 真机

如果你能在不看笔记的情况下画出这个模型,说明本章的核心知识已经内化了。

读完本章后,不要急于继续——先花 5 分钟回答以下问题。如果有 3 个以上答不出,建议回顾对应小节。这些问题将在 Ch02-08 中反复涉及。

自检:本章你应该能回答的 10 个问题

  1. 为什么不能直接在真机上训练 RL 策略?量化地说,差几个数量级?
  2. sim.step()env.step() 的区别是什么?decimation 在其中扮演什么角色?
  3. GPU 并行仿真的核心优势不是"核心多",而是什么?
  4. 从 legged_gym 到 Isaac Lab/mjlab,架构上最大的变化是什么?这个变化解决了什么工程问题?
  5. mjlab 和 Isaac Lab 各自的核心优势是什么?各自适合什么类型的任务?
  6. Newton 引擎有哪 7 个求解器?Kamino 专门解决什么问题?
  7. MuJoCo 的软接触模型和 PhysX 的硬接触模型有什么本质区别?
  8. RSL-RL 除了 PPO 还支持什么功能?rsl_rl \(\ge\) 4.0 的核心变化是什么?
  9. Isaac Lab 3.0 Beta 有哪些破坏性变更?为什么本教材以 2.3.0 为主线?
  10. 如果你要开始一个新的四足 RL 项目,你会选择什么框架?如果项目后期需要加入视觉输入呢?

如果有 3 个以上问题答不出,建议回顾对应小节。


版本信息速查

本教材的版本锚定信息(后续章节中所有安装命令和 API 调用以此为准):

组件 版本 状态 说明
mjlab 1.2.0 稳定 pip install mjlab / uv sync
Isaac Lab 2.3.0 稳定(主线) conda + pip + Isaac Sim 5.1
Isaac Lab 3.0 Beta 注释框标注 develop branch,Isaac Sim 6.0 + Newton 1.0
rsl_rl \(\ge\) 4.0.0 稳定 新 config 格式(分离 actor/critic)
Newton 1.0 GA 稳定(引擎) Isaac Lab 集成仍 Beta
MuJoCo Warp 随 mjlab 1.2.0 稳定 Google DeepMind + NVIDIA 共同维护
PyTorch \(\ge\) 2.0 mjlab 需 CUDA;Isaac Lab 3.0 需 2.10.0+cu128
Python \(\ge\) 3.10 Isaac Lab 3.0 需 3.12

以上版本信息为 2026 年 5 月的快照。框架版本号可能随时间更新,但 API 设计和核心概念的稳定性由各框架的向后兼容策略保障。当你在不同时间阅读本教材时,请以本表为"最低兼容版本"参考,实际安装时使用各框架最新的稳定版。


本章与后续章节的关系

本章是整本书的"地图和指南针"。后续每一章都建立在本章建立的心智模型之上:

后续章节 与本章的关系 本章的哪个知识点为其铺垫
Ch02 环境搭建 把 Ch01 的选型结论落地为可执行的安装命令 选型决策树(§1.4)
Ch03 物理引擎 深入本章只预览过的接触模型和引擎调参 MuJoCo 接触入门(§1.3)、Newton 求解器(§1.3)
Ch04 Manager 架构 源码级精读本章只概述过的 Manager-Based 架构 Manager 列表(§1.3)、env.step() 时序(§1.4)
Ch05 Obs/Action 深入 ObservationManager 和 ActionManager 的工程实现 Manager 职责表(§1.3)、双框架 config 对比(§1.4)
Ch06 Reward 设计 从零设计和调试 reward 函数 仿真的调试仪器角色(§1.1)
Ch07 训练管线 完整的 PPO 训练工程,包括超参/网络/导出 RSL-RL 介绍(§1.5)、rsl_rl 4.0 config(§1.5)
Ch08 DR 深入 EventManager 的工程实现 Sim-to-Real Gap(§1.1)、EventManager 职责(§1.3)
Ch13-18 实战 在具体任务上组合 Ch04-08 的所有知识 顶会项目速览(§1.6)、框架选型(§1.4)
Ch23 Sim2Real 完整的 sim-to-real 部署管线 Sim-to-Real Pipeline(§1.1)、ASAP 介绍(§1.6)

阅读建议:读完 Ch01 后不要急于进入 Ch03——先完成 Ch02 的安装和第一次训练。有了实操体验后,Ch03-08 的理论讨论才有具体的锚点。

本章小结

知识点总表

编号 知识点 核心要点 对应节 难度
1 仿真的必要性 数据需求 vs 物理代价的数量级矛盾 1.1
2 仿真三角色 物理世界 + MDP 机器 + 调试仪器 1.1
3 Sim-to-Real Gap 四个维度:动力学/执行器/感知/环境 1.1
4 Sim-to-Real Pipeline DR → TS蒸馏 → Sim2Sim → ONNX → 真机 1.1
5 GPU 并行核心 关键是数据零搬运,不只是核心多 1.2 ⭐⭐
6 SIMT + SoA GPU 编程模型 + 内存布局优化 1.2 ⭐⭐
7 Action repeat 策略频率 vs 物理频率的桥梁 1.2 ⭐⭐
8 CUDA Graph 减少 kernel 启动开销,要求静态计算图 1.2 ⭐⭐
9 GPU 显存估算 max_envs \(\approx\) (VRAM - 2GB) / per_env_mem 1.2 ⭐⭐
10 MuJoCo 接触模型 凸优化 vs LCP,solref/solimp 直觉 1.3 ⭐⭐
11 生态演进六阶段 MuJoCo CPU → Isaac Gym → Isaac Lab → MJX → Newton → mjlab 1.3 ⭐⭐⭐
12 Newton 1.0 GA 7 个求解器,locomotion 252x MJX,manipulation 475x MJX 1.3 ⭐⭐⭐
13 Manager-Based 架构 Isaac Lab 8 + mjlab 9 个 Manager 1.3 ⭐⭐⭐
14 单体 vs Manager legged_gym 单体 vs Isaac Lab/mjlab Manager 1.3 ⭐⭐⭐
15 mjlab 定位 MuJoCo Warp + Isaac Lab API + pip install,v1.2.0 1.4 ⭐⭐⭐
16 Isaac Lab 定位 PhysX/Newton + RTX 渲染 + 多 RL 后端 1.4 ⭐⭐⭐
17 选型决策树 视觉→Isaac Lab;快速原型→mjlab 1.4 ⭐⭐⭐
18 env.step() 7 步时序 action→decimation→termination→reward→reset→interval→obs 1.4 ⭐⭐⭐
19 Isaac Lab 3.0 变更 quaternion xyzw、多后端、kit-less、warp-native 1.4 ⭐⭐
20 mjlab Actuator 层叠 XmlActuator→IdealPD→DCMotor→MLP→DelayWrapper 1.4 ⭐⭐⭐
21 框架-引擎-工具分层 物理引擎 \(\ne\) 框架 \(\ne\) RL算法库 \(\ne\) 可视化 1.5
22 RSL-RL \(\ge\) 4.0 PPO + Distillation + RND + Symmetry,拆分 actor/critic config 1.5 ⭐⭐
23 MJX vs MuJoCo Warp JAX vs PyTorch,可微分 vs 非可微分 1.5 ⭐⭐
24 项目技术演化树 Locomotion/Motion Imitation/Manipulation 三大分支 1.6 ⭐⭐
25 版本锚定策略 mjlab 1.2.0 + Isaac Lab 2.3.0 为主线 1.7
26 全书知识树 7 Part \(\times\) 28 章的递进和平行关系 1.8

概念关系图

                    ┌── sim.step()(物理引擎)
                    │
仿真 ──→ env.step() ┼── compute_obs()(ObservationManager)
                    │── compute_reward()(RewardManager)
                    │── check_termination()(TerminationManager)
                    └── reset()(EventManager)
                              ↓
                    Manager-Based 架构(Isaac Lab 首创,mjlab 借鉴)
                              ↓
                    ┌── mjlab(MuJoCo Warp + 轻量)
                    └── Isaac Lab(PhysX/Newton + 视觉 + 多后端)

本章回答的核心问题

问题 答案
为什么需要仿真? 训练需要 \(10^8\)+ step,真机无法承受
为什么需要 GPU 并行? CPU 多进程瓶颈在数据搬运,GPU 端到端在显存上
我的 GPU 能跑多少环境? max_envs ≈ (VRAM - 2GB) × 1000 / per_env_MB
MuJoCo 接触模型和 PhysX 有什么区别? MuJoCo 用凸优化(总能求解),PhysX 用 TGS 迭代(可能不收敛)
为什么有这么多框架? 每一代解决上一代的痛点,演进是必然的
Newton 有什么用? 统一 7 个求解器,一行切换物理后端
为什么选 mjlab + Isaac Lab? API 趋同、互补覆盖、边际学习成本低
如何为新项目选框架? 视觉→Isaac Lab,轻量→mjlab,接触密集→mjlab
RSL-RL 只有 PPO 够用吗? locomotion 够用,操作需要 Isaac Lab 的多后端
Isaac Lab 3.0 和 2.x 的区别? 多后端、kit-less、quaternion xyzw、warp-native
我该从哪个开源项目开始读? 在技术演化树上定位最相关节点,从该节点开始

本章术语速查表

术语 含义 首次出现
sim.step() 物理引擎推进一个时间步 §1.1
env.step() 框架级环境 step(含 decimation + obs/reward/reset) §1.1
decimation / action repeat env.step() 内调用 sim.step() 的次数 §1.2
SoA / AoS Structure of Arrays / Array of Structures,GPU 内存布局 §1.2
CUDA Graph 预录制的 GPU kernel 执行序列 §1.2
Manager-Based 把 MDP 组件拆分到独立 Manager 的框架架构 §1.3
Entity / Articulation mjlab / Isaac Lab 中机器人实体的配置类 §1.4
ObsTerm / RewTerm / EventTerm Manager 中的基本配置单元 §1.4
solref / solimp MuJoCo 接触参数(刚度/阻尼 + 约束阻抗) §1.3
TGS Truncated Gauss-Seidel,PhysX 的接触求解器 §1.3
Kamino Newton 中处理闭环机构的求解器 §1.3
BeyondMimic mjlab 内置的 motion imitation reward 配方 §1.6
RSL-RL ETH + NVIDIA 的 RL 算法库(PPO + Distillation) §1.5
WandB Weights & Biases,实验管理平台 §1.5
Viser mjlab 默认的 web-based 3D 可视化工具 §1.5
Rerun 时间序列数据流可视化工具 §1.5

累积项目:本章新增模块

本章暂无项目实操。从 Ch02 开始,你将在两个框架中跑通第一个任务,这是后续所有累积项目的起点。

本教材有 8 个累积项目贯穿全书,每章在对应项目上新增一个模块。以下是与本章最相关的两个项目的全书路径:

项目 A:四足速度跟踪(Go2,mjlab 为主线)

章节 新增内容
Ch01 理解框架选型:为什么 mjlab 适合此任务(MuJoCo 接触精度)
Ch02 安装 mjlab + 跑通 Go2 velocity demo
Ch04 精读 velocity_env_cfg.py 的 Manager 结构
Ch05 理解默认 obs/action 配置并尝试修改
Ch06 修改 reward 权重,观察步态变化
Ch07 完成一次 4096 env \(\times\) 3000 iter 的正式训练
Ch08 添加 mass/friction DR,观察鲁棒性变化
Ch13 完整四足实战(rough terrain + curriculum)

项目 B:人形 locomotion(G1,双框架并重)

章节 新增内容
Ch01 理解框架选型:Isaac Lab + mjlab 并重
Ch02 安装 Isaac Lab + 跑通 G1/H1 velocity demo
Ch14 人形 locomotion 实战
Ch15 Motion imitation 实战(BeyondMimic)
Ch20 人形全身控制(上下肢协调)

向后预告:Ch02 将带你在两个框架中各跑通一个 demo——这是验证你的环境正确安装的第一步,也是项目 A/B 的起点。


延伸阅读

核心论文(必读)

资源 难度 说明
Makoviychuk et al., Isaac Gym: High Performance GPU-Based Physics Simulation for Robot Learning, NeurIPS 2021 ⭐⭐ GPU 并行仿真的奠基工作
Mittal et al., Isaac Lab: A GPU-Accelerated Simulation Framework for Multi-Modal Robot Learning, arXiv 2511.04831 ⭐⭐ Manager-Based 架构的设计文档
Zakka et al., mjlab: A Lightweight Framework for GPU-Accelerated Robot Learning, arXiv 2601.22074 ⭐⭐ mjlab 设计哲学和 benchmark 数据
Rudin et al., Learning to Walk in Minutes Using Massively Parallel Deep RL, CoRL 2021 ⭐⭐ legged_gym,locomotion RL 标准范式
Schwarke et al., RSL-RL: A Learning Library for Robotics Research, arXiv 2509.10771 ⭐⭐ RSL-RL 算法库的设计和功能

物理引擎

资源 难度 说明
Todorov et al., MuJoCo: A physics engine for model-based control, IROS 2012 ⭐⭐⭐ MuJoCo 物理引擎的原始论文
NVIDIA, Newton Adds Contact-Rich Manipulation and Locomotion, Technical Blog 2026 ⭐⭐ Newton 1.0 benchmark 数据和求解器介绍
ROBOLAWEB, solref/solimp Parameter Cheat Sheet MuJoCo 接触参数的实用推荐值
Borse et al., ComFree-Sim, arXiv 2603.12185 ⭐⭐⭐ 密集接触场景的替代接触模型,比 MuJoCo Warp 快 2-3\(\times\)

生态与工具

资源 难度 说明
MuJoCo 官方文档:mujoco.readthedocs.io MJCF 格式、物理参数含义
MuJoCo Menagerie:github.com/google-deepmind/mujoco_menagerie 50+ 机器人 MJCF 模型库
awesome-loco-manipulation:github.com/aCodeDog/awesome-loco-manipulation 移动操作论文列表 + 复合机器人 URDF
Viser 文档:viser.studio Web-based 3D 可视化工具
Rerun 文档:rerun.io 时间序列数据流可视化
WandB 文档:docs.wandb.ai 实验管理平台

进阶阅读

资源 难度 说明
NVIDIA Warp 文档 ⭐⭐⭐ 理解 MuJoCo Warp 的 GPU kernel 实现
Liang et al., GPU-Accelerated Robotic Simulation for Distributed RL, CoRL 2018 ⭐⭐⭐ Isaac Gym 之前的 GPU 仿真探索
He et al., ASAP: Aligning Simulation and Real-World Physics, RSS 2025, arXiv 2502.01143 ⭐⭐⭐ 跨仿真器 delta action model
Kamino: GPU-based Massively Parallel Simulation of Multi-Body Systems with Challenging Topologies, arXiv 2603.16536 ⭐⭐⭐ Newton 闭环机构求解器的原始论文

研究实践建议

开源数据集与基准测试 ⭐

具身智能领域近两年(2024-2025)涌现了大量开源数据集和基准测试平台,它们与仿真框架的关系日益紧密:

数据集 规模 机器人种类 与仿真的关系
Open X-Embodiment 100 万+ 轨迹 22 种 多框架数据汇聚,部分包含 MuJoCo 仿真数据
AgiBot World 100 万+ 轨迹 100+ 种 2024-2025 最大规模多机器人数据集
DROID 7.6 万轨迹 Franka 为主 真机遥操作数据,常用 MuJoCo 做 sim-to-real 对齐
RH20T 147 任务 多种 人手遥操作 + 机器人执行

这些数据集正在推动具身智能从"单任务 RL 训练"向"基础模型预训练 + 下游微调"的范式转变。Vision-Language-Action(VLA)策略——如 RT-2、Octo——统一了感知、语言理解和控制,试图用一个模型覆盖多种机器人和任务。

但即使在 VLA 时代,仿真仍然不可替代:(1) VLA 模型的下游微调仍然依赖仿真数据来扩充稀缺的真机数据;(2) 仿真中的域随机化是让 VLA 策略泛化到新场景的关键技术;(3) sim-to-real 验证仍然是部署前的必要步骤。这就是为什么理解本章的仿真基础设施——无论你最终是做传统 RL 还是 VLA——都是必需的。

反事实推理:如果具身智能领域完全转向真机数据收集(不再使用仿真)会怎样?以 Open X-Embodiment 的规模为参考,100 万条真机轨迹需要大量人工遥操作。按每条轨迹平均 30 秒计算,100 万条需要约 8300 小时(1 年以上)的连续遥操作时间。而在仿真中用 GPU 并行,同等数据量只需数小时。仿真与真机数据的互补关系,在可预见的未来不会改变。

与本教材后续章节的关系:Ch08(Domain Randomization)和 Ch23(Sim2Real 部署)会详细讲解如何利用仿真数据来弥补真机数据的不足。Ch16(多模态动作获取)会讨论 VLA 在机器人运控中的应用。

给博士新生的框架选择建议

如果你刚开始博士生涯,面对框架选择感到不知所措,以下是我们基于教学经验总结的建议:

第一周:在 mjlab 上跑通一个 demo。pip install mjlabuv run train Mjlab-Velocity-Flat-Unitree-Go2 → 观察训练曲线和可视化。这让你在 30 分钟内建立对"机器人 RL 训练是什么样的"的直觉。

第一个月:在 mjlab 上完成第一个完整的训练实验——修改 reward 权重、观察行为变化、用 WandB 记录实验。这是 Part II(Ch04-10)的实践侧。

第一个学期:根据你的研究方向选择是否需要 Isaac Lab。如果你的方向涉及视觉策略、多算法对比或已有 Isaac Lab 的 baseline——安装 Isaac Lab 并学习其 API。如果你的方向是纯 locomotion/motion imitation——mjlab 可能已经足够。

始终保持的习惯: - 从第一次训练就用 WandB 记录 - 每个实验都设固定 seed(至少跑 3 个 seed 取均值) - 修改 reward 前先用 zero agent 和 random agent 验证环境正确性(Ch04 的实验矩阵) - 读代码时先读 config → 再读 Manager → 最后读 base class

给有经验研究者的迁移建议

如果你已经在 Isaac Gym / legged_gym 上有大量代码,迁移策略如下:

  1. 不急于迁移所有代码:旧代码如果还能跑,暂时不需要迁移。新实验用 mjlab/Isaac Lab
  2. 优先迁移 reward 和 obs 设计:这些是最有复用价值的——reward 函数和 obs 配置的设计思想跨框架通用
  3. 利用 sim2sim 验证:在旧框架和新框架中用相同的策略做 sim2sim 对比,确认行为一致
  4. 参考 HOVER 的迁移经验:HOVER(ICRA'25)是一个从 Isaac Gym 成功迁移到 Isaac Lab 的案例,其仓库结构可以作为迁移的参考模板

给实验室 PI 的基础设施建议

如果你是实验室负责人,正在为实验室配置机器人 RL 的训练基础设施:

硬件推荐(2026 年)

用途 推荐 GPU 显存 最大环境数 预算参考
教学/入门 RTX 4090 24 GB ~4096 ~$1,600
标准研究 A100 80GB 80 GB ~8192 ~$10,000
大规模训练 H100 80GB 80 GB ~16384 ~$25,000
视觉策略 A100/H100(RTX 渲染额外需要显存) 80 GB ~2048(含相机) ~$10,000+

软件标准化:建议实验室统一使用 mjlab + Isaac Lab 双框架,配置共享的 WandB 组织账号,在 lab wiki 上维护安装指南和常见问题。新同学入组时,先按 Ch02 的 Day-1 流程搭建环境,再按 Ch01 的知识地图规划学习路径。

版本管理:建议在实验室 NFS 共享目录上维护一份经过验证的 conda/uv 环境快照。新同学直接 clone 而非从头安装——这可以避免 90% 的"我安装不上"问题。

实验室新人入门 Checklist

如果你是实验室新加入的研究生,以下是按优先级排列的入门步骤(第一个月内完成):

周次 任务 验证标准 对应章节
Week 1 安装 mjlab + Isaac Lab Ch02 的 L0-L6 全部通过 Ch02
Week 1 配置 WandB 训练曲线在 WandB 上可见 Ch02
Week 1 完成 Go2 flat terrain 完整训练 reward 收敛、可视化行为合理 Ch02
Week 2 阅读 velocity_env_cfg.py 源码 能说出每个 ObsTerm 的含义 Ch04 预览
Week 2 修改一个 reward 权重并重新训练 观察到行为变化并能解释原因 Ch06 预览
Week 3 阅读一个顶会项目的 README + config 能复述其 obs/reward/DR 设计 Ch01 §1.6
Week 3 在 WandB 上对比 3 组不同参数的实验 使用 Run Compare 功能 Ch07 预览
Week 4 开始你自己研究课题的第一个实验 有明确的 baseline + 1 个修改

如果不按这个顺序来会怎样:很多新同学的第一反应是"先读 100 篇论文再动手"。但机器人 RL 是一个极度依赖动手经验的领域——你需要亲眼看到 reward 曲线从零上升、亲眼看到机器人从摔倒到行走,才能对后续的理论讨论建立直觉。先动手再补理论,远比先理论再动手高效。


🔧 故障排查手册

选型决策相关

故障 症状 原因 排查步骤
"我该用哪个框架" 选择困难,在两个框架之间反复犹豫 没有明确任务需求 1. 明确你的任务是否需要视觉输入 → 2. 是否需要对比多种 RL 算法 → 3. 跟随 1.4 节决策树 → 4. 如果仍不确定,先用 mjlab(安装简单,试错成本低)
"论文用的框架和我的不同" 想复现论文结果但框架不匹配 框架版本或选型差异 1. 在附录 A 查找该论文的框架信息 → 2. 如果是 Isaac Gym 论文,理解其代码可能需要重构到 Isaac Lab/mjlab → 3. 概念(obs/reward/DR)是通用的,只是 API 不同
"Isaac Gym 还能用吗" 不确定是否该迁移到新框架 生态演进快 Isaac Gym 已停止更新。如果你已有 Isaac Gym 代码,可以继续使用但不推荐新项目基于它开发。迁移到 Isaac Lab 约需 3-5 天(参考 HOVER 等项目的迁移经验)

概念理解相关

故障 症状 原因 排查步骤
"MuJoCo 是免费的吗" 对许可证状态困惑 历史信息混乱 MuJoCo 在 2021 年被 Google DeepMind 收购后完全开源(Apache 2.0)。MuJoCo Warp 也是开源的。mjlab 也是开源的(Apache 2.0)
"MJX 和 MuJoCo Warp 一样吗" 两个名字容易混淆 名称相似 MJX = MuJoCo + JAX(Google 维护),MuJoCo Warp = MuJoCo + NVIDIA Warp(Google DeepMind + NVIDIA 共同维护)。物理精度相近,编程模型不同(JAX vs PyTorch)
"Manager-Based 是什么意思" 看到 Isaac Lab/mjlab 代码不理解其结构 没有读过旧框架做对比 先看 legged_gym 的 legged_robot.py(单体架构),再看 mjlab/Isaac Lab 的 config 文件(Manager 架构),对比就会立刻理解
"为什么不直接在真机上训练" 听说有公司做真机 RL 混淆了不同范式 少数公司(如 Physical Intelligence)探索真机 RL,但代价极高。绝大多数研究和产品仍然是 sim-to-real 范式。本教材聚焦 sim-to-real

生态导航相关

故障 症状 原因 排查步骤
"GitHub 上有太多框架" 面对 Isaac Lab / mjlab / Genesis / Brax 等不知如何选择 生态碎片化 本教材的推荐:(1) mjlab + Isaac Lab 为主线,(2) 其他框架按 1.5 节分类了解即可
"找不到我的机器人的模型" 需要一个 MJCF/USD 但不知去哪找 不了解模型库 1. MuJoCo Menagerie(50+ MJCF) → 2. Isaac Lab 内置(16+ USD) → 3. awesome-loco-manipulation(复合机器人 URDF) → 4. 如果都没有 → Ch11 教你从 SolidWorks 导出
"Newton/ComFree-Sim 是什么" 看到新名词不知道是否需要学 生态更新快 Newton = 多求解器统一引擎(Isaac Lab 3.0 Beta);ComFree-Sim = 新的密集接触求解器(2026,比 MuJoCo Warp 在密集接触场景快 2-3\(\times\))。当前不需要学,了解定位即可

跨框架问题

故障 症状 原因 排查步骤
"同一机器人两框架行为不同" 默认站姿差异、行走步态不同 物理引擎接触模型差异 这是正常现象——MuJoCo 和 PhysX 的接触处理不同。ASAP 论文量化了这种差异
"mjlab config 复制到 Isaac Lab 报错" AttributeError / KeyError API 命名差异 查阅 writing_guide.md §5.3 的 API 对应表,逐一替换
"Isaac Lab 3.0 代码和 2.3 不兼容" quaternion 报错、数据类型错误 3.0 破坏性变更 查阅 1.4 节 Isaac Lab 3.0 变更表
"rsl_rl 4.0 的 config 和旧版不一样" actor_critic 属性找不到 rsl_rl 4.0 拆分了 actor/critic 使用新格式 actor = RslRlMLPModelCfg(...) + critic = RslRlMLPModelCfg(...)

Ch01 完结。 本章从"为什么需要仿真"出发,梳理了 GPU 并行仿真的技术基础和整个框架生态的演进脉络,最终建立了 mjlab vs Isaac Lab 的选型方法论。你现在拥有了一张完整的地图——知道生态中有哪些框架、它们各自解决什么问题、你应该从哪里开始。

下一步行动: 1. 如果你还没有 GPU 环境 → 打开终端运行 pip install mjlab 2. 如果已有 GPU 环境 → 直接进入 Ch02,按分层验证流程搭建双框架环境 3. 如果你已经安装过两个框架 → 快速浏览 Ch02 确认验证步骤完整,然后跳到 Ch03 或 Ch04

无论哪种情况,在继续阅读理论之前先动手跑通一个 demo。机器人 RL 是一个"做中学"的领域——没有训练过一次策略的人,再多的理论也是纸上谈兵。

版本更新提醒:本章的版本信息(Stars 数、版本号、benchmark 数据)均有时效性。如果你在 2026 年下半年或之后阅读本章,建议查阅 mjlab 和 Isaac Lab 的 GitHub 仓库获取最新信息。本教材的版本锚定策略(§1.7)确保了核心概念和 API 设计的稳定性——但具体的数字可能已经变化。

提醒:本章的所有版本信息、Stars 数据和 benchmark 数据已根据 2026 年 5 月的深度调研报告校验。如有疑问,请查阅项目知识库中的「mjlab and Isaac Lab Ecosystem: 2026 Robot RL Framework Technical Survey」。