wholebody-vlaviralgr00t-visualsim2realunitree-g1isaac-simisaac-labdaggerpposim2realwholebody-vlahumanoid

VIRAL: RGB sim2real cho G1 loco-manip

Dựng VIRAL với Isaac Sim 5.1: PPO teacher, RGB DAgger student, Hydra fields, export ONNX và so sánh EgoHumanoid.

Nguyễn Anh Tuấn11 tháng 6, 202616 phút đọc
VIRAL: RGB sim2real cho G1 loco-manip

Vì sao VIRAL là stack thứ tư?

bài 1 về OpenWBT, ta bắt đầu từ teleoperation whole-body có thể debug trong MuJoCo/Isaac trước khi nghĩ tới robot thật. Ở bài 2 về TWIST2, trọng tâm là thu dữ liệu robot bằng PICO teleop, Redis bus và low-level controller. Ở bài 3 về EgoHumanoid, câu hỏi chuyển sang dữ liệu người: làm thế nào dùng egocentric human demonstrations cộng một lượng robot data nhỏ để co-train VLA policy cho G1.

VIRAL đi theo hướng khác. Repo NVlabs/GR00T-VisualSim2Real mô tả VIRAL là framework visual sim-to-real cho humanoid loco-manipulation trên Unitree G1. Paper VIRAL: Visual Sim-to-Real at Scale for Humanoid Loco-Manipulation nhấn mạnh robot học hoàn toàn trong simulation, sau đó deploy zero-shot sang hardware thật bằng RGB và proprioception. Nói ngắn gọn: EgoHumanoid dùng human egocentric data để tăng diversity ngoài đời, còn VIRAL cố làm simulator đủ giàu để student policy chỉ nhìn RGB vẫn chuyển được sang G1 thật.

Bài này không cố reproduce toàn bộ paper ở quy mô nhiều GPU. Mục tiêu thực tế hơn cho lab là dựng đúng repo NVlabs/GR00T-VisualSim2Real, hiểu workflow teacher-student, chạy teacher PPO bằng gr00t/rl/train_agent_trl.py +exp=loco_manip/walk_stand_place_grasp_turn_homie, distill student RGB DAgger qua config wsdpt_student_for_teacher_v8q8.002_resnet_rgb_delay.yaml, đọc các field Hydra quan trọng như teacher_actor_path, num_envs, env.config.reset_from_dataset.enable, rồi export ONNX bằng gr00t/rl/eval_agent_trl.py num_envs=1.

Nếu bạn cần bối cảnh rộng hơn ngoài series, nên đọc thêm Chạy GR00T-VisualSim2Real cho G1WholeBodyVLA open-source guide. Bài hiện tại đi sâu vào một path cụ thể: task walk_stand_place_grasp_turn_homie của VIRAL.

Roadmap series

  1. OpenWBT: G1 teleop trong MuJoCo/Isaac: dựng môi trường, kiểm tra ONNX policy và hiểu split lower-body joystick với upper-body IK.
  2. TWIST2: PICO teleop và G1 sim2real: dùng PICO teleop, Redis và low-level controller để thu dữ liệu robot trực tiếp.
  3. EgoHumanoid: human demo sang G1 VLA: biến egocentric human demo thành dataset robot-ready bằng view/action alignment.
  4. VIRAL: RGB sim2real cho G1 loco-manip: train privileged teacher trong sim, distill RGB student, randomize hình ảnh và export policy.
  5. FromW1: chuyển kỹ năng sang robot thật: xử lý latency, contact và actuator khi đi từ sim sang hardware.
  6. CLONE: closed-loop whole-body teleop: xem closed-loop teleop như data stack dài hạn.

Nguồn kỹ thuật cần mở song song

