Official implementation of
FlashDexRetarget: Accelerating Dexterous Manipulation Data Generation through Multi-Motion Retargeting
Kyungmin Lee*1, Sibeen Kim*1, Dongyoon Hwang*1, Yoonsang Oh*1, Donghu Kim2, Youngdo Lee2, I Made Aswin Nahrendra2, Jaegul Choo1†, Hojoon Lee2†
1KAIST AI, 2Holiday Robotics
arXiv'2026. (* indicates equal contribution, † indicates corresponding author)
FlashDexRetarget retargets large collections of human hand-object demonstrations to a dexterous robot hand by training one RL policy jointly across all reference motions, instead of optimizing every demonstration separately.
# 1. environment (conda env, Isaac Sim 5.1 / Isaac Lab 2.3, robot USDs)
bash scripts/setup.sh
# 2. data: MANO models in assets/mano/ (see Data), then a released dataset
# -> <output_dataset_path>/<robot>/motion.pt (taco.sh | oakink2.sh | hot3d_1obj.sh)
bash scripts/retarget/taco.sh <raw_dataset_path> <output_dataset_path>
# 3. train (~110 GB of GPU memory; with runner.agent.buffer_device_type=cpu ~16 GB GPU + ~100 GB RAM)
MOTION=<output_dataset_path>/xhand/motion.pt bash scripts/train_flashdexretarget.shdocs/guide/flashdexretarget.md: training options (launcher variables, Hydra overrides), GPU memory, stop / resume, evaluation, outputs.docs/guide/kinematic_retargeting.md: data, from a released dataset tomotion.pt: dataset layout, clip format, every pipeline step and its settings,motion.ptcontents.
git clone --recursive https://github.com/Holiday-Robot/FlashDexRetarget.git
cd FlashDexRetarget
bash scripts/setup.shOne script builds the conda env FlashDexRetarget (pinned Isaac freeze, rsl_rl_flashsac), scripts/env.sh
and the XHAND and Sharpa Wave USDs.
Caution
setup.sh installs every package with --no-deps. Add packages to this env the same way
(pip install --no-deps <pkg>): a plain pip install pulls newer torch / warp and breaks Isaac Lab.
Troubleshooting
- Export
OMNI_KIT_ACCEPT_EULA=1in every shell that imports Isaac Sim (the launchers do); otherwise evenimport isaacsimwaits for a EULA prompt and dies withEOF when reading a line. - No
libEGL(headless servers):export MUJOCO_GL=disabled. - A corrupted shader cache after an interrupted first boot:
rm -rf ~/.cache/ov/Kit. simulation_app.close()segfaults on isaacsim 5.1, so the runner exits withos._exit; a non-zero exit code at the very end of a finished run is expected.Unresolved reference prim path ... configuration/*_base.usdwarnings while the scene builds concern visual meshes only; physics loads.- Out of GPU memory:
runner.agent.buffer_device_type=cpu, or a smallerrunner.agent.buffer_max_length(GPU memory).
Motion data is not part of this repository. A dataset is one directory holding motion.pt and the
objects/ it uses; one script builds it from a released TACO, OakInk2 or HOT3D (segments in which both
hands handle one object).
The import runs the MANO hand model, which is not redistributed here: register at
mano.is.tue.mpg.de, download Models & Code (mano_v1_2.zip) and put
the two hand models in assets/mano/ (or symlink an existing copy: ln -s <dir> assets/mano):
mkdir -p assets/mano
unzip mano_v1_2.zip
cp mano_v1_2/models/MANO_{RIGHT,LEFT}.pkl assets/mano/Then:
ROBOTS="xhand sharpa" bash scripts/retarget/taco.sh <raw_dataset_path> <output_dataset_path> # oakink2.sh | hot3d_1obj.shIt writes <output_dataset_path>/<robot>/motion.pt; every step and its settings are in
docs/guide/kinematic_retargeting.md.
MOTION=<output_dataset_path>/xhand/motion.pt bash scripts/train_flashdexretarget.sh
# Hydra overrides go after the script, e.g. a run name and the replay buffer in host RAM
MOTION=<output_dataset_path>/xhand/motion.pt bash scripts/train_flashdexretarget.sh \
logger.wandb.run_name=my_run runner.agent.buffer_device_type=cpuROBOT=sharpa (with its sharpa/motion.pt) trains the Sharpa Wave hand. The defaults live in config/
(learner: config/runner/flashsac.yaml). The policy is evaluated on every clip each 20M env steps, and
checkpoints and the passing rollouts go to logs/flashsac/<run>/. Every option, GPU memory and resuming:
docs/guide/flashdexretarget.md.
# a retargeted dataset (<output_dataset_path>/<robot>/motion.pt, or one robot dir) in a viser web viewer
bash scripts/visualization.sh <output_dataset_path>
# plus the archived rollouts of training runs (a run dir, its success/ dir, or logs/flashsac for every run)
bash scripts/visualization.sh <output_dataset_path> logs/flashsac/<run>Open the printed URL (PORT=8080 by default) in a browser. With a saved run the simulated hands and objects are
drawn solid over the reference (translucent blue); a run trained on another motion.pt is tagged [other reference].
src/
agents/ # FlashSAC agent (per-hand actor-critic, replay buffer, future trajectory encoder)
runner/ # Off-policy training loop, checkpoints, resume
envs/ # Observations, actions, rewards, terminations, curriculum, motion command
evaluation/ # Per-clip evaluation and success archive
simulator/ # Isaac Sim scene, sensors and asset conversion
retarget/ # Human demos -> motion.pt (import, IK retargeting, packing)
config/ # Hydra configs (envs, runner, eval, logger, retarget)
scripts/ # Setup, training launcher, viewer, retarget/ (one script per dataset)
assets/ # Robot models (XHAND, Sharpa Wave); MANO models go in assets/mano/
docs/ # Project page and guides (docs/guide/)
train.py # Training entry point
@article{lee2026flashdexretarget,
title = {FlashDexRetarget: Accelerating Dexterous Manipulation Data Generation through Multi-Motion Retargeting},
author = {Lee, Kyungmin and Kim, Sibeen and Hwang, Dongyoon and Oh, Yoonsang and Kim, Donghu and
Lee, Youngdo and Nahrendra, I Made Aswin and Choo, Jaegul and Lee, Hojoon},
journal = {arXiv preprint arXiv:2610.01849},
year = {2026}
}