Trong phần 1 của series, chúng ta đã nhìn SONIC như một kiến trúc điều khiển toàn thân: encoder cho motion robot, encoder cho SMPL human motion, encoder hybrid cho teleop, tất cả đi vào một không gian token chung rồi được decoder thành target joint positions cho humanoid. Phần 2 này chuyển từ “hiểu kiến trúc” sang “chạy được pipeline”.
Bài này tập trung vào đường chạy simulation chính trong repo NVlabs/GR00T-WholeBodyControl: cài môi trường MuJoCo nhẹ bằng bash install_scripts/install_mujoco_sim.sh, mở vòng lặp sim với python gear_sonic/scripts/run_sim_loop.py, chạy deployment C++ bằng bash gear_sonic_deploy/deploy.sh sim, sau đó đánh giá policy trong Isaac Lab bằng gear_sonic/eval_agent_trl.py.
Mục tiêu không phải là huấn luyện lại model lớn. Mục tiêu là giúp bạn kiểm tra policy SONIC đã tải về có chạy đúng, biết cách dùng sample_data/robot_filtered và sample_data/smpl_filtered, biết khi nào dùng ++eval_callbacks=im_eval, biết cách bật render bằng ++manager_env.config.render_results=True, và biết đọc các ngưỡng cơ bản: success_rate > 0.97, mpjpe_l < 30 mm, mpjpe_g < 200 mm.
Nguồn kỹ thuật nên mở song song:
| Nguồn | Dùng để làm gì |
|---|---|
| GR00T-WholeBodyControl Quick Start | Lệnh MuJoCo sim2sim, phím điều khiển, cách chạy simulator và deployment ở hai terminal |
| SONIC Training Guide | Lệnh eval bằng Isaac Lab, sample data override, render video, ngưỡng metric |
| Repo NVlabs/GR00T-WholeBodyControl | Cấu trúc thư mục, checkpoint, media, script deploy và training stack |
| Paper SONIC trên arXiv | Bối cảnh benchmark: success rate, MPJPE-L, sim-to-real và so sánh baseline |