Nguồn Dùng để làm gì Điểm cần ghi nhớ
GR00T-VisualSim2Real README Cài đặt, train teacher, train student, evaluate, export ONNX Repo dùng Isaac Sim 5.1, Isaac Lab, TRL và Hydra
VIRAL paper Hiểu thiết kế teacher-student và sim2real Teacher có privileged full state; student dùng RGB; domain randomization và camera/hand alignment rất quan trọng
VIRAL project page Xem task, failure cases và generalization Project page báo cáo các biến thiên về tray, object, table, lighting và 54 cycle loco-manipulation
Student config YAML Đọc teacher_actor_path, camera, DAgger, ResNet RGB delay Đây là config distill student từ teacher đã train
EgoHumanoid paper So sánh với pipeline dùng human egocentric data EgoHumanoid co-train human + robot data bằng view/action alignment, không chỉ simulation

VIRAL visual sim-to-real pipeline
VIRAL visual sim-to-real pipeline

Mental model: teacher nhìn full state, student nhìn RGB

Điểm khó nhất của VIRAL không nằm ở command train. Nó nằm ở cách tách bài toán thành hai policy:

Isaac Sim 5.1 / Isaac Lab
  robot G1, object, table, tray, contact, task stage
        |
        v
Privileged teacher PPO
  obs: full state, object pose, hand-object transform, target, contact-like signals
  action: homie command + right arm + finger primitive
        |
        | rollouts + teacher action labels
        v
RGB student DAgger
  obs: proprioception tối thiểu + delayed RGB image
  backbone: ResNet18 vision encoder + MLP
  action: cùng action space với teacher
        |
        v
eval_agent_trl.py num_envs=1
  checkpoint -> exported ONNX
        |
        v
deployment stack của G1

Teacher được phép "gian lận" theo nghĩa học từ thông tin mà robot thật không có trực tiếp: vị trí vật, transform giữa tay và vật, target place/lift, trạng thái stage. Điều này giúp PPO học task long-horizon nhanh hơn. Nhưng teacher như vậy không phải policy deploy được. Student mới là policy cần chuyển sang robot thật: nó chỉ nhận observation gần với runtime, gồm RGB camera và proprioception.

DAgger giúp student không chỉ học từ dataset tĩnh. Student được chạy trong loop simulation; khi nó lệch khỏi trajectory đẹp của teacher, teacher vẫn cung cấp action đúng tại state mới. Với humanoid loco-manipulation, khác biệt này rất lớn. Một lỗi nhỏ ở bước đi tới bàn có thể làm camera nhìn lệch, tay không còn tới vật, và behavior cloning offline dễ sụp khỏi distribution. Online DAgger tạo nhiều tình huống "student đã hơi sai nhưng vẫn cứu được", nhờ vậy policy thật bền hơn.

Bước 1: cài môi trường VIRAL

README chính thức yêu cầu Ubuntu 22.04, NVIDIA driver từ 535 trở lên, Conda/Mamba, Isaac Sim 5.1 và Isaac Lab. Repo dùng Python 3.11, PyTorch 2.7.0 với CUDA 12.8 wheel, rồi cài Isaac Sim qua pip:

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 rồi cài repo:

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

cd <path-to-GR00T-VisualSim2Real>
pip install -e .
pip install numpy==1.26.0

Hai lệnh kiểm tra nên chạy trước khi train:

python -c "import isaaclab; print(isaaclab.__file__)"
python -c "from gr00t.rl.envs.base_task.base_task import BaseTask; print('OK')"

Nếu lệnh thứ hai lỗi import, đừng vội chỉnh YAML. Lỗi thường nằm ở editable install, path Isaac Lab hoặc xung đột numpy. Với Isaac Sim/Isaac Lab, sai version nhỏ cũng đủ tạo lỗi khó đọc. Hãy khóa môi trường trước, rồi mới chỉnh num_envs.

Bước 2: chạy teacher PPO

Teacher của bài này dùng experiment:

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

Config walk_stand_place_grasp_turn_homie.yaml compose nhiều mảnh Hydra:

