Một robot có bánh xe đã học nhặt đồ ở nhiều độ cao. Bạn vừa có một humanoid hai chân, nhưng chỉ thu được vài phút demonstration. Có cách nào tận dụng dữ liệu cũ mà không ép robot mới bắt chước từng góc khớp của robot cũ?
TrajBooster chọn trajectory 6D của hai cổ tay làm giao diện chuyển giao. Hệ thống đưa trajectory qua simulation để tạo action tương thích với Unitree G1, dùng chúng để bổ sung training cho VLA, rồi fine-tune bằng dữ liệu robot thật. Điểm đáng học là cách tạo nhãn action mới từ dữ liệu khác embodiment, chứ không chỉ cách chạy teleop.
Bài viết tập trung vào paper TrajBooster bản v3, ngày 19/03/2026, dự án được repo công bố là đã được nhận tại ICRA 2026, và code chính thức OpenHelix-Team/OpenTrajBooster. Phiên bản đầu xuất hiện năm 2025; đây không phải một paper vừa công bố trong tháng 10. Góc phân tích ở đây là trajectory transfer và kiểm tra hợp đồng dữ liệu, bổ sung cho hướng dẫn teleop đã có trên blog.
1. Vì sao không copy joint positions giữa hai robot?
Hãy tưởng tượng hai người có chiều dài tay khác nhau cùng lấy một chiếc cốc. Cả hai đều muốn đưa bàn tay đến cốc, nhưng góc vai và khuỷu tay không giống nhau. Với robot, sự khác biệt còn lớn hơn: số khớp, giới hạn khớp, hệ tọa độ, vị trí camera và cách giữ thăng bằng đều có thể khác.
Embodiment là tập hợp đặc điểm cơ thể và giao diện điều khiển đó. Cross-embodiment learning cố gắng chuyển kỹ năng giữa các embodiment. Nếu xem một vector action đơn thuần là danh sách số mà bỏ qua ý nghĩa từng chiều, model có thể học sai dù loss giảm rất đẹp.
Một pose 6D gồm vị trí 3D và orientation 3D. “6D” ở đây nói về bậc tự do của pose; dữ liệu orientation có thể lưu bằng quaternion bốn số hoặc rotation matrix chín số. Đừng suy luận rằng mỗi pose luôn được lưu trong đúng sáu ô của tensor.
TrajBooster sử dụng đường đi của hai end-effector để biểu diễn mục tiêu thao tác. Robot nguồn và robot đích có thể cùng cố đưa tay tới một vùng trong không gian, trong khi tự chọn cấu hình cơ thể phù hợp. Trajectory cũng chứa thứ tự thời gian: đưa tay tới, khép bàn tay, nhấc vật, rồi chuyển vật. Một pose đơn lẻ không đủ mô tả kỹ năng này.
Nếu bạn muốn thử training pipeline trong bài, phần tốn công thường nằm ở GPU, dataset và kiểm tra action schema trước khi mua thêm hardware.
2. Pipeline real-to-sim-to-real
Pipeline có ba đoạn, nhưng mỗi đoạn xử lý một loại khoảng cách khác nhau:
Agibot-World: camera + language + wrist trajectories
|
Chuẩn hóa workspace nguồn
|
Retargeting trong Isaac Gym trên Unitree G1
|
Camera nguồn + language nguồn + action robot đích
|
Post-pre-training GR00T N1.5
|
Fine-tune bằng camera/action từ Unitree G1 thật
|
VLA + worker policy -> thao tác whole-body