1. Bức tranh tổng thể: sim2sim khác eval ở đâu?
Trước khi gõ lệnh, bạn cần tách hai mode hay bị nhầm:
| Mode | Mục đích | Tool chính | Kết quả mong đợi |
|---|---|---|---|
| MuJoCo sim2sim | Xem policy deployment chạy như khi nối với robot, nhưng robot nằm trong MuJoCo | run_sim_loop.py + deploy.sh sim |
Cửa sổ MuJoCo hiện robot, deployment nhận phím và phát motion |
| Isaac Lab evaluation | Chạy nhiều motion song song để lấy metric định lượng | gear_sonic/eval_agent_trl.py |
Log có success_rate, mpjpe_l, mpjpe_g; có thể xuất video |
MuJoCo sim2sim là bước “nhìn tận mắt”. Nó giúp bạn kiểm tra pipeline runtime: simulator, policy loop, giao tiếp giữa simulator và deployment, phím điều khiển, motion reference, emergency stop. Nếu robot đứng yên, ngã ngay, hoặc không nhận phím T, lỗi thường nằm ở môi trường, checkpoint, đường dẫn data, hoặc thứ tự khởi động.
Isaac Lab eval là bước “đo bằng số”. Nó không thay thế sim2sim vì bạn có thể có metric tốt nhưng vẫn muốn nhìn video để phát hiện behavior xấu. Ngược lại, một clip đẹp cũng chưa đủ nếu policy chỉ chạy tốt trên một motion dễ. Với SONIC, tài liệu chính thức xem success_rate, mpjpe_l và mpjpe_g là bộ metric thực dụng để biết policy đã hội tụ hoặc checkpoint có bị lệch môi trường hay không.
Một cách nghĩ đơn giản: sim2sim trả lời “nó có chạy không?”; eval trả lời “nó chạy tốt đến mức nào?”.
2. Chuẩn bị repo và checkpoint
Bài này giả định bạn đã clone repo:
git clone https://github.com/NVlabs/GR00T-WholeBodyControl.git
cd GR00T-WholeBodyControl
Repo dùng Git LFS cho nhiều asset lớn. Nếu clone mà không pull LFS, bạn có thể thấy file tồn tại nhưng nội dung chỉ là pointer rất nhỏ. Trường hợp này dễ gây lỗi âm thầm: mesh không load, checkpoint không đúng, GIF hoặc ONNX trông như có nhưng thực ra không phải binary đầy đủ.
Kiểm tra Git LFS trước khi đi xa:
git lfs install
git lfs pull
Với SONIC release, bạn cũng cần tải model checkpoint và sample data theo hướng dẫn của repo. Tài liệu training dùng checkpoint sonic_release/last.pt cho ví dụ eval, còn sample motion nằm ở:
sample_data/robot_filtered
sample_data/smpl_filtered
Hai thư mục này đại diện cho hai dạng reference khác nhau. robot_filtered là trajectory đã ở không gian robot G1, phù hợp khi đánh giá robot-motion encoder. smpl_filtered là dữ liệu human SMPL đã xử lý, phù hợp khi đánh giá encoder nhận pose người. Trong config sonic_release, cả hai đường dẫn thường cần có mặt vì policy release hỗ trợ nhiều encoder và config checkpoint có thể tham chiếu cả motion robot lẫn SMPL motion.
Điểm dễ sai cho beginner: checkpoint release được huấn luyện trong môi trường nội bộ của NVIDIA, nên config.yaml nhúng trong checkpoint có thể chứa path nội bộ không tồn tại trên máy của bạn. Vì vậy khi eval checkpoint release, bạn nên override motion path bằng sample_data/robot_filtered và sample_data/smpl_filtered. Với checkpoint tự train trong workspace của bạn, nếu config đã lưu đúng path local thì có thể bỏ override này.
3. Cài môi trường MuJoCo simulator
Từ repo root, chạy:
bash install_scripts/install_mujoco_sim.sh
Theo tài liệu Quick Start, script này tạo một virtual environment nhẹ tên .venv_sim, chỉ chứa dependency cần cho simulator: MuJoCo, Pinocchio, Unitree SDK2 và các gói runtime liên quan. Đây là lựa chọn có chủ ý. Training stack của SONIC cần Isaac Lab và GPU simulation nặng; simulator runtime thì không nên kéo cả môi trường training vào. Tách môi trường giúp bạn debug nhanh hơn và giảm khả năng dependency của training phá dependency của deployment.
Sau khi cài xong, kiểm tra:
source .venv_sim/bin/activate
python -c "import mujoco; print('mujoco ok')"
Nếu import MuJoCo lỗi, đừng vội sửa script deploy. Hãy xử lý môi trường sim trước. Sim2sim yêu cầu terminal chạy simulator dùng đúng .venv_sim; terminal deployment có thể chạy native hoặc trong Docker tùy setup, nhưng simulator MuJoCo theo hướng dẫn chính thức chạy trên host, không nằm trong Docker container.
4. Chạy MuJoCo sim loop ở Terminal 1
Mở terminal thứ nhất tại repo root:
cd GR00T-WholeBodyControl
source .venv_sim/bin/activate
python gear_sonic/scripts/run_sim_loop.py
Terminal này chịu trách nhiệm mở viewer MuJoCo và mô phỏng robot. Hãy để nó chạy. Nếu viewer chưa xuất hiện ngay, chờ vài giây và xem log có báo thiếu asset, thiếu XML, hay lỗi dynamic library không.
Khi viewer hiện robot, bạn chưa điều khiển policy ngay. Lúc này simulator giống một robot ảo đang chờ deployment binary kết nối. Với người mới, đây là điểm dễ nhầm: run_sim_loop.py không phải toàn bộ policy. Nó là phía simulation. Policy runtime nằm ở deployment process.
5. Chạy deployment ở Terminal 2
Mở terminal thứ hai. Tài liệu chính thức chạy từ thư mục gear_sonic_deploy/:
cd GR00T-WholeBodyControl/gear_sonic_deploy
bash deploy.sh sim
Lệnh này chạy stack deployment theo chế độ sim, tức thay vì nói chuyện với robot G1 thật, nó nói chuyện với simulator. Trong mental model production, đây là cách kiểm tra cùng logic deployment trước khi đi tới hardware. Bạn muốn mọi thứ liên quan đến policy loading, interface manager, motion selection và stop command hoạt động ổn trong simulation trước.
Nếu dùng Docker cho phần deployment, tài liệu lưu ý Terminal 1 vẫn nên chạy trên host với .venv_sim, còn Terminal 2 có thể nằm trong container. Dù chạy native hay Docker, nguyên tắc debug vẫn giống nhau: simulator phải lên trước, deployment lên sau, rồi mới bắt đầu control.
6. Thứ tự phím khi bắt đầu control
Sau khi cả hai terminal đã sẵn sàng, làm theo trình tự này:
- Ở Terminal 2, nhấn
]để start policy. - Click vào cửa sổ MuJoCo viewer.
- Trong viewer, nhấn
9để thả robot xuống mặt đất. - Quay lại Terminal 2, nhấn
Tđể phát motion reference hiện tại. - Nhấn
NhoặcPđể chuyển sang motion kế tiếp hoặc motion trước đó. - Nhấn
Tlần nữa để phát motion mới. - Nếu muốn replay motion hiện tại sau khi kết thúc, nhấn lại
T. - Nếu muốn dừng motion và quay về frame đầu của motion hiện tại, nhấn
R. - Khi cần dừng hẳn hoặc emergency stop, nhấn
O.
Không nên bấm loạn phím khi chưa hiểu trạng thái hiện tại. Với humanoid whole-body policy, “đang đứng chờ”, “đã start policy”, “đã drop xuống đất”, “đang phát motion” là các trạng thái khác nhau. Nếu bạn nhấn T trước khi policy start, hoặc chưa drop robot đúng cách, log có thể làm bạn tưởng policy hỏng trong khi chỉ sai thứ tự thao tác.

