CoorDex: Hướng Dẫn Train Unitree G1 Vừa Đi Vừa Gắp Đồ Dexterous bằng Body và Hand Latent Priors
Có một vấn đề cơ bản mà các nhà nghiên cứu robot gặp phải suốt nhiều năm: robot humanoid giỏi đi bộ hoặc giỏi gắp đồ, nhưng hiếm khi làm được cả hai cùng một lúc. Hầu hết hệ thống đều theo mô hình "dừng lại rồi thao tác" — robot đi đến gần mục tiêu, dừng hẳn, thực hiện thao tác, rồi mới đi tiếp. Đây là nút thắt lớn trong ứng dụng thực tế.
CoorDex (arXiv 2606.23680) từ UNC Chapel Hill và UC Berkeley giải quyết vấn đề này theo một hướng tiếp cận thú vị: thay vì học trực tiếp trong không gian khớp 29 chiều thân người cộng thêm 20 ngón tay, framework này nén điều khiển thân người và tay dexterous vào các latent space nhỏ gọn, rồi học cách phối hợp chúng thông qua một residual policy chung.
Kết quả: Unitree G1 có thể vừa bước đi, vừa với tay gắp chai nước đang di chuyển, vừa mang đi — liên tục không dừng. Đây là lần đầu tiên điều này được chứng minh trên phần cứng thực với tay dexterous 7-DoF trong điều kiện liên tục loco-manipulation.
Tại Sao Bài Toán Này Khó Đến Vậy?
Hãy tưởng tượng bạn đang đi bộ và muốn nhặt một vật từ mặt bàn. Não bạn phối hợp một cách cực kỳ phức tạp: chân giữ thăng bằng và tạo bước đi, hông điều chỉnh trọng tâm, vai và cánh tay tiếp cận vật, ngón tay căn chỉnh chính xác để nắm đúng. Tất cả diễn ra đồng thời và liên tục.
Với robot, thách thức nhân lên gấp bội:
-
Không gian hành động cực lớn — Unitree G1 có 29 khớp thân người có actuator, cộng thêm 12-20 khớp ngón tay. Tổng cộng 41-49 chiều hành động. Học RL trực tiếp trong không gian này cực kỳ khó hội tụ vì không gian khám phá quá rộng.
-
Thang thời gian khác nhau — Locomotion cần điều chỉnh theo chu kỳ bước khoảng 0.5-1 giây, trong khi manipulation ngón tay cần phản hồi nhanh hơn nhiều để xử lý lực tiếp xúc.
-
Phụ thuộc cơ học chéo — Mỗi bước chân tạo ra nhiễu động lên toàn thân, ảnh hưởng trực tiếp đến vị trí cổ tay và ngón tay. Kiểm soát ngón tay trong khi đang bước phải bù lại dao động này theo thời gian thực.
-
Reward thưa thớt — Khi nào thì coi là "gắp thành công trong khi đi bộ"? Nếu robot đứng lại để gắp thì không tính. Reward design cho bài toán liên tục này rất không tầm thường.
Các cách tiếp cận trước đó — học trực tiếp toàn bộ khớp bằng PPO, hoặc tách rời locomotion và manipulation thành hai module riêng — đều thất bại hoàn toàn trong ablation study của paper này.
Kiến Trúc CoorDex: Ba Giai Đoạn Độc Lập

