simulationisaac-labsim2realwheeled-robotreinforcement-learningrc-cardrift

Wheeled Lab: train RC car drift sim-to-real với Isaac Lab

Hướng dẫn chi tiết Wheeled Lab — open-source ecosystem cho phép train RC car drift, leo dốc, visual nav trong Isaac Lab và deploy thẳng ra phần cứng thật, chi phí dưới $1000.

Nguyễn Anh Tuấn27 tháng 4, 202610 phút đọc
Wheeled Lab: train RC car drift sim-to-real với Isaac Lab

Nếu bạn đã từng đọc paper RL robotics rồi thở dài "muốn thử nhưng máy không có, robot không có, lab không có" — thì Wheeled Lab là món quà dành cho bạn. Đây là project mã nguồn mở từ University of Washington (CoRL 2025) cho phép bạn train RC car biết drift, leo dốc, đi theo camera, rồi deploy thẳng ra xe thật không cần fine-tune. Phần cứng rẻ nhất chỉ ~$930, GPU một con RTX 3080 là đủ chạy.

Trong bài này, tôi sẽ đi từ ý tưởng paper, kiến trúc hệ thống, cài đặt, training, đến deploy xe thật — đủ chi tiết để một sinh viên năm 3 cũng làm theo được.

RC car drift trên đường nhựa

1. Wheeled Lab giải quyết bài toán gì?

Trước Wheeled Lab, hệ sinh thái RL cho wheeled robot bị xé thành nhiều mảnh:

  • Sim hiện đại (Isaac Lab, MuJoCo MJX) chủ yếu phục vụ humanoid và quadruped.
  • Wheeled robot platform (MuSHR, F1Tenth, HOUND) có nhưng pipeline sim2real mỗi nhóm tự build, không tái sử dụng được.
  • Drift, off-road, visual nav đều có paper riêng nhưng code đóng kín hoặc đã bit-rot.

Tác giả Tyler Han và đồng nghiệp tại UW Robot Learning Lab quyết định gom tất cả vào một ecosystem chung dựng trên Isaac Lab v2.0.2: một xe chuẩn, một sim chuẩn, một bộ task chuẩn, một workflow deploy chuẩn. Kết quả là 3 demo zero-shot sim-to-real:

Task Mô tả Highlight
Controlled Drifting Drift quanh đường oval Đầu tiên trong literature làm zero-shot drift policy
Elevation Traversal Leo dốc, vượt chướng ngại Học từ height map ngẫu nhiên
Visual Navigation Đi theo waypoint qua camera Input ảnh xám 40×60

Điểm "đắt" nhất là drift: trước đây ai làm drift cũng phải fine-tune ngoài thực địa hoặc dùng MPC kết hợp model động học chính xác. Wheeled Lab cho thấy chỉ cần massive parallelization + domain randomization trong Isaac Lab là đủ.

Paper: Wheeled Lab: Modern Sim2Real for Low-cost, Open-source Wheeled Robotics — Han et al., CoRL 2025.

2. Phần cứng: $930 hay $3000?

Wheeled Lab support 2 platform chính, đều mua được trên Amazon hoặc tự lắp:

MuSHR-mini (~$930)

  • Khung Traxxas Slash 1/10 (RC car)
  • Compute: Jetson Nano hoặc Raspberry Pi 4
  • IMU đơn giản, không cần LiDAR
  • Phù hợp drift + visual nav indoor

HOUND (~$3000)

  • Khung Traxxas X-Maxx (off-road truck 1/5)
  • Compute: Jetson Orin NX (~70 TOPS)
  • Sensor: LiDAR 2D + RGB camera
  • Wheelbase 0.28m, track width 0.23m, mass 3.5kg
  • Drive: tự sửa thành rear-wheel drive, dán băng dính lên bánh để giảm ma sát → drift dễ hơn

Trick "tape-wrapped wheels" của HOUND là chi tiết kỹ thuật rất Việt Nam: kỹ sư hack vật liệu để fit với sim, thay vì cố sim chính xác bánh xe cao su mềm phức tạp.

3. Kiến trúc Wheeled Lab

WheeledLab/
├── source/
│   ├── wheeledlab/              # Core utilities, configs
│   ├── wheeledlab_assets/       # USD models của HOUND, MuSHR
│   ├── wheeledlab_tasks/        # Drift, Elevation, Visual envs
│   └── wheeledlab_rl/           # Training scripts, PPO configs
└── scripts/
    └── train_rl.py              # Entry point chính

Bốn package được wire vào nhau qua Isaac Lab API: bạn import wheeledlab_tasks thì nó register environments theo chuẩn gym.make("Isaac-Drift-Hound-v0"), dùng được luôn với RSL-RL hoặc rl_games.

Workflow tổng:

flowchart LR
    A[Isaac Lab Sim] --> B[Domain Randomization]
    B --> C[1024 parallel envs]
    C --> D[PPO Training]
    D --> E[Policy .pt]
    E --> F[Real Lab deploy]
    F --> G[HOUND / MuSHR]