Đoạn đầu xử lý khác biệt kinematics. Đoạn thứ hai tạo dữ liệu để model làm quen với action space mới. Đoạn cuối điều chỉnh policy cho camera và trạng thái của robot thật. Đây là lý do không nên gọi toàn bộ dữ liệu bổ sung là “demonstration G1 thật”: action được sinh cho G1, nhưng ảnh vẫn đến từ robot nguồn.
Paper gọi những mẫu này là heterogeneous triplets: source vision, source language, target action. Đây là một lựa chọn thực dụng, nhưng có visual mismatch. Model thấy tay hoặc camera của Agibot trong ảnh, trong khi được yêu cầu dự đoán action G1. Fine-tune robot đích giúp xử lý khoảng cách này, nhưng không chứng minh nó biến mất hoàn toàn.
3. Đưa trajectory vào workspace của G1
Theo phần III-A của paper, Agibot có sải tay khoảng 1,8 m, còn Unitree G1 khoảng 1,2 m. Truyền thẳng trajectory rộng của robot nguồn sang G1 có thể tạo mục tiêu không với tới được.
Nhóm tác giả xử lý từng trục: căn chỉnh trục x bằng thống kê z-score tham chiếu dữ liệu G1, scale trục y với hệ số 0,6667 tương ứng tỷ lệ chiều dài tay, và clip trục z trong khoảng 0,15–1,25 m. Những số này thuộc cấu hình nghiên cứu; không phải giới hạn an toàn phổ quát cho mọi humanoid.
Với người mới, nên hiểu thao tác này như việc đổi kích thước bản vẽ trước khi giao cho người thợ. Nếu chỉ sửa đơn vị mà không sửa phạm vi làm việc, các điểm ở xa vẫn không khả thi. Nếu chỉ scale mà quên orientation hoặc hệ quy chiếu, đường đi có thể bị xoay sai.
Trước khi tạo một dataset mới, hãy vẽ một episode ngắn. Kiểm tra vị trí cổ tay theo trục x, y, z; phân biệt world frame và base frame; xác nhận mét và radian; kiểm tra dấu quay trái/phải. Đối chiếu với một chuyển động nhỏ có kết quả dễ đoán. Đây là khuyến nghị triển khai của bài viết, không phải thí nghiệm bổ sung của tác giả.
4. Kiến trúc retargeting: arm, manager và worker
Retargeting không đơn thuần giải inverse kinematics cho hai tay. Khi mục tiêu nằm thấp, G1 cần hạ cơ thể; khi tay vươn ra, chân phải phản ứng với thay đổi tải và tư thế.
| Thành phần | Công việc | Đầu ra chính |
|---|---|---|
| Arm policy | Closed-loop inverse kinematics bằng Pinocchio | Target joint positions của tay |
| Manager policy | Chọn chuyển động base dựa trên wrist goals | vx, vy, yaw rate, torso height |
| Worker policy | Thực hiện lệnh base và giữ vận động ổn định | Target joint positions cho 12 khớp chân |
Worker được huấn luyện bằng RL theo hướng Homie, có curriculum tăng dần nhiễu từ chuyển động upper body. README cũng mô tả bổ sung locomotion khi cơ thể ở tư thế semi-crouched. Nhờ đó, worker không chỉ học bước đi với hai tay bất động.
Manager học bằng heuristic-enhanced harmonized online DAgger. DAgger giải quyết một vấn đề dễ hình dung: policy chạy sẽ gặp trạng thái khác với trạng thái trong demonstration. Nếu chỉ học trên trạng thái của expert, policy có thể không biết tự sửa khi lệch đường. DAgger lấy thêm nhãn ở những trạng thái policy thực sự ghé qua.
Trong TrajBooster, nhãn manager đến từ heuristic và privileged information trong simulation. Nhóm tác giả dùng seed trajectories, tạo biến thiên độ cao bằng PCHIP, rồi huấn luyện manager trên rollout. Dữ liệu mới được đưa vào tập tích lũy mỗi 10 iteration để cân bằng chi phí lưu trữ và khả năng nhớ dữ liệu cũ. Privileged information này không phải tín hiệu mà VLA sẽ có sẵn khi chạy robot thật. Xem README retargeting để phân biệt hai module worker và manager.
5. VLA dự đoán gì khi robot chạy thật?
VLA nền là GR00T N1.5, được bổ sung data configuration cho OpenWBC. Nó nhận ảnh, language instruction và proprioception, tức trạng thái khớp của robot. Action head dùng flow matching để sinh action chunk liên tục.
Có thể hình dung flow matching như học cách biến một chuỗi action nhiễu thành chuỗi có cấu trúc dưới điều kiện ảnh và câu lệnh. Model không phải viết một kế hoạch bằng văn bản rồi mới điều khiển robot. Nó dự đoán action thông qua quá trình sinh liên tục đã học.
Theo paper, inference sinh chunk 16 timestep ở 20 Hz với bốn denoising step. Chunk tương ứng 0,8 giây nếu thực hiện toàn bộ tuần tự. Tuy nhiên, chunk horizon không tự cho biết client có thực thi hết chunk trước khi quan sát lại hay không; cần đọc vòng lặp deployment để xác định chính xác.
VLA xuất joint targets cho tay và bàn tay, cùng bốn lệnh base. Worker biến lệnh base thành chuyển động chân. Vì vậy, “whole-body VLA” ở đây là một hệ thống phối hợp toàn thân với controller phân cấp. VLA không trực tiếp xuất torque cho mọi actuator.
6. Cài đặt: bắt đầu từ offline, tách môi trường
Các lệnh bên dưới là hướng dẫn thích nghi từ repo, chưa được chạy training hoặc kiểm chứng trên robot trong bài viết này. Đường dẫn dataset và checkpoint là ví dụ cần thay bằng dữ liệu của bạn.
Repo có nhiều môi trường khác nhau. Retargeting dùng Isaac Gym Preview 4 và Python 3.8 trên Ubuntu 20.04/22.04 theo README. Nhánh VLA khuyến nghị Python 3.10 và CUDA 12.4 trong tài liệu GR00T đi kèm. Đừng cài tất cả vào một environment rồi mong dependency tự tương thích.
Tải archive từ trang GitHub chính thức, giải nén và đổi tên thư mục thành OpenTrajBooster. Sau đó tạo environment cho VLA:
cd OpenTrajBooster/VLA_model/gr00t_modified_for_OpenWBC
conda create -n trajbooster-vla python=3.10
conda activate trajbooster-vla
pip install --upgrade setuptools
pip install -e '.[base]'
pip install --no-build-isolation flash-attn==2.7.1.post4
python scripts/gr00t_finetune.py --help
Hãy kiểm tra driver, PyTorch và CUDA trước khi xử lý lỗi FlashAttention. Nếu lỗi import xuất hiện ngay ở bước đọc --help, chưa cần tải toàn bộ dataset. README chỉ ra một lỗi OpenCV cụ thể liên quan CV_8U; chỉ áp dụng cách sửa tương ứng khi thực sự gặp lỗi đó.
Bạn có thể bắt đầu bằng PPT checkpoint, thay vì tự chạy lại post-pre-training. Repo còn cung cấp dataset Agibot→G1 retargeted. README ước lượng dataset khoảng 30 GB và model khoảng 6 GB; dung lượng thực tải còn phụ thuộc revision và file bạn chọn.
7. Chuẩn bị dữ liệu: 40 chiều state, 32 chiều action
Đây là bước quan trọng nhất để beginner không train nhầm. File modality.json của converter định nghĩa:
| Nhóm | State thô | Action |
|---|---|---|
| Tay trái + tay phải | 14 | 14 |
| Bàn tay trái + bàn tay phải | 14 | 14 |
| Chân trái + chân phải | 12 | 0 |
| Base motion | 0 | 4 |
| Tổng | 40 | 32 |
Model được quan sát trạng thái chân, nhưng không trực tiếp dự đoán 12 joint targets của chân. Bốn chiều cuối của action là lệnh cho worker, không phải bốn góc khớp bổ sung. State thô cũng có thể được biến đổi trước khi vào model; không đồng nhất chiều dataset với chiều feature sau preprocessing.
Config openwbc_g1 dùng ba video stream: ego_view, wrist_left, wrist_right. Nó lấy một observation hiện tại và 16 future actions. Kiểm tra thứ tự camera, tên annotation và modality mapping trước khi train.
Lệnh three-view converter trong README gốc:
cd OpenTrajBooster/OpenWBC_to_Lerobot
python convert_3views_to_lerobot.py \
--input_dir /data/g1_raw \
--output_dir /data/g1_lerobot \
--dataset_name pick_toy \
--robot_type g1 \
--fps 30
Tài liệu converter cũng có ví dụ single-view với convert_to_lerobot.py. Không tráo hai lệnh nếu dataset của bạn có ba camera. FPS 30 trong ví dụ chuyển đổi và 20 Hz trong inference cũng cần được xử lý rõ ở pipeline thời gian: chúng không tự động đồng nghĩa với cùng một khoảng cách thời gian giữa các action.
Trước một run dài, đọc vài frame liên tiếp để kiểm tra ảnh có đúng thời điểm action hay không, tay trái có bị đổi với tay phải không và language có mô tả đúng task không. Chia train/validation theo episode để tránh các frame liền kề của cùng demonstration xuất hiện ở cả hai tập.
8. Training: PPT trước, fine-tune robot đích sau
Paper dùng 1.960 episode từ 176 task, tương đương khoảng 35 giờ dữ liệu retargeted. PPT chạy 60.000 step trên hai A100 80 GB với batch size 128. Fine-tune robot đích dùng khoảng 10 phút, gồm 28 episode, trên một A100 với batch size 16 và 3.000 step. Các con số này là cấu hình nghiên cứu, không phải yêu cầu tối thiểu cho mọi thử nghiệm.
Đây là cách diễn giải đúng câu “chỉ cần 10 phút dữ liệu”: 10 phút là dữ liệu target-domain bổ sung, phía trước vẫn có pretrained model, dữ liệu nguồn, retargeting và GPU training. Đừng dùng con số này để dự toán toàn bộ dự án.
Ví dụ fine-tune bắt đầu từ checkpoint PPT đã tải về, với flag dựa trên hướng dẫn VLA của repo:
cd OpenTrajBooster/VLA_model/gr00t_modified_for_OpenWBC
python scripts/gr00t_finetune.py \
--base-model-path /models/PPTmodel4UnitreeG1 \
--dataset-path /data/g1_lerobot \
--output-dir ./save/pick_toy_ppt \
--data-config openwbc_g1 \
--embodiment-tag new_embodiment \
--num-gpus 1 \
--batch-size 16 \
--max_steps 3000 \
--report-to tensorboard
Không nên xem đây là reproduction đầy đủ chỉ vì số step giống paper. Bạn còn phải khớp dataset split, camera, normalization, module được freeze và revision code. Hãy bắt đầu bằng một run ngắn để xác nhận checkpoint được lưu và model đọc đúng modality, rồi mới tăng thời lượng.
9. Kết quả: lợi ích có thật, phạm vi cần đọc kỹ

