File size: 11,532 Bytes
c26f879 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 | # MotionBricks: Scalable Real-Time Motions with Modular Latent Generative Model and Smart Primitives
<p align="center">
<a href="https://nvlabs.github.io/motionbricks"><img src="https://img.shields.io/badge/Project-Page-blue" alt="Project Page"></a>
<a href="docs/motion_representation.md"><img src="https://img.shields.io/badge/docs-online-green.svg" alt="Documentation"></a>
</p>
<p align="center">
<img src="assets/teaser_motion_bricks_three_rows.jpg" alt="MotionBricks teaser" width="100%">
</p>
MotionBricks is a real-time generative framework that transforms interactive motion control for animation and robotics. By combining a large-scale latent backbone with intuitive "smart primitives," it delivers high-quality, zero-shot motion synthesis at 15,000 FPS, allowing users to effortlessly build complex animations and robotic movements like assembling bricks.
## Contents
- [News & Roadmap](#news--roadmap)
- [Results](#results)
- [Setup](#setup)
- [Interactive Demo: Quick Start](#interactive-demo-quick-start)
- [Training](#training)
- [Motion Representation and Custom Datasets](#motion-representation-and-custom-datasets)
- [Related Work](#related-work)
- [Project Structure](#project-structure)
- [Known Issues](#known-issues)
- [Citation](#citation)
- [License](#license)
- [Contact](#contact)
## News & Roadmap
### News
- **2026-04-27** — Initial public release: interactive demo, pretrained checkpoints (VQVAE · pose · root), synthetic training code, motion-representation docs, and GIF gallery.
### Roadmap
- [ ] Full training pipeline inside [GR00T Whole-Body Control](https://github.com/NVlabs/GR00T-WholeBodyControl)'s GEAR-SONIC pipeline — targeted for approximately one month out; reproducibility experiments are already in flight.
## Results
See the [project page](https://nvlabs.github.io/motionbricks) for the full uncut demos and comparison videos. Short clips below are GIFs (muted, ~10 s each).
### Teasers
| Animation | Robotics |
| :---: | :---: |
|  |  |
### Smart Locomotion — Single Styles
| Zombie | Injured leg |
| :---: | :---: |
|  |  |
| **Injured torso** | **Skipping** |
|  |  |
| **Strafing** | **Crouch strafing** |
|  |  |
### Smart Locomotion — Mixture of Styles
| Freestyle | Idle · Walk · Jog · Run |
| :---: | :---: |
|  |  |
### Smart Objects
| Pick up sword | Falling |
| :---: | :---: |
|  |  |
| **Jump over bench** | **Sitting** |
|  |  |
| **Interactive authoring** | |
|  | |
## Setup
**Requirements:** Python 3.10+, a CUDA-capable GPU, [Git LFS](https://git-lfs.com/).
### Clone the repository
MotionBricks ships as a subproject of [GR00T Whole-Body Control](https://github.com/NVlabs/GR00T-WholeBodyControl). Clone the parent repo and `cd` into `motionbricks/`. Pretrained checkpoints, mesh assets, and gallery GIFs are tracked with Git LFS, so install LFS before cloning:
```bash
git lfs install
```
The parent repo skips MotionBricks pretrained checkpoints by default so a normal monorepo clone does not automatically download the extra ~2.2 GB of checkpoint files. MotionBricks GIFs and mesh assets still download normally. If you only need source code (for example, to train on your own data), clone normally:
```bash
git clone https://github.com/NVlabs/GR00T-WholeBodyControl.git
cd GR00T-WholeBodyControl/motionbricks
```
If you want the checkpoints for the interactive demo, fetch them explicitly from the repo root:
```bash
git clone https://github.com/NVlabs/GR00T-WholeBodyControl.git
cd GR00T-WholeBodyControl
git lfs pull --include="motionbricks/out/**" --exclude=""
git lfs pull --include="motionbricks/assets/skeletons/g1/meshes/**" --exclude="" # needed for interactive demo
cd motionbricks
```
After fetching MotionBricks checkpoints, verify that checkpoint files were downloaded (not tiny Git LFS pointer files):
```bash
ls -lh out/G1-clip.ckpt # ~7.5 MB
ls -lh out/motionbricks_vqvae/version_1/checkpoints/*.ckpt # ~273 MB
ls -lh out/motionbricks_pose/version_1/checkpoints/*.ckpt # ~1.6 GB
ls -lh out/motionbricks_root/version_1/checkpoints/*.ckpt # ~391 MB
```
If these files are unexpectedly small (around 1 KB), they are LFS pointers. From the repo root, run `git lfs pull --include="motionbricks/out/**" --exclude=""` to fetch the actual checkpoints.
### Install dependencies
```bash
# Create environment
conda create -n motionbricks python=3.10 -y
conda activate motionbricks
# Install dependencies
pip install -e .
# Linux only: needed for keyboard input and MuJoCo key-grab workaround
pip install pynput python-xlib
```
## Interactive Demo: Quick Start
```bash
DISPLAY=:1 python scripts/interactive_demo_g1.py
```
This launches the MuJoCo viewer with the G1 robot. Use your keyboard to control it in real time. Hold the left mouse button and drag to change the camera look-at direction.
<p align="center">
<img src="assets/gifs/interactive_demo.gif" alt="Interactive demo screencast" width="480">
</p>
### Movement Controls
| Key | Action |
|-----|--------|
| `W` | Move forward |
| `A` | Move left |
| `S` | Move backward |
| `D` | Move right |
The movement direction is relative to the camera. Rotate the camera by right-clicking and dragging in the MuJoCo viewer.
### Motion Styles
| Key | Style |
|-----|-------|
| `V` | Slow walk |
| `Z` | Hand crawling |
| `X` | Walk boxing |
| `B` | Elbow crawling |
| `R` | Stealth walk |
| `T` | Injured walk |
| `C` | Walk stealth (crouched) |
| `E` | Happy dance walk |
| `F` | Zombie walk |
| `G` | Gun walk |
| `Q` | Scared walk |
Note: crawling modes (`Z` hand crawling and `B` elbow crawling) currently do not support side-only directions.
Without pressing a style key, the default locomotion is: **idle** (no movement keys), **walk** (WASD pressed).
## Training
Training scripts are provided for all three model components. The scripts use synthetic data by default and load model configs from the saved checkpoints in `out/`. The full motion datasets are available at <https://bones.studio/datasets>.
**Full release status:** A full release — a model fully embedded in [GR00T whole-body control](https://github.com/NVlabs/GR00T-WholeBodyControl)'s robotics formulation, along with the complete training pipeline — is targeted for approximately one month out. Reproducibility experiments are already in flight; please check back for updates.
```bash
# Train the VQVAE (motion tokenizer)
python scripts/train_vqvae.py
# Train the pose model (requires pretrained VQVAE checkpoint)
python scripts/train_pose.py
# Train the root model (no VQVAE needed)
python scripts/train_root.py
```
### Dataset
The datasets used to train the pretrained checkpoints can be downloaded at <https://bones.studio/datasets>. All current training scripts default to **synthetic data** (see `motionbricks/data/synthetic_dataset.py`) so that the full training pipeline can be verified end-to-end without the real dataset.
## Motion Representation and Custom Datasets
For details on the motion feature representation, skeleton system, coordinate conventions, normalization, and feature computation pipeline, see [docs/motion_representation.md](docs/motion_representation.md).
For a step-by-step guide to training MotionBricks on your own motion data and adapting it to a new robot, see [docs/adding_your_own_dataset.md](docs/adding_your_own_dataset.md).
## Related Work
**Kimodo** — A sibling project focused on offline motion generation, complementary to MotionBricks' real-time runtime.
[Project page](https://research.nvidia.com/labs/sil/projects/kimodo/) · [GitHub](https://github.com/nv-tlabs/kimodo)
<p align="center">
<img src="assets/gifs/kimodo_teaser.gif" alt="Kimodo teaser" width="480">
</p>
**GEAR-SONIC** — Together with MotionBricks, GEAR-SONIC anchors NVIDIA's GR00T Whole-Body Control initiative.
[Project page](https://nvlabs.github.io/GEAR-SONIC/) · [GitHub](https://github.com/NVlabs/GR00T-WholeBodyControl)
<p align="center">
<img src="assets/gifs/sonic_teaser.gif" alt="GEAR-SONIC teaser" width="480">
</p>
**BONES-SEED Dataset** — MotionBricks' training corpus — 350k production-grade mocap clips from real human actors and actresses.
[Dataset page](https://huggingface.co/datasets/bones-studio/seed)
<p align="center">
<img src="assets/gifs/bones_seed_teaser.gif" alt="BONES-SEED teaser" width="480">
</p>
**SOMA Retargeter** — The Newton-based solver that retargets SOMA capture onto the G1, producing MotionBricks' training data.
[GitHub](https://github.com/NVIDIA/soma-retargeter)
<p align="center">
<img src="assets/gifs/soma_retargeter_teaser.gif" alt="SOMA Retargeter teaser" width="480">
</p>
## Project Structure
```
motionbricks/
assets/skeletons/g1/ # MuJoCo XMLs and STL meshes
motionbricks/ # Python package
scripts/
interactive_demo_g1.py # Interactive demo
train_vqvae.py # VQVAE training
train_pose.py # Pose model training
train_root.py # Root model training
out/ # Pre-trained checkpoints (Git LFS)
G1-clip.ckpt
motionbricks_vqvae/
motionbricks_pose/
motionbricks_root/
setup.py
```
## Known Issues
- **Linux/X11 only:** The keyboard key-grab workaround requires X11 (`python-xlib`). On Wayland, macOS, or Windows, some MuJoCo keyboard shortcuts may conflict with the controller keys. Keep the **terminal focused** (not the MuJoCo window) as a workaround.
- **`PYTORCH_JIT=0` disables key grabs:** Running with `PYTORCH_JIT=0` interferes with the X11 key-grab workaround. If you need `PYTORCH_JIT=0`, keep the terminal focused instead.
- The `pynput` package is required for keyboard input on Linux/macOS. On Windows, the `keyboard` package is used instead.
## Citation
If you use MotionBricks in your research, please cite:
```bibtex
@misc{wang2026motionbricksscalablerealtimemotions,
title={MotionBricks: Scalable Real-Time Motions with Modular Latent Generative Model and Smart Primitives},
author={Tingwu Wang and Olivier Dionne and Michael De Ruyter and David Minor and Davis Rempe and Kaifeng Zhao and Mathis Petrovich and Ye Yuan and Chenran Li and Zhengyi Luo and Brian Robison and Xavier Blackwell and Bernardo Antoniazzi and Xue Bin Peng and Yuke Zhu and Simon Yuen},
year={2026},
eprint={2604.24833},
archivePrefix={arXiv},
primaryClass={cs.RO},
url={https://arxiv.org/abs/2604.24833},
}
```
## License
Source code in this repository is licensed under **Apache 2.0**. Pretrained model weights are licensed under the **NVIDIA Open Model License**, which permits commercial use with attribution subject to the trustworthy AI requirements.
## Contact
For questions and feedback, please reach out at **`gear-wbc@nvidia.com`**.
|