CoorDex xây dựng qua 3 giai đoạn tuần tự, mỗi giai đoạn giải quyết một mức độ phức tạp khác nhau:
Giai Đoạn 1: Privileged Motion-Tracking Teachers
Body Teacher học locomotion và reaching từ reference motions:
- Input: proprioception của thân (joint positions/velocities, base angular velocity, 5-frame history) + reference goals
- Output: 29 target joint positions không bao gồm ngón tay
- Training: RL với reward theo dõi reference motion + domain randomization như ma sát và perturbation trọng tâm COM
- Điểm đặc biệt: sử dụng privileged critic — critic thấy thêm reference motion errors mà actor không thấy, giúp value function chính xác hơn trong khi policy vẫn robust
Hand Teacher học dexterous grasping trong môi trường floating-hand tách biệt:
- Dataset: ManipTrans-style retargeted hand-object motions được tạo từ MANO keypoints người thật
- Trick quan trọng: Wrist-stabilized configuration — wrist pose được viết trực tiếp vào simulator từ reference data, hand teacher chỉ cần học điều khiển ngón tay
- Lý do của trick này: Nếu hand teacher phải học cả wrist motion, 12-dimensional latent space sẽ bị "tốn chỗ" cho 6D wrist kinematics thay vì tập trung vào finger dexterity — đây là insight thiết kế quan trọng của paper
Giai Đoạn 2: VAE Latent Prior Distillation
Mỗi teacher được chưng cất thành một proprioception-conditioned latent prior thông qua Variational Autoencoder:
Encoder: full_observation + reference_goals → phân phối latent q(z|obs, goal)
Prior: proprioception_only → phân phối latent p(z|proprio) ← dùng lúc deploy
Decoder: proprioception + z → joint actions ← FROZEN sau khi train xong
- Body latent space: 16 chiều → decode ra 29 body joint targets
- Hand latent space: 12 chiều → decode ra 12 finger targets (Dex3-1 real) hoặc 20 targets (WUJI sim)
Tại sao VAE thay vì behavioral cloning đơn thuần? VAE tạo ra smooth, structured latent space — các điểm gần nhau trong latent space tương ứng với hành động gần nhau trong joint space. Điều này cực kỳ quan trọng vì residual policy ở giai đoạn 3 sẽ học cách dịch chuyển trong latent space một cách có ý nghĩa.
Tổng số chiều hành động sau khi qua latent interface: 16 (body) + 12 (hand) = 28 chiều, thay vì 41-49 chiều trong joint space gốc. Nhưng quan trọng hơn là cấu trúc của không gian này.
Giai Đoạn 3: Coordinated Latent Residual Policy (PPO)
Đây là "bộ não phối hợp" — một policy học cách điều chỉnh nhỏ (chứ không phải thay thế) cả hai prior cùng lúc thông qua một shared context:
Input: [proprioception, task_state, object_geometry,
contact_features, μ^b,p (body prior mean), μ^h,p (hand prior mean)]
↓
Shared Coordination Trunk (MLP [512, 256])
↓
┌────────────────────────┐
↓ ↓
Body Residual Head Hand Residual Head
(Δz^b) (Δz^h)
↓ ↓
z̃^b = μ^b,p + Δz^b z̃^h = μ^h,p + Δz^h
↓ ↓
Body Decoder Hand Decoder (FROZEN)
↓ ↓
Body joint targets Finger joint targets
Công thức cốt lõi: z̃ = μ_prior + Δz_residual
Khi residual Δz nhỏ, prior hoạt động như được train từ đầu — locomotion pattern tự nhiên được giữ nguyên. Policy chỉ đẩy residual lớn khi cần thiết, ví dụ khi phải tinh chỉnh vị trí cổ tay để tiếp cận vật, hoặc điều chỉnh lực ngón tay khi tiếp xúc.
Điều này giống như bạn là pianist chuyên nghiệp: kỹ thuật cơ bản đã nằm trong muscle memory (latent prior), bạn chỉ cần tập trung vào những điều chỉnh nhỏ cho bài cụ thể (residual).
Hardware và Môi Trường Simulation
Unitree G1:
- Chiều cao: khoảng 127 cm, nặng khoảng 35 kg
- 29 khớp thân người có actuator
- Tay thực tế: Dex3-1 (7-DoF từ Inspire Robots)
- Tay trong simulation: WUJI (20-DoF, 5 ngón với 4 khớp mỗi ngón)
- Tổng latent dimensions: 16 body + 12 hand = 28
Isaac Lab (GPU-accelerated physics simulation):
- 4.096 môi trường song song chạy trên RTX 4090
- Tốc độ: 1 giây simulation tương đương khoảng 27 phút kinh nghiệm thực tế
- Physics engine: NVIDIA PhysX 5
Ba task được train và kiểm thử:
| Task | Mô tả | Thách thức chính |
|---|---|---|
| WalkGrab | Đi tới, gắp chai nước trong khi đang bước | Tiếp cận động học và giữ thăng bằng đồng thời |
| OpenFridge | Mở cửa tủ lạnh trong khi bước lùi | Lực kéo cộng với giữ thăng bằng khi đi lùi |
| WalkPickTurn | Nhặt hộp, quay 180°, giữ vật trong tay | Thay đổi hướng trong khi không đánh rơi vật |
Cài Đặt: Từng Bước Chi Tiết
Yêu Cầu Phần Cứng Tối Thiểu
GPU: NVIDIA RTX 4090 (24 GB VRAM) — tối thiểu để train
NVIDIA A100 80 GB — khuyến nghị để train nhanh hơn
RAM: 32 GB trở lên
Hệ điều hành: Ubuntu 20.04 hoặc 22.04
CUDA: 12.x
Cài Đặt Isaac Lab và Môi Trường
# Bước 1: Clone repo CoorDex
git clone https://github.com/Skevinci/CoorDex
cd CoorDex
# Bước 2: Cài NVIDIA Isaac Sim (theo hướng dẫn chính thức)
# Xem: https://isaac-sim.github.io/IsaacLab/
# Yêu cầu: NVIDIA Isaac Sim 4.x hoặc mới hơn
# Bước 3: Tạo conda environment
conda create -n coordex python=3.10
conda activate coordex
# Bước 4: Cài Python dependencies
pip install -r requirements.txt
# Bước 5: Cài Isaac Lab extensions
python -m pip install -e source/extensions/omni.isaac.lab
python -m pip install -e source/extensions/omni.isaac.lab_tasks
# Bước 6: Kiểm tra cài đặt
python scripts/check_env.py
Cấu Trúc Thư Mục Repo
CoorDex/
├── envs/ # Isaac Lab task environments
│ ├── walk_grab.py # WalkGrab environment definition
│ ├── open_fridge.py # OpenFridge environment definition
│ └── walk_pick_turn.py # WalkPickTurn environment definition
├── models/ # Model architectures
│ ├── body_prior/ # VAE body prior
│ ├── hand_prior/ # VAE hand prior
│ └── coord_policy/ # Coordination residual policy
├── scripts/ # Training và evaluation scripts
│ ├── train_body_teacher.py
│ ├── train_hand_teacher.py
│ ├── distill_prior.py
│ ├── train_coord_policy.py
│ └── deploy_real.py # Real robot deployment
├── configs/ # YAML hyperparameter configs
└── data/ # Motion capture và retargeted data
└── mano_retargeted/ # ManipTrans-processed hand motions
Training Pipeline: Từng Bước Thực Hành
Bước 1: Train Body Teacher
python scripts/train_body_teacher.py \
--robot unitree_g1 \
--num_envs 4096 \
--max_iterations 5000 \
--log_dir logs/body_teacher
Body teacher dùng privileged critic: critic nhận thêm thông tin về sai số theo dõi reference motion, nhưng actor (policy) không thấy thông tin này. Điều này cho phép critic học value function chính xác hơn trong khi policy vẫn phải hoạt động robust tại deployment chỉ với proprioception.
Domain randomization được áp dụng trong quá trình train:
- Hệ số ma sát sàn: ±30% so với nominal
- Perturbation lực ngoài ngẫu nhiên lên torso
- Noise trên quan sát joint angles: ±0.01 rad
Bước 2: Train Hand Teacher (Wrist-Stabilized)
python scripts/train_hand_teacher.py \
--mode wrist_stabilized \
--dataset data/mano_retargeted/ \
--num_envs 4096 \
--max_iterations 3000 \
--log_dir logs/hand_teacher
Config quan trọng nhất: wrist_pose_override: True. Simulator sẽ đọc wrist pose từ reference trajectory data và set trực tiếp vào simulation state. Hand teacher chỉ cần học điều khiển ngón tay, không cần lo wrist positioning.
Reward function của hand teacher:
- MANO keypoint tracking loss (tập trung fingertip nặng hơn)
- Velocity tracking cho ngón tay
- Power penalty để giảm tiêu thụ năng lượng
- Action rate penalty để giữ smooth motion
Bước 3: Distill Latent Priors qua VAE
# Distill body prior
python scripts/distill_prior.py \
--type body \
--teacher_ckpt logs/body_teacher/best.pt \
--latent_dim 16 \
--output models/body_prior/ \
--epochs 200
# Distill hand prior
python scripts/distill_prior.py \
--type hand \
--teacher_ckpt logs/hand_teacher/best.pt \
--latent_dim 12 \
--output models/hand_prior/ \
--epochs 200
VAE training dùng loss kết hợp ba thành phần:
L_total = L_reconstruction + λ_KL × KL(q||p) + λ_smooth × temporal_smoothness
Trong đó:
L_reconstruction = MSE giữa predicted actions và teacher actions
KL(q||p) = KL divergence giữa encoder và prior distributions
temporal_smooth = ||z_t - z_{t-1}||² trung bình theo thời gian
temporal_smoothness term quan trọng: nếu thiếu, latent trajectory sẽ nhảy lộn xộn qua các frames, gây jitter ở joint output.
Bước 4: Train Coordinated Residual Policy
python scripts/train_coord_policy.py \
--task walk_grab \
--body_prior models/body_prior/ \
--hand_prior models/hand_prior/ \
--num_envs 4096 \
--rollout_steps 24 \
--num_minibatches 4 \
--learning_rate 1e-3 \
--gamma 0.99 \
--gae_lambda 0.95 \
--kl_target 0.01 \
--log_dir logs/coord_policy/walk_grab/
Hyperparameters PPO quan trọng:
- 4 minibatches × 98.304 samples = ~393K transitions mỗi gradient update
- Adaptive learning rate: điều chỉnh dựa trên KL target 0.01
- Actor/Critic MLP: [1024, 512, 256] với activation ELU
- Coordination trunk: [512, 256] shared → [256, 128] mỗi head riêng
- Discount factor γ = 0.99, GAE λ = 0.95
Trong quá trình training residual policy, cả body decoder và hand decoder đều bị đóng băng (frozen). Chỉ coordination trunk và hai residual heads được update gradient. Điều này giữ nguyên các motion patterns đã học từ giai đoạn trước.
Kết Quả: Số Liệu Cụ Thể

