M3imic giải quyết vấn đề gì?
M3imic, hay Multi-Modal Mimic, là paper mới về huấn luyện một whole-body controller đa phương thức cho humanoid. Paper chính thức là M3imic: Learning a Versatile Whole-Body Controller for Multimodal Motion Mimicking, còn code public nằm ở repo Renforce-Dynamics/MultiModalWBC. Nền tảng chạy trên NVIDIA Isaac Sim / Isaac Lab 2.1.1, dùng RSL-RL, và robot mục tiêu là Unitree G1 29-DoF.
Nếu bạn đã đọc whole-body VLA open-source guide, deploy G1 WBC, hoặc ASAP cho Unitree G1, M3imic nằm đúng ở giao điểm giữa ba hướng đó: motion imitation, multi-modal command representation và sim-to-real cho humanoid. Điểm khác biệt là M3imic không ép mọi dữ liệu motion về một format duy nhất trước khi training. Nó học một latent command space chung để cùng một policy có thể nhận nhiều loại reference khác nhau.
Với người mới, hãy bắt đầu từ câu hỏi thực tế: khi điều khiển humanoid, bạn muốn đưa vào controller dạng dữ liệu nào? Với locomotion kiểu walking, running hoặc dancing, dữ liệu dense robot joint trajectory rất tiện vì mỗi joint của G1 có target rõ ràng. Với teleoperation, bạn thường chỉ có sparse end-effector pose: hai tay, hai chân, chest hoặc pelvis từ mocap/VR. Với dataset human motion, bạn có SMPL-X body pose chứ không có sẵn joint angle của G1. Ba nguồn này đều hữu ích, nhưng cấu trúc khác nhau rất mạnh. Nếu convert tất cả sang robot joint bằng inverse kinematics, bạn mất tính linh hoạt và phải chạy IK lúc deployment. Nếu concatenate tất cả vào một vector rồi distill teacher-student, training phức tạp và dễ sinh mismatch giữa train/deploy.
M3imic chọn hướng thứ ba: dùng modality-specific encoders cho từng loại reference, map chúng vào shared latent space, sau đó train một policy end-to-end bằng reinforcement learning. Policy nhìn thấy proprioception của robot và latent command, rồi xuất joint position action cho G1. Paper đánh giá trên simulation và robot thật, với kết quả nổi bật: trên unseen OMOMO test set, end-effector policy đạt 98,42% success rate, còn robot-joint policy đạt pose/joint tracking error tốt nhất.

Mental model cho beginner
Hãy tưởng tượng bạn đang dạy G1 bắt chước chuyển động. Có ba người hướng dẫn:
| Modality | Dữ liệu đầu vào | Khi nào hữu ích |
|---|---|---|
| Robot joint angles | 29 joint angle của Unitree G1 | Motion tracking chính xác, dataset đã retarget sang robot |
| Human body pose | SMPL-X, 21 joints, 6D rotation | Tận dụng dataset human motion lớn |
| End-effector poses | 5 SE(3) keypoints: hands, feet, chest | Teleoperation, sparse mocap/VR command |
Một controller truyền thống thường muốn command rõ ràng kiểu "joint này đi đến angle này". Nhưng teleoperation không luôn có thông tin đó. Nếu người vận hành chỉ đưa tay ra trước, có nhiều cấu hình full-body hợp lệ: robot có thể hơi xoay torso, dịch pelvis, gập gối hoặc đổi stance để giữ thăng bằng. Đây là kinematic redundancy. Sparse command ít chính xác hơn ở từng joint, nhưng cho robot nhiều freedom hơn để tự cân bằng.
M3imic biến sự khác biệt này thành lợi thế. Robot-joint modality cho tracking fidelity cao. End-effector modality cho robustness cao khi motion nằm ngoài distribution training. Human-pose modality là cầu nối từ dataset người sang robot. Shared latent space buộc các encoder học representation tương thích, để cùng một actor policy không phải được train lại cho từng modality.
Một cách viết đơn giản:
reference sequence
-> robot encoder / human encoder / keypoint encoder
-> latent z, 64 dimensions
-> actor(policy) + robot proprioception
-> joint position action for Unitree G1
Paper dùng horizon ngắn gồm 10 future/reference frames, sampling cách nhau 2 step. Như vậy encoder không chỉ nhìn frame hiện tại, mà thấy một đoạn chuyển động sắp tới để policy mượt hơn. Nếu bạn đã từng train locomotion PPO, đây giống việc command không chỉ là velocity target tức thời, mà là một đoạn "motion intent" ngắn.
Kiến trúc M3imic trong paper
Kiến trúc chính có bốn mảnh: data preprocessing, multi-modal command encoder, asymmetric actor-critic và curriculum sampling.

