Introduction#
MimicLite is an open-source general motion tracking system for humanoid robots from RoboParty Lab. Given a reference motion (from a motion-capture dataset, or human motion captured live by PICO), the trained policy controls the robot to follow it under physical constraints. The same policy can both replay motions offline and be used for real-time teleoperation.
MimicLite's focus is fast training: with 8 RTX 4090s, a deployable policy can be trained in about 3 hours.
Resources:
1. Overview#
This section introduces MimicLite's components, the released models, and the environment setup. After completing this section, you can run the released policies in simulation and prepare the training environment.
1.1 What MimicLite can do#
| Workflow | What it does | See |
|---|---|---|
| Motion Data | Convert motion datasets into a unified format, inspect and replay them | Section 2 |
| Training | Train tracking policies with PPO or PPO-ROA | Section 3 |
| Play & Export | View policies in simulation, export ONNX and YAML for deployment | Section 4 |
| Sim2Sim & Sim2Real | Validate in MuJoCo, deploy to the real robot, teleoperate with PICO | Section 5 |
| Evaluation | Evaluate policies under a unified protocol, run or integrate policies trained with other codebases | Section 6 |
1.2 The four repositories#
MimicLite consists of four repositories; Roboparty/MimicLite is the project entry point:
| Repository | Responsible for | Runs on |
|---|---|---|
| mimic-lite | Tracking tasks, rewards, training algorithms, viewing and export | Training machine |
| active-adaptation | Simulation backends (mjlab / IsaacLab), distributed launch, environment infrastructure | Training machine |
| any4hdmi | Motion data format, conversion, inspection, and visualization | Any computer |
| sim2real | ONNX inference, MuJoCo simulation validation, PICO teleoperation, real-robot deployment, cross-codebase evaluation | Workstation or the robot's onboard compute unit |
1.3 Released models#
| Model | Actor network | Parallel environments | Training pipeline | GPU hours | Deployment config (sim2real) |
|---|---|---|---|---|---|
| MimicLite-PPO | 3 layers × 1024 | 16 × 16384 | PPO | 92.3 | checkpoints/mimic-lite/ppo/policy.yaml |
| MimicLite-ROA | 3 layers × 1024 | 16 × 16384 | Teacher → adaptation → fine-tuning | 173.2 | checkpoints/mimic-lite/roa/policy.yaml |
| MimicLite v1.1 | 3 layers × 512 | 8 × 8192 | Teacher → adaptation → fine-tuning | 50.1 | checkpoints/mimic-lite/v1_1/policy.yaml |
All three models only need 0.08 seconds of future reference motion, making them suitable for low-latency teleoperation. The ONNX and YAML files for deployment are in the shared sim2real artifacts. Evaluation results for each model are in the tracking leaderboard.
1.4 System requirements#
| Item | Training | Deployment |
|---|---|---|
| Operating system | Linux | Workstation (x86_64 Linux), or the robot's onboard compute unit |
| GPU | NVIDIA GPU; the example uses 8 cards (RTX 4090) | Optional; inference uses CPU by default |
| Environment management | uv | uv |
| Simulation | mjlab (default) or IsaacLab | MuJoCo |
| Accounts | W&B (logging training and saving models), Hugging Face (downloading data) | — |
| Teleoperation | — | PICO headset and leg trackers, XRoboToolkit |
1.5 Installing the training environment#
active-adaptation and mimic-lite must be cloned separately; mimic-lite goes under active-adaptation's projects/:
git clone https://github.com/Agent-3154/active-adaptation.git
cd active-adaptation
git clone https://github.com/EGalahad/mimic-lite projects/mimic-liteCreate a separate environment for each simulation backend:
# mjlab (default backend)
mkdir -p venv/mjlab
cp projects/mimic-lite/pyproject-mjlab.toml venv/mjlab/pyproject.toml
uv sync --project venv/mjlab
# IsaacLab (optional)
mkdir -p venv/isaaclab
cp projects/mimic-lite/pyproject-isaaclab.toml venv/isaaclab/pyproject.toml
uv sync --project venv/isaaclabEnable MimicLite and confirm the tasks are registered:
uv --project venv/mjlab run aa-discover-projects
uv --project venv/mjlab run aa-project enable mimic_lite
uv --project venv/mjlab run aa-list-tasksSet up accounts:
export WANDB_API_KEY=<your_wandb_api_key>
export HF_TOKEN=<your_huggingface_token>Note
If mjlab training errors out with missing
mujoco.mjtEnableBit.mjENBL_MULTICCD, the environment hasmujoco>=3.8installed. Runuv --project venv/mjlab add 'mujoco<3.8'and then re-sync.IsaacLab may mistakenly use the Warp bundled with Isaac Sim instead of the
warp-langinstalled in the environment. When this happens, clear the cache by following the Troubleshooting section of the mimic-lite README.
1.6 Installing the deployment environment and running the released models#
On the workstation:
git clone https://github.com/EGalahad/sim2real
cd sim2real
uv sync --extra inference-cpuDownload checkpoints/ and third_party/ from the shared sim2real artifacts and place them in the repository root:
sim2real/
├── checkpoints/ # policy.yaml and policy.onnx for each policy
└── third_party/
├── wheels/ # wheels for deployment
└── prebuilt/ # non-Python prebuilt packagesRun MimicLite v1.1 in MuJoCo. Terminal A:
uv run sim2real/sim_env/base_sim.pyTerminal B:
uv run sim2real/rl_policy/tracking.py \
--policy-config checkpoints/mimic-lite/v1_1/policy.yamlAfter both processes have started, press ] in the policy terminal to begin tracking, then open the mjviser URL printed by base_sim.py to view it.
Check inference speed:
uv run scripts/test_policy_inference.py \
--policy_config checkpoints/mimic-lite/roa/policy.yaml \
--inference_backend onnx-cpu2. Motion data#
This section prepares the motion data used for training. MimicLite uses the unified format defined by any4hdmi; data conversion and inspection are handled by the any4hdmi repository.
2.1 Data format#
An any4hdmi dataset consists of:
<dataset>/
├── manifest.json # Dataset info: frame interval, Hugging Face reference for the robot model (MJCF), etc.
└── motions/**/*.npz # One file per motion segment, storing only the robot's generalized coordinates qposThe positions and orientations of all body parts can be computed from qpos and the robot model, so they don't need to be stored redundantly. On the first load during training, forward kinematics is computed once and cached.
2.2 Using existing datasets#
Already-converted datasets are in the any4hdmi Hugging Face collection, including LAFAN, 100STYLE, the AMASS hard subset, ground motions, high-dynamic motions, PICO-captured data, and more. Training configs can reference them directly with hf:// paths, without downloading them locally.
Note The BONES-SEED data used by SONIC is under license restrictions and cannot be redistributed. It must be obtained from the original source and then converted with any4hdmi.
2.3 Converting data#
Run the following in the any4hdmi repository:
# LAFAN (robot-retargeted version)
uv run any4hdmi-convert-lafan \
--csv-dir <retargeted LAFAN CSV directory> \
--out-dir output/lafan
# SONIC (BONES-SEED)
uv run any4hdmi-convert-sonic \
--csv-dir <BONES-SEED CSV directory> \
--out-dir output/sonic
# 100STYLE
uv run any4hdmi-convert-axellwppr \
--input /path/to/100style.tar \
--out-dir output/100styleTo use a different robot model, specify the MJCF on Hugging Face with --mjcf-repo, --mjcf-path, and --mjcf-revision.
2.4 Inspection and replay#
# Replay a motion in MuJoCo
uv run any4hdmi-view --motion output/lafan/motions/dance1_subject2.npz
# Headless inspection
uv run any4hdmi-view --motion output/sonic/motions/<path>.npz --headlessConverted datasets can be uploaded to Hugging Face with uv run any4hdmi-upload <local directory> <HF repo name>.
2.5 Recording your own motions#
Motions captured live with PICO and retargeted to the robot can be recorded directly as an any4hdmi dataset (you need to set up PICO per Section 5.4 first):
# In the sim2real repository, first start PICO retargeting
uv run --project venv/pico sim2real/teleop/pico_retarget_pub.py
# Open another terminal to record; press Ctrl-C to stop
uv run scripts/record_motion.pyThe output directory looks like <robot>_motion_YYYYMMDD_HHMMSS/, containing manifest.json and motions/motion.npz.
2.6 Referencing data in training configs#
The data combinations used for training are written under mimic-lite's cfg/task/motion/, for example <robot>/lafan.yaml, <robot>/mixture.yaml. Each data source can set:
| Field | Purpose |
|---|---|
path |
Local directory or hf:// path |
weight |
Sampling weight |
full_motion |
Whether to use the full motion |
filenames_path |
Use only the motions in the list |
shard |
For multi-GPU training, split the data into shards so each GPU loads only one |
Note In the default mixture config, some data sources (e.g. SONIC, LAFAN) point to local directories under
../any4hdmi/output/. Before use, convert them per Section 2.3, or change the paths to the correspondinghf://datasets.
3. Training#
This section trains the tracking policy. All commands are run from the root of the active-adaptation repository. In the commands, <robot> denotes the robot directory under cfg/task/motion/.
3.1 PPO#
Single-stage PPO, 8-GPU training:
bash scripts/launch_ddp.sh 0,1,2,3,4,5,6,7 projects/mimic-lite/scripts/train.py venv/mjlab \
task=tracking-base task/motion=<robot>/mixture +exp=ppo/train \
algo/ppo/module=huge backend=mjlabThe arguments of launch_ddp.sh are, in order: GPU IDs, the training script, the simulation backend environment, followed by Hydra config overrides.
3.2 PPO-ROA (teacher → adaptation → fine-tuning)#
PPO-ROA runs in three sequential stages: first train a teacher with privileged information and a longer future reference, then have a student that only uses deployable inputs imitate the teacher, and finally fine-tune the student directly with PPO.
CUDA_VISIBLE_DEVICES=0,1,2,3,4,5,6,7 \
uv --project venv/mjlab run \
projects/mimic-lite/scripts/train_sequential.py \
task/motion=<robot>/mixture \
+task/patches=teacher_future_t16 \
algo/ppo_roa/module=huge \
task.num_envs=8192+task/patches=teacher_future_t16lets the teacher see 16 frames (0.32 seconds) of future reference; the student still only sees 0.08 seconds.If you run out of GPU memory, append
task.command.diff_future_steps=[0,1].The division of the three stages is written in
cfg/stages/, defaulting tonormal; v1.1 usescfg/stages/v1_1.yaml(4000 / 1000 / 2000 updates).
3.3 Common config options#
| Config option | Possible values | Purpose |
|---|---|---|
task= |
tracking-base, etc. |
Tracking task, chosen per robot |
task/motion= |
<robot>/mixture, <robot>/lafan, etc. |
Training data combination (see Section 2.6) |
+exp= |
ppo/train, ppo_roa/train, etc. |
Experiment preset |
algo/ppo/module=, algo/ppo_roa/module= |
small, base, large, huge |
Network size |
backend= |
mjlab, isaaclab |
Simulation backend, default mjlab |
task.num_envs= |
e.g. 8192 |
Number of parallel environments per GPU |
wandb.mode= |
online, disabled |
Can be set to disabled for local debugging |
3.4 Training output#
The run directory is
./outputs/<date>/<time>-<task name>-<algorithm name>/.By default, the model is saved every 500 updates and uploaded to W&B.
Afterwards you can reference the model on W&B directly with
checkpoint_path=run:<entity>/mimic_lite/<run_id>.
4. Viewing & Export#
This section views the trained policy in simulation and exports the ONNX and YAML that sim2real can use directly.
4.1 Viewing a policy#
View a PPO model:
uv --project venv/mjlab run projects/mimic-lite/scripts/play.py \
task=tracking-base task/motion=<robot>/lafan \
+exp=ppo/train algo/ppo/module=huge \
task.num_envs=4 task.termination.root_pos_error.enabled=false \
checkpoint_path=run:<entity>/mimic_lite/<run_id>View only the fine-tuned PPO-ROA student:
uv --project venv/mjlab run projects/mimic-lite/scripts/play.py \
task/motion=<robot>/lafan \
+task/patches=teacher_future_t16 \
+exp=ppo_roa/finetune algo/ppo_roa/module=huge \
task.num_envs=1 task.termination.root_pos_error.enabled=false \
checkpoint_path=run:<entity>/mimic_lite/<run_id>When viewing, disable root drift termination (root_pos_error.enabled=false) so you can observe long motions continuously. Replace <entity> and <run_id> in checkpoint_path with your own W&B run to view your own trained model.
4.2 Exporting deployment files#
Append export_policy=true to the viewing command; to export only without opening the simulation, also add export_only=true.
The exported files are under mimic-lite's scripts/exports/<task name>/, named policy-<run_id>-<checkpoint number>:
| File | Content |
|---|---|
.onnx |
The policy used for deployment |
.yaml |
Deployment config: observation terms, joint and body order, PD gains, default pose, action scaling, future reference frames, etc. |
sim2real automatically loads the ONNX with the same name as the YAML, so this exported pair can be used directly as --policy-config (see Section 5).
Note The ONNX and YAML must come from the same export and be used together.
4.3 Batch evaluation#
scripts/eval.py is used for quantitative evaluation: by default it runs 512 parallel environments for 1000 steps headlessly and outputs a TensorDict for later statistics. For unified cross-codebase evaluation, see Section 6.
5. Sim2Sim & Sim2Real#
This section uses the sim2real repository to validate the policy in MuJoCo, deploy it to the real robot, and teleoperate with PICO.
5.1 How it runs#
sim2real separates the policy from the execution side: the policy process reads the robot state, runs ONNX, and issues joint commands; the execution side is MuJoCo in simulation and the robot body on the real robot.
| Environment | Purpose |
|---|---|
| Root project (repository root) | Policy inference, MuJoCo simulation, robot communication |
venv/pico |
PICO retargeting, motion recording |
Two hardware layouts are supported: a workstation controls the robot over an Ethernet cable, or all programs run on the robot's onboard compute unit.
Control methods:
| Action | Keyboard | PICO |
|---|---|---|
| Enter the initial pose | i |
A |
| Enable the policy | ] |
A + B |
| Stop the policy, hold the current joint positions | o |
B |
| Pause / resume the reference motion | Space | X (start) |
The control method is selected by --controller keyboard|joystick|pico, defaulting to keyboard. joystick is the robot's remote controller; see the sim2real docs for the key mapping.
5.2 Sim2Sim: tracking offline motions#
Terminal A starts MuJoCo, which prints the mjviser URL:
uv run sim2real/sim_env/base_sim.pyTerminal B starts the policy:
uv run sim2real/rl_policy/tracking.py \
--policy-config checkpoints/mimic-lite/roa/policy.yaml \
--motion-path <motion path><motion path> is a motion from an any4hdmi dataset; it can be a local .npz or an hf:// path.
Press ] in the policy terminal to start. In the mjviser interface you can toggle the virtual gantry (Elastic Band) and adjust its length.
Single-process run: the policy and MuJoCo can also run in the same process. It places the robot at the first frame of the motion, waits 5 seconds, then starts tracking, and holds the last frame when finished:
uv run sim2real/sim_env/integrated_sim2sim.py \
--policy-config checkpoints/mimic-lite/roa/policy.yaml \
--motion-path <motion path>Add --headless to run without a GUI; add --trajectory-output <path>.npz to save the trajectory, then use the scripts under scripts/tracking_experiment/ to compute tracking metrics.
5.3 Sim2Real: deploying to the real robot#
Install robot dependencies:
uv sync --extra inference-cpu --extra <robot communication extra>
# When using GPU inference on the onboard compute unit:
uv sync --extra inference-gpu --extra <robot communication extra>See the Root Project section of the sim2real docs for the name of <robot communication extra>.
If installation reports Could not locate cyclonedds, you need to build and install CycloneDDS (0.10.x) and set CYCLONEDDS_HOME; see the Root Project section of the sim2real docs for the steps.
Choose the robot communication method:
| Method | Processes | Suitable for |
|---|---|---|
--robot-io inline |
Policy only | The recommended real-robot method, with the most stable latency |
--robot-io zmq + Python bridge script |
Policy + Python bridge | When you need to split the policy and robot communication into two processes for debugging |
--robot-io zmq + C++ binding bridge script |
Policy + C++ binding bridge | Same as above, with the bridge using the C++ low-level control bindings |
See the Robot I/O section of the sim2real docs for both bridge scripts.
The recommended inline method:
uv run sim2real/rl_policy/tracking.py \
--robot-io inline \
--policy-config checkpoints/mimic-lite/roa/policy.yaml \
--motion-path <motion path>If the robot's network interface is not eth0, add --robot-interface <interface name>.
Tip On the real robot, if the joints shake violently or high-dynamic motions degrade noticeably, first suspect unstable ZMQ communication latency and switch to
--robot-io inlineto retry, rather than rushing to tune the policy or gains.
Network layouts:
Cable connection: all programs run on the laptop; the laptop connects to the robot via an Ethernet cable and to PICO via the lab Wi-Fi.
Onboard operation: all programs run on the robot's onboard compute unit; the robot, laptop, and PICO all connect to the lab Wi-Fi, and the laptop is only used for SSH.
When running on the robot, it's recommended to set HF_HUB_OFFLINE=1 and HF_HUB_DISABLE_TELEMETRY=1 to prevent programs from trying to access the network.
5.4 PICO teleoperation#
Prepare the teleoperation environment (workstation):
Install
venv/pico:uv sync --project venv/picoInstall the
.debof XRoboToolkit PC Service and build and installxrobotoolkit_sdk(see the Teleop Project section of the sim2real docs for the steps).Put on the leg trackers, complete full-body tracking calibration, connect the workstation in XRoboToolkit, and enable the full-body data stream.
For the configuration to run teleoperation on the robot's onboard compute unit, see the Onboard section of the Teleop Project in the sim2real docs.
Run:
# Terminal A: retarget PICO motion into robot motion in real time, and open mjviser to view
uv run --project venv/pico sim2real/teleop/pico_retarget_pub.py
# Terminal B (only needed for simulation): MuJoCo
uv run sim2real/sim_env/base_sim.py
# Terminal C: the policy, following the real-time motion stream
uv run sim2real/rl_policy/tracking.py \
--policy-config checkpoints/mimic-lite/roa/policy.yaml \
--motion-backend zmq \
--controller picoFirst confirm in Terminal A's mjviser that the retargeted robot motion is correct. On the real robot, drop Terminal B and add --robot-io inline per Section 5.3.
Operations on PICO: press A to enter the initial pose, press A + B to enable the policy, and press X to start following the motion stream. If retargeting and the policy run on different computers, add --motion-zmq-connect tcp://<retargeting computer IP>:28701 to the policy.
Tip sim2real also supports using the PICO trigger to control the DH116S dexterous hand; see the sim2real docs for details.
6. Evaluation#
This section evaluates policies under a unified protocol and explains how to run or integrate policies trained with other codebases.
6.1 Cross-codebase unified evaluation#
The tracking leaderboard uses four frozen subsets from ChingMu's MotionDecode data; all policies run in the same MuJoCo environment using CPU ONNX Runtime:
| Subset | Number of motions | Role |
|---|---|---|
| Locomotion-80 | 80 | Primary; includes global root tracking |
| Manipulation-48 | 48 | Primary; body and wrist tracking |
| Ground-60 | 60 | Secondary |
| Dance-40 | 40 | Secondary |
Evaluate your own policy:
uv run scripts/tracking_experiment/run_motiondecode_eval.py \
--download \
--policy my_policy=checkpoints/my_policy/policy.yaml \
--output-dir outputs/my_policy_motiondecode \
--max-workers 8By default, Locomotion-80 and Manipulation-48 are evaluated; add
--splits locomotion manipulation ground danceto evaluate all four subsets.Repeat
--policy name=pathto compare multiple policies at once.Data is cached in
datasets/motiondecode; the script verifies each file;--dry-runonly downloads and verifies the data without running the simulation.Each subset outputs trajectories,
runs.csv,tracking_metrics.csv/json, andsummary.json.
Key points of the evaluation protocol:
If the pelvis height error exceeds 0.3 m, or the gravity direction error exceeds 0.8, it is judged a failure; failure is not judged by root position.
Progress and Tracking Return are both truncated at the failure frame; errors are only counted for frames before the failure, so they should be read together with Progress.
Global root error is only reported on Locomotion.
These data are only for evaluation; do not resample them or use them for other robots.
6.2 Running policies from other codebases#
sim2real has converted a variety of external policies into the same deployment format; you only need to replace --policy-config:
| Policy | Deployment config |
|---|---|
| HEFT | checkpoints/heft/pmg/policy.yaml, etc. |
| SONIC | checkpoints/sonic/release/.../policy.yaml, etc. |
| HoloMotion v1.4.0 | checkpoints/holomotion/v1_4_0/policy.yaml (requires downloading the official ONNX separately) |
| ScaleBFM | checkpoints/scalebfm/humanoid_transformer_xl/policy.yaml, etc. |
| BFM-Zero | checkpoints/bfm-zero/exp_lafan40-100style_update_z10/policy.yaml (requires a dedicated MJCF; GPU inference recommended) |
| TeleopIT, Humanoid-GPT, TWIST2 | checkpoints/<name>/policy.yaml |
For the full list and each policy's special requirements (e.g. SONIC's SMPL mode needs a separate motion source), see the Run External Policies section of the sim2real docs.
6.3 Integrating your own policy#
Having just an ONNX file is not enough: the construction of observations, joint order, PD gains, and action scaling must all match training. Integrating a new policy requires:
Export the ONNX;
Implement the corresponding observation class and write the deployment YAML;
Validate in Sim2Sim.
The sim2real repository includes a Codex skill (.agents/skills/adapt-policy-to-sim2real) that walks through these steps. Models trained with MimicLite itself just use the export in Section 4.2 and don't need this step.