Extensions#
wbc-mjlab is modular by design: core owns the shared MDP and reference tasks; each robot is a separate entity that must be registered before train, play, or data conversion will work.
What you typically build#
Artifact |
Where it lives |
|---|---|
Robot entity |
Extension package — MJCF, actuators, sensors, |
Tasks |
|
Motion data |
|
Optional deploy runtime |
Separate repo (not part of wbc-mjlab core) |
Core ships one in-tree robot (g1) as a reference. New hardware platforms
should not fork env/ — publish an extension package instead.
Modularity checklist#
Before opening a PR or publishing an extension, confirm:
No MDP forks — rewards/RSI/terminations stay in
env/mdp/; use presetsRobot registered —
register_robotorregister_wbc_extensionat importBody names explicit — anchor, motion keybodies, EE termination tuple in constants
Motion FK wired —
RobotMotionSpecforwbc-mjlab-data-to-npz --robot <id>Tasks registered —
WbcTaskConfigwith matchingrobot_idEntry point —
[project.entry-points."mjlab.tasks"]so mjlab discovers the package
Workflow#
# 1. Scaffold extension (separate repo)
# 2. Implement <robot>_base_cfg + register_wbc_extension
Install the extension editable alongside wbc-mjlab:
uv pip install -e ../my-robot-wbc
uv run wbc-mjlab-list-envs # should list Wbc-<Robot>
uv run wbc-mjlab-data-to-npz --robot <id> --dataset samples --batch-size 8
uv run wbc-mjlab-train --task Wbc-<Robot> --dataset samples
pip install -e ../my-robot-wbc
wbc-mjlab-list-envs # should list Wbc-<Robot>
wbc-mjlab-data-to-npz --robot <id> --dataset samples --batch-size 8
wbc-mjlab-train --task Wbc-<Robot> --dataset samples
API reference: Extension API (WbcRobotSpec, register_wbc_extension,
WbcTaskConfig, RobotMotionSpec).
Related: Concepts, Contributing, Usage.