7. Cách đọc lỗi sim2sim thường gặp
Khi sim2sim không chạy, hãy chia lỗi theo lớp:
| Triệu chứng | Khả năng cao | Cách kiểm tra |
|---|---|---|
| Không import được MuJoCo | .venv_sim chưa kích hoạt hoặc cài lỗi |
which python, python -c "import mujoco" |
| Viewer mở nhưng robot không phản ứng | Deployment chưa start policy hoặc chưa kết nối | Xem Terminal 2, nhấn ], kiểm tra log kết nối |
| Robot ngã ngay khi phát motion | Motion không phù hợp, sai checkpoint, sai asset hoặc chưa drop đúng | Thử motion khác bằng N/P, restart bằng R |
| Nhấn phím không có tác dụng | Focus đang ở sai cửa sổ hoặc sai terminal | Click viewer cho phím viewer, quay Terminal 2 cho phím deployment |
| Chạy trong Docker nhưng sim không lên | Simulator đang bị chạy trong môi trường không có viewer/display | Đưa Terminal 1 ra host như Quick Start khuyến nghị |
Đừng sửa policy khi lỗi nằm ở viewer hoặc venv. Một policy humanoid có thể phức tạp, nhưng nhiều lỗi ban đầu lại rất cơ bản: sai Python, thiếu Git LFS, chưa tải checkpoint, hoặc chạy lệnh từ sai thư mục.
8. Chạy Isaac Lab eval với sample data
Khi sim2sim đã ổn, chuyển sang eval định lượng. Lệnh metrics cơ bản cho checkpoint release:
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/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"
Giải thích từng phần:
| Tham số | Ý nghĩa |
|---|---|
+checkpoint=sonic_release/last.pt |
Load checkpoint release |
+headless=True |
Chạy không mở viewer, phù hợp để lấy metric |
++eval_callbacks=im_eval |
Bật callback imitation evaluation để log metric tracking |
++run_eval_loop=False |
Chạy eval hữu hạn thay vì loop tương tác liên tục |
++num_envs=128 |
Chạy 128 environment song song, nhanh hơn nhưng tốn GPU memory hơn |
+manager_env/terminations=tracking/eval |
Dùng termination rule cho tracking evaluation |
max_unique_motions=512 |
Giới hạn số motion unique để eval nhanh trên sample hoặc smoke test |
motion_file=sample_data/robot_filtered |
Override path robot motion |
smpl_motion_file=sample_data/smpl_filtered |
Override path SMPL motion |
Với beginner, nên bắt đầu bằng num_envs=16 hoặc num_envs=32 nếu GPU yếu. Khi lệnh chạy ổn mới tăng lên 128. Nếu hết VRAM, giảm num_envs trước khi nghi ngờ code.
9. Render video từ Isaac Lab eval
Metric tốt nhưng bạn vẫn nên xem video. Render command:
python gear_sonic/eval_agent_trl.py \
+checkpoint=sonic_release/last.pt \
+headless=True \
++eval_callbacks=im_eval \
++run_eval_loop=False \
++num_envs=8 \
++manager_env.config.render_results=True \
"++manager_env.config.save_rendering_dir=/tmp/sonic_renders" \
++manager_env.config.env_spacing=10.0 \
"~manager_env/recorders=empty" "+manager_env/recorders=render" \
++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"
Ở đây ++manager_env.config.render_results=True là công tắc quan trọng. save_rendering_dir chỉ nơi ghi video. num_envs=8 đủ để render vài motion mà không tạo quá nhiều file. env_spacing=10.0 giúp các robot trong scene cách nhau, tránh video bị chồng hình. Hai override enable_corruption=False giúp video eval sạch hơn, vì lúc render để kiểm tra behavior bạn thường muốn tắt noise/corruption.
Video sẽ được ghi kiểu 000000.mp4, 000001.mp4 trong /tmp/sonic_renders. Khi xem, hãy kiểm tra bốn điểm: robot có bám reference không, chân có trượt quá nhiều không, thân có rung bất thường không, và motion kết thúc có bị early termination không.

