Jianuo Cao*1,2, Yuxin Chen*2, Masayoshi Tomizuka2
*Equal contribution
1Nanjing University Β Β
2University of California, Berkeley
CLAWπ¦ is a web pipeline for scalable language-annotated whole-body motion generation on Unitree G1. Built on SONIC, it composes controllable motion primitives in MuJoCo, supports keyboard and timeline editing across 25 motion modes, and exports kinematic/dynamic trajectory-language datasets with multi-style annotations.
| Requirement | Version |
|---|---|
| Ubuntu | 20.04 / 22.04 / 24.04 (or other Debian-based) |
| Python | β₯ 3.8 |
| Node.js | β₯ 18 |
git clone https://github.com/JianuoCao/GR00T-WBC-Dev
cd GR00T-WBC-DevClone the NVIDIA upstream repo into this directory:
git clone https://github.com/NVlabs/GR00T-WholeBodyControl.git GR00T-WholeBodyControl
cd GR00T-WholeBodyControl && git lfs pull && cd ..Your directory should now look like:
GR00T-WBC-Dev/
βββ GR00T-WholeBodyControl/
βββ web_wasm_demo/
βββ annotation/
βββ scripts/
Then follow the three official guides to complete the NVIDIA-side setup:
- Installation & Build β install dependencies, build the C++ inference stack
- Download Models β pull policy checkpoints and ONNX files via
git lfs - Quick Start β Following the "One-time setup" section (install the MuJoCo sim environment) is enough.
ln -sfn ../../GR00T-WholeBodyControl/gear_sonic_deploy/g1 web_wasm_demo/public/g1
ln -sfn ../../GR00T-WholeBodyControl/gear_sonic_deploy/policy web_wasm_demo/public/policyThese expose the G1 model files and policy checkpoints to the Vite dev server, which only serves files under
public/.
Python bridge (WebSocket β ZMQ):
pip3 install -r web_wasm_demo/requirements.txtFrontend (Vite + Three.js + MuJoCo WASM):
npm install --prefix web_wasm_demoOpen four terminals, all from the GR00T-WBC-Dev/ root.
source GR00T-WholeBodyControl/.venv_sim/bin/activate
python GR00T-WholeBodyControl/gear_sonic/scripts/run_sim_loop.pyA MuJoCo window will appear. Press 9 in that window to start the simulation.
Do not press Enter here until prompted β the script will ask for confirmation before starting real/sim hardware.
- Check whether
./GR00T-WholeBodyControl/gear_sonic_deploy/buildexists. - If it does not exist, complete Installation & Build first.
- Start the controller using one of the following methods.
If you built on the host, run:
./GR00T-WholeBodyControl/gear_sonic_deploy/deploy.sh sim --input-type zmq_managerIf you built in Docker, run:
./GR00T-WholeBodyControl/gear_sonic_deploy/docker/run-ros2-dev.sh
./deploy.sh sim --input-type zmq_manager- Wait until Terminal 2 shows
Init Done, then open Terminal 3.
python web_wasm_demo/ws_bridge.pynpm run dev --prefix web_wasm_demoOpen http://localhost:5173 in your browser (5173 is Vite's default port β check the terminal if it differs).
The interface is organized into six primary regions:
- Top Bar: control mode, render mode, the
ONLINEindicator,Reset, and file status. - Motion Library: the upper half of the left panel for browsing motion categories and motion clips.
- Robot Canvas: the central viewport where the robot is rendered and previewed live.
- Telemetry HUD: the right-side status panel showing controller state, movement, heading, and FPS.
- Segment Editor: the lower half of the left panel, which appears when a segment is selected for editing.
- Sequence Editor: the bottom timeline used to arrange and review motion segments.
Tip
When the page first opens, check whether the ONLINE indicator in the top-right corner is lit. If it is, the frontend has connected to the backend bridge successfully. Then select both a control mode and a render mode before continuing with the demo.
The interface provides two control modes:
Keyboard Mode: direct real-time control from the keyboard.Editor Mode: timeline-based authoring for multi-segment motion sequences.
The render mode determines how the motion is visualized:
- Kinematic: the robot follows the commanded trajectory directly, which is useful for clean preview, quick inspection, and sequence editing.
- Dynamic: the robot is shown under the physics-driven controller, which better reflects physically grounded execution and controller response.
Place the two render-mode demos side by side:
|
Kinematic motion
|
Dynamic motion
|
| Key | Action |
|---|---|
Enter |
Activate or deactivate the controller |
W / S |
Move forward or backward |
A / D |
Turn left or right |
Q / E |
Snap heading by -30Β° or +30Β° |
, / . |
Strafe left or right (not available in some idle modes) |
R |
Stop the current movement |
Space |
Pause the viewport |
- Press
Enterto activate control.
- Click to select a motion from the motion library on the left.
- Use the keyboard to control the robot's direction, actions, speed, and root height.
|
|
|
|
Tip
The planner transitions smoothly between modes by using the current robot state as its starting point, so you can switch to another motion at any time.
Drag: drag a motion from the library into the sequence editor to create a new segment.
Zoom: zoom the timeline to inspect segment boundaries and timing more precisely.
Clear: clear the current sequence and return to an empty editing state.
Once a segment is selected on the timeline, the lower-left panel becomes the Segment Editor.
Motion: motion clip assigned to the segment.Move: directional intent.Turn: turn behavior or heading change.Speed / Height: motion-specific parameters (when available).
To play a motion sequence:
- Drag motions into the timeline and edit them as needed.
- Press
Enterto activate control. - Click
Playto start the sequence. The robot will execute it in the canvas, and the timeline will advance from left to right. - After playback, the interface automatically loads the kinematic trajectory, dynamic trajectory, and text annotation for the sequence. You can download these outputs directly. See Output Data Format for more details.
After each sequence playback, the backend produces a structured data package stored under web_wasm_demo/results/<run_id>/. Three files are presented for download in the browser:
| File | Description |
|---|---|
trajectory_kinematic.csv |
Kinematic reference trajectory at 50 Hz. Columns: timestamp, base pose (base_x/y/z, qw/qx/qy/qz), and 29 joint positions. Base XY is normalized so the trajectory starts at the origin. |
trajectory_dynamic.csv |
Measured (physics-simulated) trajectory at 50 Hz. Same column layout as the kinematic CSV, with absolute base positions. |
annotation.json |
Natural-language motion descriptions in a structured JSON format. |
This project builds on GEAR-SONIC / GR00T-WholeBodyControl by NVIDIA GEAR Lab.