Task Success Rates (Simulation + Real World)
| Task | Success Rate | Metric phụ |
|---|---|---|
| WalkGrab | 55% | Reach: 100%, Grasp: 55%, Fall: 0% |
| OpenFridge | 66% | Góc mở cửa trung bình: 57.76°/60° |
| WalkPickTurn | 89% | Giữ vật khi hoàn thành quay 180° |
Ablation Study: Tại Sao Cấu Trúc Latent Quan Trọng
| Phương pháp | WalkGrab Success | Action Rate |
|---|---|---|
| All Joint Space — PPO trực tiếp | 0% | — |
| Body Prior + Hand Joint Space | 0% | — |
| Monolithic Latent Residual (gộp) | 0% | 0.40 |
| CoorDex — Coordinated Latent | 55% | 0.22 |
Kết quả ablation tiết lộ điều mấu chốt: không phải latent space nói chung mà là cấu trúc phối hợp riêng biệt — separate body head và hand head — mới tạo ra sự khác biệt. Monolithic latent gộp body và hand vào 1 latent duy nhất cũng thất bại hoàn toàn. Hơn nữa, CoorDex có action rate thấp hơn (0.22 so với 0.40), tức là motion smoother và ít jitter hơn.
Demo Thực Tế trên Unitree G1

Inference và Deploy trên Unitree G1 Thực
Chạy Real Robot Deployment
# Kết nối với Unitree G1 qua network (thường 192.168.123.x)
# Đảm bảo robot đã vào low-level control mode
python scripts/deploy_real.py \
--task walk_grab \
--policy logs/coord_policy/walk_grab/best.pt \
--body_prior models/body_prior/ \
--hand_prior models/hand_prior/ \
--hand dex3_1
Xử Lý Sim-to-Real Gap
Một điểm thú vị của CoorDex: train với tay WUJI 20-DoF trong simulation nhưng deploy với tay Dex3-1 7-DoF thực tế. Framework xử lý gap về morphology này bằng cách:
- Hand decoder được retrain cho Dex3-1 morphology với 7-DoF
- Body prior và coordination trunk giữ nguyên — không cần fine-tune
- Chỉ hand prior fine-tune lại để output khớp với 7-DoF
Domain randomization trong training bao phủ:
- Hệ số ma sát: ±30%
- Lực nhiễu ngoài ngẫu nhiên lên torso
- Độ trễ actuator: 10-30 ms
- Độ trễ quan sát: 0-20 ms
So Sánh Với Các Hướng Tiếp Cận Khác
| Hướng tiếp cận | Ưu điểm | Nhược điểm |
|---|---|---|
| Direct PPO (joint space) | Đơn giản, ít hyperparameter | Không học được coordination phức tạp, action space quá lớn |
| Hierarchical (walk + grasp tách riêng) | Mô-đun hóa, dễ debug | Phải dừng lại để chuyển mode, hand-off phức tạp |
| VLA end-to-end | Flexible, có thể generalize | Latency cao do LLM inference, cần nhiều data đa dạng |
| CoorDex | Liên tục không dừng, dexterous thực sự | Chưa generalize sang object mới dễ dàng |
CoorDex gần về tinh thần với ω-0 (WAM) ở chỗ cả hai đều dùng latent predictive structure để phối hợp locomotion và manipulation. Điểm khác biệt: CoorDex tập trung vào dexterous hand với tay ngón tay thực sự, trong khi ω-0 thiên về whole-body coordination ở cấp độ cao hơn.
So với ASAP — cũng train trên Unitree G1 — CoorDex giải quyết bài toán khó hơn vì phải phối hợp locomotion và manipulation đồng thời thay vì chỉ tối ưu sim-to-real transfer.
Hạn Chế Hiện Tại và Hướng Phát Triển
Những gì CoorDex chưa làm được:
-
Object diversity thấp: Hiện tại train trên vật cụ thể như chai nước, hộp. Muốn gắp vật mới phải retrain hoặc fine-tune. Kết hợp với vision foundation model có thể mở rộng khả năng này.
-
55% WalkGrab chưa đủ ổn định: Paper phân tích rõ: lỗi chủ yếu xảy ra tại phase tiếp xúc đầu tiên khi robot vừa bước vừa với tay đồng thời. Thêm force sensing như FM-VLA có thể cải thiện giai đoạn này.
-
Chỉ một tay: Extension sang bimanual manipulation sẽ cần body prior mạnh hơn để giữ thăng bằng khi cả hai tay đều thao tác.
-
Không có semantic understanding: Robot không "hiểu" nó đang gắp gì. Kết hợp với VLA policy ở cấp cao hơn có thể bổ sung khả năng này.
Tại Sao CoorDex Là Bước Tiến Quan Trọng?
Latent prior coordination là một thay đổi paradigm trong thiết kế controller cho humanoid robot:
- Trước đây: Học trực tiếp trong joint space 40+ chiều, hoặc tách locomotion và manipulation thành hai module riêng
- CoorDex: Nén kiến thức vào latent space có cấu trúc → phối hợp qua residual nhỏ → bảo toàn motion patterns tự nhiên
Hãy nghĩ theo cách này: khi bạn học chơi bóng rổ, bạn không phải suy nghĩ về từng cơ bắp khi dribbling. Muscle memory (latent prior) xử lý phần đó. Bạn chỉ cần tập trung vào quyết định cao cấp hơn: di chuyển sang trái, né cầu thủ đối phương, đồng thời keep the ball. CoorDex làm điều tương tự cho robot.
Với code open-source tại github.com/Skevinci/CoorDex, đây là baseline quan trọng cho ai muốn nghiên cứu continuous dexterous loco-manipulation trên humanoid platform thực tế.


