GR00T-VisualSim2Real là repo mã nguồn mở của NVIDIA cho hai project rất đáng chú ý trong humanoid robot: VIRAL và DoorMan. Cả hai đều nhắm tới cùng một câu hỏi thực dụng: làm sao train policy hoàn toàn trong simulation, dùng RGB camera và proprioception, rồi đưa sang Unitree G1 thật mà không phải fine-tune lại trên robot thật?
Bài này hướng dẫn theo hướng beginner có thể follow được, nhưng cần nói rõ ngay từ đầu: đây không phải tutorial "chạy trên laptop trong một buổi tối". VIRAL và DoorMan thuộc nhóm whole-body visual loco-manipulation, tức robot vừa phải giữ thăng bằng, vừa di chuyển, vừa dùng tay thao tác với vật hoặc cửa. Paper VIRAL báo cáo training đáng tin cậy khi scale lên nhiều GPU, thậm chí tới 64 GPU cho student training. DoorMan cũng dùng nhiều GPU L40s ở các phase distillation và GRPO. Vì vậy mục tiêu hợp lý cho lab nhỏ là: cài được môi trường, chạy smoke test, train teacher/student ở quy mô giảm, evaluate trong Isaac Lab, export ONNX, rồi chỉ deploy thật khi đã có G1, camera, safety rig và whole-body control stack ổn định.
Nếu bạn mới đọc về VLA và policy training cho robot, nên xem trước hướng dẫn fine-tune GR00T N1, tổng quan WholeBodyVLA và sim-to-real cho humanoid. GR00T-VisualSim2Real nằm ở giao điểm của cả ba: simulation lớn, privileged RL, vision student, domain randomization và deploy lên humanoid thật.
Nguồn gốc paper và repo
Repo chính thức: NVlabs/GR00T-VisualSim2Real. README mô tả repo này chứa application code cho VIRAL và DoorMan, chạy trên Isaac Lab/Isaac Sim 5.1, dùng TRL và Hydra. Repo hỗ trợ teacher training bằng PPO, student training bằng DAgger distillation, evaluation và ONNX export.
Hai paper gốc:
| Project | Paper | Task chính | Robot | Điểm nổi bật |
|---|---|---|---|---|
| VIRAL | Visual Sim-to-Real at Scale for Humanoid Loco-Manipulation | Walk, stand, grasp, drop, turn, repeat | Unitree G1 | RGB policy chạy zero-shot tới 54 cycle loco-manipulation |
| DoorMan | Opening the Sim-to-Real Door for Humanoid Pixel-to-Action Policy Transfer | Mở nhiều loại cửa bằng RGB | Humanoid/Unitree G1-style stack | Teacher-student-bootstrap, GRPO, nhanh hơn human teleoperator tới 31.7% |
Ý tưởng chung rất rõ: teacher policy được train trong simulation với privileged state như trạng thái đầy đủ của robot, object, door, contact hoặc target. Teacher này giỏi nhưng không deploy trực tiếp được vì robot thật không đo được mọi thứ. Sau đó một student policy chỉ nhìn được dữ liệu giống robot thật, chủ yếu RGB camera và proprioception, học bắt chước teacher qua DAgger/behavior cloning. Với DoorMan, NVIDIA thêm phase GRPO fine-tuning để student xử lý partial observability tốt hơn trong task dài như mở cửa.
Sơ đồ pipeline tối giản:
Isaac Lab simulation
|
v
Privileged teacher (PPO)
obs: full state, object/door state, targets, contacts
action: whole-body delta action / joint targets
|
| rollouts + teacher actions
v
Vision student (DAgger + BC)
obs: RGB camera + proprioception + action history
action: same low-level action space
|
| optional for DoorMan
v
Student bootstrap / GRPO fine-tuning
reward: mostly task success, closed-loop consistency
|
v
Evaluation -> ONNX export -> real robot deployment
VIRAL khác DoorMan ở đâu?
VIRAL là framework tổng quát hơn cho humanoid loco-manipulation. Project page cho thấy G1 có thể đi tới bàn, đứng ổn định, grasp object, thả hoặc xoay người, rồi lặp lại nhiều lần. Paper nhấn mạnh ba nhóm kỹ thuật: delta action space và reference state initialization cho teacher, tiled rendering và online DAgger cho student, cuối cùng là visual domain randomization cộng real-to-sim alignment cho camera và dexterous hand.
DoorMan là benchmark hẹp hơn nhưng khó hơn về interaction với articulated object. Mở cửa không chỉ là "đưa tay tới handle". Robot phải ước lượng khoảng cách từ RGB, đưa thân tới đúng vị trí, grasp handle, kéo/đẩy theo hinge, giữ balance khi lực phản hồi thay đổi, và điều chỉnh khi góc cửa thay đổi mà camera không quan sát đủ. Vì vậy DoorMan thêm staged-reset exploration để teacher học long-horizon dễ hơn, và GRPO fine-tuning cho student sau DAgger. Project page DoorMan ghi rõ phase teacher PPO dùng 1 L40s khoảng 6 giờ, distill student dùng 32 L40s khoảng 24 giờ, rồi GRPO dùng 64 L40s khoảng 12 giờ. Đây là mốc tham khảo để bạn sizing compute, không phải yêu cầu tuyệt đối nếu chỉ chạy thử quy mô nhỏ.
Kiến trúc policy
Trong repo, cấu trúc code chính nằm dưới gr00t/rl/. Các thành phần quan trọng:
| Thư mục | Vai trò |
|---|---|
train_agent_trl.py |
Entry point cho teacher và student training |
eval_agent_trl.py |
Evaluate checkpoint và export ONNX khi num_envs=1 |
config/exp/loco_manip/ |
Hydra experiment configs cho task loco-manipulation |
config/robot/g1/ |
Cấu hình robot Unitree G1, bao gồm model G1 43-DOF |
config/obs/ |
Observation groups: privileged obs, RGB obs, proprioception |
config/domain_rand/ |
Visual/physics randomization |
envs/loco_manip/ |
Task implementation |
trl/trainer/ |
PPO và distillation trainer |
Một điểm beginner dễ nhầm: GR00T-VisualSim2Real không giống fine-tune một VLM bằng text/image dataset. Đây là closed-loop robot policy training. Simulator tạo rollout, policy xuất action, action làm robot di chuyển, trạng thái mới quay lại policy. Nếu observation hoặc latency trong sim khác robot thật, policy có thể fail ngay cả khi reward trong sim đẹp.
Teacher dùng privileged observations để học skill khó trước. Student không cần tự khám phá từ đầu, mà học "nếu nhìn thấy ảnh này và proprioception này, teacher sẽ hành động ra sao". DAgger khác behavior cloning offline ở chỗ student được chạy trong closed-loop, khi student lệch khỏi distribution ban đầu thì teacher vẫn cung cấp action sửa sai. Điều này rất quan trọng cho humanoid vì chỉ cần lệch vài cm ở base hoặc wrist là grasp có thể hỏng.
Yêu cầu phần cứng và phần mềm
Theo README repo, baseline môi trường là:
| Hạng mục | Khuyến nghị |
|---|---|
| OS | Ubuntu 22.04 |
| NVIDIA driver | >= 535 |
| Python | 3.11 |
| PyTorch | 2.7.0 + CUDA 12.8 wheel |
| Isaac Sim | 5.1 |
| Isaac Lab | bản tương thích Isaac Sim 5.1 |
| GPU | Tối thiểu một GPU NVIDIA mạnh để smoke test; nhiều GPU cho training nghiêm túc |
| Tracking | Weights & Biases mặc định |
Nếu bạn chỉ có một RTX 4090 hoặc một L40s, hãy bắt đầu bằng num_envs nhỏ, chạy headless, evaluate thường xuyên và đừng kỳ vọng reproduce full paper. Với visual policy, VRAM bị ăn bởi simulator, camera rendering, batch rollout và model. Với student training, num_envs=8 trong README đã là cấu hình debug hợp lý hơn num_envs=48 của teacher.
Cài đặt môi trường
Các bước dưới đây giữ gần với README chính thức. Bạn nên dùng conda/mamba riêng để tránh xung đột Isaac Sim, PyTorch và NumPy.
conda create -n viral python=3.11 -y
conda activate viral
pip install torch==2.7.0 torchvision==0.22.0 \
--index-url https://download.pytorch.org/whl/cu128
pip install isaacsim==5.1.0.0 isaacsim-rl==5.1.0.0
Cài Isaac Lab từ source:
pip install setuptools poetry-core flatdict
pip install --no-build-isolation -e <path-to-IsaacLab>/source/isaaclab
pip install --no-build-isolation -e <path-to-IsaacLab>/source/isaaclab_assets \
-e <path-to-IsaacLab>/source/isaaclab_tasks \
-e "<path-to-IsaacLab>/source/isaaclab_rl[all]"
pip install numpy==1.26.0
python -c "import isaaclab; print(isaaclab.__file__)"
Cài GR00T-VisualSim2Real:
cd <path-to-GR00T-VisualSim2Real>
pip install -e .
pip install numpy==1.26.0
python -c "from gr00t.rl.envs.base_task.base_task import BaseTask; print('OK')"
Nếu bước import Isaac Lab fail, thường là do version Isaac Sim không khớp, môi trường Python sai, hoặc numpy bị upgrade sau khi cài dependency. README repo cũng nhắc pin lại numpy==1.26.0 sau khi pip install -e ..
Train teacher VIRAL bằng PPO
Teacher training dùng full state trong sim. Lệnh mẫu từ README:
HYDRA_FULL_ERROR=1 accelerate launch --num_processes 1 \
gr00t/rl/train_agent_trl.py \
+exp=loco_manip/walk_stand_place_grasp_turn_homie \
num_envs=48 \
project_name=wsdpt_teacher
Giải thích các tham số quan trọng:
| Tham số | Ý nghĩa |
|---|---|
+exp=... |
Chọn Hydra experiment config |
num_envs=48 |
Số environment song song; tăng tốc nhưng tốn VRAM |
project_name |
Project trên Weights & Biases |
headless=True/False |
Chạy không GUI hoặc mở Isaac Sim để quan sát |
env.config.reset_from_dataset.enable |
Reset từ demonstration dataset nếu config hỗ trợ |
Cho lần chạy đầu, nên dùng cấu hình nhỏ:
HYDRA_FULL_ERROR=1 accelerate launch --num_processes 1 \
gr00t/rl/train_agent_trl.py \
+exp=loco_manip/walk_stand_place_grasp_turn_homie \
num_envs=8 \
headless=True \
experiment_name=teacher_smoke_g1 \
project_name=viral_debug
Bạn chưa cần reward đẹp ngay. Mục tiêu smoke test là simulator launch được, environment reset được, GPU memory ổn, checkpoint được ghi vào logs_rl/<experiment_name>/, và W&B có metric. Sau đó mới tăng num_envs, chỉnh reward scale, hoặc bật GUI để debug posture.
Evaluate teacher
Khi có checkpoint:
python gr00t/rl/eval_agent_trl.py \
+checkpoint=logs_rl/<teacher_experiment>/model_step_044500.pt
Checklist khi xem evaluate:
| Dấu hiệu | Cách hiểu |
|---|---|
| Robot đứng được nhưng không reach | Locomotion ổn, reward manipulation yếu hoặc observation target sai |
| Reach đúng nhưng grasp fail | Hand SysID, finger action scale hoặc contact model có vấn đề |
| Thành công trong sim nhưng action giật | Action smoothing, delta action scale, latency/randomization chưa đủ |
| GUI đẹp nhưng headless metric xấu | Khác biệt seed, số env hoặc config override |
Train student VIRAL bằng DAgger
Student cần checkpoint teacher. Trong README, bạn sửa teacher_actor_path trong file config student:
# gr00t/rl/config/exp/loco_manip/wsdpt_student_for_teacher_v8q8.002_resnet_rgb_delay.yaml
teacher_actor_path: logs_rl/<your_teacher_experiment>/model_step_XXXXXX.pt
Sau đó chạy:
HYDRA_FULL_ERROR=1 accelerate launch --num_processes 1 \
gr00t/rl/train_agent_trl.py \
+exp=loco_manip/wsdpt_student_for_teacher_v8q8.002_resnet_rgb_delay \
num_envs=8 \
headless=True \
experiment_name=wsdpt_student \
project_name=wsdpt_student_debug
Tên config cho thấy student dùng ResNet RGB và delay randomization. Đây là chi tiết rất quan trọng. Với robot thật, image không tới policy cùng lúc với joint state; camera exposure, network, preprocessing và inference đều tạo latency. Nếu sim không randomize delay, policy dễ học phản ứng quá "sạch" và fail khi deploy.
Student evaluation:
python gr00t/rl/eval_agent_trl.py \
+checkpoint=logs_rl/<student_experiment>/model_step_XXXXXX.pt
Khi evaluate với num_envs=1, repo tự export ONNX:
python gr00t/rl/eval_agent_trl.py \
+checkpoint=logs_rl/<student_experiment>/model_step_XXXXXX.pt \
num_envs=1
Model export nằm trong:
logs_rl/<student_experiment>/exported/
DoorMan: train policy mở cửa
DoorMan dùng cùng triết lý teacher-student nhưng task là articulated loco-manipulation. Project page mô tả randomization trên mass, handle type, hinge damping, stiffness, texture và background. Đây là khác biệt lớn so với task pick/place: physics của cánh cửa quyết định lực phản hồi lên robot, và lỗi nhỏ ở grasp có thể làm base mất balance.
Pipeline DoorMan:
Phase 1: PPO privileged teacher
- staged reset để teacher không phải khám phá toàn bộ horizon từ đầu
- privileged obs gồm door state, handle pose, hinge state
Phase 2: DAgger vision student
- RGB-only perception + proprioception
- học action từ teacher trong closed loop
Phase 3: GRPO bootstrap
- fine-tune student bằng reward task success
- tăng consistency khi observation bị thiếu hoặc trễ
Vì README công khai chưa liệt kê riêng một lệnh DoorMan như lệnh VIRAL, cách thực dụng là tìm trong gr00t/rl/config/exp/ các experiment DoorMan/door tương ứng của repo bạn đang dùng:
find gr00t/rl/config/exp -iname "*door*" -o -iname "*doorman*"
Sau đó chạy theo cùng pattern:
HYDRA_FULL_ERROR=1 accelerate launch --num_processes 1 \
gr00t/rl/train_agent_trl.py \
+exp=<door_or_doorman_teacher_exp> \
num_envs=8 \
headless=True \
experiment_name=doorman_teacher_smoke \
project_name=doorman_debug
Với DoorMan, đừng bỏ qua staged reset. Nếu train từ trạng thái robot đứng xa cửa, chưa biết handle ở đâu, chưa biết lực hinge, reward lại thưa, PPO có thể mất rất lâu để tìm được trajectory hữu ích. Staged reset chia task thành các đoạn dễ học hơn: gần handle, đã grasp, đang kéo, gần hoàn thành. Khi teacher ổn, student mới học từ rollout đủ đa dạng.
Inference và deploy lên Unitree G1
Để deploy robot thật, bạn cần hai lớp: policy inference và whole-body controller. Tài liệu GR00T-WholeBodyControl mô tả pipeline kiểu PolicyServer qua ZMQ, inference client đọc camera/state, rồi publish action cho C++ deploy stack. Với GR00T-VisualSim2Real, nếu bạn export ONNX từ student policy, nguyên tắc vẫn tương tự: policy phải nhận đúng tensor RGB/proprioception, output đúng action space mà controller hiểu, và tốc độ vòng lặp phải ổn định.
Sơ đồ deploy:
Camera server on G1 ---> inference client ---> action publisher
Joint/IMU state ---> | |
v v
policy checkpoint C++ whole-body control
or ONNX |
v
Unitree G1 actuators
Nếu dùng PolicyServer từ GR00T-WholeBodyControl, ví dụ manual setup là:
# GPU machine
uv run python gr00t/eval/run_gr00t_server.py \
--model-path /path/to/your/finetuned_model \
--embodiment-tag UNITREE_G1_SONIC \
--device cuda:0 \
--port 5550
Client inference:
source .venv_inference/bin/activate
python gear_sonic/scripts/run_vla_inference.py \
--host <policy_server_ip> \
--port 5550 \
--embodiment-tag unitree_g1_sonic \
--prompt "open the door" \
--camera-host 192.168.123.164
Với DoorMan/VIRAL policy không phải GR00T N1 language model, bạn có thể không cần prompt; nhưng vẫn cần giữ cùng nguyên tắc interface: action publish rate, action horizon, camera host, latency compensation và initial pose phải khớp. Tài liệu inference nêu action publish rate mặc định 50 Hz, inference rate 2.5 Hz và action horizon 40 cho stack VLA. Với policy ONNX riêng, hãy đo latency end-to-end thay vì chỉ đo thời gian model forward.
Kết quả paper và cách đọc đúng
VIRAL báo cáo RGB-based policy trên Unitree G1 thực hiện loco-manipulation liên tục tới 54 cycle, generalize qua vị trí tray, vị trí cylinder, vị trí robot, chiều cao bàn, lighting, màu khăn bàn, loại bàn và object khác nhau. Project page cũng ghi lại hành trình rất thực tế: nhiều mốc thất bại trước khi grasp ổn định, rồi mới tới walk-stand-grasp và cycle dài.
DoorMan báo cáo policy train hoàn toàn trong simulation, dùng pure RGB perception, generalize zero-shot trên nhiều loại cửa, handle, texture và vị trí. Paper/project page nêu kết quả nhanh hơn human teleoperator tới 31.7% về thời gian hoàn thành, và GRPO fine-tuning cải thiện success rate khoảng 20-30% trong phase bootstrap.
Điều quan trọng: các con số này không có nghĩa bạn clone repo là reproduce ngay. Chúng phụ thuộc vào compute scale, randomization, camera alignment, hand SysID, controller, safety setup và hardware calibration. Với lab nhỏ, kết quả tốt nhất nên đặt theo từng nấc:
| Nấc | Mục tiêu |
|---|---|
| 1 | Import package, launch Isaac Lab, reset G1 task |
| 2 | Train teacher smoke test, checkpoint không NaN |
| 3 | Evaluate teacher và xem behavior hợp lý |
| 4 | Distill student với RGB ở num_envs nhỏ |
| 5 | Export ONNX và kiểm tra tensor I/O |
| 6 | Sim-to-sim với latency/randomization |
| 7 | Real robot dry run không tải, có E-stop |
| 8 | Task thật với speed limit và safety spotter |
Troubleshooting nhanh
| Lỗi | Nguyên nhân thường gặp | Cách xử lý |
|---|---|---|
import isaaclab fail |
Isaac Lab chưa cài editable hoặc sai env | Activate đúng conda, cài lại source packages |
| Isaac Sim crash khi bật camera | Thiếu VRAM hoặc driver không hợp | Giảm num_envs, chạy headless, cập nhật driver |
| Training NaN | Reward/action scale quá lớn, contact unstable | Giảm learning rate, kiểm tra action clipping |
| Student không học | Teacher path sai hoặc RGB obs mismatch | In config Hydra, verify teacher_actor_path |
| Sim tốt real fail | Camera FOV/delay/hand SysID lệch | Align camera, randomize delay, đo lại finger response |
| Door task không tiến triển | Reward quá sparse | Dùng staged reset, tăng curriculum |
Kết luận
GR00T-VisualSim2Real đáng chú ý vì nó đưa visual sim-to-real cho humanoid từ mức demo rời rạc sang một pipeline có thể nghiên cứu và tái sử dụng: privileged teacher, vision student, large-scale rendering, domain randomization, real-to-sim alignment và export để deploy. VIRAL cho thấy G1 có thể làm loco-manipulation liên tục bằng RGB; DoorMan cho thấy articulated object như cửa cũng có thể được xử lý bằng policy train trong simulation.
Nếu bạn bắt đầu hôm nay, đừng bắt đầu bằng robot thật. Hãy bắt đầu bằng một teacher smoke test trong Isaac Lab, sau đó student distillation quy mô nhỏ, rồi sim-to-sim với latency và camera randomization. Khi policy sống sót qua các bước đó, deployment lên Unitree G1 mới là bước kỹ thuật có cơ sở, không phải một cú nhảy may rủi.
Nguồn tham khảo
- NVlabs/GR00T-VisualSim2Real GitHub
- VIRAL arXiv paper
- VIRAL project page
- DoorMan arXiv paper
- DoorMan project page
- Isaac Lab humanoid imitation examples
- GR00T-WholeBodyControl VLA inference docs