Table II báo cáo 10 lần thử cho mỗi task. Dưới đây chỉ lấy full success, tách khỏi partial success:
| Task | Có PPT + 3K step | Không PPT + 3K step | Không PPT + 10K step |
|---|---|---|---|
| Pick Mickey Mouse | 100% | 0% | 80% |
| Store Toys | 70% | 0% | 30% |
| Clean the Table | 70% | 0% | 70% |
| Pick Orange & Place | 10% | 0% | 0% |
Task cuối cho thấy giới hạn đáng chú ý: model có PPT thêm 50% trường hợp gắp được nhưng đặt thất bại. Không được cộng con số đó thành 60% hoàn thành task. Với 10 trial, mỗi lần thành công tương ứng 10 điểm phần trăm; đây là đánh giá quy mô nhỏ.
Khi đổi vị trí đồ chơi sang vị trí chưa có trong teleop, có PPT đạt 80%, còn baseline không PPT 10K step đạt 0% trong Table III. Tác giả phân tích trajectory để cho thấy baseline có xu hướng lặp lại đường đi đã thấy, trong khi model PPT thay đổi cách tiếp cận vật.

Loss thấp giúp theo dõi training nhưng không thay thế success rate. Một model dự đoán đường đi gần demonstration có thể vẫn thất bại nếu đồ vật bị dịch sang bên. Vì vậy, đánh giá nên có cả task success, vị trí ngoài phân phối và failure breakdown.
Demo “Pass the Water” là zero-shot đối với teleop task trên robot đích: task đã xuất hiện trong dữ liệu PPT, nhưng không có trong tập fine-tune G1. Nó không phải kỹ năng mà model chưa từng thấy dưới bất kỳ hình thức nào.
10. Inference và các kiểm tra trước deployment
Trước khi nối actuator, chạy offline evaluation bằng dataset đã tách riêng:
python scripts/eval_policy.py \
--plot \
--model_path ./save/pick_toy_ppt/checkpoint-3000 \
--dataset-path /data/g1_validation \
--embodiment-tag new_embodiment \
--data-config openwbc_g1 \
--modality-keys base_motion left_hand right_hand
Kiểm tra amplitude và độ mượt của base commands, độ cao yêu cầu, nhãn tay và các đoạn action đột biến. MSE trung bình có thể che một spike ngắn gây hành vi xấu. Dữ liệu validation cần cùng schema với train nhưng có episode độc lập.
Deployment thực cần image server, HomieDeploy, Unitree SDK2 và cấu hình mạng phù hợp. Sau khi low-level stack đã được kiểm tra riêng, lệnh VLA trong repo có dạng:
python scripts/G1_inference.py \
--arm=G1_29 \
--hand=dex3 \
--model-path ./save/pick_toy_ppt/checkpoint-3000 \
--goal pick_toy \
--frequency 20 \
--vis \
--filt
README yêu cầu tư thế ban đầu không lệch quá xa dữ liệu teleop và khuyến nghị 20 Hz. Bắt đầu bằng quan sát output offline, kiểm tra controller trong simulation, rồi mới làm thử nghiệm thật có giám sát và cơ chế dừng phù hợp. Đừng cho rằng --filt thay thế mọi kiểm tra controller.
Một thử nghiệm nhỏ đáng làm là giữ nguyên tập teleop, chạy hai model có và không có PPT, rồi thử ở vị trí đồ vật mới. Cách này kiểm tra trực tiếp giả thuyết transfer thay vì chỉ nhìn loss. Ghi cả thất bại nhận diện, gắp, đặt và ổn định cơ thể để biết nên sửa perception, dataset hay worker.
TrajBooster đáng nghiên cứu vì biến dữ liệu khác robot thành bước đệm cho whole-body VLA. Nhưng paper vẫn nêu hạn chế về dexterous hands, visual mismatch, dữ liệu loco-manipulation và quy mô đánh giá. Bắt đầu với mục tiêu hẹp như gắp vật ở hai độ cao sẽ cho kết quả dễ phân tích hơn kỳ vọng một household generalist ngay từ run đầu.