Ý tưởng cốt lõi: train trong sim với phân phối rộng hơn thực tế, policy buộc phải học strategy "bền" với mọi friction, mass, latency. Khi gặp xe thật, vốn nằm gọn trong phân phối đó, policy chỉ cần "nhận diện" mình ở scenario nào và xử lý.

4. Cài đặt từng bước

4.1 Yêu cầu hệ thống

  • Ubuntu 22.04 (20.04 cũng được nhưng cần Isaac Sim binary)
  • GPU NVIDIA ≥ 10GB VRAM (RTX 3080 trở lên ổn nhất)
  • Python 3.10
  • Conda hoặc miniconda

4.2 Tạo môi trường conda

conda create -n WL python=3.10
conda activate WL
pip install --upgrade pip

4.3 Cài Isaac Sim 4.5.0

pip install 'isaacsim[all,extscache]==4.5.0' \
  --extra-index-url https://pypi.nvidia.com

Lần đầu chạy sẽ tải ~15GB asset cache. Để qua đêm cho yên tâm.

4.4 Cài Isaac Lab v2.0.2

git clone --branch v2.0.2 https://github.com/isaac-sim/IsaacLab.git
cd IsaacLab
./isaaclab.sh -i

Lệnh này tự cài thêm các extension như omni.isaac.lab, omni.isaac.lab_tasks, rsl_rl.

4.5 Cài Wheeled Lab

git clone https://github.com/UWRobotLearning/WheeledLab.git
cd WheeledLab/source
pip install -e wheeledlab
pip install -e wheeledlab_tasks
pip install -e wheeledlab_assets
pip install -e wheeledlab_rl

Sau cùng, fix một bug numpy phổ biến:

pip install --force-reinstall "numpy<2"

Verify cài thành công:

python -c "import wheeledlab_tasks; print('OK')"

5. Bài toán Drift: reward, observation, action

Đây là phần "ngon" nhất paper. Drift không phải bài toán control kiểu thường — bạn không thể bảo "đi theo line này", mà phải khuyến khích xe trượt mà vẫn theo line. Wheeled Lab dùng 6 reward components:

Reward Ý nghĩa
cross_track_distance Khoảng cách lateral từ đường oval → giảm đi xa
velocity Khuyến khích tốc độ cao
side_slip Chỉ thưởng khi slip angle 0–30° (vùng "drift ổn định")
progress Tiến theo chiều ngược kim đồng hồ
turn_energy Shaping cho velocity ở vùng cua
turn_left_go_right Khuyến khích counter-steering — chìa khóa của drift

Reward cuối cùng (turn_left_go_right) là một insight rất hay: muốn xe học drift thì phải cho nó biết "đánh lái ngược" là điều tốt, nếu không nó sẽ học cách đi nhanh nhưng không drift, vì đi thẳng cũng tăng velocityprogress.

Action space

Chỉ 2 chiều liên tục:

  • Steering: -1 → +1 ánh xạ về ±30°
  • Throttle: -1 → +1

Observation space

Vector low-dim chứa:

  • Linear & angular velocity (body frame)
  • Yaw rate, slip angle
  • Vector hướng tới điểm tracking gần nhất
  • Last action (giúp policy mượt hơn)

Không có ảnh, không có LiDAR cho drift task — sim2real dễ hơn nhiều.

6. Domain Randomization: bí kíp sim2real

Đây là trái tim của Wheeled Lab. Mỗi episode, env sample lại các tham số:

  • Friction động (kinetic friction): khoảng 0.2 → 0.8 (đo bằng cân lò xo trên xe thật → midpoint ~0.4)
  • Mass: ±20% so với danh nghĩa
  • Center of mass offset: random vài cm
  • Motor latency: 0–50ms, mô phỏng delay từ MCU
  • Tire stiffness: random hệ số Pacejka

Friction range rộng là quyết định trọng tâm: xe thật chạy trên thảm khác sàn xi măng khác đường nhựa, nếu sim chỉ randomize hẹp thì policy fail ngay lần đổi địa hình. Sau khi tăng range lên ±100% so với midpoint, policy bắt đầu transfer được.

Đây cũng là chủ đề trung tâm của bài Sim-to-Real Pipeline cho Robotics — Wheeled Lab là ví dụ thực tế đáng học hỏi.

7. Training: 1024 envs, 5000 epoch, 1 GPU

Lệnh train drift:

python source/wheeledlab_rl/scripts/train_rl.py \
  --headless \
  -r RSS_DRIFT_CONFIG

Cấu hình mặc định:

Tham số Giá trị
Parallel envs 1024 (baseline 64)
Training epochs 5000
Algorithm PPO (RSL-RL)
GPU 1× RTX 3080
Wall-clock ~6 giờ

Tại sao 1024 thay vì 64? Vì domain randomization kéo dãn phân phối — bạn cần đủ batch để mỗi update step mẫu được toàn bộ phân phối, nếu không gradient sẽ noisy. Với 64 envs paper báo cáo policy không converge.

Các config khác:

# Elevation
python source/wheeledlab_rl/scripts/train_rl.py --headless -r RSS_ELEV_CONFIG

# Visual navigation
python source/wheeledlab_rl/scripts/train_rl.py --headless -r RSS_VISUAL_CONFIG

