Vì sao OpenHLM đáng học ngay bây giờ?
OpenHLM, viết tắt của Open Humanoid Loco-Manipulation, là một recipe open-source cho bài toán khó hơn rất nhiều so với robot arm pick-and-place: humanoid phải nhìn cảnh, hiểu câu lệnh, đi tới đúng vị trí, cúi người, với tay, dùng cả chân hoặc thân người khi cần, rồi thao tác vật thể. Paper gốc, OpenHLM: An Empirical Recipe for Whole-Body Humanoid Loco-Manipulation, không chỉ giới thiệu một model mới. Điểm giá trị là nhóm tác giả làm một chuỗi thí nghiệm có kiểm soát để trả lời ba câu hỏi thực dụng: teleoperation nên điều khiển humanoid như thế nào, VLA có sẵn như pi0.5 cần sửa gì để điều khiển toàn thân, và có thể giảm chi phí dữ liệu whole-body teleop bằng HuMI hay không.
Nếu bạn đã đọc về LeRobot v0.5 trên G1, ASAP delta-action sim2real, hoặc GR00T SONIC teleop VLA, OpenHLM nằm đúng ở giao điểm của ba hướng đó: Unitree G1, whole-body controller, và VLA policy. Nhưng khác với nhiều demo humanoid chỉ ghép locomotion controller với arm IK, OpenHLM đặt mục tiêu whole-body native: policy xuất hành động cho toàn bộ action space thay vì coi phần chân như một mobile base.
Nguồn chính nên đọc song song với bài này gồm project page https://openhlm-project.github.io/, paper arXiv 2606.22174, repo OpenHLM-project/OpenHLM, dataset OpenHLM/OpenHLM-data, model checkpoints OpenHLM/OpenHLM-ckpts, và docs Unitree G1 trong LeRobot. Bài viết này không thay thế tài liệu gốc; nó diễn giải lại thành một checklist để beginner có thể hiểu pipeline trước khi chạm vào robot thật.
Ý tưởng paper: không tách humanoid thành "chân" và "tay"
Trong nhiều stack humanoid hiện nay, policy high-level không thật sự điều khiển robot hình người. Nó thường chỉ tạo lệnh cho tay, torso, height, và navigation velocity. Một controller RL bên dưới xử lý cân bằng và walking. Cách này dễ triển khai, nhưng nó biến humanoid thành một wheeled dual-arm robot có chân. Khi nhiệm vụ cần dùng đầu gối, bàn chân, hoặc squat sâu để mở rộng workspace, action space bị khóa ngay từ thiết kế.
OpenHLM bắt đầu từ một giả thuyết đơn giản: nếu demonstration đã che mất nhiều bậc tự do, VLA sẽ không bao giờ học được hành vi phối hợp toàn thân. Vì vậy paper so sánh ba interface:
| Interface | Ý tưởng | Hạn chế chính |
|---|---|---|
| Decoupled control | IK cho upper body, locomotion controller cho lower body | Chân chỉ là base, khó dùng body parts làm manipulator |
| VR 3-point | Theo dõi head và hai wrist từ VR | Không đủ ràng buộc cho toàn bộ joints |
| Joint-based whole-body teleop | Operator điều khiển full joint targets | Khó hơn, nhưng action space biểu đạt đầy đủ nhất |
Kết quả paper cho thấy joint-based whole-body teleoperation là lựa chọn duy nhất hoàn thành đầy đủ các nhiệm vụ đại diện. Đây là nền của chữ native trong whole-body native VLA: policy không xin phép một module khác để squat, bước, xoay thân, hoặc dùng chân. Nó dự đoán một action vector có ngữ nghĩa joint-level cho toàn thân.

