Hãy nghĩ đến một vận động viên bơi lội chuyên nghiệp — toàn thân chuyển động trong một luồng liên tục hoàn hảo: tay, vai, hông, chân phối hợp mà không cần suy nghĩ. Đó không phải lập trình thủ công; đó là bản năng được tích lũy qua hàng nghìn giờ luyện tập. SONIC làm chính xác điều đó cho robot humanoid: thay vì lập trình từng động tác riêng lẻ, bạn cho robot "xem" 100 triệu frame chuyển động người thực, và để mạng neural tự học phối hợp toàn thân.
Bài viết này là hướng dẫn từ A đến Z: từ bối cảnh Science Robotics 2026, qua kiến trúc kỹ thuật, đến cài đặt, huấn luyện, đánh giá và deploy SONIC controller trên Unitree G1 với framework GR00T-WholeBodyControl mã nguồn mở của NVIDIA.
Tại Sao Science Robotics 2026 Là Bước Ngoặt?
Paper SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control (DOI: 10.1126/scirobotics.aed4592), được chấp nhận đăng trên Science Robotics Vol. 11, Issue 117 (2026) bởi Zhengyi Luo, Ye Yuan, Tingwu Wang và hơn 25 đồng tác giả từ NVIDIA GEAR Lab, đánh dấu một bước chuyển căn bản.
Trước SONIC, cộng đồng robotics vẫn loay hoay với bài toán "split controller": một module điều khiển chân (locomotion), một module điều khiển tay (manipulation), một layer phối hợp thủ công. Mỗi behavior mới đòi hỏi thiết kế reward function riêng, train riêng, test riêng. Không scale được.
SONIC đặt câu hỏi khác hẳn: "Nếu dạy robot bắt chước chính xác bất kỳ chuyển động người nào — liệu robot có tự động học được mọi kỹ năng không?"
Câu trả lời là có. Và được chứng minh bằng ba trục scaling:
| Trục Scaling | Nhỏ nhất | Lớn nhất |
|---|---|---|
| Kích thước mô hình | 1.2M tham số | 42M tham số |
| Dữ liệu huấn luyện | Vài chục giờ mocap | 100M+ frames (700 giờ) |
| Tài nguyên tính toán | ~1k GPU hours | 21,000 GPU hours |
Kết quả: một policy duy nhất điều khiển toàn bộ 29 bậc tự do của Unitree G1 — bao gồm cả hai tay — với khả năng generalize sang chuyển động chưa thấy trong training, robust với perturbations ngoài, và deploy thẳng từ simulation lên robot thật không cần fine-tune thêm.
GR00T-WholeBodyControl: Framework Mã Nguồn Mở
NVIDIA phát hành GEAR-SONIC vào ngày 19/02/2026 kèm theo:
- Checkpoint pretrained trên HuggingFace (
nvidia/GEAR-SONIC) - Framework GR00T-WholeBodyControl (Apache 2.0): github.com/NVlabs/GR00T-WholeBodyControl
- C++ inference stack tối ưu cho Jetson Orin (latency 1–2 ms)
- VR teleoperation qua PICO headset
- Tài liệu đầy đủ: nvlabs.github.io/GR00T-WholeBodyControl