Visual nav có observation 40×60 grayscale + velocity + last action — nhỏ vừa đủ chạy realtime trên Jetson Nano.

Tắt wandb nếu không dùng:

... -r RSS_DRIFT_CONFIG train.log.no_wandb=True

Setup workstation cho RL training

8. Deploy ra HOUND/MuSHR thật

Sau train xong, policy lưu thành policy.pt. Để chạy trên xe:

git clone https://github.com/UWRobotLearning/RealLab.git
cd RealLab
pip install -e .

Trên Jetson Orin NX (HOUND) hoặc Jetson Nano (MuSHR-mini):

python deploy_drift.py --policy /path/to/policy.pt --vehicle hound

Pipeline runtime:

  1. IMU + encoder → tính velocity, yaw rate (~200Hz)
  2. Compose observation vector
  3. Policy forward (~2ms trên Orin NX)
  4. Output steering/throttle → ESC + servo qua PWM

Latency total ~10ms, đủ realtime cho drift ở 1.6 m/s.

Kết quả thật

  • Slip angle max: 58° (đỉnh điểm góc trượt — drift "mạnh tay")
  • Speed trung bình: 1.6 m/s
  • Recovery: khi xe spin out, policy tự lái về trở lại track
  • Zero-shot: không hề fine-tune trên xe thật

Đây là lần đầu trong literature drift policy transfer thành công zero-shot sim-to-real. Trước đây Yunlong Song (DroneRacing), Velocidrone đều phải fine-tune online.

9. Pitfall hay gặp

  1. Quên chạy numpy<2 → TypeError khi import. Force-reinstall ngay sau cài Isaac Lab.
  2. GPU < 10GB → 1024 envs sẽ OOM. Hạ xuống 256, tăng epoch lên 15000 để bù.
  3. Bánh xe không bọc băng dính trên HOUND → drift không nhất quán, policy mất tracking. Theo paper, đây là detail bắt buộc.
  4. Surface khác sim quá xa → ví dụ chạy trên cát, gravel — policy fail. Nếu cần địa hình lạ, tăng friction range randomize lên 0.05–1.2.
  5. Latency MCU lớn hơn 50ms → sim không cover, hành vi giật cục. Đo latency bằng oscilloscope, nếu > 50ms phải cập nhật firmware ESC.
  6. Track size khác sim → drift policy nhạy với bán kính cua. Nếu track thật to/nhỏ hơn ±30%, retrain với randomize cả size oval.

10. Wheeled Lab dạy ta điều gì?

Project này là case study đẹp về 3 nguyên tắc sim2real hiện đại:

  1. Massive parallelism thay thế simulation chính xác cao. Thay vì model bánh xe Pacejka phức tạp, dùng model thô nhưng randomize rộng.
  2. Reward shaping từ vật lý, không từ trực giác. turn_left_go_right ra đời vì hiểu drift = counter-steer, chứ không phải "thêm reward cho trông đẹp".
  3. Open-source ecosystem hơn open-source paper. Han và team không chỉ release code, họ release cả USD assets, deployment stack, hardware BOM. Đó là lý do project sẽ sống lâu.

Nếu bạn đang muốn nghiên cứu RL cho mobile robotics ở Việt Nam, đây là điểm khởi đầu tốt nhất hiện nay: rẻ, có doc, có community, lab UW trả lời issue trên GitHub.

Tôi đã thử cài và chạy task drift trong sim — sau 3 giờ training trên RTX 3090, policy đã quay được vòng oval mượt mà ở slip angle ~45°. Bước tiếp theo sẽ là tự lắp MuSHR-mini và deploy. Sẽ có bài tiếp theo nói về quá trình đó.

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

NEWTutorial
Ark v1.5: Python Framework cho Robot Learning sim-to-real
ark-frameworkpythonimitation-learningactdiffusion-policysim2realros

Ark v1.5: Python Framework cho Robot Learning sim-to-real

Hướng dẫn chi tiết Ark v1.5 — Python framework open-source train ACT + Diffusion Policy seamless giữa sim và robot thật, native ROS, Gym-style API.

8/5/202610 phút đọc
NEWTutorial
Booster Gym ICRA 2026: Train Humanoid T1 Sim-to-Real với Isaac Gym
humanoidisaac-gymreinforcement-learningsim2realbooster-t1icra-2026

Booster Gym ICRA 2026: Train Humanoid T1 Sim-to-Real với Isaac Gym

Hướng dẫn chi tiết Booster Gym — RL framework end-to-end open-source train humanoid Booster T1 walking từ teleop đến deploy thực tế.

6/5/202611 phút đọc
Tutorial
Hướng dẫn SO-101 sim-to-real với Isaac Lab & LeRobot
so-101isaac-lablerobotsim-to-realmanipulationgr00tdomain-randomization

Hướng dẫn SO-101 sim-to-real với Isaac Lab & LeRobot

Từng bước train cánh tay SO-101 trong NVIDIA Isaac Lab, thu thập dữ liệu teleop, fine-tune GR00T N1.5, và deploy policy lên robot thực tế.

29/4/202612 phút đọc