Kiến trúc OpenHLM gồm những phần nào?
Repo OpenHLM chia stack thành ba khối chính.
Thứ nhất là GR00T-WholeBodyControl4OpenHLM. Đây là phần robot-side whole-body control cho Unitree G1: VR teleoperation, data collection đồng bộ, simulation utilities, và deployment interface. Nó dựa trên ecosystem whole-body control/SONIC/GR00T để robot có thể nhận target từ policy ở tần số đủ cao mà vẫn giữ thăng bằng.
Thứ hai là HuMI4OpenHLM. HuMI là Humanoid Manipulation Interface, phiên bản tương tự UMI nhưng dành cho humanoid. Người operator không cần robot trong loop. Họ dùng gripper cầm tay, tracker cơ thể, GoPro hoặc camera wrist-view, sau đó pipeline IK retarget trajectory của tay, pelvis và feet sang joint positions tương thích với humanoid. HuMI không hoàn hảo vì visual/action domain gap vẫn lớn, nhưng nó rẻ hơn nhiều so với đứng cạnh G1 và teleop full-body cho từng object mới.
Thứ ba là openpi4OpenHLM. Đây là phần VLA training/inference. OpenHLM dùng nền pi0.5/OpenPI, chuyển dữ liệu sang LeRobot format, tính normalization statistics, fine-tune policy, serve policy qua websocket, rồi robot client gọi inference để chạy trên G1.
Luồng dữ liệu đầy đủ có thể hình dung như sau:
Language instruction + camera images + proprioception
|
v
pi0.5/OpenPI VLA backbone
|
v
34-D whole-body action chunk
|
v
GR00T/SONIC whole-body control layer
|
v
Unitree G1 joints, grippers, waist, locomotion behavior
Chi tiết đáng chú ý là paper không phát hiện một "mẹo kiến trúc" đơn lẻ quyết định tất cả. Các thay đổi như action projection, action ordering, absolute vs relative actions, proprioception input đều ảnh hưởng, nhưng kết quả lớn nhất đến từ ba nguyên tắc: dùng robot-pretrained VLA thay vì random/VLM-only init, giữ action space whole-body, và dùng multi-step flow matching inference thay vì one-step model chỉ vì MSE validation thấp hơn.
HLM-12 benchmark: policy phải làm gì?
Benchmark HLM-12 gồm 12 language-conditioned tasks chia thành bốn nhóm. Nhóm đầu là pick-and-place with locomotion: đi tới vật, cầm, mang đi, đặt đúng chỗ. Nhóm thứ hai là workspace extension: dùng squat, torso, hoặc bước chân để với tới vị trí cao/thấp. Nhóm thứ ba là body-as-tool: dùng bộ phận cơ thể ngoài bàn tay như một phần của thao tác. Nhóm cuối là loco-manipulation under constraints: mở lọ, kéo đồ, hoặc thao tác trong không gian bị ràng buộc.
Điều này quan trọng vì nhiều benchmark VLA truyền thống, ví dụ LIBERO hay ALOHA tabletop, không ép policy phải quyết định "nên dùng thân người như thế nào". Với HLM-12, robot có thể thất bại dù arm trajectory đúng, nếu lower body không đưa workspace tới đúng chỗ. Đây cũng là lý do validation action MSE bị paper xem là proxy yếu: một action có MSE thấp nhưng sai timing khi squat hoặc đặt chân vẫn làm rollout hỏng.
Trên project page, nhóm tác giả báo cáo OpenHLM đạt task progress cao trên toàn bộ HLM tasks, và phần paper nêu mốc 89% average task progress trên 8 training tasks. Với các held-out tasks, co-training bằng stationary teleop hoặc HuMI giúp kiểm tra khả năng mở rộng sang object/language mới mà không phải thu full whole-body teleop cho mọi thứ.
Chuẩn bị hardware và môi trường
Nếu chỉ muốn đọc paper, bạn không cần robot. Nếu muốn reproduce pipeline, yêu cầu thực tế khá nặng. Phần robot data collection trong README liệt kê Unitree G1, Ubuntu PC, GPU NVIDIA, hai gripper ChangingTek CTAG2F90-D, hai Intel RealSense D405 ở wrist, camera fisheye stereo Unitree SV1-25 trên head, PICO4U VR kit với HMD, controllers và leg trackers, cùng mount in 3D.
Phần HuMI data collection dùng năm HTC Vive trackers: hai tracker cho gripper cầm tay, một cho pelvis, hai cho bàn chân. Ngoài ra cần Windows machine để stream tracker pose qua SteamVR, Linux hoặc macOS để chạy online/offline IK và xử lý dữ liệu, hai GoPro cho wrist-view video, và mount/clamp để gắn camera.
Trước khi làm thật, beginner nên tách mục tiêu thành ba level:
- Read-only reproduction: tải paper, xem project page, hiểu benchmark, không chạy code.
- Training dry run: dùng
example_demonstrationtrong Hugging Face dataset để test conversion, norm stats và training command. - Real robot deployment: chỉ làm khi có G1, vùng an toàn, emergency stop, người giám sát và đã chạy simulation/teleop nhiều lần.
Về network, Unitree G1 thường dùng IP 192.168.123.164; PC kết nối nên đặt static IP cùng subnet, ví dụ 192.168.123.222 theo README OpenHLM hoặc 192.168.123.200 theo docs LeRobot. Docs LeRobot cũng lưu ý cài unitree_sdk2_python, cyclonedds, pinocchio từ conda-forge, rồi cài LeRobot với extra unitree_g1.
Cài đặt robot-side và PC-side
Ở PC data collection, README OpenHLM yêu cầu đi qua setup của GR00T-WholeBodyControl trước: cài TensorRT, build C++ deployment, download model checkpoints, chạy sim2sim quick start, và setup PICO VR. Sau đó cài thêm dependency cho OpenHLM:
cd src/GR00T-WholeBodyControl4OpenHLM/
uv pip install --python .venv_teleop/bin/python -e ./gear_sonic/thirdparty/GMR
uv pip install --python .venv_teleop/bin/python -e ./openpi-client
cd ./gear_sonic/thirdparty/XRoboToolkit-Orin-Video-Sender
sudo apt update
sudo apt install build-essential pkg-config libopencv-dev \
libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev \
libglib2.0-dev libzmq3-dev libssl-dev
make
Ở robot-side, repo hướng dẫn clone phần hardware setup:
git clone https://github.com/Tendourisu/hardware4OpenHLM.git
cd path/to/hardware4OpenHLM
uv run hardware_setup
Sau đó PC chạy script data collection:
cd src/GR00T-WholeBodyControl4OpenHLM/scripts
bash launch_data_collection.sh
Đừng bỏ qua cảnh báo an toàn. Whole-body teleoperation có thể làm robot ngã hoặc vung tay mạnh. Chạy low gains, kiểm tra vùng trống, test simulation trước, và không để người đứng trong vùng tác động khi mới bring-up.
Thu dữ liệu HuMI và chuyển sang LeRobot
HuMI là phần làm OpenHLM thực dụng hơn. Full whole-body teleop tạo dữ liệu tốt nhất nhưng đắt: cần robot thật, operator có kinh nghiệm, reset scene, xử lý overheating, và rủi ro hỏng hardware. HuMI thu demonstration từ người, sau đó dùng IK để chuyển thành episode có cùng action semantics với joint-based whole-body teleop.

