WBC-Mjlab: Whole Body Control in MuJoCo Lab
One shared MDP for whole-body motion tracking on mjlab — train once on a motion library, deploy one policy for many skills.
Recent works (ZEST, BeyondMimic, SONIC, OmniXtreme) is all WBC / large-scale tracking, with overlapping ideas (keybody rewards, adaptive sampling, multi-clip training) but different design choices — each still tends to ship as its own codebase. In wbc-mjlab, paper-specific knobs are --task switches on a shared stack:
- Multi-motion by design — train on multi-clip datasets (LAFAN, SEED, custom NPZ libraries); one controller generalizes across the library. At runtime, provide reference - via playing clip, teleop, or higher level policy.
- Shared MDP — rewards, terminations, motion command, RSI, and playback live in
env/once; robots and papers plug in via task configs. - Tasks, not forks — ZEST, BeyondMimic-style RSI, deploy obs, etc. are
--taskswitches (Wbc-G1,Wbc-G1-Zest,Wbc-G1-BinaryFailure, …) with the same CLI and log layout for fair comparison. - Motion data pipeline — versioned libraries under
data/, GMR PKL ingest, batch GPU CSV→NPZ, optional motion-bundle cache. - Building blocks — paper presets in
presets/and G1 task builders inrobots/g1/tasks.py; add a paper setup or tune your own WBC without forking the core MDP. - Plug-in robots — add a humanoid from its MJCF / URDF without code, or ship an extension package via
register_wbc_extension(H2 example). - WBC Studio — the whole pipeline in a browser: robots, clip QA and conversion, presets, training jobs, playback on many envs.
- One policy, many skills — one policy for walk, jog, run, crawl, fight, get-up, lie-down, flips, and more.
- Sim → real — train/play export
policy.onnx+config.yamlaligned with the deploy runtime.
Quick start
Requires mjlab (≥ 1.5) and an NVIDIA GPU for training (installation).
git clone https://github.com/wbc-mjlab/wbc-mjlab.git && cd wbc-mjlab
uv run wbc-mjlab-list-envs
Demo — live web demo, or locally with the bundled checkpoint: uv run wbc-mjlab-demo (convert the samples first).
In the browser: WBC Studio
uv run wbc-mjlab-studio # open the printed link (also from other machines on the network)
Five steps — Robot → Data → Preset → Train → Play: pick or add a robot from its MJCF / URDF, import, check and convert clips, tune observations / rewards / sampling / terrain / PPO as presets with reusable modules, launch and follow training jobs, play policies on many envs with reference ghosts. Options, files and the HTTP API: Studio guide.
From the command line
# convert source clips (CSV / PKL) to NPZ — 10 bundled samples, see data/g1/samples/README.md
uv run wbc-mjlab-data-to-npz --robot g1 --dataset samples --batch-size 8
train a task (Wbc-G1, Wbc-G1-Zest, Wbc-G1-Terrain-Scan, …)
uv run wbc-mjlab-train --task Wbc-G1 --dataset samples
play / evaluate the last run (exports policy.onnx + config.yaml)
uv run wbc-mjlab-play --task Wbc-G1 --dataset samples --viewer viser
More: quickstart · tasks · motion data · training & resume · deploy · all commands.
Related repos
| Repo | Role | |------|------| | wbc-mjlab/wbc-mjlab | Training library (this repo) — shared MDP, presets, extension API | | wbc-mjlab/wbc-mjlab-extension-h2 | Reference robot extension (Unitree H2) — plug-in WBC without forking core | | wbc-mjlab/wbc-g1-deploy | Optional G1 runtime (ONNX + motion clips) | | mujocolab/mjlab | Simulation and RL stack |