Data preprocessing lấy LAFAN1 và 100STYLE làm training datasets. LAFAN1 chứa nhiều chuyển động người đa dạng và dynamic; 100STYLE tập trung vào nhiều kiểu walking. Paper dùng OMOMO test set cho manipulation motion chưa thấy trong training. Trước khi train, dữ liệu cần được refine qua Blender cho SMPL-X và retarget bằng GMR. Repo public cũng có script xử lý CSV/NPZ trong scripts/data/, còn dataset đã preprocess được trỏ tới ModelScope seulzx/gae_mimic_dataset.
Multi-modal command encoder có ba encoder và ba decoder. Robot input là q_t có 29 chiều. Human input là SMPL-X body pose 21 x 6, dùng 6D rotation representation thay vì axis-angle thô. End-effector input là 5 x 9, gồm root-relative 3D position và 6D rotation cho 5 keypoints. Mỗi encoder đưa reference sequence về latent z 64 chiều. Decoder dùng lại để reconstruct từng modality, tạo reconstruction loss.
Shared latent alignment là phần quan trọng nhất. Autoencoder loss có ba phần:
| Loss | Ý nghĩa thực tế |
|---|---|
| Reconstruction loss | Encoder-decoder phải giữ đủ thông tin để khôi phục modality gốc |
| Alignment loss | Latent của robot, human và keypoints cho cùng motion phải gần nhau |
| Consistency loss | Khi decode latent từ modality khác về robot reference, kết quả phải nhất quán |
Nói cách khác, M3imic không chỉ train policy để sống sót. Nó buộc representation của ba input modality nói cùng một "ngôn ngữ điều khiển" ở latent space. Đây là lý do paper gọi whole-body control là multi-modal sequence alignment problem.
Asymmetric actor-critic là trick quen thuộc trong sim-to-real. Actor chỉ dùng thông tin có thể có khi deploy: latent command, root rotation error, angular velocity, joint position, joint velocity và previous action. Actor cố tình không dùng global root position và linear velocity, vì ngoài đời không phải lúc nào G1 cũng có external localization ổn định. Critic thì được dùng privileged information trong simulation: root position error, body link positions/orientations và root linear velocity. Critic học tốt hơn trong sim, nhưng actor vẫn deploy được trên real robot.
Action output trong repo là joint position command. whole_body_control/robots/g1.py định nghĩa Unitree G1 bằng ArticulationCfg và ImplicitActuatorCfg, kèm joint limits, stiffness/damping theo nhóm joint và action scale. Task config GAEMimic_G1FlatEnvCfg dùng G1 cylinder asset, anchor body là pelvis, và track các body link chính như pelvis, hip roll, knee, ankle roll, torso, shoulder roll, elbow và wrist yaw.
Cài đặt môi trường Isaac Lab
Repo yêu cầu Linux, Python 3.10, Isaac Sim 4.5.0, Isaac Lab 2.1.1 và PyTorch CUDA. Với beginner, đừng cài trực tiếp vào môi trường đang dùng cho dự án khác. Tạo env riêng:
conda create -n env_mimic python=3.10
conda activate env_mimic
pip install torch==2.7.0 torchvision==0.22.0 --index-url https://download.pytorch.org/whl/cu128
Sau đó cài Isaac Sim bằng pip theo hướng dẫn repo:
pip install 'isaacsim[all,extscache]==4.5.0' --extra-index-url https://pypi.nvidia.com
isaacsim isaacsim.exp.full.kit
Nếu GUI Isaac Sim mở được, chuyển sang Isaac Lab. Repo yêu cầu commit Isaac Lab cụ thể:
git clone https://github.com/isaac-sim/IsaacLab.git
cd IsaacLab
git checkout 90b79bb2d44feb8d833f260f2bf37da3487180ba
./isaaclab.sh -i
./isaaclab.sh -p scripts/reinforcement_learning/rsl_rl/train.py --task=Isaac-Ant-v0 --headless
Lệnh Isaac-Ant-v0 không liên quan G1, nhưng là smoke test tốt: nếu nó chạy được, Isaac Lab, Python extension, GPU và RSL-RL integration đã tương đối ổn.
Tiếp theo, cài RSL-RL và M3imic:
cd /path/to/IsaacLab
./isaaclab.sh -p -m pip install -e /path/to/MultiModalWBC/third_party/rsl_rl
cd /path/to/MultiModalWBC/source/whole_body_control
pip install -e .
Repo cũng yêu cầu Unitree assets:
git clone https://huggingface.co/datasets/unitreerobotics/unitree_model
Hãy kiểm tra asset path trong config trước khi training. Nếu Isaac Lab không tìm thấy USD/MJCF hoặc mesh của G1, environment có thể khởi tạo lỗi hoặc robot spawn sai posture. Với G1, sai joint order/action scale nguy hiểm hơn sai texture: policy có thể học nhưng không deploy được.
Dataset và cấu trúc thư mục
README repo nói dataset preprocess có SMPL-X và keypoints ở ModelScope:
https://www.modelscope.cn/datasets/seulzx/gae_mimic_dataset
Sau khi tải, đặt dữ liệu dưới datasets/. Trong package, whole_body_control.tasks.__init__ định nghĩa:
datasets/npz_datasets
datasets/extended_datasets
Config GAEMimic_G1FlatEnvCfg mặc định đọc datasets/extended_datasets/lafan1_dataset với split train. Nếu bạn tải đủ 100STYLE, có thể mở thêm dòng 100style_dataset trong config. Với người mới, nên giữ một dataset nhỏ trước để kiểm tra pipeline:
python scripts/tools/list_envs.py
Sau đó kiểm tra task có xuất hiện không. Các task chính trong README:
| Task | Mục tiêu |
|---|---|
TrackingEnvCfg |
Single reference motion tracking |
MultiTracking_TrackingEnvCfg |
Multi-motion tracking từ nhiều motion clips |
GAEMimic_TrackingEnvCfg |
Multi-modal imitation với robot, SMPL-X và SE(3) keypoints |
Nếu chỉ muốn học workflow, bắt đầu từ MultiTracking-Flat-G1-v0. Nếu muốn đi đúng M3imic multi-modal, dùng task GAEMimic tương ứng trong environment list. README quick start dùng:
python scripts/rsl_rl/train.py \
--headless \
--task MultiTracking-Flat-G1-v0
Vì repo đang ở giai đoạn research, tên task cụ thể nên được lấy từ scripts/tools/list_envs.py sau khi install, không đoán bằng trí nhớ. Đây là thói quen quan trọng khi làm Isaac Lab: task registry được import động từ package, chỉ cần thiếu pip install -e . hoặc sai Python env là list task sẽ khác ngay.
Training policy
Runner config cho G1 dùng PPO với:
| Tham số | Giá trị trong repo |
|---|---|
num_steps_per_env |
24 |
max_iterations |
30.000 cho single tracking, 50.000 cho multi/GAEMimic |
| Actor hidden dims | [512, 256, 128] |
| Critic hidden dims | [512, 256, 128] |
| Activation | elu |
| Learning rate | 1e-3, adaptive schedule |
gamma, lam |
0,99 và 0,95 |
desired_kl |
0,01 |
| Entropy coef | 0,005 |
GAEMimic policy trong repo dùng RslRl_Triple_AE_PPOPolicyCfg. Các dimension đáng chú ý:
robot signal dim: 290
human signal dim: 1260 # 126 x 10 frames
keypoints signal dim: 450 # 5 keypoints x 9 dims x 10 frames
latent dim: 64
Trong config public, activate_signals="robot" được ghi chú là dùng robot signals cho zero-shot training. Khi bạn muốn thử modality khác, hãy đọc kỹ implementation của actor_sonic.py, actor_critic_triple_ae.py và task observations để biết input nào đang active, input nào dùng cho alignment/reconstruction. Không nên chỉ sửa một string rồi kết luận model đã chạy multi-modal đầy đủ.
Lệnh train thực tế nên bắt đầu nhỏ:
python scripts/rsl_rl/train.py \
--headless \
--task MultiTracking-Flat-G1-v0 \
--num_envs 256 \
--max_iterations 1000 \
--video \
--video_interval 500
Khi đã ổn, tăng num_envs lên 2048 hoặc 4096, bỏ --video nếu cần tốc độ, và chạy đủ 50.000 iteration. Paper dùng 4096 parallel environments cho evaluation; ablation train 50.000 iteration trên 4 RTX 4090. Nếu bạn chỉ có một GPU 24 GB, kỳ vọng training sẽ chậm hơn và cần giảm num_envs.
Reward trong paper gồm tracking reward và regularization:
| Nhóm reward | Ý nghĩa |
|---|---|
| Root velocity/orientation | Bám vận tốc và orientation của root |
| Body position/orientation | Bám pose các link chính |
| Body velocity/angular velocity | Bám dynamic motion, không chỉ pose tĩnh |
| Action rate penalty | Giảm action giật |
| Joint limit penalty | Tránh vượt soft joint limits |
| Collision penalty | Tránh contact không mong muốn |
Domain randomization gồm friction [0.1, 1.6], push robot đến khoảng [-0.5, 0.5] m/s, base COM/mass variation, default joint position noise, anchor orientation noise, base angular velocity noise, joint position noise và joint velocity noise. Đây là phần bắt buộc nếu bạn muốn policy có cơ hội sống trên G1 thật. Simulation đẹp nhưng không randomize thường chỉ là video đẹp.
Inference và export policy
Sau khi có checkpoint trong logs/rsl_rl/<experiment_name>/..., dùng play.py:
python scripts/rsl_rl/play.py \
--task MultiTracking-Flat-G1-v0 \
--num_envs 16 \
--checkpoint /path/to/model.pt \
--video \
--video_length 400
Script play.py load checkpoint bằng OnPolicyRunner, lấy inference policy, sau đó export cả TorchScript và ONNX:
<run_dir>/exported/policy.pt
<run_dir>/exported/policy.onnx
Đây mới là điểm bắt đầu cho sim-to-real. Trước khi đưa lên Unitree G1 thật, bạn cần tối thiểu bốn lớp kiểm tra:
- Sim replay: policy chạy trong Isaac Lab với cùng dataset reference, không fall, action không saturate.
- Sim-to-sim: nếu có MuJoCo/Unitree sim, kiểm tra joint order, PD gains, action scale, control frequency.
- Low-power real test: đứng yên, small-amplitude motion, emergency stop, logging đầy đủ.
- Teleoperation test: chỉ tăng độ khó sau khi sparse command không gây drift hoặc crouch quá sâu.
Paper report real-world deployment không cần thu teleoperation data riêng để train. Với in-domain tracking, robot encoder được dùng để track dancing, running, walking. Với OOD teleoperation, nhóm dùng optical mocap lấy end-effector data từ người vận hành. Kết quả real-world trung bình: robot-joint policy đạt 41.63 mm, 0.095 rad, 0.260 m/s; end-effector policy đạt 43.22 mm, 0.105 rad, 0.268 m/s. Sai số end-effector cao hơn nhẹ, nhưng interface thực dụng hơn cho teleoperation.

