humanoidwholebody-vlahumanoidretargetingamassgmrwhole-body-control

Retarget AMASS/GMR sang robot

Đi theo hai luồng retarget thật: H2O/OmniH2O với AMASS SMPL+H và GMR với SMPL-X, BVH, FBX, PICO.

Nguyễn Anh Tuấn10 tháng 6, 202619 phút đọc
Retarget AMASS/GMR sang robot

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ở:

  1. Luồng H2O/OmniH2O trong repo human2humanoid: AMASS định dạng SMPL+H, fit shape cho H1 bằng scripts/data_process/grad_fit_h1_shape.py, retarget bằng scripts/data_process/grad_fit_h1.py, xem lại bằng scripts/vis/vis_motion.py, và dùng file motion đã lọc amass_phc_filtered.pkl nếu muốn bắt đầu nhanh.
  2. 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, config ik_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 WholeBodyVLAVideo 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 2026hướ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:

  1. Viết forward kinematics của H1 trong human2humanoid/phc/phc/utils/torch_h1_humanoid_batch.py.
  2. Fit một shape SMPL khớp với kinematics của H1 bằng human2humanoid/scripts/data_process/grad_fit_h1_shape.py.
  3. 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

Bài viết liên quan

NT

Nguyễn Anh Tuấn

Robotics & AI Engineer. Building VnRobo — sharing knowledge about robot learning, VLA models, and automation.

Khám phá VnRobo

Bài viết liên quan

Teleop toàn thân: TWIST và HOMIE
humanoid

Teleop toàn thân: TWIST và HOMIE

10/6/202617 phút đọc
NT
Huấn luyện tracker và LMO RL
humanoid

Huấn luyện tracker và LMO RL

10/6/202617 phút đọc
NT
Sim-to-real: kiểm trước khi lên G1
humanoid

Sim-to-real: kiểm trước khi lên G1

10/6/202615 phút đọc
NT