wholebody-vlaOASIShumanoidIsaac Labloco-manipulationsim-to-realUnitree G1whole-body policyteleoperation

OASIS: Thu thập dữ liệu humanoid trong Isaac Lab

Hướng dẫn OASIS: dựng asset, teleop trong Isaac Lab, render domain randomization, train policy toàn thân và deploy zero-shot cho Unitree G1.

Nguyễn Anh Tuấn11 tháng 6, 202616 phút đọc
OASIS: Thu thập dữ liệu humanoid trong Isaac Lab

OASIS là một paper rất đáng chú ý cho cộng đồng humanoid trong tuần này: OASIS: From Simulation Data Collection to Real-World Humanoid Loco-Manipulation, xuất hiện trên arXiv ngày 7/6/2026. Nhóm tác giả từ TeleAI, Fudan University, East China University of Science and Technology và Shanghai Jiao Tong University đề xuất một pipeline lấy dữ liệu hoàn toàn trong simulation, train policy visuomotor toàn thân, rồi deploy zero-shot lên Unitree G1 thật.

Điểm quan trọng không nằm ở việc "train trong sim" nói chung. Điểm mới của OASIS là cách họ tách pipeline thành hai phần: operator chỉ cần teleop trong Isaac Lab với rendering nhẹ để giữ độ trễ thấp, còn dữ liệu thị giác chất lượng cao được render offline sau đó bằng PathTracing, domain randomization và camera perturbation. Cách này biến một trajectory teleop thành nhiều biến thể ảnh khác nhau mà không bắt operator lặp đi lặp lại cùng một task.

Bài này là hướng dẫn thực hành cho beginner đã biết Python/Linux cơ bản: đọc paper, hiểu kiến trúc, cài repo, thu thập dữ liệu trong Isaac Lab, render lại trajectory, chuẩn bị training, chạy inference và đánh giá zero-shot sim-to-real. Nếu bạn đang theo dõi các hướng Isaac Lab, humanoid loco-manipulation hoặc WholeBodyVLA sim-to-real, OASIS là một case study rất sát thực tế.

Humanoid loco-manipulation
Humanoid loco-manipulation

Nguồn chính cần đọc

Trước khi chạy lệnh, bạn nên mở ba nguồn gốc:

Nguồn Link Dùng để làm gì
Paper arXiv arxiv.org/abs/2606.08548 Ý tưởng, kiến trúc, thí nghiệm, ablation
Project page oasis-humanoid.github.io Video, hình overview, demo real robot
GitHub repo github.com/TeleHuman/OASIS Code thu thập dữ liệu, assets, script play/record/replay

Tại thời điểm viết bài, repo OASIS public gồm code data collection, scene/assets và paper. Phần có thể reproduce trực tiếp nhất là simulation scene, VR teleoperation, record trajectory, replay offline với domain randomization. Phần policy training trong paper cần bạn ghép với trainer imitation learning/Flow Matching của nhóm hoặc tự triển khai theo mô tả kiến trúc. Vì vậy bài này sẽ phân biệt rõ:

  • Có trong repo: cài OASIS, chạy Isaac Lab scene, teleop, record, replay, render dữ liệu.
  • Theo paper: high-level Flow Matching planner, low-level whole-body controller, curriculum rollout, zero-shot deployment.

OASIS giải quyết vấn đề gì?

Humanoid loco-manipulation là nhóm task robot vừa phải đi, vừa phải dùng tay thao tác vật thể. Ví dụ trong paper:

Task Vì sao khó
Place Cup in Box Robot phải đi tới vị trí, căn người, đưa tay, thả cốc đúng hộp
Wipe Monitor Tay phải tạo tiếp xúc ổn định trong khi thân giữ cân bằng
Lift Basket and Place Cup Hai tay và chân phối hợp qua nhiều pha
Kneel and Wipe Under Table Cần hạ thấp thân, vẫn nhìn vật và giữ ổn định

Nếu thu thập dữ liệu trên robot thật, mỗi lỗi nhỏ đều tốn thời gian reset: robot có thể ngã, vật bị lệch, operator phải dựng robot lên, sắp lại bàn, kiểm tra camera và chạy lại. Với humanoid, chi phí reset lớn hơn nhiều so với arm robot để bàn. OASIS chọn hướng ngược lại: thu thập trajectory trong simulation, nơi reset chỉ là một lệnh, asset có thể nhân bản, môi trường có thể randomize, và dữ liệu có thể scale mà không cần thêm robot thật.

