One shared MDP for whole-body motion tracking on mjlab.
Built on mjlab's sim + RL stack. Recent humanoid WBC work (ZEST, BeyondMimic, SONIC, …) tends to ship as separate codebases — wbc-mjlab unifies that line on one training surface: paper-specific choices as --task switches (RSI, observations, rewards, DR). On deploy: one policy, many motion clips — swap at runtime, no checkpoint change.
Modular by design: one shared MDP and presets in the core repo; robots plug in via register_wbc_extension in a separate package (same wbc-mjlab-train / play CLIs, stock apply_wbc preset — no fork, no new preset per robot).
Documentation · Live demo · Sim rollout video
| Repo | Role |
|---|---|
| wbc-mjlab | Training — shared MDP, presets, G1 tasks, GMR PKL + batch NPZ conversion, ONNX export (PyPI · docs) |
| wbc-mjlab-extension-h2 | Reference robot extension (Unitree H2) — plug-in package via register_wbc_extension, no core fork |
| wbc-g1-deploy | Reference G1 runtime — one ONNX policy, clip library via manifest.yaml |
| wbc-demo | In-browser live demo — MuJoCo WASM + ONNX, deploy-aligned clip UX |
Upstream: mujocolab/mjlab (extension, not a fork).
The bundled deploy policy already covers walk, jog, run, crawl, fight, get up from the floor, lie down, and flips — selected from a clip library with the joystick.
Live demo (browser)
MuJoCo + ONNX in the browser — idle, walk, fight, get up, lie down, … (wbc-demo) |
||
Unitree G1 — one policy, many skills
Get-up · idle · dance · fight · sprint · sideflip — same deploy policy, clip library switching (wbc-g1-deploy) |
More skills coming (backflips, …). See wbc-demo and wbc-g1-deploy.
Paper knobs are presets stacked on one MDP, not separate codebases:
| Layer | Where | Role |
|---|---|---|
| Shared MDP | env/ |
Rewards, terminations, motion command, RSI, playback |
| Presets | presets/ |
Paper recipes as functions — apply_zest, apply_wbc, apply_binary_failure, apply_se_actor |
| Robot tasks | robots/g1/tasks.py |
Preset stacks + registered --task ids (Wbc-G1, Wbc-G1-Zest, …) |
| External robots | wbc-mjlab-extension-h2 | Separate repo: MJCF + register_wbc_extension → Wbc-H2 on the same MDP |
Add a paper setup: new preset in presets/, wire it in robots/<id>/tasks.py, register a WbcTaskConfig — same CLI, same log layout, comparable runs.
Add a robot (external): copy the H2 extension layout — robot assets, base.py, entry-point registration; reuse apply_wbc with no preset fork. Details: documentation · CONTRIBUTING.md.
Already wired: ZEST-style rewards + reward-aligned RSI, BeyondMimic binary-failure sampling, multi-clip motion libraries, deploy-style obs export, Viser play overlays (motion context + adaptive RSI bins).
- Train / export in wbc-mjlab (
params/policy.onnx+params/config.yaml) - Copy into wbc-g1-deploy
config/policy/ - Build and run
wbc_g1_ctrl— deploy README
Tech report, SONIC-style task, and external preset modules as separate repos.
Public on PyPI; APIs and tasks still evolving. Feedback, issues, and PRs welcome on any repo.