Workflow HuMI trong README gồm ba bước:
uv run online-ik pick --rpc-address tcp://<windows_machine_ip>:4242
uv run run-pipeline data/<humi_session> --gopro_timezone +08:00
uv run generate-final data/<humi_session>
Bước đầu stream tracker poses từ Windows/SteamVR và chạy online IK. Bước hai align video GoPro với trajectory tracker/IK và tạo dataset_plan.pkl. Bước ba export thành episode folders trong data/<humi_session>/final_data. Khi đã có raw robot demos hoặc HuMI demos, training code mong đợi dữ liệu ở LeRobot format:
uv run examples/unitree_g1/convert_g1_data_to_lerobot.py \
--data_dir ./example_demonstration/20260520_1602_example_1 \
--repo_name OpenHLM/example
Với nhiều folder:
uv run examples/unitree_g1/convert_g1_data_to_lerobot_multi.py \
--parent_dir ./example_demonstration \
--dataset_folders 20260520_1602_example_1 20260520_1602_example_2 \
--repo_name OpenHLM/example
LeRobot format quan trọng vì nó chuẩn hóa episode metadata, video streams, state/action tensors, task prompts và thống kê dataset. Nếu bạn đã quen với LeRobot ecosystem guide, hãy xem OpenHLM như một specialization cho G1 whole-body data.
Training policy: pi0.5 với action_dim 34
Trong src/openpi4OpenHLM, cài môi trường training:
cd src/openpi4OpenHLM
GIT_LFS_SKIP_SMUDGE=1 uv sync
GIT_LFS_SKIP_SMUDGE=1 uv pip install -e .
cp -r ./src/openpi/models_pytorch/transformers_replace/* \
.venv/lib/python3.11/site-packages/transformers/
uv run examples/convert_jax_model_to_pytorch.py \
--checkpoint_dir gs://openpi-assets/checkpoints/pi05_base \
--config_name pi05_aloha \
--output_path ~/.cache/openpi/openpi-assets/checkpoints/pi05_base_pytorch
Config mẫu trong README dùng Pi0Config(pi05=True, action_dim=34, action_horizon=50, discrete_state_input=True), LeRobotG1DataConfig(repo_id="OpenHLM/example"), batch size 256, cosine decay learning rate từ 1e-4 về 1e-5, AdamW, weight loader từ pi0.5 base, và num_train_steps=30_000.
Trước khi train, tính normalization statistics:
CUDA_VISIBLE_DEVICES=0 uv run scripts/compute_norm_stats.py \
--config-name openhlm_example \
--max-frames 500000
Sau đó chạy training distributed:
CUDA_VISIBLE_DEVICES=0,1,2,3 uv run torchrun --standalone \
--nnodes=1 --nproc_per_node=4 scripts/train_pytorch.py \
openhlm_example \
--save-interval 10000 \
--batch_size 128 \
--no-enable-gradient-checkpointing \
--enable-training-compile \
--pytorch-weight-path ~/.cache/openpi/openpi-assets/checkpoints/pi05_base_pytorch \
--exp-name openhlm_example
Nếu bạn không có multi-GPU, hãy giảm batch size và số process. Nhưng đừng thay quá nhiều biến cùng lúc. Paper OpenHLM nhấn mạnh "one-variable-at-a-time experiments"; trong lab của bạn cũng nên giữ tinh thần đó: đổi dataset, action representation, camera view, hoặc checkpoint init từng bước một để biết nguyên nhân khi rollout xấu.
Co-training: stationary teleop khác HuMI thế nào?
OpenHLM thử hai nguồn dữ liệu rẻ hơn full whole-body teleop. Stationary teleop vẫn dùng humanoid thật, nhưng feet planted và chỉ thao tác manipulation. Nó rẻ hơn vì episode ngắn hơn, reset nhanh hơn, robot ít di chuyển hơn. HuMI còn rẻ hơn vì robot không nằm trong loop; người thu dữ liệu bằng tracker và camera.

Kết quả paper rất đáng nhớ: stationary co-training có thể cung cấp cả semantic understanding mới và motion mới. HuMI co-training rất tốt cho semantic understanding, ví dụ object mới và language prompts mới, nhưng ở data scale hiện tại chưa giỏi dạy motion hoàn toàn mới như vessel-tilt trong task pouring. Paper giải thích bằng hai domain gaps: camera/gripper khác nhau, và action từ người sau IK retargeting vẫn khác trajectory khi teleop robot thật.
Con số từ project page giúp bạn nhớ nhanh:
| Nguồn dữ liệu | Chi phí demo trên held-out task | Vai trò tốt nhất |
|---|---|---|
| Whole-body teleop | 21 phút/task | Oracle, motion + semantics |
| Stationary teleop | 13 phút/task | Motion manipulation + semantics |
| HuMI | 7 phút/task | Semantic grounding rẻ, object/language mới |
Với tasks 9-11, project page báo cáo 8-task baseline đạt 36%, HuMI co-training đạt 84%, stationary co-training đạt 89%, và 11-task teleop oracle đạt 96%. Paper cũng nêu khi xét 4 held-out tasks, co-training có thể kéo average progress từ 33% lên khoảng 87% với stationary data, còn HuMI mạnh nhất ở nhóm reuse motion.
Inference và deployment trên G1
Deployment tách thành policy server và robot client. Server chạy trên máy GPU:
cd src/openpi4OpenHLM
CUDA_VISIBLE_DEVICES=0 uv run scripts/serve_policy.py \
--env SONICG1 \
--num-steps 10 \
policy:checkpoint \
--policy.config=openhlm_example \
--policy.dir=path/to/trained/checkpoint
Robot/client side chạy low-level stream trước:
cd src/GR00T-WholeBodyControl4OpenHLM/scripts
bash deploy_stream.sh
Terminal thứ hai chạy OpenPI deployment client:
cd src/GR00T-WholeBodyControl4OpenHLM/scripts
python openpi-eval/main.py \
--control_hz 30 \
--max_steps 10000 \
--save_video \
--instruction "put the lemon on the shelf" \
--exp_name openhlm_example
Ở đây --control_hz 30 nhắc bạn rằng latency không phải chi tiết phụ. Humanoid đang cân bằng liên tục. Nếu websocket, camera stream hoặc policy inference bị jitter, rollout có thể hỏng dù checkpoint tốt. Với beginner, hãy test từng tầng: camera stream ổn chưa, low-level controller giữ balance chưa, teleop manual chạy chưa, policy server trả action đúng shape chưa, rồi mới cho robot tự động.
Kết quả chính và cách đọc cho đúng
Trong long-horizon fruit task, robot phải đi từ home pose tới bàn thấp, nhặt fruit 1 bằng tay phải, đi tới bàn trung bình, nhặt fruit 2 bằng tay trái, rồi tới shelf cao để đặt vào hai container riêng. Có năm loại fruit, tạo 20 ordered pairs. GR00T N1.6 và Psi0 nhận full loco-manipulation teleop cho cả 20 pairs, tổng 120 demos. OpenHLM HuMI co-training chỉ nhận full loco-manipulation teleop cho 6 pairs từ banana/peach/mangosteen, rồi dùng HuMI demos cho 14 pairs có lemon hoặc tomato.
Project page báo cáo OpenHLM HuMI co-training đạt 87.5% task progress với 1.14 giờ demo time, trong khi GR00T N1.6 đạt 57.5% với 2.70 giờ, Psi0 đạt 48.8% với 2.70 giờ. Teleop oracle của OpenHLM đạt cao hơn nhưng cần nhiều whole-body teleop hơn. Paper kết luận quan trọng: chỉ thêm humanoid data vào pretraining chưa đủ; design details của teleop interface, action representation, proprioception và co-training mới quyết định khả năng rollout.
Đừng hiểu kết quả này là HuMI thay thế hoàn toàn robot data. Paper nói rõ HuMI hiện mạnh ở semantic grounding hơn là novel motion. Cách dùng thực tế là: thu một lõi whole-body teleop đủ đa dạng motion, thêm stationary teleop cho manipulation motion khó, rồi dùng HuMI để mở rộng object/language coverage với chi phí thấp.
Checklist triển khai cho lab nhỏ
Nếu bạn có một G1 và muốn bắt đầu nghiêm túc, checklist hợp lý là:
| Giai đoạn | Mục tiêu | Exit criteria |
|---|---|---|
| Safety bring-up | Robot đứng, network, E-stop, camera stream | Low-level controller chạy ổn trong sim và real |
| Manual teleop | Operator điều khiển full body | 10-20 episode không lỗi nguy hiểm |
| Dataset dry run | Convert example data sang LeRobot | Norm stats chạy xong, sample tensor đúng shape |
| First fine-tune | Train từ pi0.5 base | Loss hợp lý, checkpoint load được |
| Shadow inference | Server trả action, chưa actuate mạnh | Action dim, frequency, latency đạt yêu cầu |
| Low-risk rollout | Task đơn giản, vùng trống | Robot hoàn thành partial task an toàn |
| Co-training | Thêm stationary/HuMI data | Không regress training tasks, cải thiện held-out objects |
Beginner thường muốn nhảy thẳng tới training, nhưng với humanoid, dữ liệu xấu hoặc latency xấu nguy hiểm hơn model nhỏ. Hãy ghi log mọi episode, lưu video, lưu state/action, và review failure theo taxonomy: perception, language grounding, grasp, balance, timing, workspace, hay low-level tracking.
Nên dùng OpenHLM khi nào?
OpenHLM phù hợp nếu bạn đang xây stack whole-body VLA cho humanoid thật, đặc biệt Unitree G1, và muốn học từ một recipe đã có paper, code, dataset, checkpoint. Nó cũng hữu ích nếu bạn không có G1 nhưng muốn hiểu cách một lab thiết kế benchmark và co-training cho humanoid loco-manipulation.
Không nên xem OpenHLM như "npm install là robot chạy". Hardware phức tạp, dependency nhiều, và phần an toàn không thể outsource cho VLA. Nhưng về mặt research direction, OpenHLM cho một bài học rõ: humanoid manipulation sẽ không tiến xa nếu policy chỉ điều khiển cánh tay trên một base biết đi. Muốn robot hình người làm việc trong môi trường người thật, demonstration, action space và policy đều phải coi toàn thân là công cụ thao tác.


