unifolm-vla + Unitree G1 (Bài 1): kiến trúc hệ thống WBC+VLA từ dữ liệu đến robot thật
Đây là bài mở đầu của series 5 bài hướng dẫn xây dựng hệ thống Whole-Body Control + Vision-Language-Action (WBC+VLA) cho robot hình người Unitree G1 — từ thu thập dữ liệu thực tế đến deploy lên phần cứng thật.
Series này khác với series GR00T N1 + G1 ở chỗ: thay vì dùng NVIDIA GR00T-WBC (cần access đặc biệt và tích hợp phức tạp), chúng ta dùng Unitree native stack — bộ công cụ do chính Unitree phát triển, hoạt động ngay trên G1 mà không cần cấu hình thêm bất kỳ SDK bên ngoài nào.
Vấn đề: tại sao cần WBC+VLA cho humanoid?
Robot hình người có 2 thách thức lớn cùng lúc:
Bài toán 1 (Locomotion): Bài toán 2 (Manipulation):
G1 phải giữ thăng bằng G1 phải nhìn vào vật thể
khi đứng / đi / di chuyển và điều khiển tay + ngón
→ 12 bậc tự do (chân) → 7+7+2+2 bậc tự do (tay)
→ Chạy ở 200–500 Hz → Chạy ở 3–10 Hz (VLM)
Hai vòng lặp này không thể chạy cùng 1 controller — tần số quá khác nhau. Giải pháp là decoupled WBC+VLA:
┌─────────────────────────────────────────────┐
│ G1 Whole-Body │
├──────────────────┬──────────────────────────┤
│ ARM VLA │ LOCOMOTION │
│ unifolm-vla │ G1 built-in SDK │
│ Qwen2.5-VL-7B │ hoặc unitree_rl_gym │
│ ~3-5 Hz │ 200-500 Hz │
│ Điều khiển tay │ Điều khiển chân │
└──────────────────┴──────────────────────────┘
↕ ↕
xr_teleoperate motion.pt
(thu dữ liệu tay) (pretrained loco)
Hai hệ thống chạy song song, độc lập — G1 vừa đi lại vừa dùng tay làm việc.
Ba repo cốt lõi của series này
1. unifolm-vla — VLA cho cánh tay G1
GitHub: https://github.com/unitreerobotics/unifolm-vla
unifolm-vla là mô hình Vision-Language-Action do Unitree phát triển cho robot hình người của họ, đặc biệt là G1. Điểm đặc biệt:
- Backbone:
Qwen/Qwen2.5-VL-7B-Instruct— mô hình VLM 7 tỉ tham số của Alibaba, công khai trên HuggingFace - Action head: dự đoán joint commands cho cánh tay G1 (7+7 DoF arm + 2+2 DoF gripper)
- Base checkpoint:
Unifolm-VLM-0— checkpoint pretrained của Unitree, chưa công khai tại thời điểm viết bài - Workaround: trong series này, chúng ta sẽ fine-tune trực tiếp từ
Qwen2.5-VL-7B-Instruct(công khai) — hiệu quả thấp hơn một chút nhưng hoàn toàn khả thi
# Repo structure chính
unifolm-vla/
├── src/unifolm_vla/
│ ├── training/train_unifolm_vla.py # training script
│ ├── config/deepseeds/ # DeepSpeed configs
│ └── models/ # model definitions
├── prepare_data/
│ ├── convert_lerobot_to_hdf5.py # data pipeline step 2
│ └── hdf5_to_rlds/ # data pipeline step 3
└── run_real_eval_server.py # FastAPI inference server
2. xr_teleoperate — thu thập dữ liệu qua VR
GitHub: https://github.com/unitreerobotics/xr_teleoperate
Đây là tool thu thập dữ liệu teleoperation qua các headset XR:
| Thiết bị | Platform | Độ trễ | Ghi chú |
|---|---|---|---|
| Meta Quest 3 | Android | ~40ms | Phổ biến nhất, giá tốt nhất |
| Apple Vision Pro | visionOS | ~30ms | Tốt nhất, đắt nhất |
| PICO 4 Ultra | Android | ~45ms | Phổ biến ở châu Á |
Dữ liệu thu thập: JSON format chứa chuỗi thời gian của pose tay + joint states + camera frames.
3. unitree_rl_gym — locomotion cho G1
GitHub: https://github.com/unitreerobotics/unitree_rl_gym
Repo này chứa RL training cho locomotion G1 dùng Isaac Gym (KHÔNG phải IsaacLab). Điểm quan trọng:
- Có sẵn
motion.pt— checkpoint pretrained locomotion cho G1 (đã public) - Nếu bạn chỉ cần G1 đứng/đi/chạy, không cần train lại — dùng
motion.pttrực tiếp - Chỉ cần train lại khi muốn locomotion behavior tùy chỉnh (VD: leo cầu thang, chạy nhanh hơn)
# Cấu trúc chính
unitree_rl_gym/
├── legged_gym/
│ ├── scripts/
│ │ ├── train.py # train locomotion policy
│ │ └── play.py # evaluate / visualize
│ └── envs/
│ └── g1/ # G1 environment config
└── resources/
└── robots/g1/
└── motion.pt # pretrained G1 locomotion ✅
Hardware requirements
G1 phần cứng cần thiết
| Component | Spec | Ghi chú |
|---|---|---|
| Unitree G1 | 29 DoF | Có Dex3 hands (tay 3 ngón dexterous) |
| Onboard compute | Jetson Orin NX hoặc tương đương | Có sẵn trong G1 |
| Camera | Intel RealSense D435 (wrist-mounted) | Cần gắn thêm nếu chưa có |
| Mạng | LAN (dây) khi deploy | WiFi có thể gây jitter |
Workstation requirements
| Component | Minimum | Recommended |
|---|---|---|
| GPU | RTX 4090 (24GB) | A100 40GB |
| RAM | 32GB | 64GB |
| CPU | 8-core | 16-core |
| Storage | 200GB SSD | 500GB NVMe |
| VR headset | Meta Quest 3 | Apple Vision Pro |
Lưu ý quan trọng: RTX 4090 là minimum cho training. Nếu chỉ deploy (inference server), RTX 3080 10GB cũng đủ — Qwen2.5-VL-7B có thể chạy ở 4-bit quantization với ~8GB VRAM.
Setup môi trường
Bước 1: Clone các repo
mkdir ~/unifolm_ws && cd ~/unifolm_ws
# Repo 1: unifolm-vla (VLA model)
git clone https://github.com/unitreerobotics/unifolm-vla.git
# Repo 2: xr_teleoperate (data collection)
git clone https://github.com/unitreerobotics/xr_teleoperate.git
# Repo 3: unitree_rl_gym (locomotion)
git clone https://github.com/unitreerobotics/unitree_rl_gym.git
# Repo phụ: unitree_IL_lerobot (data conversion)
git clone https://github.com/unitreerobotics/unitree_IL_lerobot.git
Bước 2: Tạo conda environments
Mỗi repo cần environment riêng (dependencies conflict nhau):
# Environment cho xr_teleoperate
conda create -n xr_teleop python=3.10
conda activate xr_teleop
cd xr_teleoperate
pip install -r requirements.txt
# Environment cho unifolm-vla (training + inference)
conda create -n unifolm python=3.10
conda activate unifolm
cd unifolm-vla
pip install -e .
pip install deepspeed accelerate
# Environment cho unitree_rl_gym (locomotion, cần Isaac Gym)
# Isaac Gym yêu cầu riêng — xem hướng dẫn trong repo
conda create -n loco python=3.8
conda activate loco
cd unitree_rl_gym
pip install -e .
Bước 3: Cài Unitree SDK Python
Cần cho bước deploy (giao tiếp với G1):
conda activate unifolm
pip install unitree_sdk2py
Verify kết nối với G1:
python -c "
from unitree_sdk2py.core.channel import ChannelFactory
factory = ChannelFactory.Instance()
factory.Init(0, 'eth0') # thay eth0 bằng network interface của bạn
print('G1 connected OK')
"
Bước 4: Download Qwen2.5-VL-7B-Instruct
conda activate unifolm
pip install huggingface_hub
python -c "
from huggingface_hub import snapshot_download
snapshot_download(
repo_id='Qwen/Qwen2.5-VL-7B-Instruct',
local_dir='~/models/Qwen2.5-VL-7B-Instruct',
ignore_patterns=['*.gguf', '*.bin'] # chỉ lấy safetensors
)
print('Download xong!')
"
Download khoảng 15GB — cần ổ cứng trống ~30GB (model + optimizer states).
Luồng dữ liệu end-to-end
Để dễ hình dung toàn bộ series:
[Bài 2] Thu thập dữ liệu
xr_teleoperate → teleop_hand_and_arm.py → JSON files
↓
[Bài 3] Data pipeline
JSON → unitree_IL_lerobot → LeRobot V2.1 format
→ unifolm-vla prepare_data → HDF5
→ hdf5_to_rlds → RLDS format
↓
[Bài 4] Training
RLDS → accelerate launch train_unifolm_vla.py → checkpoint
↓
[Bài 5] Deploy
checkpoint → run_real_eval_server.py (FastAPI /act)
→ SSH tunnel → G1 robot client
+ motion.pt → G1 locomotion (song song)
Tóm tắt bài 1
Bạn đã hiểu:
- unifolm-vla dùng Qwen2.5-VL-7B làm backbone (VLA cho cánh tay G1)
- xr_teleoperate thu thập dữ liệu qua VR headset (Meta Quest 3 là lựa chọn tốt)
- unitree_rl_gym cung cấp locomotion qua
motion.ptpretrained (không cần train lại) - Ba hệ thống chạy song song để tạo ra "whole-body control"
- Checkpoint
Unifolm-VLM-0chưa public → chúng ta fine-tune từQwen2.5-VL-7B-Instruct(public)
Bài tiếp theo sẽ hướng dẫn chi tiết thu thập dữ liệu với xr_teleoperate + Meta Quest 3 trên G1 thật.
References
- unifolm-vla GitHub
- xr_teleoperate GitHub
- unitree_rl_gym GitHub
- Qwen2.5-VL-7B-Instruct (HuggingFace)
- Unitree SDK2 Python