Ý tưởng này gần với các hướng synthetic data cho VLA, nhưng OASIS tập trung rất cụ thể vào whole-body humanoid policy: dữ liệu phải có locomotion, thao tác tay, camera đầu, trạng thái object và command chuyển động tham chiếu. Đây cũng là điểm khác với các bài chỉ train locomotion trên terrain hoặc chỉ train manipulation cố định. OASIS nằm ở giữa: robot phải di chuyển để thao tác.

Pipeline tổng thể

Sơ đồ đơn giản của OASIS:

Ảnh vật thật
    |
    v
Hunyuan3D tạo mesh + texture
    |
    v
Qwen3-VL ước lượng kích thước + vật liệu
    |
    v
Isaac Lab scene có object vật lý
    |
    v
VR teleop trong simulation, record state trajectory
    |
    v
Replay offline bằng PathTracing + domain randomization
    |
    v
Train hierarchical whole-body policy
    |
    v
Deploy zero-shot lên Unitree G1 thật

Có bốn module chính:

  1. Real-to-sim asset generation: Từ ảnh vật thật, OASIS dùng Hunyuan3D tạo mesh/textures. Sau đó Qwen3-VL ước lượng kích thước, vật liệu, density, friction và restitution ở mức category.
  2. Simulation teleoperation: Operator dùng PICO 4U, controller và ankle trackers để điều khiển humanoid trong Isaac Lab từ góc nhìn first-person.
  3. Offline rendering: Trajectory được replay lại với texture, lighting và camera extrinsics randomization. Đây là nguồn dữ liệu thị giác chính cho policy.
  4. Hierarchical policy: High-level planner dự đoán reference motion command từ observation đa modal. Low-level controller track command thành target joint angles.

Chuẩn bị máy

OASIS nằm trên Isaac Lab v2.1.0, Isaac Sim và GPU NVIDIA. Bạn không nên thử trên laptop không có RTX nếu mục tiêu là render PathTracing. Một cấu hình tối thiểu thực tế:

Thành phần Khuyến nghị
OS Ubuntu 22.04
GPU NVIDIA RTX series, VRAM càng cao càng tốt
Driver/CUDA Theo yêu cầu Isaac Sim tương ứng
Python Conda environment riêng cho Isaac Lab/OASIS
VR PICO 4U nếu muốn teleop như paper
Disk Nhiều trăm GB nếu render nhiều trajectory

Repo cũng lưu ý PC cần cùng network segment với PICO, và phải start xrobotoolkit-pc-service trước khi teleoperation. Nếu bạn chỉ muốn học pipeline, có thể bắt đầu bằng play.shreplay.sh với assets sẵn có, chưa cần VR.

Cài Isaac Lab và OASIS

Đầu tiên cài Isaac Lab v2.1.0 theo hướng dẫn chính thức của Isaac Lab. Sau khi có thư mục IsaacLab, tạo environment:

cd IsaacLab
./isaaclab.sh -c oasis
./isaaclab.sh -i

Sau đó cài OASIS:

git clone https://github.com/TeleHuman/OASIS.git
conda activate oasis
cd OASIS
pip install -e .

Tải object dataset và texture dataset từ link Google Drive trong README của repo nếu bạn muốn chạy scene sẵn. Đặt chúng vào:

OASIS/
  assets/
    objects/
    textures/

Nếu bạn dùng asset riêng, bắt đầu bằng một vật dễ: cup, box hoặc sponge. Đừng bắt đầu bằng vật có geometry quá mảnh hoặc nhiều lỗ. Beginner thường mất nhiều thời gian ở collision mesh hơn là ở policy.

Tạo asset riêng từ ảnh vật thật

Paper dùng Hunyuan3D để tạo mesh và texture từ ảnh vật thật, rồi dùng Qwen3-VL để ước lượng thông số vật lý. Trong thực hành, bạn có thể làm thủ công trước:

  1. Chụp vật trên nền đơn giản, ánh sáng đều.
  2. Upload lên Hunyuan3D, export file .glb.
  3. Import .glb vào Isaac Sim qua Content Browser.
  4. Thêm Rigid Body with Colliders Preset.
  5. Đổi collision approximation sang Convex Decomposition.
  6. Save asset thành USD trong assets/objects/<object_name>/<object_name>.usd.
  7. Kiểm tra texture path trong material để không bị mất ảnh khi move folder.
  8. Scale object theo kích thước thật.

Script trong README dùng UsdGeom.BBoxCache để đo bounding box của prim. Bạn có thể dùng ý tưởng này để kiểm tra nhanh object đã đúng scale chưa:

