应用介绍
训练强化学习策略、跑 MPC 采样,最烧的就是仿真吞吐——一次只推进一个 MuJoCo 环境,几千步下来 CPU 大半时间在空转,Python 那把 GIL 锁还把多线程堵死。mjbatch 把这条路打通了:一个 Python 库,直接在 CPU 上并行推进数千个 MuJoCo 仿真,底层用 C++ 线程池执行并释放 GIL,所以真的是多核一起跑,不是假并行。
它给的接口也很克制——`Batch(model, num_sims=4096)` 一行开出四千个环境,`bind` 拿到整批状态和控制量的实时数组,你的控制器一次算完四千个、`step()` 一步并行推进,`qpos` 原地更新。作者放的例子里,一个 Go1 四足机器人的行走策略在五年前的 M1 笔记本上一分钟内就学会走路。做 RL、MPC、系统辨识、硬件协同设计都用得上。
C++ 线程池 · 释放 GIL:批量仿真在原生线程池里并行执行,执行期间释放 Python GIL,真正吃满多核,不被解释器锁拖住。
批量实时状态访问:用 `bind` 把整批 MjData 字段(如 qpos、ctrl)映射成一块可读写的实时数组,控制器一次读写全部仿真,没有逐个拷贝的开销。
逐仿真参数设置:用 `expand` 给每个仿真单独设 MjModel 字段(比如 geom_friction),配 `set_const` 重算派生常量,域随机化、参数扫描直接铺开。
线程数自动铺满:不指定时线程数默认拉到每个逻辑 CPU,开箱就用满机器算力。
覆盖多种研究场景:随库附带 RL、MPC、系统辨识、硬件协同设计的完整可跑示例,每个都是自包含的高性能实现。
它给的接口也很克制——`Batch(model, num_sims=4096)` 一行开出四千个环境,`bind` 拿到整批状态和控制量的实时数组,你的控制器一次算完四千个、`step()` 一步并行推进,`qpos` 原地更新。作者放的例子里,一个 Go1 四足机器人的行走策略在五年前的 M1 笔记本上一分钟内就学会走路。做 RL、MPC、系统辨识、硬件协同设计都用得上。
软件功能
C++ 线程池 · 释放 GIL:批量仿真在原生线程池里并行执行,执行期间释放 Python GIL,真正吃满多核,不被解释器锁拖住。
批量实时状态访问:用 `bind` 把整批 MjData 字段(如 qpos、ctrl)映射成一块可读写的实时数组,控制器一次读写全部仿真,没有逐个拷贝的开销。
逐仿真参数设置:用 `expand` 给每个仿真单独设 MjModel 字段(比如 geom_friction),配 `set_const` 重算派生常量,域随机化、参数扫描直接铺开。
线程数自动铺满:不指定时线程数默认拉到每个逻辑 CPU,开箱就用满机器算力。
覆盖多种研究场景:随库附带 RL、MPC、系统辨识、硬件协同设计的完整可跑示例,每个都是自包含的高性能实现。