GR00T-WholeBodyControl là một unified platform hỗ trợ nhiều kiểu controller:
- SONIC — behavior foundation model học từ mocap (focus của bài này)
- Decoupled WBC — dùng trong GR00T N1.5/N1.6 cho VLA integration
- Hỗ trợ custom embodiment (có example cho robot H2)
Kiến Trúc SONIC: Ba Encoder, Một Token Space
Hiểu kiến trúc giúp bạn debug training và thiết kế fine-tuning hiệu quả. Chi tiết đầy đủ xem tại kiến trúc SONIC, đây là overview ngắn gọn:
Ba Encoder Chuyên Biệt
SONIC có ba encoder độc lập, mỗi cái xử lý một kiểu input khác nhau:
Robot Motion Encoder (Er) — nhận 10 frame tương lai (cách 0.1s/frame) của robot joint trajectory. Dùng khi bạn có target trajectory đã được retarget từ mocap sang robot.
Human Motion Encoder (Eh) — nhận 10 frame tương lai (cách 0.02s/frame) của SMPL pose — chuẩn biểu diễn thân người 3D từ Max Planck Institute. Dùng khi bạn có raw mocap data.
Hybrid Motion Encoder (Em) — nhận lệnh hỗn hợp robot/người (ví dụ: 3 điểm VR tracking — đầu + 2 cổ tay). Dùng trong VR teleoperation và video-based control.
Tất cả encoder đều là MLP với kiến trúc [2048, 1024, 512, 512].
Finite Scalar Quantization (FSQ): Ngôn Ngữ Chung
Output của ba encoder được lượng tử hóa vào cùng một không gian token rời rạc qua FSQ. Đây là bước then chốt: dù input đến từ robot trajectory, SMPL pose hay VR controller, chúng đều trở thành "tokens" trong cùng một ngôn ngữ.
Ý nghĩa thực tế: bạn có thể chuyển đổi seamless giữa các chế độ điều khiển (gamepad → VR → VLA output) mà không cần retrain gì cả — chỉ cần chọn encoder phù hợp.
Decoder và Action Space
Control Decoder (Dc) biến tokens thành 29 target joint positions (phân phối Gaussian). Decoder MLP: [2048, 2048, 1024, 1024, 512, 512].
Auxiliary Robot Motion Decoder (Dr) tái tạo robot motion để tạo supervision signal bổ sung trong quá trình training — giúp encoder học biểu diễn tốt hơn.
| Thông Số | Giá Trị |
|---|---|
| Action space | 29-dimensional joint positions |
| Policy frequency | 50 Hz |
| Motor stream | 500 Hz (Unitree low-level API) |
| Inference latency | 1–2 ms (Jetson Orin, TensorRT + CUDA Graph) |
Dataset BONES-SEED: 100M+ Frames Motion Capture
SONIC train trên BONES-SEED (Bones Studio Skeletal Everyday Embodiment Dataset) — dataset motion capture lớn nhất trong lịch sử humanoid robotics tính đến 2026:
| Thông Số | Giá Trị |
|---|---|
| Tổng số motion sequences | 142,220 (71,132 gốc + 71,088 mirror) |
| Thời lượng | ~288 giờ @ 120 fps |
| Tổng số frames | ~124 triệu frames |
| Số diễn viên | 522 người (253 nữ, 269 nam) |
| Độ tuổi | 17–71 tuổi |
| Chiều cao | 145–199 cm |
| Thiết bị thu | Vicon optical mocap (sub-millimeter accuracy) |
| Định dạng phân phối | SMPL + retargeted Unitree G1 SOMA CSV |
Dataset gốc trong nghiên cứu SONIC thu thập từ 170 người. Tháng 3/2026 tại GTC, Bones Studio mở rộng và công bố phiên bản công khai với 522 diễn viên.
Tại sao cần nhiều diễn viên? Mỗi người có tỷ lệ cơ thể khác nhau — chân dài, tay ngắn, vai rộng, hông hẹp. SONIC phải học cách retarget các tỷ lệ cơ thể khác nhau sang khung xương cố định của Unitree G1 (cao 127 cm, nặng 35 kg). Nhiều diễn viên = nhiều tỷ lệ = controller generalize tốt hơn, ít "overfit" vào một kiểu cơ thể cụ thể.
Cài Đặt GR00T-WholeBodyControl
Yêu Cầu Phần Cứng
| Thành Phần | Tối Thiểu | Khuyến Nghị |
|---|---|---|
| GPU training | RTX 4090 (24 GB VRAM) | NVIDIA L40 / A100 |
| RAM | 64 GB | 128 GB |
| Lưu trữ | 200 GB SSD | 500 GB NVMe |
| OS | Ubuntu 22.04 | Ubuntu 22.04 |
| Python | 3.11 (bắt buộc) | 3.11 |
| CUDA | 12.x | 12.4 |
Training SONIC đầy đủ từ đầu cần ~21,000 GPU hours (khoảng 2 tuần trên cluster 64x A100). Fine-tune từ checkpoint pretrained chỉ cần vài trăm GPU hours — hoàn toàn khả thi trên một GPU đơn lẻ.
Bước 1: Cài Đặt Isaac Lab
Isaac Lab là simulation environment bắt buộc. Cài theo hướng dẫn chính thức tại Isaac Lab v2.3.2, sau đó verify:
python -c "import isaaclab; print(isaaclab.__version__)"
# Expected: 2.3.2 hoặc cao hơn
Bước 2: Clone và Cài GR00T-WholeBodyControl
git clone https://github.com/NVlabs/GR00T-WholeBodyControl.git
cd GR00T-WholeBodyControl
# Cài package training (kèm dependencies)
pip install -e "gear_sonic/[training]"
# Cài HuggingFace Hub để download checkpoint
pip install huggingface_hub
Bước 3: Download Checkpoint và Dữ Liệu Mẫu
# Download checkpoint PyTorch + SMPL motion data (~5 GB)
python download_from_hf.py --training
# Download sample data nhỏ để test nhanh (~200 MB)
python download_from_hf.py --sample
# Kiểm tra môi trường đầy đủ
python check_environment.py --training
Checkpoint được host tại nvidia/GEAR-SONIC trên HuggingFace. Script download_from_hf.py tự xử lý authentication và đặt file đúng thư mục.
Chuẩn Bị Dataset BONES-SEED
Nếu muốn fine-tune với dữ liệu riêng hoặc toàn bộ BONES-SEED, cần qua hai bước xử lý:
Bước 1: Convert SOMA CSV → Motion Library
BONES-SEED phân phối ở định dạng SOMA CSV (kết quả retarget từ SMPL sang Unitree G1). Bước này convert sang định dạng internal mà SONIC trainer đọc:
python gear_sonic/data_process/convert_soma_csv_to_motion_lib.py \
--input /path/to/bones_seed/g1/csv/ \
--output data/motion_lib_bones_seed/robot \
--fps 30 \
--fps_source 120 \
--individual \
--num_workers 16
--fps_source 120— BONES-SEED thu ở 120 fps--fps 30— downsample xuống 30 fps cho training nhẹ hơn--individual— mỗi motion lưu thành file riêng, dễ filter
Bước 2: Lọc Motion Chất Lượng Thấp
Không phải toàn bộ 142K motions đều phù hợp — một số quá ngắn, quá tĩnh, hoặc có lỗi retarget:
python gear_sonic/data_process/filter_and_copy_bones_data.py \
--source data/motion_lib_bones_seed/robot \
--dest data/motion_lib_bones_seed/robot_filtered \
--workers 16
Sau filter, dữ liệu "clean" nằm tại data/motion_lib_bones_seed/robot_filtered/.
Tham khảo hướng dẫn training và export ONNX để xử lý dữ liệu mocap tùy chỉnh (custom embodiment).
Huấn Luyện SONIC
Smoke Test Bắt Buộc Trước Khi Train
Luôn chạy smoke test 5 iterations trước khi dùng toàn bộ dataset — tránh lãng phí GPU hours:
# Với UI (để xem robot di chuyển trong Isaac Sim)
python gear_sonic/train_agent_trl.py \
+exp=manager/universal_token/all_modes/sonic_release \
num_envs=16 \
headless=False \
++algo.config.num_learning_iterations=5
# Headless (trên server không có màn hình)
python gear_sonic/train_agent_trl.py \
+exp=manager/universal_token/all_modes/sonic_release \
num_envs=16 \
headless=True \
++algo.config.num_learning_iterations=5
Smoke test pass nghĩa là: Isaac Lab render đúng, policy network load được, data pipeline hoạt động, không có CUDA OOM.
Fine-Tune Từ Checkpoint Pretrained (Khuyến Nghị)
python gear_sonic/train_agent_trl.py \
+exp=manager/universal_token/all_modes/sonic_release \
num_envs=256 \
headless=True \
++algo.config.num_learning_iterations=10000 \
+checkpoint=sonic_release/last.pt
num_envs=256— số parallel simulation environments. Tăng tối đa RAM/VRAM cho phép+checkpoint=sonic_release/last.pt— fine-tune từ checkpoint thay vì random init- Fine-tune chỉ cần vài trăm GPU hours; train từ đầu cần ~21,000 GPU hours
Đánh Giá Checkpoint
Xem Policy Trong Isaac Sim
python gear_sonic/eval_agent_trl.py \
+checkpoint=sonic_release/last.pt \
+headless=False \
++num_envs=1 \
++manager_env.observations.policy.enable_corruption=False \
++manager_env.observations.tokenizer.enable_corruption=False \
"++manager_env.commands.motion.motion_lib_cfg.motion_file=sample_data/robot_filtered" \
"++manager_env.commands.motion.motion_lib_cfg.smpl_motion_file=sample_data/smpl_filtered"
Đánh Giá Metrics Tự Động (128 Environments)
python gear_sonic/eval_agent_trl.py \
+checkpoint=sonic_release/last.pt \
+headless=True \
++eval_callbacks=im_eval \
++run_eval_loop=False \
++num_envs=128 \
++manager_env.observations.policy.enable_corruption=False \
++manager_env.observations.tokenizer.enable_corruption=False \
"+manager_env/terminations=tracking/eval" \
"++manager_env.commands.motion.motion_lib_cfg.max_unique_motions=512" \
"++manager_env.commands.motion.motion_lib_cfg.motion_file=sample_data/robot_filtered" \
"++manager_env.commands.motion.motion_lib_cfg.smpl_motion_file=sample_data/smpl_filtered"
Metric chính cần theo dõi: tracking accuracy trên tập motions chưa thấy trong training (generalization score).
Deploy: Từ Simulation Đến Robot Thật
Bước 1: Sim2Sim Qua MuJoCo
Trước khi chạy trên robot thật, luôn test qua MuJoCo để verify behavior an toàn:
# Cài MuJoCo simulation environment
bash install_scripts/install_mujoco_sim.sh
# Terminal 1: Khởi động MuJoCo simulator
source .venv_sim/bin/activate
python gear_sonic/scripts/run_sim_loop.py
# Terminal 2: Launch SONIC deployment stack
bash deploy.sh sim