import omni.usd
from pxr import Usd, UsdGeom

stage = omni.usd.get_context().get_stage()
prim = stage.GetPrimAtPath("/World")

bbox_cache = UsdGeom.BBoxCache(
    Usd.TimeCode.Default(),
    includedPurposes=[UsdGeom.Tokens.default_],
)
bbox = bbox_cache.ComputeWorldBound(prim)
rng = bbox.ComputeAlignedRange()
mn, mx = rng.GetMin(), rng.GetMax()

print("size meters:", mx[0] - mn[0], mx[1] - mn[1], mx[2] - mn[2])

Với simulation contact-rich, scale sai 20-30% có thể làm policy học hành vi lệch hoàn toàn. Một chiếc cup quá nhẹ sẽ bị văng, một basket quá nặng sẽ khiến controller không theo kịp, còn friction sai làm task wiping hoặc grasping không đáng tin.

Chạy scene để xem trước

Sau khi cài xong, chạy visual mode:

conda activate oasis
sh play.sh

Mục tiêu của bước này không phải thu dữ liệu, mà là kiểm tra:

  • Isaac Sim mở scene không lỗi.
  • Unitree G1 load đúng pose.
  • Object xuất hiện đúng vị trí.
  • Camera head hoặc wrist camera không bị đen.
  • Asset không rơi xuyên bàn hoặc nổ physics.
  • FPS đủ dùng trước khi bật VR teleop.

Nếu scene lỗi, đừng sửa policy vội. Hãy xử lý asset, USD path, material path và collision trước. Trong pipeline OASIS, scene sạch là điều kiện đầu tiên để dữ liệu sạch.

Record trajectory bằng VR teleoperation

Khi đã có PICO SDK và GMR, mở XRoboToolkit trên PICO, xem IP, rồi điền vào biến pico_host trong play.shrecord.sh. Máy PC và PICO phải cùng mạng. Trước khi record, start service trên PC:

xrobotoolkit-pc-service

Sau đó mở hai terminal. Terminal thứ nhất chạy record headless:

conda activate oasis
sh record.sh

Terminal thứ hai chạy teleop:

conda activate gmr
sh teleop.sh

Trong mode record, stream từ head camera của robot trong Isaac Sim được gửi tới PICO. Trên PICO, bấm Listen trong phần Remote Vision. Mapping controller theo README:

Nút Chức năng
X Bắt đầu ghi dữ liệu
Y Kết thúc và lưu dữ liệu
A Reset environment và bỏ dữ liệu đang ghi
B Đổi mode hiển thị first-person
Left/Right Trig Đóng tay trái/phải
Left/Right Grip Mở tay trái/phải

Kinh nghiệm thực hành: hãy record từng đoạn ngắn, sạch và có nhịp. Một trajectory 20 giây tốt thường hữu ích hơn một trajectory 2 phút có nhiều pha đứng đợi, object lệch, hoặc operator loay hoay sửa tư thế. Với beginner, mỗi task nên chia thành các phase:

approach -> align body -> reach -> contact/grasp -> move object -> release -> recover posture

OASIS không chỉ cần pose tay. Nó cần toàn bộ trạng thái thân, chân, object và camera. Vì vậy operator phải thao tác như đang dạy một humanoid thật: bước chân phải hợp lý, thân không xoay gấp, tay không xuyên vật, và kết thúc task ở trạng thái robot còn đứng ổn định.

Replay offline và domain randomization

Sau khi record, dùng replay.sh để render lại trajectory:

sh replay.sh

Trong replay.sh, đặt:

input_dir=/path/to/recorded_trajectories
output_dir=/path/to/rendered_dataset
start=0
end=100
target_envs_per_episode=8

Ý nghĩa:

  • input_dir: dữ liệu state trajectory đã record.
  • output_dir: nơi lưu image/action/state sau render.
  • start, end: range sequence muốn render.
  • target_envs_per_episode: số biến thể render cho mỗi trajectory.

Paper randomize ba nhóm chính:

Nhóm randomization Ví dụ
Background material Texture tường, sàn, bàn, roughness, metallic, UV transform
Lighting Dome light intensity, color temperature, RGB, indoor light
Camera extrinsics Offset vị trí và roll/pitch/yaw của camera