Nhóm config Giá trị chính Ý nghĩa
/algo ppo Train teacher bằng PPO
/env walk_stand_place_grasp_turn_homie Task đi, đứng, đặt, grasp, xoay
/simulator isaacsim Backend Isaac Sim
/robot g1/g1_43dof Robot Unitree G1 43-DOF trong config repo
/obs obs_walk_stand_place_grasp_turn_homie Observation giàu thông tin cho teacher
/rewards reward_wsdpt_butterflyV8_q_2_teacher Reward shaping cho task WSDPT
/trainer trl_homie_api Trainer wrapper dùng trong repo

Trong YAML gốc, num_envs có thể là 2048 cho training nghiêm túc. README lại dùng num_envs=48 cho ví dụ chạy đơn giản hơn. Đây là điểm beginner cần hiểu: giá trị trong file là default của experiment, còn giá trị sau command line là override của Hydra. Nếu GPU chỉ có 24 GB, hãy bắt đầu rất thấp:

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 \
  project_name=wsdpt_teacher_smoke \
  experiment_name=wspgt_teacher_smoke

num_envs là số environment chạy song song. Tăng nó giúp thu rollout nhanh hơn, nhưng VRAM tăng theo số robot, object, contact sensor, buffer observation và renderer nếu camera bật. Với teacher không dùng RGB camera, bottleneck thường dễ chịu hơn student. Tuy vậy task loco-manip vẫn nặng vì có G1, table, object, tray, hand primitive và nhiều termination condition.

Khi cần xem GUI, thêm:

headless=False

Nhưng đừng bật GUI cho run dài. GUI hữu ích cho 5 phút đầu để kiểm tra robot spawn đúng, object có ở vị trí hợp lý, stage task không nhảy bất thường. Sau đó headless mới là mode training chính.

Bước 3: hiểu env.config.reset_from_dataset.enable

Trong env config walk_stand_place_grasp_turn_homie, block quan trọng là:

env:
  config:
    reset_from_dataset:
      enable: True
      use_motion_file_dir: True
      motion_file_dir: "gr00t/rl/data/motions/g1_wsdpt/33demos_675_775"
      num_per_sample: 10
      sample_interval_s: 0.1
      resample_every: 1000

Field này nói simulator có thể reset episode từ một tập motion/demo thay vì luôn reset từ cùng một trạng thái đầu. Với task dài kiểu walk-stand-place-grasp-turn, reset từ dataset là một biến thể của reference state initialization. Nó giúp teacher gặp nhiều đoạn của task hơn: lúc đang đi tới bàn, lúc chuẩn bị đặt vật, lúc chuyển sang grasp, lúc xoay người. Nếu chỉ bắt đầu từ frame đầu, PPO có thể mất rất lâu mới học được reward ở stage sau.

Khi debug, bạn có ba lựa chọn:

Mục tiêu Override nên thử Lý do
Kiểm tra env spawn từ đầu env.config.reset_from_dataset.enable=False Dễ nhìn initial state sạch
Train theo recipe repo giữ True Học task dài nhanh hơn
Kiểm tra lỗi dataset path HYDRA_FULL_ERROR=1 và giảm num_envs=1 Stack trace dễ đọc hơn

Đừng tắt reset_from_dataset chỉ vì thấy nó "phức tạp". Với whole-body task dài, phần reset/curriculum thường quan trọng không kém reward. Nếu dataset path thiếu hoặc demo không nằm đúng chỗ, sửa dữ liệu trước; không nên âm thầm train một task khác.

Bước 4: evaluate teacher checkpoint

Khi có checkpoint, evaluate bằng:

python gr00t/rl/eval_agent_trl.py \
  +checkpoint=logs_rl/<experiment_dir>/model_step_044500.pt

Ở bước này, bạn đang hỏi ba câu:

