wholebody-vlagr00tvisual-sim2realunitree-g1isaac-labvlasim2realhumanoidrl

Chạy GR00T-VisualSim2Real cho G1

Hướng dẫn train VIRAL và DoorMan cho Unitree G1 trong Isaac Lab: cài đặt, teacher-student, DAgger, GRPO, inference và sim-to-real.

Nguyễn Anh Tuấn7 tháng 6, 202615 phút đọc
Chạy GR00T-VisualSim2Real cho G1

GR00T-VisualSim2Real là repo mã nguồn mở của NVIDIA cho hai project rất đáng chú ý trong humanoid robot: VIRALDoorMan. 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 WholeBodyVLAsim-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

Bài viết liên quan

NT

Nguyễn Anh Tuấn

Robotics & AI Engineer. Building VnRobo — sharing knowledge about robot learning, VLA models, and automation.

Khám phá VnRobo

Bài viết liên quan

WholebodyVLA Open-Source: Hướng Dẫn Kiến Trúc & Code
wholebody-vla

WholebodyVLA Open-Source: Hướng Dẫn Kiến Trúc & Code

12/4/202619 phút đọc
NT
Hướng dẫn fine-tune NVIDIA GR00T N1
wholebody-vla

Hướng dẫn fine-tune NVIDIA GR00T N1

12/4/202612 phút đọc
NT
Làm synthetic data cho GR00T VLA
wholebody-vla

Làm synthetic data cho GR00T VLA

6/6/202614 phút đọc
NT