Đây là phần giúp OASIS thắng real-robot teleop trong nhiều task. Dữ liệu thật có thể chính xác về physics, nhưng thường nghèo diversity: cùng phòng, cùng ánh sáng, cùng camera. Dữ liệu OASIS có thể render cùng một hành vi dưới nhiều điều kiện nhìn khác nhau. Với policy học từ ảnh, diversity thị giác đôi khi quan trọng hơn việc có thêm vài trajectory thật giống nhau.

Dataset nên được tổ chức thế nào?

Một format dễ debug:

dataset/
  task_place_cup_box/
    seq_000001/
      obs_head_rgb/
      obs_wrist_left_rgb/
      obs_wrist_right_rgb/
      proprio.npy
      object_state.npy
      action.npy
      meta.json
    seq_000002/
      ...

meta.json nên ghi rõ:

{
  "task": "place_cup_in_box",
  "robot": "unitree_g1",
  "sim": "isaac_lab_2.1.0",
  "render": "path_tracing",
  "randomization": {
    "texture": true,
    "lighting": true,
    "camera_extrinsics": true
  }
}

Nếu sau này train bị lỗi, bạn sẽ cần truy ngược: lỗi do operator, do render, do camera transform, do action alignment hay do controller. Metadata tốt tiết kiệm rất nhiều thời gian.

Kiến trúc policy của OASIS

OASIS dùng kiến trúc hierarchical:

RGB + proprioception + task context
    |
    v
High-level Flow Matching planner
    |
    v
Reference motion command
    |
    v
Low-level whole-body controller
    |
    v
Target joint angles
    |
    v
PD / robot control loop

High-level planner dự đoán reference motion command từ observation. Low-level controller biến command đó thành target joint angles trong closed loop. Cách chia này rất quan trọng: nếu một network end-to-end phải xuất thẳng joint angle cho toàn bộ G1 từ ảnh, bài toán sẽ quá khó và rất nhạy latency. Hierarchical policy giữ phần thị giác/task ở tầng cao, còn phần ổn định cơ thể ở tầng thấp.

Bạn có thể hình dung high-level planner trả lời câu hỏi: "trong vài bước tới, thân và tay nên đi theo reference nào?" Low-level controller trả lời câu hỏi: "để track reference đó mà không ngã, các khớp phải đặt target ra sao ở 50 Hz hoặc cao hơn?"

Training recipe cho người mới

Nếu bạn muốn tự dựng trainer theo paper, hãy bắt đầu từ behavior cloning trước khi Flow Matching đầy đủ. Mục tiêu không phải đạt ngay kết quả paper, mà là kiểm tra dataset/action alignment.

Pseudo-code:

for batch in dataloader:
    images = batch["head_rgb"]          # B, T, C, H, W
    proprio = batch["proprio"]          # B, T, Dp
    task = batch["task_embedding"]      # B, Dt
    target = batch["ref_motion"]        # B, T, Dr

    pred = high_level_policy(images, proprio, task)
    loss_bc = mse_loss(pred, target)

    optimizer.zero_grad()
    loss_bc.backward()
    optimizer.step()

Sau khi BC ổn, chuyển sang Flow Matching. Ý tưởng đơn giản: model học vector field đưa noise tới action/reference distribution. Với long-horizon loco-manipulation, Flow Matching thường ổn hơn regression một bước vì nó biểu diễn được nhiều quỹ đạo hợp lệ.

Một checklist training thực tế:

Bước Mục tiêu debug
Train trên 1 task, 10 trajectory Loss giảm, rollout trong sim không nổ
Train trên 1 task, nhiều randomization Policy bớt phụ thuộc background
Thêm camera perturbation Robot chịu được lệch camera nhỏ
Thêm nhiều task Kiểm tra task embedding/instruction
Curriculum rollout Giảm compounding error khi rollout dài

Paper có ablation cho curriculum-based rollout: không có rollout, success rate trên bốn task rất thấp; có rollout, các task tăng mạnh, ví dụ Place Cup in Box đạt 8/10, Wipe Monitor 7/10, Lift Basket and Place Cup 8/10, Kneel and Wipe Under Table 10/10. Bài học là teacher-forcing thuần trên ground-truth history không đủ cho long horizon. Khi deploy, policy phải sống với chính lỗi của nó.

Inference trong simulation

Trước khi nghĩ tới robot thật, hãy chạy inference trong Isaac Lab hoặc một scene replay:

load checkpoint
load low-level controller
reset scene
while not done:
    rgb = read_head_camera()
    proprio = read_robot_state()
    ref = high_level_policy(rgb, proprio, task)
    q_target = low_level_controller(ref, proprio)
    send_to_pd(q_target)