Câu hỏi Dấu hiệu tốt Dấu hiệu xấu
Robot có đi ổn định không? Không chạm gối, không drift mạnh, không ngã khi đổi stage Termination vì knee contact, low height hoặc gravity
Tay phải có tiếp cận vật đúng không? Wrist đi tới vùng object trước khi finger primitive đóng Tay vung quá nhanh hoặc object bị hất
Stage task có tiến triển không? Walk, stand, place, grasp, turn diễn ra theo thứ tự Robot đứng mãi ở một stage hoặc reset sớm

Teacher phải đủ tốt trước khi train student. Nếu teacher chưa grasp ổn trong sim, student RGB sẽ không sửa được. Student chỉ đang học bắt chước teacher trong observation khó hơn; nó không biến teacher yếu thành policy mạnh.

Bước 5: distill RGB student bằng DAgger

Student dùng config:

gr00t/rl/config/exp/loco_manip/wsdpt_student_for_teacher_v8q8.002_resnet_rgb_delay.yaml

Workflow theo README là sửa teacher_actor_path, rồi chạy:

teacher_actor_path: logs_rl/<your_teacher_experiment>/model_step_XXXXXX.pt
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

Điểm cần để ý: YAML gốc của student có num_envs: 1024, camera RGB bật, resolution [108, 192], camera_types bật RGB và tắt depth, còn README dùng num_envs=8 cho run debug. Student nặng hơn teacher vì mỗi environment cần render ảnh. Nếu bạn thấy VRAM tăng đột biến so với teacher, đó là bình thường.

Các field quan trọng:

Field Nằm ở đâu Ý nghĩa thực tế
teacher_actor_path top-level student YAML Path checkpoint teacher để load vào network_load_dict.teacher_actor.path
num_envs top-level hoặc command line Số env song song; student RGB nên bắt đầu nhỏ
enable_cameras top-level và simulator config Bắt buộc cho vision student
simulator.config.cameras.camera_resolutions student YAML Kích thước ảnh RGB, ở đây là 108 x 192
obs.rgb_image_delay_step obs config RGB delay Chọn frame RGB mới nhất hay trễ vài step
algo.config.use_dagger algo DAgger config Bật training kiểu DAgger/BC từ teacher
algo.config.enforce_teacher_rollout student YAML Ép rollout dùng teacher theo logic distillation
algo.config.ratio_teacher_rollout student YAML Tỷ lệ rollout teacher trong distillation
algo.config.network_load_dict.teacher_actor.path student YAML Trỏ tới ${teacher_actor_path}
algo.config.actor.backbone.vision_module student YAML ResNet vision encoder, mặc định resnet18 pretrained

Observation của student ít "privileged" hơn teacher. actor_obs gồm base angular velocity, projected gravity, previous actions, DOF pos/vel không tính finger, delta actions và homie commands. vision_obs chỉ lấy rgb_image_delayed. Trong khi đó teacher_obs vẫn chứa nhiều thông tin object và target. Đây chính là teacher-student gap: teacher biết vật ở đâu trong state; student phải suy ra từ ảnh.

Bước 6: RGB delay và domain randomization

Tên config có rgb_delay vì student không nên giả định ảnh camera đến tức thì. Trong robot thật, camera capture, driver, preprocessing, policy inference và actuator command đều có latency. Obs config hỗ trợ:

obs:
  rgb_image_delay_random: False
  rgb_image_delay_resample_on_reset: False
  rgb_image_delay_step: 1
  rgb_image_delay_step_min: 1
  rgb_image_delay_step_max: 5
  history_save_interval: 1

rgb_image_delay_step=1 nghĩa là dùng frame mới nhất trong buffer. Nếu muốn train robustness với delay ngẫu nhiên, bạn có thể chuyển sang:

obs.rgb_image_delay_random=True \
obs.rgb_image_delay_resample_on_reset=True \
obs.rgb_image_delay_step_min=1 \
obs.rgb_image_delay_step_max=5