Trong MuJoCo bạn có thể test: keyboard control (WASD di chuyển, QE xoay), gamepad (PS5/Xbox), và VR (PICO headset với setup thêm).
Bước 2: Deploy Trên Unitree G1 Thật
bash deploy.sh real
Lệnh này khởi động C++ inference stack, kết nối đến Unitree low-level API qua Ethernet, và chạy control loop 500 Hz.
Checklist an toàn trước khi chạy robot thật:
- Có người đứng cạnh với remote emergency stop
- Robot đứng trên vùng rộng, không có vật cản
- Test ở tốc độ thấp nhất trước (limit velocity trong config)
- Verify MuJoCo sim chạy ổn định ít nhất 5 phút trước khi chuyển sang real
Monitoring Realtime
# Stream joint states và tracking error realtime
python visualize_motion.py --realtime_debug_url tcp://localhost:5557
Tích Hợp VLA: SONIC Như Low-Level Controller
Một trong những ứng dụng quan trọng nhất của SONIC là làm low-level controller cho VLA models như GR00T N1.7. VLA predict compact latent action tokens, SONIC decode chúng thành full-body joint commands — kết hợp được vision, language, và whole-body motion trong một hệ thống.

Pipeline tích hợp VLA + SONIC:
- Camera input → VLA model (GR00T N1.7, embodiment tag
UNITREE_G1_SONIC) - VLA predict latent action tokens
- SONIC Hybrid encoder nhận tokens qua FSQ shared space
- Control Decoder output 29 joint targets
- 500 Hz motor stream → Unitree G1
Tham khảo hướng dẫn tích hợp VLA và teleoperation để biết cách kết nối GR00T N1.7 với SONIC controller trong thực tế.
Kết Quả và So Sánh
Theo kết quả trong paper Science Robotics 2026:
- Scaling law rõ ràng: tăng data + model size → tracking accuracy cải thiện monotonically
- Generalization mạnh: policy generalize tốt sang motions chưa thấy trong training
- Perturbation robust: tracking ổn định dưới external perturbations (đẩy robot từ bên ngoài)
- Sim2real gap nhỏ: deploy thẳng từ Isaac Lab lên G1 thật — 100% success rate trên nhiều behaviors
- Low latency: 1–2 ms inference trên Jetson Orin → real-time 500 Hz không drop frame
| Tiêu Chí | Split Controller Truyền Thống | SONIC |
|---|---|---|
| Behavior mới | Phải design reward mới + retrain | Chỉ cần thêm mocap data |
| Phối hợp tay/chân | Thủ công, phức tạp | Tự nhiên, học được |
| Scale với dữ liệu | Khó, phi tuyến | Scaling law rõ ràng |
| VLA integration | Phức tạp, nhiều glue code | Native support qua FSQ token |
| Deployment latency | Thấp (controller đơn giản) | 1–2 ms (TensorRT tối ưu) |
Mẹo Thực Tế Khi Dùng GR00T-WholeBodyControl
- Bắt đầu với fine-tune, không train từ đầu — checkpoint pretrained đã học đi/đứng/tay cơ bản; fine-tune chỉ tốn vài trăm GPU hours thay vì 21,000
- Smoke test 5 iterations bắt buộc trước mọi run dài — phát hiện lỗi config/data sớm, tiết kiệm GPU hours
- Filter dữ liệu nghiêm túc — motions ngắn hơn 2 giây hoặc quá tĩnh sẽ làm nhiễu training
- MuJoCo trước, robot thật sau — sim2sim verification tiết kiệm rất nhiều thời gian debug hardware
- Dùng
num_envslớn nhất có thể — SONIC dùng on-policy RL; nhiều parallel envs = sample efficient hơn nhiều - Monitor tracking loss — nếu loss không giảm sau 1,000 iterations, check data path và dataset format trước khi điều chỉnh hyperparameter
Để đi sâu vào deploy qua ZMQ protocol cho remote control setup, xem bài viết chuyên về phần này.