Log tối thiểu:

  • RGB frame được policy nhìn thấy.
  • Proprioception vector sau normalization.
  • Reference motion command.
  • Target joint angles.
  • Object pose.
  • Success/failure flag theo phase.

Nếu simulation rollout fail, xem video side-by-side với demonstration. Thường lỗi nằm ở một trong bốn điểm:

  1. Image normalization khác giữa train và inference.
  2. Camera extrinsic trong inference không giống dataset.
  3. Action bị lệch timestep so với observation.
  4. Low-level controller không track được reference do scale hoặc joint order sai.

Deploy zero-shot lên Unitree G1

Zero-shot không có nghĩa là "không cần chuẩn bị". Nó có nghĩa policy high-level được train bằng simulation data và không fine-tune trên dữ liệu robot thật cho task đó. Bạn vẫn phải đảm bảo stack robot thật match với simulation:

Hạng mục Cần kiểm tra
Joint order Thứ tự joint trong policy đúng với robot SDK
Control frequency Policy/control loop không bị jitter
Camera pose Head camera extrinsic gần với sim
Latency RGB và proprioception timestamp align
Safety E-stop, torque limit, fall detection
Workspace Vật thật cùng kích thước với asset

Đừng deploy task khó ngay. Trình tự an toàn:

stand still -> arm motion only -> reach without contact -> contact with soft object -> full task at slow speed -> full task normal speed

OASIS báo cáo policy train bằng simulation data có thể match hoặc vượt policy train bằng real-robot teleoperation ở nhiều task trong zero-shot deployment. Lý do chính là dữ liệu render có variation lớn về ánh sáng và môi trường. Đây là kết quả quan trọng: với humanoid, simulation không chỉ là nơi train locomotion, mà có thể trở thành nguồn dữ liệu thao tác toàn thân nếu asset, camera và domain randomization được xử lý cẩn thận.

Những lỗi beginner hay gặp

Asset quá đẹp nhưng physics sai. Mesh visual đẹp không đồng nghĩa collision tốt. Với manipulation, collision đơn giản, ổn định và đúng scale thường quan trọng hơn hình ảnh quá chi tiết.

Record quá dài. Long trajectory không sạch tạo dataset nhiều noise. Hãy record nhiều trajectory ngắn, có phase rõ ràng.

Randomization quá mạnh từ đầu. Nếu camera offset hoặc lighting quá cực đoan, policy chưa học được task đã phải học robust perception. Bắt đầu nhẹ, tăng dần.

Không lưu seed và metadata. Khi replay ra dữ liệu lỗi, bạn cần biết randomization nào gây lỗi.

Nhầm zero-shot với zero-validation. Trước khi lên robot thật, vẫn cần validation trong nhiều scene, nhiều lighting và nhiều camera pose.

Kết quả và ý nghĩa

Paper đánh giá OASIS trên Unitree G1 thật với bốn task loco-manipulation. Kết quả chính: dữ liệu simulation của OASIS giúp policy deploy zero-shot thành công và trong nhiều trường hợp tốt hơn policy train từ real teleoperation data cùng ngân sách trajectory. Ablation cũng cho thấy domain randomization và curriculum rollout là hai thành phần quan trọng, không phải chi tiết phụ.

Với đội robotics nhỏ, ý nghĩa thực tế là: bạn không nhất thiết phải có một lab lớn với nhiều humanoid mới bắt đầu xây dựng dataset whole-body. Bạn có thể dùng Isaac Lab để tạo scene, teleop trong sim, replay offline, rồi train policy. Vẫn còn nhiều việc khó - low-level controller, latency, safety, camera calibration - nhưng bottleneck dữ liệu bắt đầu dịch chuyển từ "cần nhiều robot thật" sang "cần pipeline simulation đủ sạch".

Nếu bạn đang làm VLA hoặc WholeBodyVLA, OASIS cũng gợi ý một hướng data engine rất thực dụng: không cố thu thập mọi thứ từ web video, cũng không chỉ dựa vào RL reward phức tạp, mà dùng simulation teleop để tạo trajectory đúng embodiment rồi nhân rộng bằng rendering.

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

Bản đồ pipeline WholeBodyVLA
wholebody-vla

Bản đồ pipeline WholeBodyVLA

10/6/202616 phút đọc
NT
Đánh giá VLA toàn thân
wholebody-vla

Đánh giá VLA toàn thân

10/6/202615 phút đọc
NT
NVIDIA GR00T + SONIC Whole-Body VLA
wholebody-vla

NVIDIA GR00T + SONIC Whole-Body VLA

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