Khi humanoid gặp VLA: Pi0-FAST trên Unitree G1
Tưởng tượng bạn có một chiếc robot hình người — Unitree G1 với 29 bậc tự do, hai cánh tay khéo léo, đôi chân đủ mạnh để đi bộ — và bạn muốn nó không chỉ đứng yên nhặt đồ mà đi lại trong căn phòng, tiếp cận vật thể, rồi thực hiện thao tác tay với độ chính xác cao. Đây là bài toán loco-manipulation — và LeRobot v0.5.0 là framework đầu tiên trong thế giới open-source cho phép bạn làm điều này.
Bản phát hành LeRobot v0.5.0 vào tháng 3/2026 đánh dấu một cột mốc lịch sử: lần đầu tiên, một humanoid robot được tích hợp đầy đủ vào pipeline huấn luyện mã nguồn mở — từ thu thập dữ liệu, qua huấn luyện policy VLA, đến inference real-time với Real-Time Chunking. Và policy được chọn để "khai trương" Unitree G1? Chính là Pi0-FAST — VLA autoregressive nhanh gấp 5 lần so với Pi0 gốc.
Bài viết này sẽ dẫn bạn qua toàn bộ pipeline: hiểu kiến trúc G1 trong LeRobot, setup môi trường, thực hiện teleoperation bằng Homunculus Exoskeleton, thu thập dataset cho whole-body control, huấn luyện Pi0-FAST, và deploy với RTC. Nếu bạn đã đọc Pi0-FAST training guide và tổng quan v0.5, đây là bước tiếp theo — đưa mọi thứ lên hardware thực tế.
Unitree G1 trong LeRobot v0.5.0: Robot humanoid đầu tiên
Tại sao G1 là "humanoid đầu tiên" của LeRobot?
Trước v0.5.0, LeRobot hỗ trợ nhiều loại robot arm (SO-100, Koch, Panda, WidowX) và mobile manipulator, nhưng chưa có humanoid nào. G1 phá vỡ giới hạn đó vì ba lý do:
- Unitree mở hơn Boston Dynamics — G1 có API SDK đầy đủ, không cần license thương mại để tích hợp custom software
- Giá hợp lý — G1 ở mức ~$16,000, thấp hơn nhiều so với các humanoid research-grade khác
- Cộng đồng lớn — Unitree đã có ecosystem rộng từ Go2, Go1, và H1; community code sẵn có nhiều
Hai biến thể: 23 DoF vs 29 DoF
LeRobot v0.5.0 hỗ trợ cả hai biến thể:
| Thông số | G1 23-DoF | G1 29-DoF |
|---|---|---|
| Chân (mỗi bên) | 6 joints | 6 joints |
| Cánh tay (mỗi bên) | 4 joints | 7 joints |
| Tay (gripper) | Không có | 3 DoF/tay |
| Tốc độ đi bộ | 2 m/s | 2 m/s |
| Payload cánh tay | 3 kg | 1.5 kg |
| Use case | Locomotion nặng | Dexterous manipulation |
Với whole-body loco-manipulation (đi lại + dùng tay), 29-DoF là lựa chọn tốt hơn vì độ linh hoạt của cánh tay và khả năng dùng bàn tay để cầm nắm.
Hai locomotion controller: Holoso vs GR00T
Đây là phần độc đáo nhất của G1 integration. LeRobot không tự viết locomotion controller — thay vào đó, nó tích hợp với hai controller bên ngoài:
HolosomaLocomotionController (mã nguồn mở):
- Dự án open-source, có thể modify và inspect code
- Điều khiển locomotion (đi bộ, dừng, quay) qua giao diện velocity command
- Phù hợp với research và experimentation
- Cài đặt phức tạp hơn một chút vì nhiều dependency
GR00T-WholeBodyControl (NVIDIA):
- Dùng NVIDIA GR00T foundation model làm locomotion backbone
- Hiệu suất cao hơn, phục hồi sau mất thăng bằng tốt hơn
- Yêu cầu NVIDIA GPU trên robot (Jetson AGX Orin hoặc tương đương)
- Phù hợp với production deployment
Chọn controller nào? Nếu bạn đang research và muốn hiểu sâu → Holoso. Nếu bạn muốn kết quả tốt nhất ngay → GR00T.
Pi0-FAST: Tại sao đây là policy lý tưởng cho G1?
Vấn đề với diffusion trên humanoid
Pi0 gốc dùng flow matching (một dạng diffusion). Mỗi inference step cần 10-50 bước denoising, mỗi bước là một forward pass qua network 2B parameter. Kết quả: inference latency 300-600ms trên GPU thông thường.
Với một robot arm đứng yên, latency 300ms là chấp nhận được — bạn chờ thêm 0.3 giây rồi robot mới thực hiện hành động. Với một humanoid đang đi bộ, latency 300ms là thảm họa — robot có thể mất thăng bằng trong khoảng thời gian đó.
Pi0-FAST giải quyết điều này bằng cách chuyển từ diffusion sang autoregressive generation. Thay vì denoising lặp đi lặp lại, Pi0-FAST predict action tokens một lần — như LLM generate text, nhưng generate robot joint angles.
Kiến trúc Pi0-FAST chi tiết
Input:
- Camera images (RGB, 224×224 hoặc 448×448)
- Text instruction ("Pick up the cup and walk to the table")
- Robot state (joint positions, velocities)
↓
SigLIP Vision Tower (ViT-So400M)
- Encode images thành visual tokens
- Patch size: 16×16, 576 tokens/image
↓
PaliGemma Backbone (Gemma 2B)
- Multimodal attention giữa visual + text + state tokens
- KV-cache cho inference tối ưu
↓
FAST Action Tokenizer
- Normalize action chunk (quantile normalization)
- DCT per dimension (như JPEG nhưng cho time series)
- Quantize + prune insignificant coefficients
- Output: ~20 discrete tokens thay vì 50×29 = 1450 floats
↓
Autoregressive decoding (Gemma action head)
- Generate FAST tokens từng token một
- Decode về continuous joint angles
Output: Action chunk (50 bước × 29 DoF = 1450 giá trị)
FAST tokenization là chìa khóa. Bằng cách apply Discrete Cosine Transform (DCT) — cùng thuật toán JPEG dùng để compress ảnh — lên time series của joint angles, FAST nén 1450 float thành ~20 discrete tokens. 10x compression ratio. Điều này không chỉ làm inference nhanh hơn mà còn giúp model học hiệu quả hơn vì sequence length ngắn hơn.
So sánh tốc độ inference
| Policy | Latency trên RTX 4090 | Control frequency | Phù hợp WBC? |
|---|---|---|---|
| Pi0 (diffusion) | 300-600ms | 1.5-3 Hz | Không |
| Pi0-FAST (autoregressive) | 60-120ms | 8-16 Hz | Có |
| SmolVLA | 40-80ms | 12-25 Hz | Có |
| ACT | 20-40ms | 25-50 Hz | Có |
Pi0-FAST ở mức 8-16 Hz — đủ phản ứng cho loco-manipulation khi kết hợp với Real-Time Chunking.
Real-Time Chunking: Giải pháp cho high-latency models
Ngay cả 8 Hz vẫn có latency 125ms — trong thời gian đó robot đã thực hiện được 6-7 bước locomotion. Đây là lúc Real-Time Chunking (RTC) phát huy tác dụng.
RTC hoạt động như thế nào?
Thay vì đợi inference xong rồi mới execute action, RTC cho phép robot tiếp tục thực hiện chunk cũ trong khi inference chunk mới đang chạy. Khi chunk mới xong, RTC không "cut" ngay mà blend mượt mà với chunk đang chạy:
Timeline (không có RTC):
t=0 [Inference A: 120ms] → [Execute chunk A: 500ms] → [Inference B: 120ms] → ...
Timeline (với RTC):
t=0 [Inference A: 120ms]
t=120 [Execute A] + [Inference B: chạy nền]
t=240 [Blend A→B smoothly]
t=360 [Execute B] + [Inference C: chạy nền]
...
RTC thêm một guidance term vào quá trình denoising: nó "kéo" chunk mới về phía các bước đã được execute trong chunk cũ để đảm bảo continuity. Không có RTC, bạn sẽ thấy robot jerky — mỗi khi policy replanning, robot giật cục. Với RTC, chuyển động mượt mà như chạy ở 25+ Hz.
Với G1 whole-body control, RTC đặc biệt quan trọng cho phần locomotion — mất balance control chỉ vài frame là có thể ngã.
Cài đặt môi trường
Yêu cầu hệ thống
- GPU: RTX 4080/4090 hoặc A100 (để inference Pi0-FAST real-time)
- RAM: 32 GB+ (G1 state observation không nhỏ)
- OS: Ubuntu 22.04 (tested) hoặc Ubuntu 20.04
- Python: 3.12 (LeRobot v0.5.0 yêu cầu Python 3.12)
- CUDA: 12.1+
Cài đặt LeRobot v0.5.0 với G1 support
# Clone LeRobot
git clone https://github.com/huggingface/lerobot.git
cd lerobot
# Tạo virtual environment Python 3.12
python3.12 -m venv venv
source venv/bin/activate
# Cài đặt LeRobot với G1 dependencies
pip install -e ".[unitree_g1]"
# Nếu dùng HolosomaLocomotionController
pip install -e ".[unitree_g1,holoso]"
# Nếu dùng GR00T
pip install -e ".[unitree_g1,groot]"
Cài đặt Unitree SDK
# Unitree SDK2 Python bindings
pip install unitree-sdk2py
# Verify kết nối robot (robot phải trong cùng mạng LAN)
python -c "from unitree_sdk2py.core.channel import ChannelFactory; print('SDK OK')"
Download pretrained Pi0-FAST checkpoint
# Base checkpoint (pretrained trên 1M+ real robot sequences)
python -c "
from huggingface_hub import snapshot_download
snapshot_download(
repo_id='lerobot/pi0fast-base',
local_dir='./checkpoints/pi0fast-base'
)
"
Teleoperation với Homunculus Exoskeleton
Homunculus là bộ exoskeleton 7-DoF open-source do cộng đồng LeRobot phát triển để điều khiển G1 whole-body. Nó track cử động cánh tay và bàn tay của operator và map sang G1's arms + hands.
Setup teleoperation
# Chạy session teleoperation để thu thập dữ liệu
python lerobot/scripts/control_robot.py \
--robot.type=unitree_g1 \
--robot.variant=29dof \
--robot.controller=HolosomaLocomotionController \
--control.type=teleoperate \
--control.fps=30 \
--control.display_cameras=true
Trong lần đầu chạy, script sẽ hỏi bạn calibrate Homunculus — giơ tay ở neutral position để thiết lập reference frame. Quá trình này mất ~2 phút.
Thu thập dataset cho whole-body task
Mục tiêu: dạy G1 thực hiện task "đi đến bàn, nhặt cốc nước, mang đến điểm đích".
# Record episodes — mỗi episode là 1 lần thực hiện task
python lerobot/scripts/control_robot.py \
--robot.type=unitree_g1 \
--robot.variant=29dof \
--robot.controller=HolosomaLocomotionController \
--control.type=record \
--control.fps=30 \
--control.single_task="Walk to table, pick up cup, carry to target" \
--control.repo_id="your_username/g1-cup-transport" \
--control.num_episodes=100 \
--control.push_to_hub=true
Lưu ý khi thu thập dữ liệu WBC:
- Độ dài episode: Whole-body task thường dài hơn arm-only task — 30-60 giây thay vì 5-15 giây. Đảm bảo buffer đủ lớn.
- Camera placement: Gắn ít nhất 2 camera: 1 chest camera (góc nhìn egocentric) và 1 external overhead camera.
- Locomotion diversity: Thu thập data với các locomotion style khác nhau — đi thẳng, rẽ trái/phải, dừng chờ, để model học generalization.
- 50+ episodes tối thiểu cho single task, 100+ tốt hơn cho WBC vì action space phức tạp hơn nhiều.
Huấn luyện Pi0-FAST cho Unitree G1
Cấu hình training
Pi0-FAST cần train FAST tokenizer trước, sau đó fine-tune model chính. Đây là điểm khác biệt so với ACT hay Diffusion Policy.
Bước 1: Train FAST tokenizer trên dataset của bạn
python lerobot/scripts/train_fast_tokenizer.py \
--dataset.repo_id="your_username/g1-cup-transport" \
--tokenizer.vocab_size=512 \
--tokenizer.chunk_size=50 \
--tokenizer.dct_components=0.95 \
--output_dir="./checkpoints/fast-tokenizer-g1"
Tham số quan trọng:
vocab_size=512: Số discrete tokens. Tăng lên 1024 nếu action space phức tạp (29-DoF WBC cần nhiều hơn arm-only)chunk_size=50: Bao nhiêu bước mỗi action chunk. 50 ≈ 1.67 giây ở 30 Hzdct_components=0.95: Giữ lại DCT coefficients đến khi explain 95% variance
Bước 2: Fine-tune Pi0-FAST
python lerobot/scripts/train.py \
--policy.type=pi0fast \
--policy.pretrained="./checkpoints/pi0fast-base" \
--dataset.repo_id="your_username/g1-cup-transport" \
--policy.fast_tokenizer_path="./checkpoints/fast-tokenizer-g1" \
--training.batch_size=32 \
--training.num_epochs=100 \
--training.learning_rate=1e-4 \
--training.use_amp=true \
--output_dir="./checkpoints/pi0fast-g1-cup" \
--wandb.enable=true
Hardware requirements cho training
| Config | GPU | VRAM | Thời gian/epoch (100 eps) |
|---|---|---|---|
| Pi0-FAST full | A100 80GB | 60 GB | ~15 phút |
| Pi0-FAST + PEFT/LoRA | RTX 4090 | 20 GB | ~25 phút |
| Pi0-FAST + PEFT/LoRA | RTX 3090 | 18 GB | ~40 phút |
Không có A100? Dùng PEFT/LoRA fine-tuning — chỉ train adapter layers, giữ nguyên backbone frozen:
python lerobot/scripts/train.py \
--policy.type=pi0fast \
--policy.pretrained="./checkpoints/pi0fast-base" \
--training.peft.enabled=true \
--training.peft.method=lora \
--training.peft.rank=16 \
--training.peft.alpha=32 \
# ... các tham số khác như trên
Inference với Real-Time Chunking
Deploy policy lên G1
python lerobot/scripts/control_robot.py \
--robot.type=unitree_g1 \
--robot.variant=29dof \
--robot.controller=HolosomaLocomotionController \
--control.type=inference \
--policy.path="./checkpoints/pi0fast-g1-cup" \
--control.fps=30 \
--control.rtc.enabled=true \
--control.rtc.execution_horizon=10 \
--control.rtc.max_guidance_weight=2.0 \
--control.task="Walk to table, pick up cup, carry to target"
Tham số RTC quan trọng
execution_horizon=10: Blend 10 bước đầu của chunk mới với chunk cũ. Tăng lên nếu chuyển động bị jerky.max_guidance_weight=2.0: Cường độ "kéo" chunk mới về phía chunk cũ. Giá trị cao hơn = mượt hơn nhưng có thể kém reactive.prefix_attention_schedule=exponential: Cách decay guidance weight theo thời gian.
Monitoring real-time
# Terminal thứ hai — xem latency và success rate
python lerobot/scripts/monitor_inference.py \
--log_file="./logs/g1-inference.log" \
--plot_latency=true
Kết quả và benchmark
Dựa trên kết quả từ LeRobot team và community experiments với G1:
| Task | Policy | Success Rate | Avg Completion Time |
|---|---|---|---|
| Pick & place (standing) | Pi0-FAST + RTC | 87% | 8.2s |
| Pick & place (standing) | ACT | 82% | 6.1s |
| Loco-manipulation: cup transport | Pi0-FAST + RTC | 71% | 24.3s |
| Loco-manipulation: cup transport | Pi0-FAST (no RTC) | 43% | 31.1s |
| Door opening (walking) | Pi0-FAST + RTC | 58% | 18.7s |
Một số nhận xét:
- RTC tăng success rate loco-manipulation từ 43% → 71% — tác động lớn nhất là ở các task kết hợp locomotion + manipulation
- ACT nhanh hơn cho simple pick-and-place, nhưng Pi0-FAST generalize tốt hơn sang tasks chưa thấy
- 100 episodes là điểm ngọt cho WBC — thêm data vẫn cải thiện nhưng với diminishing returns
Pitfalls thường gặp
1. Robot mất thăng bằng khi policy replanning
- Nguyên nhân: Latency quá cao hoặc RTC chưa được bật
- Fix: Bật
--control.rtc.enabled=truevà tăngexecution_horizon
2. Training loss không giảm
- Nguyên nhân: FAST tokenizer chưa được train trên dataset của bạn — đang dùng tokenizer mặc định cho arm-only tasks
- Fix: Train custom tokenizer trước với
train_fast_tokenizer.py
3. Locomotion controller không connect
- Nguyên nhân: Unitree SDK chưa nhận diện được robot IP
- Fix: Verify
ROBOT_IPenvironment variable:export ROBOT_IP=192.168.123.1
4. OOM khi train Pi0-FAST full
- Fix: Dùng
--training.gradient_checkpointing=truevà--training.peft.enabled=true
Kết luận
LeRobot v0.5.0 + Pi0-FAST + Unitree G1 là tổ hợp mạnh nhất hiện có trong open-source robotics cho whole-body loco-manipulation. Pipeline này không phải không có thách thức — setup phức tạp, yêu cầu GPU cao, và cần ít nhất 100 episodes demonstration — nhưng đây là lần đầu tiên trong lịch sử bạn có thể làm tất cả điều đó mà không cần trả tiền cho proprietary framework.
Bước tiếp theo tự nhiên là thử với các task phức tạp hơn: mang đồ vật lên cầu thang, mở tủ lạnh, hay tương tác với con người trong môi trường dynamic. Framework đã sẵn sàng — phần còn lại là dữ liệu và thử nghiệm.