Kết quả cần nhớ
Trên training datasets LAFAN1 + 100STYLE, M3imic đạt:
| Method | Success | MPKPE | MPJAE | Velocity error |
|---|---|---|---|---|
| HOVER | 87,35% | 128,20 mm | 0,686 rad | 0,481 m/s |
| ExBody2 | 98,12% | 53,25 mm | 0,146 rad | 0,285 m/s |
| OmniH2O | 97,78% | 62,75 mm | 0,154 rad | 0,307 m/s |
| TWIST2 | 98,89% | 51,65 mm | 0,121 rad | 0,267 m/s |
| M3imic | 99,54% | 46,05 mm | 0,112 rad | 0,256 m/s |
Trên unseen OMOMO test set:
| Policy | Success | MPKPE | MPJAE | Velocity error |
|---|---|---|---|---|
M3imic robot-joint pi^r |
95,98% | 71,52 mm | 0,139 rad | 0,341 m/s |
M3imic human-pose pi^h |
95,23% | 72,21 mm | 0,140 rad | 0,339 m/s |
M3imic end-effector pi^e |
98,42% | 75,52 mm | 0,142 rad | 0,337 m/s |
Kết luận thực tế là: dense robot reference bám pose chính xác hơn, còn sparse end-effector reference thường robust hơn khi distribution shift. Đây là insight rất đáng nhớ cho teleoperation và VLA: nếu high-level model chỉ biết "tay phải đến vị trí này", đừng vội ép nó thành full-body joint target bằng IK cứng. Cho low-level controller một không gian command đủ mềm đôi khi tốt hơn.

Checklist chạy thử an toàn
Nếu bạn muốn reproduce ở lab nhỏ, thứ tự nên là:
- Cài Isaac Sim 4.5 và Isaac Lab đúng commit.
- Cài repo M3imic bằng
pip install -e. - Chạy
scripts/tools/list_envs.py. - Tải dataset preprocess, đặt đúng
datasets/extended_datasets. - Train với
--num_envs 256 --max_iterations 1000để debug. - Bật video ngắn, kiểm tra robot không spawn sai, không action saturate.
- Train lớn hơn với 2048-4096 envs.
- Dùng
play.pyexport ONNX/TorchScript. - Chỉ sim-to-sim và hardware test sau khi đối chiếu joint order, control rate, PD gain, action scale và emergency stop.
M3imic không phải shortcut để bỏ qua robotics cơ bản. Nó là một cách tổ chức representation và training tốt hơn cho whole-body policy. Phần nguy hiểm nhất khi deploy G1 vẫn là những thứ rất đời thường: joint mapping sai, delay khác simulator, torque limit, network jitter, robot chưa được treo dây an toàn, hoặc reference motion có foot contact phi vật lý.



