📌 项目地址:github.com/kevinzakka/mjbatch | 星数:423+ | 语言:Python + C++
做机器人强化学习最痛的事之一:仿真太慢,采样效率上不去。mjbatch 把 MuJoCo 变成批量引擎——同一个模型克隆出成千上万份并行推进,控制策略一次算完整批。关键在于 C++ 线程池执行且释放 GIL,Python 侧的 bind 直接映射整批 MjData 字段,读写零拷贝。官方示例里,Go1 机器狗的 RL 行走控制器在一台五年前的 M1 笔记本上不到一分钟学会走路。同领域的 RL 机器人项目还可以参考 MicroDuck教程:RL双足机器人。
| 特性 | 说明 |
|---|---|
| C++ 线程池执行 | 推进全部仿真时释放 GIL,Python 不挡道 |
| bind 实时数组访问 | 整批的 qpos/ctrl 等 MjData 字段直接映射为 numpy 可写数组 |
| expand 每仿真参数 | 为每个仿真设定独立的 MjModel 字段(摩擦等),set_const 重算派生常量 |
| 线程默认占满 | threads 默认为全部逻辑核心 |
import mujoco, numpy as np
from mjbatch import Batch
model = mujoco.MjModel.from_xml_path("scene.xml")
batch = Batch(model, num_sims=4096) # 线程默认占满逻辑核心
qpos, ctrl = batch.bind("qpos"), batch.bind("ctrl")
# 每个仿真独立设置摩擦参数
batch.expand("geom_friction")[:, :, 0] = \
np.random.uniform(0.4, 1.2, (4096, 1))
for _ in range(1000):
ctrl[:] = policy(qpos) # 你的控制器,一次算 4096 个
batch.step() # 并行推进,qpos 原地更新
kevinzakka 开源的 Python 库(423 星),用于在 CPU 上并行运行数千个 MuJoCo 仿真。核心特性:C++ 线程池执行且释放 GIL、通过 bind 实时访问整批仿真状态与控制量、用 expand 为每个仿真设定不同模型参数并用 set_const 重算派生常量。官方示例中 Go1 机器狗 RL 控制器在五年前的 M1 笔记本上不到一分钟学会走路。
import mujoco 与 from mjbatch import Batch 后:用 MjModel.from_xml_path 加载模型,Batch(model, num_sims=4096) 创建批量(线程默认占满全部逻辑核心);batch.bind('qpos')、batch.bind('ctrl') 拿到可写数组;batch.expand('geom_friction') 为每个仿真设置独立摩擦等参数;循环里 ctrl[:] = policy(qpos) 写控制、batch.step() 一次推进全部 4096 个仿真,qpos 原地更新。
仓库展示的官方示例覆盖四类:强化学习(RL)、模型预测控制(MPC)、系统辨识(SysID)与软硬件协同设计,每个示例都是自包含的高性能实现。典型用途是机器人策略训练与评估——批量仿真把采样效率提升几个数量级,单机 CPU 即可完成。