Mục tiêu của bài này
Bài 1 đã dựng bản đồ pipeline WholeBodyVLA: video egocentric đi vào LAM, VLA dự đoán latent action, decoder nhẹ chuyển latent thành lệnh robot, còn LMO giữ locomotion ổn định. Bài 2 đi sâu vào dữ liệu video action-free cho manipulation LAM và locomotion LAM. Bài 3 chuyển sang một nguồn dữ liệu khác: motion capture và motion dataset đã có skeleton, cần được retarget sang robot đích trước khi dùng cho imitation, motion prior, RL tracking hoặc kiểm thử whole-body controller.
Retargeting nghe đơn giản là "lấy chuyển động người rồi map sang robot", nhưng trong humanoid nó là một bài toán đầy bẫy. Người có tỷ lệ chi khác robot. Robot có joint limit, foot geometry, waist khác, arm DoF khác, hand khác, actuator khác. Một clip người đá chân hoặc cúi nhặt hộp có thể nhìn hợp lý trong SMPL, nhưng khi ép vào Unitree H1 hoặc G1 thì chân xuyên sàn, bàn chân trượt, thân nổi, tay tự cắt qua người, hoặc root translation không còn ăn khớp với contact. Những lỗi này không chỉ xấu về mặt hình ảnh; chúng làm policy học reference trajectory khó theo, rồi bạn phải bù bằng reward shaping và domain randomization ở giai đoạn RL.
Trong bài này ta đi theo hai đường retarget thật, đều có code mở:
- Luồng H2O/OmniH2O trong repo
human2humanoid: AMASS định dạng SMPL+H, fit shape cho H1 bằngscripts/data_process/grad_fit_h1_shape.py, retarget bằngscripts/data_process/grad_fit_h1.py, xem lại bằngscripts/vis/vis_motion.py, và dùng file motion đã lọcamass_phc_filtered.pklnếu muốn bắt đầu nhanh. - Luồng GMR: retarget đa định dạng bằng
scripts/smplx_to_robot.py,scripts/bvh_to_robot.py,scripts/fbx_offline_to_robot.py,scripts/optitrack_to_robot.py, PICO streaming, configik_match_table1, và robot ID nhưunitree_g1,unitree_h1,agibot_a2.
Nếu bạn đang đọc series theo thứ tự, hãy xem lại Bản đồ pipeline WholeBodyVLA và Video egocentric và LAM. Bài hiện tại nối trực tiếp sang Teleoperation fine-tuning: sau khi có motion retargeted tốt, ta vẫn cần robot thật để ground latent và kiểm tra controller. Ngoài series, hai bài nền hữu ích là phân tích WholeBodyVLA ICLR 2026 và hướng dẫn WholebodyVLA open-source.
Retargeting nằm ở đâu trong pipeline dữ liệu?
Retargeting không thay thế video LAM và cũng không thay thế teleoperation. Nó phục vụ một lớp dữ liệu khác: chuyển động toàn thân có pose/skeleton rõ ràng. Trong một pipeline WholeBodyVLA hoặc whole-body control, dữ liệu retargeted thường dùng cho bốn việc.
| Mục tiêu | Dữ liệu đầu vào | Kết quả mong muốn | Rủi ro nếu retarget kém |
|---|---|---|---|
| Motion prior | AMASS, LAFAN1, BVH, FBX, SMPL-X | Chuyển động robot hợp lý để pretrain hoặc regularize | Policy học dáng đi trượt, thân nổi, joint không tự nhiên |
| RL tracking | Trajectory robot đã retarget | Reference qpos/root pose cho imitation | Reward phải sửa lỗi reference thay vì học skill |
| Evaluation | Bộ motion đa dạng | Test controller trên động tác khó | Benchmark đo lỗi retarget thay vì lỗi controller |
| Teleop bootstrap | Human motion hoặc MoCap online | Target tạm thời cho robot viewer/controller | Latency và IK artifact làm operator khó tin hệ thống |
Trong bài 2, dữ liệu video có thể không có action label. Retargeting thì ngược lại: ta thường có pose 3D hoặc skeleton, nhưng chưa có action hợp lệ cho robot đích. Vì vậy bài toán chính là embodiment gap: làm sao chuyển motion từ "cơ thể người" sang "cơ thể robot" mà vẫn giữ ý nghĩa chuyển động, contact, hướng thân, vị trí tay/chân và giới hạn cơ khí.
Một rule đơn giản cho beginner:
Nếu bạn cần VLA học latent từ ảnh:
ưu tiên video egocentric cho LAM
Nếu bạn cần low-level humanoid policy học đi, xoay, squat, đá, nhảy, với reference toàn thân:
dùng retargeted motion
Nếu bạn cần robot thật làm task với vật thật:
dùng teleoperation và log đầy đủ state/action/command
Đường 1: H2O/OmniH2O với AMASS SMPL+H
Repo human2humanoid là official implementation cho H2O và OmniH2O. Project page H2O mô tả pipeline gồm retargeting SMPL sang humanoid, lọc motion không khả thi bằng privileged imitation policy, rồi train policy bám motion để triển khai real-time teleoperation. Project page OmniH2O nhấn mạnh large-scale retargeting và augmentation của human motion datasets, sau đó distill sim-to-real policy từ privileged teacher. Nói ngắn gọn: H2O/OmniH2O xem retargeting là phần đầu của hệ học điều khiển, không phải một công cụ visualization rời rạc.
Luồng trong README dùng H1 làm ví dụ. Có ba bước chính:
- Viết forward kinematics của H1 trong
human2humanoid/phc/phc/utils/torch_h1_humanoid_batch.py. - Fit một shape SMPL khớp với kinematics của H1 bằng
human2humanoid/scripts/data_process/grad_fit_h1_shape.py. - Retarget AMASS dựa trên keypoint tương ứng giữa fitted SMPL shape và H1 bằng
human2humanoid/scripts/data_process/grad_fit_h1.py.
Điểm hay của luồng này là nó rất rõ ràng về logic PHC-style: trước hết làm cho SMPL có tỷ lệ cơ thể gần robot hơn, sau đó tối ưu root pose và joint của robot để keypoint robot theo được keypoint từ SMPL. Bài báo GMR sau này cũng mô tả PHC theo đúng tinh thần đó: fit shape parameter vào skeleton robot, dùng SMPL body model tính target joint positions theo thời gian, rồi dùng gradient descent qua forward kinematics để giảm lỗi vị trí giữa robot và target.
Chuẩn bị AMASS và SMPL trong H2O
README yêu cầu tải AMASS ở định dạng SMPL + H G, đặt dưới:
human2humanoid/
data/
AMASS/
AMASS_Complete/
ACCAD.tar.bz2
BMLhandball.tar.bz2
BMLmovi.tar.bz2
CMU.tar.bz2
...
Sau đó giải nén các archive:
cd human2humanoid/data/AMASS/AMASS_Complete
for file in *.tar.bz2; do
tar -xvjf "$file"
done
Bạn cũng cần SMPL model dạng pkl, đặt lại tên thành:
human2humanoid/
data/
smpl/
SMPL_FEMALE.pkl
SMPL_MALE.pkl
SMPL_NEUTRAL.pkl
Ở đây có một chi tiết dễ nhầm với GMR: H2O dùng AMASS định dạng SMPL + H G, trong khi GMR README nói rõ với đường SMPL-X của họ thì tải raw AMASS SMPL-X và không tải SMPL+H. Hai repo đang phục vụ hai pipeline khác nhau, nên đừng trộn hướng dẫn download.
Bước A: fit shape H1 bằng grad_fit_h1_shape.py
Sau khi chuẩn bị dữ liệu, chạy:
cd human2humanoid
python scripts/data_process/grad_fit_h1_shape.py
Kết quả mong đợi trong README là:
human2humanoid/
data/
h1/
shape_optimized_v1.pkl
File này là cầu nối giữa cơ thể SMPL và kinematic skeleton của H1. Nếu bỏ qua bước fit shape, retargeter có thể cố ép robot theo một cơ thể người có tỷ lệ khác quá xa: vai rộng/hẹp sai, chân dài sai, pelvis height sai. Khi đó bước tối ưu motion phía sau dễ tạo artifact.
Với beginner, hãy hiểu grad_fit_h1_shape.py như một bước "chọn người mẫu SMPL có tỷ lệ gần H1 nhất". Nó không retarget từng clip AMASS. Nó chỉ tối ưu shape để các keypoint nguồn và robot có chung hệ quy chiếu hợp lý hơn.
Một checklist trước khi chuyển sang bước motion:
[ ] File SMPL đã đúng tên và đúng thư mục.
[ ] AMASS đã giải nén thành folder dataset, không chỉ còn archive.
[ ] `shape_optimized_v1.pkl` tồn tại dưới `data/h1/`.
[ ] Bạn biết robot đích là H1; nếu đổi robot, phải có FK và script tương ứng.
Bước B: retarget AMASS bằng grad_fit_h1.py
Sau bước shape, chạy:
cd human2humanoid
python scripts/data_process/grad_fit_h1.py
README cho thấy script sẽ xử lý một lượng lớn motion, ví dụ log có dòng 15886 Motions to process. Đây không phải một lệnh realtime. Nó là offline batch conversion: đọc motion AMASS, tính target keypoint qua fitted SMPL, rồi tối ưu robot root/joint cho từng sequence. Vì dùng gradient descent qua forward kinematics, nó có thể chậm, nhưng đổi lại bạn nhận được dataset robot-specific có thể đưa vào training.
Sau khi chạy xong, dùng viewer:
python scripts/vis/vis_motion.py
Viewer là bước bắt buộc về mặt chất lượng. Đừng chỉ nhìn loss. Hãy xem vài motion thuộc các nhóm khác nhau: đi bộ, quay người, đá chân, nhảy, cúi người, vung tay, đấm, motion có contact tay/chân. Các lỗi cần tìm:
| Lỗi | Dấu hiệu | Hậu quả khi train |
|---|---|---|
| Foot sliding | Bàn chân lướt khi đáng lẽ đang bám sàn | Policy học contact sai |
| Floating | Robot lơ lửng cao hơn sàn | Root height reference sai |
| Ground penetration | Bàn chân hoặc đầu gối xuyên sàn | Reward tracking và contact mâu thuẫn |
| Self-intersection | Tay xuyên thân, chân cắt nhau | Motion không khả thi |
| Joint limit clamp | Dáng giật, khớp kẹt ở biên | Policy học action cực trị |
Nếu mục tiêu của bạn là WholeBodyVLA/LMO, hãy ưu tiên motion có liên quan đến loco-manipulation: tiến tới mục tiêu, xoay, squat, nhặt, đẩy, giữ, đá nhẹ vật, đổi stance khi tay thao tác. Không phải mọi motion đẹp trong AMASS đều hữu ích cho robot làm việc trong phòng lab.
Dùng amass_phc_filtered.pkl khi cần dataset đã lọc
README human2humanoid cung cấp file motion đã retarget và lọc feasibility: amass_phc_filtered.pkl. File này được đặt dưới:
human2humanoid/
legged_gym/
resources/
motions/
h1/
amass_phc_filtered.pkl
Khi train hoặc play policy, cần override motion file:
python legged_gym/scripts/train_hydra.py \
--config-name=config_teleop \
task=h1:teleop \
motion.motion_file=resources/motions/h1/amass_phc_filtered.pkl
Đây là lựa chọn thực dụng nếu bạn muốn tái hiện pipeline H2O/OmniH2O trước khi tự retarget toàn bộ AMASS. Tuy nhiên, hãy hiểu nó là dataset cho H1 theo pipeline cụ thể, không phải dataset chung cho mọi humanoid. Nếu robot của bạn là G1, Agibot A2, Fourier, Booster hoặc một robot custom, bạn không nên copy file H1 rồi kỳ vọng joint/action hợp lệ.
Đường 2: GMR với SMPL-X, BVH, FBX, PICO và OptiTrack
GMR, viết tắt của General Motion Retargeting, đặt mục tiêu khác: một retargeter tổng quát, realtime trên CPU, hỗ trợ nhiều robot và nhiều format motion. README liệt kê các input như SMPL-X từ AMASS/OMOMO, BVH từ LAFAN1/Nokov, FBX từ OptiTrack, PICO streaming qua XRoboToolkit, và OptiTrack online. Paper "Retargeting Matters" lập luận rằng artifact từ retargeting như foot sliding, ground penetration và self-intersection có thể làm giảm robustness của policy, đặc biệt ở motion động hoặc sequence dài. GMR cố xử lý vấn đề này bằng multi-objective IK và cách scale nguồn chuyển động cẩn thận hơn.
Luồng GMR phù hợp khi bạn muốn một công cụ chung để thử nhanh nhiều robot:
| Nhu cầu | Script chính | Dạng dữ liệu | Khi nào dùng |
|---|---|---|---|
| Convert AMASS/OMOMO SMPL-X | scripts/smplx_to_robot.py |
SMPL-X file | Offline dataset hoặc single clip |
| Convert LAFAN1/Nokov BVH | scripts/bvh_to_robot.py |
.bvh |
Motion capture skeleton phổ biến |
| Convert OptiTrack FBX offline | scripts/fbx_offline_to_robot.py |
.fbx đã extract sang .pkl |
Studio MoCap xuất file |
| Stream OptiTrack realtime | scripts/optitrack_to_robot.py |
Network stream từ Motive | Online preview/teleop prototype |
| Stream PICO/TWIST2 | teleop.sh hoặc script TWIST2 |
XRoboToolkit/PICO | Whole-body teleop portable |
GMR cũng cho phép đổi robot bằng --robot <robot_name>. README liệt kê unitree_g1 với 29 DoF, unitree_h1 với 19 DoF, unitree_h1_2, unitree_g1_with_hands, và nhiều robot khác. agibot_a2 cũng xuất hiện trong bảng supported robots nhưng trạng thái các format còn TBD tại thời điểm README được đọc. Điều này quan trọng: ID có trong bảng không luôn đồng nghĩa mọi format đã được tune xong.
Cài đặt và chuẩn bị dữ liệu cho GMR
GMR được test trên Ubuntu 22.04/20.04. Luồng cài đặt tối giản trong README:
conda create -n gmr python=3.10 -y
conda activate gmr
pip install -e .
Với SMPL-X, cần đặt body model:
assets/
body_models/
smplx/
SMPLX_NEUTRAL.pkl
SMPLX_FEMALE.pkl
SMPLX_MALE.pkl
README cũng lưu ý: sau khi install SMPL-X, nếu bạn dùng file pkl, hãy đổi ext trong smplx/body_models.py từ npz sang pkl. Đây là loại lỗi khiến beginner mất nhiều giờ: script không sai, đường dẫn không sai, nhưng loader tìm extension khác.
Với AMASS trong GMR, hãy tải raw SMPL-X data. Với LAFAN1, tải raw .bvh. Với FBX từ OptiTrack, cần bước extract bằng poselib/fbx_importer.py trước khi retarget. Với online OptiTrack, cần IP của máy chạy Motive và máy chạy GMR.
Offline SMPL-X sang robot
Retarget một motion SMPL-X:
python scripts/smplx_to_robot.py \
--smplx_file <path_to_smplx_data> \
--robot unitree_g1 \
--save_path retargeting_data/g1/motion_0001.pkl \
--rate_limit
Theo README, mặc định bạn sẽ thấy robot motion trong cửa sổ MuJoCo. Nếu muốn ghi video:
python scripts/smplx_to_robot.py \
--smplx_file <path_to_smplx_data> \
--robot unitree_g1 \
--save_path retargeting_data/g1/motion_0001.pkl \
--rate_limit \
--record_video \
--video_path videos/motion_0001.mp4
--rate_limit giữ tốc độ playback của robot bằng tốc độ motion người. Nếu bỏ flag này, retarget có thể chạy nhanh nhất có thể, tiện cho batch, nhưng không phản ánh realtime playback.
Retarget cả folder:
python scripts/smplx_to_robot_dataset.py \
--src_folder <path_to_dir_of_smplx_data> \
--tgt_folder retargeting_data/unitree_g1 \
--robot unitree_g1
Batch mode thường không mở visualization. Vì vậy hãy thêm một bước QA sau đó bằng scripts/vis_robot_motion.py hoặc viewer dataset.
Offline BVH sang robot
BVH phù hợp với LAFAN1, Nokov, Xsens hoặc nhiều hệ MoCap khác. Với LAFAN1/Nokov trong script chính:
python scripts/bvh_to_robot.py \
--bvh_file <path_to_bvh_data> \
--robot unitree_g1 \
--save_path retargeting_data/g1/lafan1_walk.pkl \
--rate_limit \
--format lafan1
--format có thể là lafan1 hoặc nokov theo README. Đừng bỏ qua tham số này nếu skeleton naming khác nhau. Một file BVH không chỉ chứa số; nó chứa hierarchy, joint names, channel order và unit convention. Nếu format parser hiểu sai trục hoặc scale, robot có thể xoay lệch 90 độ hoặc bước dài bất thường.
Với dataset BVH:
python scripts/bvh_to_robot_dataset.py \
--src_folder <path_to_dir_of_bvh_data> \
--tgt_folder retargeting_data/unitree_g1_lafan1 \
--robot unitree_g1
FBX offline và OptiTrack online
Với OptiTrack FBX offline, GMR yêu cầu extract motion data trước bằng poselib/fbx_importer.py:
cd third_party
python poselib/fbx_importer.py \
--input <path_to_fbx_file.fbx> \
--output <path_to_save_motion_data.pkl> \
--root-joint <root_joint_name> \
--fps <fps>
Sau đó retarget file .pkl đã extract:
conda activate gmr
python scripts/fbx_offline_to_robot.py \
--motion_file <path_to_saved_motion_data.pkl> \
--robot unitree_g1 \
--save_path retargeting_data/g1/opti_motion.pkl \
--rate_limit
Với OptiTrack online, README mô tả setup hai máy: một máy server chạy Motive, một máy client chạy GMR. Sau khi cấu hình streaming trong Motive và biết IP hai bên:
python scripts/optitrack_to_robot.py \
--server_ip <server_ip> \
--client_ip <client_ip> \
--use_multicast False \
--robot unitree_g1
Nếu mọi thứ đúng, bạn thấy robot retargeted trong cửa sổ MuJoCo. Đây là đường realtime hữu ích để kiểm tra setup MoCap trước khi thu dataset lớn. Nó chưa tự động biến thành controller an toàn cho robot thật; hãy xem nó là preview IK/retargeting và chỉ đưa sang robot thật khi có safety layer.
PICO streaming và lựa chọn realtime
GMR README có mục PICO Streaming to Robot cho TWIST2. Luồng này dùng XRoboToolkit/PICO, cần cài PICO SDK trên headset, cài xrobotoolkit-pc-service trên PC, build Python SDK, rồi chạy script teleop, ví dụ:
bash teleop.sh
Kết quả mong đợi là motion robot retargeted trong MuJoCo window. Về mặt quyết định hệ thống, PICO/OptiTrack online khác hẳn offline dataset conversion:
| Tiêu chí | Offline conversion | Realtime retargeting |
|---|---|---|
| Input | File AMASS, SMPL-X, BVH, FBX | Stream từ PICO, OptiTrack, Xsens |
| Output | .pkl motion dataset |
qpos/robot motion theo frame realtime |
| Ưu điểm | Dễ batch, dễ QA, dễ train RL | Tương tác trực tiếp, phù hợp teleop prototype |
| Nhược điểm | Không kiểm tra operator-in-the-loop | Cần xử lý latency, dropout, safety |
| Dùng cho WholeBodyVLA | Motion prior, LMO/RL tracking, evaluation | Thu demonstration, preview whole-body target |
Nếu bạn đang xây dataset đầu tiên, hãy bắt đầu offline. Offline cho phép inspect, lọc, chia train/val, tính thống kê và phát hiện artifact trước khi robot thật tham gia. Khi offline retarget ổn, realtime retarget giúp thu demonstration hoặc teleoperation nhanh hơn.
Hiểu ik_match_table1 trong GMR
Trọng tâm kỹ thuật của GMR nằm trong các IK config như general_motion_retargeting/ik_configs/smplx_to_g1.json hoặc bvh_lafan1_to_g1.json. File có các trường:
{
"robot_root_name": "pelvis",
"human_root_name": "pelvis",
"ground_height": 0.0,
"human_height_assumption": 1.8,
"use_ik_match_table1": true,
"use_ik_match_table2": true,
"human_scale_table": {
"pelvis": 0.9,
"left_shoulder": 0.8,
"left_wrist": 0.8
},
"ik_match_table1": {
"pelvis": ["pelvis", 100, 10, [0.0, 0.0, 0.0], [0.5, -0.5, -0.5, -0.5]]
}
}
Tài liệu DOC.md của GMR giải thích một entry trong ik_match_table1 theo thứ tự:
"robot_body_name": [
"human_body_name",
position_weight,
rotation_weight,
position_offset_xyz,
rotation_offset_quaternion_wxyz
]
Ví dụ trong smplx_to_g1.json, pelvis của robot map tới pelvis của người với trọng số vị trí 100 và trọng số xoay 10. left_toe_link map tới left_foot với position weight cao. Trong bvh_lafan1_to_g1.json, torso_link map tới Spine2 với rotation weight cao ở stage đầu, còn ik_match_table2 tăng trọng số vị trí cho pelvis, ankle hoặc wrist tùy config. Cách chia hai table giúp solver làm coarse alignment trước rồi fine alignment sau.
Nói dễ hiểu:
ik_match_table1:
ưu tiên dựng dáng tổng thể, hướng thân, xoay vai/hông/chân
ik_match_table2:
tinh chỉnh vị trí root, bàn chân, cổ tay, end-effector quan trọng
Mỗi khi thêm robot mới, bạn không chỉ cần URDF/MuJoCo XML. Bạn còn cần quyết định body robot nào tương ứng body người nào, trọng số nào quan trọng, offset nào bù trục local, và scale nào hợp lý. Đây là phần "tune retargeting" thật sự.
Hiểu robot ID: unitree_g1, unitree_h1, agibot_a2
Trong GMR, --robot không phải tên tự do. Nó là key được map tới robot model và IK config. Một số ID quan trọng:
| Robot ID | Ý nghĩa trong README GMR | Ghi chú thực dụng |
|---|---|---|
unitree_g1 |
Unitree G1, 29 DoF: chân 2x6, waist 3, tay 2x7 | Được hỗ trợ rộng: SMPL-X, BVH, FBX, Nokov, PICO |
unitree_g1_with_hands |
G1 có hand, 43 DoF | Hữu ích nếu task cần ngón tay, nhưng config phức tạp hơn |
unitree_h1 |
Unitree H1, 19 DoF: chân 2x5, waist 1, tay 2x4 | Hỗ trợ SMPL-X trong bảng; gần với H2O/H1 nhưng pipeline khác |
unitree_h1_2 |
Unitree H1-2, 27 DoF | Có demo jumping trong README |
agibot_a2 |
AgiBot A2 | Có ID trong bảng nhưng nhiều format còn TBD khi đọc README |
Nếu robot ID có trong bảng nhưng cột format là TBD, đừng hứa với team rằng pipeline đã chạy production. Hãy kiểm tra file trong assets/, config trong general_motion_retargeting/ik_configs/, và thử một motion ngắn trước. Với robot mới, việc có mesh đẹp không đủ; cần joint names, body names, actuator order, quaternion convention, ground height và scale.
Chọn H2O/OmniH2O hay GMR?
Hai đường này không loại trừ nhau. Chọn theo mục tiêu.
| Câu hỏi | H2O/OmniH2O AMASS SMPL+H | GMR |
|---|---|---|
| Robot đích chính | Unitree H1 trong pipeline H2O | Nhiều robot: G1, H1, H1-2, Booster, Fourier, Kuavo, v.v. |
| Input chính | AMASS SMPL + H G |
SMPL-X, BVH, FBX, PICO, OptiTrack |
| Kiểu xử lý | Offline batch PHC-style, gradient fitting | Multi-objective IK, realtime trên CPU trong nhiều demo |
| Mạnh ở | Tái hiện H2O/OmniH2O, dùng dataset H1 đã lọc | So sánh robot/format nhanh, prototype teleop/realtime |
| Cần chú ý | Chậm, gắn với H1, cần feasibility filter | Cần tune IK config và kiểm tra format support |
Nếu bạn muốn reproduce H2O/OmniH2O trên H1, đi theo README human2humanoid là hợp lý. Nếu bạn đang có G1, muốn thử LAFAN1 BVH, OptiTrack FBX, hoặc stream PICO, GMR tiện hơn. Nếu bạn đang xây WholeBodyVLA cho robot riêng, hãy dùng GMR như một khung học cách cấu hình IK, nhưng vẫn phải tự QA từng motion và có safety layer ở bước robot thật.
QA motion retargeted trước khi train
Một pipeline tối thiểu:
def qa_retargeted_motion(motion):
metrics = {}
metrics["min_height"] = compute_min_body_height(motion)
metrics["foot_sliding"] = estimate_foot_sliding_during_contact(motion)
metrics["joint_limit_margin"] = min_joint_limit_margin(motion)
metrics["self_collision_proxy"] = check_link_distance_proxy(motion)
metrics["root_speed_spikes"] = detect_root_velocity_spikes(motion)
return metrics
Và một manifest nên lưu:
motion_id: lafan1_dance_subject2_0007
source_format: bvh
source_dataset: LAFAN1
retargeter: gmr
robot: unitree_g1
ik_config: bvh_lafan1_to_g1.json
rate_limit_used: true
qa:
visual_status: keep
foot_sliding: low
penetration: none
notes: "arms acceptable, left turn slightly stiff"
split: train
Đừng train trực tiếp trên toàn bộ output batch. Hãy chia keep, maybe, drop. Các motion maybe có thể hữu ích để debug config nhưng không nên vào training set đầu tiên. Với WholeBodyVLA, bạn cũng nên tag primitive:
walk_forward, turn_left, turn_right, sidestep, squat, reach, carry, push, kick, dance, jump
Sau này khi đánh giá LMO hoặc decoder, bạn có thể biết controller yếu ở nhóm nào thay vì chỉ thấy success rate chung giảm.
Kết luận
Retargeting là lớp dữ liệu nằm giữa video action-free và teleoperation robot thật. H2O/OmniH2O cho ta một luồng AMASS SMPL+H rất cụ thể: fit shape H1, retarget AMASS bằng gradient fitting, visualize, rồi dùng dataset đã lọc amass_phc_filtered.pkl khi cần. GMR cho ta một retargeter rộng hơn: SMPL-X, BVH, FBX, OptiTrack, PICO, nhiều robot ID, và config IK có thể đọc/tune được.
Điểm quan trọng nhất cho beginner: đừng xem retargeting là lệnh convert file một lần. Hãy xem nó là một pipeline dữ liệu có assumption, config, QA và split. Motion retargeted tốt giúp RL tracking và whole-body controller học dễ hơn. Motion retargeted lỗi sẽ đẩy gánh nặng sang reward, domain randomization và sim-to-real. Với humanoid, chất lượng reference trajectory thường quyết định bạn đang train skill hay đang train policy sửa lỗi dữ liệu.
Nguồn kỹ thuật chính
- LeCAR-Lab human2humanoid README
- H2O project page
- OmniH2O project page
- YanjieZe GMR README
- Retargeting Matters: General Motion Retargeting for Humanoid Motion Tracking
- GMR IK config documentation