SONIC-K1: whole-body motion tracking for the Booster K1
🌐 Project page & videos · ▶ Try it in 2 minutes · 💻 Code · 🧱 K1 USD
The first open-weights motion tracker for small humanoids. One policy, thousands of human motions. SONIC-K1 ports NVIDIA's SONIC motion-tracking recipe to the 22-DoF Booster K1. We trained it from scratch on 10K clips with under 1% of SONIC's training compute.
| Success on 1,985 unseen motions, SONIC's rule (MuJoCo) | 97.4% |
| Same, no-fall rule (Isaac) | 98.7% |
| PHUMA, SONIC's rule (SONIC on G1: 97.2%) | 93.6% |
| 100STYLE (100 locomotion styles), SONIC's rule | 99.0% |
| Local joint-position error, unseen (MPJPE-L / PA) | 14.7 mm / 10.8 mm |
| Training motions | 9,991 Bones-SEED clips, retargeted to K1 |
| MuJoCo sim-to-sim, all 1,985 unseen | 98.4% without a fall (97.4% under SONIC's rule), MPJPE-L 16.6 mm |
| Compute | ~100 GPU-hours (under 1% of SONIC's >9,000), 50,000 PPO iterations |
What's in this repo
| File | What it is |
|---|---|
onnx/policy_g1.onnx |
Start here. Fused robot-motion tracker: K1 reference motion + proprioception → 22 joint actions |
onnx/model_encoder.onnx, onnx/model_decoder.onnx |
The same policy split SONIC-style: encoder → 64-D token → decoder |
onnx/policy_teleop.onnx |
Fused teleop-mode tracker |
onnx/observation_config.yaml |
Exact input layout of every ONNX file |
k1_plant.json |
Joint order (IsaacLab ↔ MuJoCo), PD gains, effort limits, action scales, default pose |
sonic_k1_it50000_actor.pt |
Actor-only PyTorch weights, 25.1M params (Isaac Lab eval / fine-tuning) |
config.yaml |
Resolved training config (must sit next to the .pt) |
release.json |
Hashes, git commit, versions, training summary, eval numbers |
LICENSE, NOTICE |
CC BY-NC 4.0 for these weights + third-party notices |
Code, training configs and the MuJoCo player: github.com/Kyk0/sonic-k1.
Quick start (MuJoCo, no GPU needed)
GIT_LFS_SKIP_SMUDGE=1 git clone --depth 1 --filter=blob:none --sparse https://github.com/Kyk0/sonic-k1 && cd sonic-k1
git sparse-checkout set gear_sonic/scripts examples/k1 gear_sonic/data/assets/robot_description # ~30 MB instead of ~1 GB
pip install mujoco onnxruntime numpy "imageio[ffmpeg]" huggingface_hub
hf download Kyry10/sonic-k1 onnx/policy_g1.onnx k1_plant.json --local-dir checkpoints/sonic-k1
python gear_sonic/scripts/play_k1.py # live viewer (macOS: mjpython)
python gear_sonic/scripts/play_k1.py --record demo.mp4
Ten sample motions (shadow boxing, jumps, lunges and more, recorded from SONIC-K1 itself) ship with the code. Batch evaluation: see the GitHub README.
You bring the motion. Retarget any human clip (SMPL/BVH) to K1 with
UMR, starting from its Booster K1 example config (our settings: docs/k1/data.md in the GitHub repo),
then convert it with gear_sonic/data_process/convert_k1_npz_to_motion_lib.py.
Policy interface
| Robot | Booster K1, 22 actuated DoF (official K1_22dof.xml, BoosterRobotics/booster_assets) |
| Control | 50 Hz policy, 200 Hz physics. q* = default + action_scale · clip(a, ±20), PD τ = kp(q*−q) − kd·q̇, clamped to effort limits |
policy_g1.onnx input [1, 1220] |
motion command 440 (10 future frames at 0.1 s: joint pos 10×22 | joint vel 10×22) | anchor orientation 60 (10 × first two columns of R(q_robot⁻¹·q_ref)) | actor obs 720 |
| Actor obs 720 | 10-step history, oldest first, term-major: base ang vel 3 | joint pos − default 22 | joint vel 22 | last action 22 | gravity dir 3 (body frame) |
| Encoder / decoder | encoder [1, 1611] → token [1, 64]; decoder [1, 784] = token 64 | actor obs 720 → action [1, 22] |
| Output | 22 actions in IsaacLab joint order (listed below) |
| ONNX parity | ≈1e-5 (float32) on 392/400 MuJoCo clips; 8 clips show one isolated FSQ token flip (≤2e-2, ~1 step in 400). Closed loop with ONNX driving the robot: same success and MPJPE as PyTorch |
Joint order: head_yaw, L/R shoulder_pitch, L/R hip_pitch, head_pitch, L/R shoulder_roll, L/R hip_roll, L/R elbow_pitch,
L/R hip_yaw, L/R elbow_yaw, L/R knee_pitch, L/R ankle_pitch, L/R ankle_roll. Exact names are in k1_plant.json.
| Joints | kp | kd | Effort (N·m) | Action scale |
|---|---|---|---|---|
| head / arms | 3.95 | 0.25 | 6 / 14 | 0.38 / 0.89 |
| hip pitch | 30.2 | 3.61 | 68 | 0.56 |
| hip roll | 21.4 | 2.56 | 76 | 0.89 |
| hip yaw | 17.8 | 2.13 | 38.3 | 0.54 |
| knee | 60.4 | 4.81 | 112 | 0.46 |
| ankle pitch / roll | 35.7 | 4.26 | 38.3 | 0.27 |
Default pose: all zeros except shoulder roll ∓1.3 rad. Gains follow Booster's formula, kp = armature·(2π·4 Hz)², with
action_scale = 0.25·effort/kp. The SMPL encoder mode exists in the graph but is untrained; use mode 0 (robot motion).
Training
- Recipe: SONIC (GR00T-WholeBodyControl) universal-token tracker, with the same PPO settings, decoder MLP [4096, 4096, 2048, 2048, 1024, 1024, 512, 512], future-frame horizon and adaptive sampling as the release config.
- K1 changes:
- K1 robot config and joint maps;
- an extra head-joint tracking term (the K1 has an actuated head);
- pushes and COM randomization scaled ×0.7 for the smaller robot;
- mass randomization 0.9–1.3;
- initial action std 0.5.
- Data: 9,991 clips from Bones-SEED, retargeted to K1 at 60 fps with UMR. The clips are QA-filtered (joint limits, foot penetration, velocity spikes) and tagged for K1 feasibility (no waist, no wrists, 0.93 m).
- Compute: 16,384 parallel environments on one H100 NVL, 50,000 iterations, ~100 GPU-hours of compute (the run took ~135 h of wall time on a GPU shared with other jobs). Trained from scratch, seed 0. No NVIDIA checkpoint was used.
- Setup: headless, physics-only Isaac Lab on a shared H100, following our Isaac Lab on H100 guide. The K1 USD used is at Kyry10/booster-k1-usd.
- Software: Isaac Sim 5.1.0, Isaac Lab 0.54.4, torch 2.7.0+cu128, trl 0.28.0, accelerate 1.15.0, hydra-core 1.3.2, mujoco 3.13.0, onnx 1.22.0, onnxruntime 1.20.1, numpy 1.26.4.
Evaluation
Isaac Lab, 10 s windows, 2,000 parallel envs, deterministic actions. Unseen = 1,985 held-out Bones-SEED clips never used in training. Seen = 2,000 training clips.
| Rule | Unseen success | Seen success |
|---|---|---|
| Official repo eval (height, orientation, end-effector and foot-position limits) | 93.1% | 98.5% |
| Same, without the strict foot-position term | 97.9% | 98.8% |
| No-fall rule (root height ±0.25 m, tilt < 1 rad) | 98.7% | 98.8% |
Unseen tracking error, over successful clips as in SONIC/PHC: MPJPE-L 14.7 mm, PA-MPJPE 10.8 mm, MPJPE-G 84.9 mm.
Over all clips: 15.5 / 11.4 / 85.8 mm. Every number is in release.json.
Legs 17.4 mm, hands and head 11.7 mm, feet 18.7 mm.
Over training (same 1,985 unseen clips, official rule): 85.8% at 8.4K it, 90.4% at 18K, 92.2% at 29K, 93.1% at 50K.
Full-length clips (no 10 s cut): 98.6% paper rule / 93.4% official, MPJPE-L 15.0 mm. Teleop mode (head + hands targets with lower-body joints): 98.7% / 93.4%, MPJPE-L 15.1 mm.
PHUMA (the SONIC paper's external benchmark; HF release, 2,000 motions stratified over its 15 sources, G1 → K1 robot retarget, 1,758 pass QA; MuJoCo): 93.6% under SONIC's rule, 97.3% no-fall, 85.0% official-like; MPJPE-L 22.4 mm.
100STYLE (100 locomotion styles × forward walk/run, 200 clips × 20 s, MuJoCo): 99.0% under SONIC's rule, MPJPE-L 22.5 mm.
MuJoCo, all 1,985 unseen (10 s): 98.4% paper rule / 91.9% official-like, MPJPE-L 16.6 mm, PA 12.4 mm. Hardware-like condition (Booster deploy torque caps + 20 ms latency + PD ×0.8, MuJoCo, 1,985 unseen): 95.9% / 87.7%, MPJPE-L 19.3 mm.
MuJoCo sim-to-sim, 200-clip subsets (different physics engine, explicit PD, 5 ms steps, 10 s clips, 200 + 200 clips; MPJPE over all clips):
| Set | Paper rule | Official-like | MPJPE-L | PA-MPJPE |
|---|---|---|---|---|
| Unseen 200 | 99.0% | 90.5% | 16.2 mm | 12.3 mm |
| Seen 200 | 96.0% | 93.5% | 16.3 mm | 11.9 mm |
The released files reproduce these numbers: the shipped actor .pt and config.yaml give 92.5% official in Isaac Lab on 200 unseen clips. With ONNX driving the
robot in MuJoCo, success and MPJPE match PyTorch (99.0 / 90.5%, 16.2 mm).
These numbers are on a Bones-SEED hold-out split, not the paper's AMASS test set, and the K1 is ~0.7× the G1's size. Don't compare millimetres with G1 or X2 results.
Comparison with published trackers (indicative)
Success without a fall on unseen motions. Other methods run on the Unitree G1 as published, with their own retargeting and protocols.
All rows use the SONIC paper's success rule: a rollout fails if the root or an end-effector height deviates by more than 0.25 m. Ours are in MuJoCo with --no-terminate.
| Benchmark | SONIC-K1 (ours, K1; run by us) | SONIC (G1)* | BeyondMimic (G1)* | Any2Track (G1)* |
|---|---|---|---|---|
| PHUMA (1,758 clips, G1→K1) | 93.6% | 97.2% | 73.8% | 78.5% |
| Held-out mocap (ours: 1,985 Bones-SEED; SONIC: in-house test-content) | 97.4% | 98.5% | 82.0% | 61.6% |
* Reported in the SONIC paper (Luo et al., arXiv 2511.07820); we did not rerun these methods. They run on the Unitree G1 with their own data and retargeting, so this comparison is indicative. SONIC-K1 is the first open-weights general motion-tracking model for the Booster K1.
Coming soon
- Real Booster K1 runs: the policy on hardware, with videos
- Whole-body teleoperation: drive the K1 live from a VR headset
- Deployment controller: an open runtime for the Booster SDK
- Video to K1: SMPL/video input, so you can film a move and the K1 does it
- A bigger model: trained on 62K motions (6× more)
Intended use
Non-commercial research and education on humanoid whole-body control. Not for safety-critical, hazardous or commercial deployment.
License and attribution
- These weights: CC BY-NC 4.0 (non-commercial, required by the training-data license).
- Code: Apache-2.0 (fork of NVlabs/GR00T-WholeBodyControl).
- Robot model: BoosterRobotics/booster_assets, BSD-3-Clause.
- NVIDIA: this model was trained from scratch with SONIC's open-source code and does not include NVIDIA weights.
NOTICElinks the NVIDIA Open Model License for reference.
Training data includes Motion Data by Bones Studio (https://bones.studio/). Use of the underlying dataset is subject to the BONES Motion Capture Dataset License Agreement. No motion data, raw or retargeted, is distributed here.
Citation
@misc{kolesnichenko2026sonick1,
title = {SONIC-K1: Whole-Body Motion Tracking for the Booster K1 Humanoid},
author = {Kolesnichenko, Kyrylo},
year = {2026},
howpublished = {\url{https://huggingface.co/Kyry10/sonic-k1}}
}
@article{luo2025sonic,
title = {SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control},
author = {Luo, Zhengyi and Yuan, Ye and Wang, Tingwu and Li, Chenran and Chen, Sirui and Casta\~neda, Fernando and Cao, Zi-Ang and Li, Jiefeng and Minor, David and Ben, Qingwei and Da, Xingye and Ding, Runyu and Hogg, Cyrus and Song, Lina and Lim, Edy and Jeong, Eugene and He, Tairan and Xue, Haoru and Xiao, Wenli and Wang, Zi and Yuen, Simon and Kautz, Jan and Chang, Yan and Iqbal, Umar and Fan, Linxi and Zhu, Yuke},
journal = {arXiv preprint arXiv:2511.07820},
year = {2025}
}
Acknowledgements
Thanks to NVIDIA GEAR for open-sourcing SONIC, to Bones Studio for Bones-SEED, to the UMR authors for the retargeter, and to Booster Robotics for the K1 models. Compute: ATR Lab.
- Downloads last month
- 12