10. Hiểu success_rate, mpjpe_l, mpjpe_g
Ba metric nên nhìn đầu tiên:
| Metric | Ngưỡng kỳ vọng | Cách hiểu thực dụng |
|---|---|---|
success_rate |
> 0.97 |
Tỷ lệ motion được track đến cuối mà không early termination |
mpjpe_l |
< 30 mm |
Mean per-joint position error trong frame local, phản ánh độ khớp pose tương đối |
mpjpe_g |
< 200 mm |
Mean per-joint position error trong frame global, nhạy với drift vị trí toàn cục |
success_rate thấp là tín hiệu đỏ nhất. Nếu nhiều episode terminate sớm, policy không chỉ “hơi lệch” mà có thể mất ổn định, va chạm sai, hoặc đi quá xa reference. Với checkpoint release và sample data đúng, bạn nên kỳ vọng vượt 0.97. Nếu chỉ đạt 0.6 hoặc 0.7, gần như chắc chắn có vấn đề path, checkpoint, config, asset, hoặc môi trường.
mpjpe_l giúp bạn biết robot có giữ đúng hình dáng chuyển động không. Vì đo local, metric này giảm ảnh hưởng của việc robot bị lệch toàn cục một chút. Ngưỡng < 30 mm là mức rất chặt cho whole-body imitation. Paper SONIC báo các kết quả MPJPE-L quanh vùng 20-30 mm cho nhiều split đánh giá, và tài liệu training xem < 30 mm là dấu hiệu checkpoint đã hội tụ tốt.
mpjpe_g khó hơn vì tính trong frame global. Một robot giữ pose đẹp nhưng drift vài chục cm theo thời gian sẽ có mpjpe_l ổn nhưng mpjpe_g xấu. Vì vậy đừng chỉ nhìn local. Trong deployment thực, global drift có thể làm robot bước lệch khỏi vị trí làm việc, va vào bàn, hoặc không đến đúng vùng thao tác.
11. Smoke test hay full evaluation?
Với repo mới clone, đừng bắt đầu bằng full dataset. Hãy chạy theo ba tầng:
| Tầng | Cấu hình | Khi nào dùng |
|---|---|---|
| Smoke test | sample_data, num_envs=8-32, max_unique_motions=32-128 |
Kiểm tra setup, tránh mất thời gian |
| Sample eval nghiêm túc | sample_data, num_envs=128, max_unique_motions=512 |
Lấy metric đủ ổn để so sánh thay đổi nhỏ |
| Full eval | data/motion_lib_bones_seed/robot_filtered và data/smpl_filtered |
Đánh giá checkpoint tự train hoặc finetune |
Sample data không đại diện toàn bộ 142K+ motion của BONES-SEED. Nó dùng để kiểm tra pipeline và minh họa. Nếu bạn muốn kết luận policy tổng quát hóa tốt, phải dùng tập đầy đủ hoặc ít nhất một split held-out rõ ràng. Tuy vậy, sample eval vẫn cực kỳ hữu ích: nó cho bạn một bài kiểm tra nhanh sau mỗi lần đổi config, đổi checkpoint, hoặc đổi môi trường Isaac Lab.
12. Checklist trước khi tin kết quả
Trước khi ghi “policy đạt 98% success”, hãy tự hỏi:
- Checkpoint có đúng file không, hay bạn đang load nhầm checkpoint cũ?
- Motion path có override đúng không?
sample_data/robot_filteredvàsample_data/smpl_filteredcó tồn tại và không rỗng không?- Bạn đang dùng đúng môi trường Isaac Lab theo version repo yêu cầu không?
num_envscó bị giảm quá thấp khiến metric dao động mạnh không?- Có bật render để xem một vài failure case không?
- Có lưu lại lệnh eval đầy đủ để người khác reproduce không?
Trong robotics, metric không có command đi kèm gần như không đủ giá trị. Chỉ cần đổi termination rule, đổi motion split, hoặc đổi max_unique_motions, kết quả có thể khác. Hãy lưu cả checkpoint path, data path, số env, số motion, commit repo nếu bạn đang làm nghiên cứu hoặc benchmark nội bộ.
13. Liên hệ với các phần sau của series
Phần này mới dừng ở chạy và đo. Ở phần 3, chúng ta sẽ đi vào dữ liệu và training: convert BONES-SEED CSV, filter motion, chuẩn bị SMPL/SOMA, và hiểu vì sao motion tracking là task scale tốt cho humanoid. Sau đó phần 4 sẽ nối từ sim sang deployment runtime: ZMQ, C++ inference, ONNX export, và các điểm cần kiểm tra trước khi đưa policy đến robot thật. Nếu bạn cần nền tảng MuJoCo/Isaac rộng hơn, đọc thêm MuJoCo cho robotics simulation và Isaac Lab cho robot learning.
Điều quan trọng nhất của bài 2 là tạo một thói quen đúng: mỗi policy whole-body phải đi qua cả mắt người lẫn metric. MuJoCo sim2sim giúp bạn nhìn được behavior runtime. Isaac Lab eval giúp bạn đo được độ ổn định và tracking error. Khi cả hai cùng ổn, bạn mới có nền tảng đáng tin để bước sang training, teleop, VLA hoặc deployment thật.
Nguồn tham khảo
- GR00T-WholeBodyControl Quick Start
- SONIC Training Guide
- NVlabs/GR00T-WholeBodyControl GitHub repo
- SONIC: Supersizing Motion Tracking for Natural Humanoid Whole-Body Control


