Trong làn sóng humanoid robot bùng nổ năm 2026, một vấn đề kỹ thuật khiến nhiều nhóm nghiên cứu Việt Nam đau đầu: làm sao để policy train trong simulator chạy được trên robot thật mà không phải fine-tune lại từ đầu? Câu trả lời từ team Booster Robotics tại ICRA 2026 là Booster Gym — một framework reinforcement learning end-to-end open-source, đã được validate trực tiếp trên humanoid T1 thật, với khả năng zero-shot sim-to-real transfer cho omnidirectional walking, leo dốc 10 độ, và chống lại cú đá 10kg.
Bài viết này sẽ đi qua toàn bộ pipeline: từ ý tưởng paper, kiến trúc PPO asymmetric actor-critic, cách cài đặt Isaac Gym + Booster Gym, training với domain randomization, cross-simulation validation trên MuJoCo, cho đến deploy lên robot T1 qua Python SDK. Beginner đã quen với ROS2 hoặc đã đọc qua series RL Humanoid đều có thể follow được.
Booster Gym là gì? Tại sao quan trọng cho ICRA 2026?
Trước Booster Gym, các framework như Humanoid-Gym (NVIDIA Isaac Gym + Unitree H1) hay Berkeley Humanoid đã chứng minh được sim-to-real transfer cho bipedal locomotion. Tuy nhiên, vấn đề là mỗi nhóm phải tự code lại reward function, domain randomization, deployment SDK — không có chuẩn chung. Booster Gym ra đời để giải quyết bài toán này: một framework duy nhất, từ training đến deployment, đã chạy được trên robot thật, code hoàn toàn open-source.
Paper Booster Gym: An End-to-End Reinforcement Learning Framework for Humanoid Robot Locomotion — Booster Robotics, ICRA 2026 — có 4 đóng góp chính:
- Pipeline đầy đủ từ Isaac Gym training → MuJoCo/Webots cross-validation → real T1 deployment qua Python DDS middleware.
- Domain randomization toàn diện trên 3 trục: robot dynamics (mass, CoM), actuator (Kp, Kd, friction, latency 0–20ms), environment (terrain, kicks, friction).
- Series-Parallel Conversion Module cho parallel ankle — train trên virtual serial structure, convert qua transposed Jacobian khi deploy. Đây là điểm mới quan trọng vì nhiều humanoid (Booster T1, Unitree G1) dùng parallel ankle nhưng simulator thường chỉ support serial chain.
- Open-source repo tại github.com/BoosterRobotics/booster_gym — kèm pre-trained policy và Python deployment SDK.
Booster T1 là một humanoid 12 active joints, có IMU + joint encoders, parallel ankle structure, và onboard CPU đủ mạnh để chạy policy 50Hz qua JIT compilation. Robot này có giá hợp lý hơn Unitree G1 hoặc Tesla Optimus, phù hợp cho lab nghiên cứu.
Kiến trúc tổng thể
Booster Gym dùng PPO với asymmetric actor-critic, một pattern đã được Walk These Ways chứng minh là hiệu quả cho legged locomotion:
- Actor network chỉ nhận proprioceptive observations (cái robot thật có thể đo): base angular velocity, gravity vector từ IMU, 12 joint positions + velocities, previous action, velocity commands
(vx, vy, ωyaw), và gait cycle signal(cos, sin)để encode chu kỳ bước chân. - Critic network nhận full state trong simulator: tất cả thông tin actor có + privileged info như terrain height, friction coefficient, CoM offset thực — những thứ chỉ simulator biết. Critic dùng để estimate value function tốt hơn, nhưng khi deploy thực tế thì chỉ actor được mang ra, nên không cần privileged data ở real robot.
Action space: 12-dim joint position offsets. Policy output a_t được cộng vào nominal pose q_0 để ra desired joint position q_des = q_0 + a_t. Sau đó PD controller chạy ở tần số cao hơn (thường 1kHz) sẽ convert thành torque: τ = Kp·(q_des - q) - Kd·q̇.
Observations (39-D) Action (12-D)
┌────────────────┐ ┌─────────────┐
│ ω_base (3) │ │ joint pos │
│ gravity (3) │ │ offsets │
│ joint pos (12) │ → MLP → a_t (12) │ → PD → τ → Robot
│ joint vel (12) │ │ │
│ prev action (12)│ └─────────────┘
│ cmd (3) │
│ gait cos/sin (2)│
│ ... │
└────────────────┘
Tần số policy: 50Hz (chu kỳ 20ms). Latency thực tế đo được: 9–12ms round-trip, policy inference dưới 1ms — đủ headroom cho DDS communication.
Reward function — 19 components
Đây là phần tinh tế nhất, vì reward shaping quyết định policy có robust hay không. Booster Gym chia làm 4 nhóm:
Tracking rewards (positive):
track_lin_vel_xy_exp: thưởng theoexp(-‖v_xy_target − v_xy‖²/σ)— bám theo command vận tốc xy.track_ang_vel_yaw_exp: tương tự cho yaw rate.feet_swing: weight 3.0 — khuyến khích chân nhấc lên đúng chu kỳ gait.
Posture & stability:
base_height: weight−20.0— phạt rất nặng nếu thân lệch khỏi chiều cao mục tiêu (~0.7m).orientation: weight−5.0— dùng gravity vector trong base frame, phạt khi nghiêng quá.
Energy & smoothness:
torques,dof_acc,action_rate: phạt torque lớn, gia tốc khớp lớn, action thay đổi đột ngột.power: phạtΣ |τ·q̇|— giảm tiêu thụ điện thực tế.
Safety:
collision: weight−1.0— phạt collision giữa các link không phải chân.dof_pos_limits,dof_vel_limits: phạt khi chạm hard limit.
Mẹo từ thực tế: weight base_height = -20.0 rất lớn so với các paper khác (thường −10). Lý do là Booster T1 có ankle parallel, nếu base height dao động sẽ dễ kích thích oscillation ở ankle khi deploy — trade-off giữa tracking accuracy và stability.
Domain randomization — chìa khóa zero-shot transfer
Đây là phần bạn KHÔNG thể skip nếu muốn policy chạy được trên robot thật. Booster Gym randomize 3 trục:
1. Robot dynamics (mỗi episode):
- Trunk mass: ±15% so với nominal.
- CoM offset của trunk và mỗi link: ±5cm trên 3 trục.
- Joint friction & damping: scale 0.5×–1.5×.
2. Actuator characteristics:
- Kp scale: 0.85×–1.15× — mô phỏng calibration drift.
- Kd scale: 0.85×–1.15×.
- Latency 0–20ms giữa observation đến lúc action được apply — quan trọng nhất, vì latency thực tế là 9–12ms.
- Motor torque limit: scale 0.9×–1.0×.
3. Environment:
- Terrain: flat, slopes (±10°), stairs, rough patches — sample qua curriculum.
- Friction coefficient: 0.3–1.5.
- Restitution (độ nảy): 0–0.5.
- External pushes: random impulses 200–500N applied trên trunk mỗi 5–10s — đây là cách team train để robot chịu được cú đá 10kg ngoài đời.
Nếu bạn quen với domain randomization cơ bản, Booster Gym là step-up tự nhiên: thêm latency randomization và parallel ankle simulation.
Cài đặt
Trước tiên cần GPU NVIDIA (RTX 3060+ là đủ cho 4096 envs). Tôi test trên Ubuntu 22.04 + CUDA 11.8.
# Conda environment
conda create -n booster python=3.8 -y
conda activate booster
# PyTorch + CUDA
conda install numpy=1.21.6 pytorch=2.0 pytorch-cuda=11.8 \
-c pytorch -c nvidia -y
# Isaac Gym — download từ NVIDIA developer portal trước
# https://developer.nvidia.com/isaac-gym (cần login NVIDIA dev account)
cd ~/Downloads/isaacgym/python
pip install -e .
# Booster Gym
git clone https://github.com/BoosterRobotics/booster_gym.git
cd booster_gym
pip install -r requirements.txt
Một lỗi phổ biến là libpython3.8.so.1.0: cannot open shared object file. Fix bằng cách thêm vào ~/anaconda3/envs/booster/etc/conda/activate.d/env_vars.sh:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$CONDA_PREFIX/lib
Sau đó conda deactivate && conda activate booster.
Training
Lệnh cơ bản:
python train.py --task=T1
Trên RTX 4090 với 4096 envs, training tới convergence mất khoảng 6–8 giờ (~10000 iterations). Một số flag hữu ích:
python train.py --task=T1 \
--num_envs=4096 \
--headless \
--seed=42 \
--max_iterations=15000
Theo dõi progress:
tensorboard --logdir logs
Reward curve "lành mạnh" sẽ trông như: total reward đi lên monotonically trong 1000 iter đầu (bám velocity command), sau đó plateau ở giai đoạn 1000–3000 (cân bằng tracking và energy), rồi tiếp tục nhích lên khi curriculum tăng độ khó terrain (3000+).
Nếu reward dao động mạnh hoặc collapse về 0 sau 500 iter, kiểm tra:
- Termination quá khắt khe (height threshold). Mặc định Booster Gym terminate khi base height < 0.3m hoặc velocity > 5 m/s.
- Initial joint positions không hợp lý —
q_0phải gần neutral pose của T1.
Evaluation và cross-simulation
Sau khi train xong, eval trong Isaac Gym:
python play.py --task=T1 --checkpoint=-1
-1 nghĩa là load checkpoint mới nhất. Bạn sẽ thấy 16 robots song song đi theo random commands.
Critical step: cross-validate trên MuJoCo trước khi deploy thật. Lý do là Isaac Gym dùng PhysX engine, trong khi MuJoCo có dynamics khác (đặc biệt contact model). Nếu policy chỉ chạy được trong Isaac Gym mà không qua được MuJoCo, đó là dấu hiệu overfit physics simulator:
python play_mujoco.py --task=T1 --checkpoint=-1
Kỳ vọng: trajectory joint positions trên MuJoCo phải gần giống Isaac Gym (khác biệt < 5%). Team Booster paper cho thấy delta này thực tế chỉ 2–3% — minh chứng domain randomization đủ tốt.
Deployment lên Booster T1 thật
Bước cuối là export policy ra format TorchScript JIT để chạy trên onboard CPU:
python export_model.py --task=T1 --checkpoint=-1
Output: file policy.pt trong logs/<date>/exported/. Copy file này lên robot qua scp:
scp logs/2026-05-06_10-30-00/exported/policy.pt \
[email protected]:~/booster_deploy/
Trên T1, có sẵn Python deployment SDK qua DDS middleware. Chạy:
cd ~/booster_deploy
python run_policy.py --policy=policy.pt --freq=50
SDK sẽ:
- Subscribe IMU + joint state qua DDS topics.
- Build observation vector cùng format như training.
- Inference policy → action
a_t. - Publish
q_des = q_0 + a_tqua DDS topicjoint_command. - Onboard PD controller convert thành torque ở 1kHz.
Robot sẽ stand-up tự nhiên (vì a_t = 0 ban đầu = nominal pose), sau đó bạn dùng joystick gửi (vx, vy, ωyaw) qua topic velocity_command.
Kết quả thực nghiệm
Paper báo cáo:
| Test | Kết quả |
|---|---|
| Forward walking | 0.5–1.2 m/s, tracking error < 0.1 m/s |
| Backward + sideways | OK qua tất cả command |
| Yaw rotation | Tới 1.0 rad/s |
| Slopes 10° | Lên + xuống được không cần terrain perception |
| 6 surface types | grass, stone, soil, asphalt, concrete, tile — all OK |
| Push 10kg ball | Hồi phục gait stable trong vài bước |
| Latency tolerance | Up to 20ms (đo thực tế: 9–12ms) |
Quan trọng nhất: zero-shot — policy train trong sim, deploy thẳng, không fine-tune. Đây là tiêu chuẩn vàng cho sim-to-real research.
Pitfalls và best practices
Một số lỗi thường gặp khi tôi reproduce ở lab:
- Quên setup
LD_LIBRARY_PATH— Isaac Gym sẽ crash silently. Luôn checkecho $LD_LIBRARY_PATH | grep condasau khi activate env. - GPU OOM với 4096 envs trên VRAM < 12GB — giảm xuống 2048 envs, tăng
max_iterationslên 20000 để bù. - Reward NaN sau 100 iter — thường do
dof_accweight quá lớn kết hợp với episode đầu tiên có gia tốc spike. Giảm weightdof_acctừ-2.5e-7xuống-1e-7. - Robot real bị "high-frequency jitter" sau deploy — nguyên nhân là Kp ở real robot lớn hơn Kp trong sim. Verify config
actuator_cfg.yamlkhớp với firmware T1. - Sim-to-real gap lớn dù domain randomization đã bật — kiểm tra xem ankle có đang được train ở serial structure không. Booster Gym có flag
use_parallel_ankle: True/False— bắt buộc setFalsekhi train,Truekhi deploy.
Mở rộng
Booster Gym là baseline tốt cho nhiều hướng research:
- Loco-manipulation — mở rộng action space lên 23-D (12 chân + 11 cánh tay), thêm reward task-specific. Xem Loco-manip humanoid.
- Whole-body MPC kết hợp RL — dùng policy làm warm-start cho MPC, similar approach trong Sonic humanoid.
- Vision integration — feed depth/RGB qua một CNN encoder, concat vào observation.
- Multi-skill policy — train 1 policy cover walking + standing + recovery, dùng skill-conditioning bit như command extra.
So với LIFT-humanoid (ICLR 2026) chuyên về world model pretraining, Booster Gym đơn giản hơn nhưng đã production-ready ngay. Nếu bạn cần deploy nhanh trên T1, dùng Booster Gym; nếu cần research foundation model cho humanoid, LIFT là điểm xuất phát tốt hơn.
Tổng kết
Booster Gym đại diện cho xu hướng 2026: framework end-to-end, code công khai, validate trên hardware thật, không che giấu chi tiết. Với một sinh viên ở Việt Nam có RTX 3060 và Booster T1 (hoặc một humanoid 12-DoF tương đương), bạn có thể reproduce kết quả ICRA 2026 trong 2 ngày. Đó là điều mà 3 năm trước không tưởng tượng nổi.
Khi nào nên dùng Booster Gym? Khi bạn cần locomotion baseline robust cho humanoid 10–20 DoF, deploy thật, không cần task complexity cao. Khi nào KHÔNG nên dùng? Khi cần manipulation phức tạp, vision-language conditioning, hoặc multi-robot — những trường hợp đó cần VLA models hoặc framework chuyên biệt khác.