Đừng bật random delay cùng lúc với mọi randomization khác trong run đầu tiên. Làm từng lớp sẽ dễ biết nguyên nhân fail. Một thứ tự hợp lý:

  1. Student RGB không random delay, num_envs nhỏ, verify loss giảm.
  2. Bật camera extrinsics randomization nhẹ.
  3. Bật image/material/lighting randomization theo recipe.
  4. Bật random RGB delay nếu rollout thật có latency đáng kể.

VIRAL paper nhấn mạnh visual domain randomization lớn: lighting, materials, camera parameters, image quality và sensor delays. Nhưng với lab nhỏ, randomization quá mạnh ngay từ đầu có thể làm student không học nổi. Hãy giữ một run "clean baseline" để so sánh.

Bước 7: export ONNX

README ghi rõ khi evaluate với num_envs=1, policy được export ONNX tự động:

python gr00t/rl/eval_agent_trl.py \
  +checkpoint=logs_rl/<student_experiment_dir>/model_step_XXXXXX.pt \
  num_envs=1

Model export nằm dưới:

<experiment_dir>/exported/

Vì sao num_envs=1 quan trọng? Deployment thật không chạy 1024 robot song song. Export cần một graph có input/output shape phù hợp runtime một robot. Nếu export với batch shape lạ hoặc observation chưa đúng, bạn có thể có ONNX pass nhưng runtime deploy fail. Checklist trước khi cầm ONNX đi tiếp:

Kiểm tra Cách làm
Input obs đúng In shape của actor obs và vision obs trong eval
Camera đúng Chạy headless=False một episode ngắn để nhìn frame RGB
Action dim đúng Student config dùng robot.actions_dim: 31 cho 15 + 14 + 2 theo comment repo
Export file có thật Kiểm tra folder exported/ sau eval
Policy không phụ thuộc privileged obs Confirm actor chỉ dùng actor_obs + vision_obs, không dùng teacher_obs

So sánh VIRAL với EgoHumanoid

Hai stack cùng nhắm tới G1 loco-manipulation bằng visual policy, nhưng giả định dữ liệu khác nhau:

Trục so sánh VIRAL EgoHumanoid
Nguồn dữ liệu chính Simulation quy mô lớn trong Isaac Sim/Isaac Lab Egocentric human demos + robot teleop data
Cách học Privileged RL teacher, RGB DAgger student Co-train VLA policy trên human/robot data đã align
Observation runtime RGB + proprioception tối thiểu Egocentric RGB + language/action schema thống nhất
Cách xử lý embodiment gap Real-to-sim alignment camera/hand, visual domain randomization View alignment và action alignment giữa người và robot
Điểm mạnh Không cần thu nhiều robot/human demo ngoài đời; kiểm soát được simulator Dữ liệu người có scene diversity thật, tốt cho generalization ngoài lab
Điểm yếu Cần simulator rất đúng, compute lớn, randomization khó tune Alignment human-to-robot khó, cần pipeline data collection/processing dài
Khi nên chọn Lab có Isaac Sim mạnh, muốn train skill từ sim trước Lab có khả năng thu human demos đa dạng và một ít robot demos tốt

Điểm dễ nhầm: VIRAL không phải "ít dữ liệu" theo nghĩa tuyệt đối. Nó thay dữ liệu ngoài đời bằng compute simulation và randomization. EgoHumanoid không phải "bỏ simulator"; nó thay trọng tâm sang data alignment để human video/action trở nên robot-compatible. Với lab ở Việt Nam, cách chọn thực tế là:

Điều kiện lab Stack nên ưu tiên
Có một workstation GPU mạnh nhưng robot time ít VIRAL smoke test, train teacher/student ở quy mô nhỏ
Có PICO/ZED và nhiều người có thể thu demo ở nhiều nơi EgoHumanoid-style data pipeline
Cần policy chạy thật sớm để demo TWIST2/OpenWBT trước, VIRAL/EgoHumanoid sau
Muốn nghiên cứu sim2real RGB nghiêm túc VIRAL, vì domain randomization và teacher-student được thiết kế cho câu hỏi này

Lỗi beginner hay gặp

Train student trước khi teacher đủ tốt. Đây là lỗi tốn GPU nhất. Student RGB không thể vượt qua teacher một cách kỳ diệu trong task này. Hãy evaluate teacher bằng GUI và metrics trước.

Đặt num_envs quá cao. YAML gốc có thể dùng 1024 hoặc 2048 env, nhưng đó không phải cấu hình cho mọi máy. Với một GPU, bắt đầu từ 4, 8 hoặc 16 env để xác nhận pipeline.

Không hiểu Hydra override. +exp=... chọn experiment; num_envs=8 ghi đè top-level; obs.rgb_image_delay_random=True ghi đè field nested. Nếu override sai path, Hydra có thể tạo field mới hoặc báo lỗi tùy mode. Luôn bật HYDRA_FULL_ERROR=1.

Tắt camera mà vẫn train student. Student config cần enable_cameras: true và simulator camera RGB. Nếu tắt camera để tiết kiệm VRAM, đó không còn là RGB student nữa.

Nhầm teacher_actor_path với checkpoint student. teacher_actor_path phải là checkpoint teacher PPO. Checkpoint student dùng ở +checkpoint=... khi evaluate student, không phải ở field này.

Checklist chạy trong lab

# 1. Verify install
python -c "from gr00t.rl.envs.base_task.base_task import BaseTask; print('OK')"

# 2. Teacher smoke test
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=4 \
  headless=False \
  project_name=wsdpt_teacher_smoke \
  experiment_name=wspgt_teacher_gui

# 3. Teacher train headless
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 \
  headless=True \
  project_name=wsdpt_teacher

# 4. Teacher eval
python gr00t/rl/eval_agent_trl.py \
  +checkpoint=logs_rl/<teacher_experiment>/model_step_XXXXXX.pt

# 5. Student distill
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 \
  teacher_actor_path=logs_rl/<teacher_experiment>/model_step_XXXXXX.pt \
  num_envs=8 \
  headless=True \
  experiment_name=wsdpt_student_rgb_delay \
  project_name=wsdpt_student_debug

# 6. Student eval + ONNX export
python gr00t/rl/eval_agent_trl.py \
  +checkpoint=logs_rl/<student_experiment>/model_step_XXXXXX.pt \
  num_envs=1

Với beginner, thành công đầu tiên không phải robot thật cầm vật ngay. Thành công đầu tiên là: env spawn đúng, teacher checkpoint evaluate được, student RGB train không crash, ONNX export xuất hiện trong exported/, và bạn hiểu mỗi override Hydra đang thay đổi phần nào của system.

Kết luận

VIRAL là stack đáng học vì nó trình bày rất rõ một hướng sim2real hiện đại cho humanoid: train skill khó bằng privileged teacher trong Isaac Sim, distill sang RGB student bằng DAgger, bù sim-to-real bằng domain randomization và alignment, rồi export policy để deploy. So với EgoHumanoid, nó ít phụ thuộc vào human egocentric data hơn nhưng đòi hỏi simulator, compute và discipline debug cao hơn.

Trong series này, VIRAL đóng vai trò "simulation-first visual policy stack". Nó không thay thế OpenWBT/TWIST2/EgoHumanoid; nó bổ sung một con đường khác để xây whole-body VLA humanoid: trước tiên làm cho simulator đủ mạnh, sau đó buộc student học bằng observation giống robot thật.

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

TWIST2: PICO teleop và G1 sim2real
wholebody-vla

TWIST2: PICO teleop và G1 sim2real

11/6/202617 phút đọc
NT
CLONE: MoE teleop và chọn stack
wholebody-vla

CLONE: MoE teleop và chọn stack

11/6/202617 phút đọc
NT
OpenWBT: G1 teleop trong MuJoCo/Isaac
wholebody-vla

OpenWBT: G1 teleop trong MuJoCo/Isaac

11/6/202613 phút đọc
NT