README.md
August 25, 2026 ยท View on GitHub
๐ CLAP: Cross-Embodiment Action-Conditioned Video World Models are Zero-Shot Physical Simulators
CLAP is a cross-embodiment, action-conditioned video generation framework that unifies disparate human and robot action spaces via end-effector poses, language, and latent actions.
-
Two-Stage Curriculum: Learns unsupervised physical priors from unlabeled video, then grounds them in end-effector space for zero-shot deployment.
-
Sample-Efficient Adaptation: Facilitates few-shot transfer to target robots, matching or beating single-embodiment baselines like DROID (without post-training) and Bridge (with post-training).
-
Zero-Shot Real-World Generalization: Generalizes out-of-the-box to power real-world inference planning and RL finetuning with robot policies like ฯโ.โ and MolmoAct-2.
This package covers the full lifecycle: cross-embodiment video modeling, post-training, novel-embodiment adaptation, offline evaluation, and real-robot policy-in-the-loop deployment. New to the terminology? See the Glossary for EE, LAM, OXE, DROID, and other terms used throughout.
Contents
- ๐ข Updates
- โจ Features
- ๐ Requirements
- ๐ฆ Installation
- ๐ Getting started
- ๐งฉ Sample-efficient adaptation to new embodiments
- ๐๏ธ Checkpoints
- ๐ Project layout
- ๐ Reference (configuration, entrypoints, dataset registry, testing โ
docs/REFERENCE.md) - ๐ ๏ธ Tips and Troubleshooting
- ๐ Acknowledgment
- ๐ BibTeX
- ๐ Glossary
- โ๏ธ License
๐ข Updates
- [2026/08/12] ๐ CLAP is live.
โจ Features
CLAP delivers the most comprehensive suite of action-conditioned video world models to date โ spanning diverse action-conditioning spaces (end-effector, language, and latent) and robot morphologies, across DROID, Bridge, bimanual YAM robots, and G1 humanoids.
conditioning | Action representation | Typical use |
|---|---|---|
๐ฆพ "ee" | 7-dim end-effector cartesian pose + gripper (or raw joint angles for joint-space embodiments) | Cross-embodiment, post-training, adaptation |
๐งฌ "lam" | 32-dim latent-action-model embedding (learned, not physical) | Curriculum cross-embodiment training, including egocentric human video |
๐ฌ "language" | Per-frame CLIP-encoded text captions of the action | Language-conditioned, post-training, adaptation |
๐ Requirements
-
Python โฅ 3.9 (use 3.11 for in-process openpi policies).
-
A CUDA GPU: A single โฅ12GB GPU (e.g., RTX 3060) comfortably runs eval/replay/teleop/deploy; in-process openpi deployment needs โฅ32GB (e.g., RTX 5090) โ server mode instead runs openpi on its own machine/GPU, so
clap-rollout-deployitself only needs CLAP's own ~10GB. Inference VRAM usage and timing statistics per nominal prediction (11 total frames, 25 denoising steps, mean ยฑ std with n = 20 trials):A100-40GB A100-80GB H200 CLAP alone, idle 9.6GB 9.6GB 9.7GB + openpi in-process, idle 17.6GB 17.6GB 17.7GB + openpi in-process, inference peak 24.2GB 24.2GB 25.6GB predict_chunk(steady-state)3.24s ยฑ 0.02s 2.88s ยฑ 0.00s 1.49s ยฑ 0.00s Steady-state excludes each process's first
predict_chunkcall, which pays a one-time cuDNN kernel-autotuning cost. How much that first call costs depends on whether anything else already touched the GPU first: forclap-rollout-deploy --in-process(the table above), openpi loads before CLAP's first prediction and absorbs part of that cost, so the first call only takes ~3s; forclap-rollout-replay/clap-teleop/clap-eval, which never load openpi, the very first call is genuinely cold and can take ~15s instead. Either way, it's a one-time cost โ every call after the first lands at the steady-state numbers above. -
Full cross-embodiment modeling runs (
examples/slurm/*.slurm) are sized for 8-GPU nodes (80GB-class GPUs, ~180-450GB system RAM) โ post-training/adaptation runs on a single dataset need much less. -
CUDA 12.8-compatible driver โ
torch/torchvisionare pinned to thecu128wheel index (see Installation below). -
Real training/eval against the full OXE mix needs the underlying video datasets on disk (not included โ see Dataset registry); the Getting started walkthrough below needs none of that.
๐ฆ Installation
1. Core package
This package is developed and tested with uv
โ recommended:
git clone <this-repo> clap && cd clap
VENV_HOME=${UV_ENV_DIR:-".venv"}
uv venv ${VENV_HOME}/clap --python 3.11 # or point --python at any interpreter >= 3.9
source ${VENV_HOME}/clap/bin/activate
uv pip install -e .
Or, in one step with uv sync (creates the venv and installs the exact locked versions from
uv.lock together โ more reproducible, since uv pip install -e . above re-resolves versions
each time instead of pinning to the committed lockfile):
git clone <this-repo> clap && cd clap
VENV_HOME=${UV_ENV_DIR:-".venv"}
UV_PROJECT_ENVIRONMENT=${VENV_HOME}/clap uv sync --python 3.11
source ${VENV_HOME}/clap/bin/activate
2. Policy backends (optional)
Real-robot/policy-in-the-loop deployment (clap-rollout-deploy) additionally
needs a trained policy โ openpi or MolmoAct2, matching deploy_config.policy_type.
Both are only imported inside clap.rollout.policies.{openpi_policy,molmoact_policy}
when you actually construct one; skip this step for training/eval/replay/teleop.
๐ค openpi (pi0 / pi05 / pi0fast)
git clone --recurse-submodules git@github.com:Physical-Intelligence/openpi.git optional_dependencies/openpi
cd optional_dependencies/openpi
# Or, if you already cloned without --recurse-submodules:
# git submodule update --init --recursive
# For separate server-based policy calls
# for in-process (comment the next line)
GIT_LFS_SKIP_SMUDGE=1 uv sync
GIT_LFS_SKIP_SMUDGE=1 uv pip install -e .
Full details (other install methods): Physical-Intelligence/openpi#installation. Checkpoints, and in-process vs. server tradeoffs, are covered under Tips and Troubleshooting.
๐ค MolmoAct2
git clone https://github.com/allenai/molmoact2.git optional_dependencies/molmoact2
cd optional_dependencies/molmoact2
# CLAP supports only server-based policy calls for now
uv sync
Full details (other install methods): allenai/molmoact2#4-start-a-server. Checkpoints and bimanual_yam setup are covered under Tips and Troubleshooting.
Server warmup crashing with predict_action() got an unexpected keyword argument 'action_mode'?
See Tips and Troubleshooting.
3. Environment
All cluster/site-specific paths are read from CLAP_* environment variables
(never hardcoded) โ see setup/env.example.sh for the full list with explanations.
At minimum:
cp setupe/env.example.sh setup/env.sh
# edit env.sh: set CLAP_OXE_BASE_PATH, and any per-dataset overrides your data needs
source setup/env.sh
CLAP_OXE_BASE_PATH is the only strictly required variable (clap.config.paths.PathConfig
raises immediately if it's unset). Everything else has a generic default โ
dataset_meta_info/ (per-dataset stat.json normalization bounds) ships
pre-populated in this repo for every registered dataset, so most setups don't
need CLAP_META_INFO_ROOT at all.
๐ Getting started
No dataset or account setup needed for this section โ everything below runs
against sample_data/oxe/ (~232MB, real full-length val episodes for droid/
bridge/taco_play and the two novel-embodiment adaptation targets
bimanual_yam/g1_humanoid, shipped in this repo) and downloads one
checkpoint from HF on first use. To get started, activate your virtual environment:
source ${UV_ENV_DIR:-.venv}/clap/bin/activate # activate the venv created in Installation โธ 1. Core package
๐ฅ Download a checkpoint (optional)
Checkpoints are automatically downloaded on demand to model_ckpt/<CKPT_NAME>/ โ set CKPT_NAME to pick the default; see the checkpoints table. To pre-fetch one manually instead:
hf download omni-CLAP/CLAP --include "cross_embodiment_oxe_ee/checkpoint-100000.pt" --local-dir model_ckpt
๐ Replay demonstration trajectories
Roll a checkpoint out against a sample episode and write a side-by-side GT/prediction video + PSNR/SSIM/LPIPS:
bash examples/getting_started/replay.sh # droid, clap-curr
DATASET=bridge bash examples/getting_started/replay.sh # or: droid | bridge | taco_play
CKPT_NAME=clap-lam DATASET=bridge bash examples/getting_started/replay.sh # or other models: clap-lam, clap-lang, clap-ee-droid, clap-curr-bridge, ...
CKPT_NAME=clap-ee DATASET=droid MAX_EPISODES=3 bash examples/getting_started/replay.sh # multiple episodes
# Novel-embodiment adaptation targets (14-/26-dim joint-space actions, not 7-dim EE
# cartesian) -- pair with their matching adapt_* checkpoint; MAX_CHUNKS caps their
# much longer sample episodes (1000+ frames) for a quick demo
CKPT_NAME=adapt-yam DATASET=bimanual_yam MAX_EPISODES=3 MAX_CHUNKS=20 TRIM_STATIC=1 bash examples/getting_started/replay.sh
CKPT_NAME=adapt-g1 DATASET=g1_humanoid MAX_EPISODES=3 MAX_CHUNKS=20 bash examples/getting_started/replay.sh
See Tips and Troubleshooting
for what --num-inference-steps (25 here, vs. the real default of 50), MAX_EPISODES, and
MAX_CHUNKS (all used above) do.
Output: eval_outputs/getting_started_replay/<CKPT_NAME>_<timestamp>/{video,info}/.
๐ฎ Live Teleop for DROID, BRIDGE, TACO-PLAY, BIMANUAL YAM, G1 Humanoid
Interactively drive the world model's imagined next frame with your keyboard, seeded from a
sample episode (Ctrl-C to quit). droid/bridge/taco_play use a single-arm cartesian
scheme (w/a/s/d/z/x + roll/pitch/yaw + gripper); bimanual_yam/g1_humanoid
use a shared per-joint scheme targeting whichever arm/hand is active (Tab cycles it,
Space mirrors keypresses onto its left/right counterpart too). The live-preview browser
page (below) shows the actual key map and highlights each key as you press it, which is
easier to follow live than reading it here โ see clap.rollout.teleop_controls's module
docstring if you want the exact static reference instead:
bash examples/getting_started/teleop.sh # default DATASET=droid, CKPT_NAME=clap-curr
DATASET=bridge bash examples/getting_started/teleop.sh # or: bridge | droid | taco_play
DATASET=bimanual_yam bash examples/getting_started/teleop.sh # CKPT_NAME auto-set to adapt_bimanual_yam
DATASET=g1_humanoid bash examples/getting_started/teleop.sh # CKPT_NAME auto-set to adapt_g1_humanoid
EPISODE=1002 DATASET=bridge bash examples/getting_started/teleop.sh # other episodes: bridge -> 10|1002|1003, droid -> 2799|7099|9199, taco_play -> 1002|1003|1010
CKPT_NAME=clap-ee DATASET=droid bash examples/getting_started/teleop.sh # or other checkpoints (clap-lang, clap-ee-droid, post-trained, ...); explicit CKPT_NAME always wins over the auto-default above
LIVE_VIEW_WS_PORT=7765 LIVE_VIEW_HTTP_PORT=7766 bash examples/getting_started/teleop.sh # modify the websocket/html viewer ports
Output: eval_outputs/getting_started_teleop/<CKPT_NAME>_<timestamp>/. See
Tips and Troubleshooting for the live-preview viewer,
scripted (KEYS=) mode, --num-inference-steps, workspace bounds, g1_humanoid
control tips, and camera stacking order.
๐ Deploy (policy-in-the-loop) on DROID and Bimanual YAM with Live Preview
Simulated closed-loop deployment: a real policy outputs actions and the world
model predicts the future each round with live preview. Needs MolmoAct2 or openpi
installed (see Installation) and a policy server/checkpoint filled
into examples/getting_started/deploy_config.yaml first โ see
Tips and Troubleshooting for other deploy-specific notes:
bash examples/getting_started/deploy.sh # uses deploy_config.yaml's own policy_type/policy_server/policy_ckpt setting
POLICY_SERVER_OVERRIDE=127.0.0.1:8001 bash examples/getting_started/deploy.sh # or a different policy server host/port
POLICY_TYPE=pi05 bash examples/getting_started/deploy.sh # or openpi/pi05 instead of the MolmoAct2 default
POLICY_TYPE=pi05 IN_PROCESS=1 bash examples/getting_started/deploy.sh # or an in-process policy instead of a server
CKPT_NAME=clap-ee POLICY_SERVER_OVERRIDE=127.0.0.1:8001 bash examples/getting_started/deploy.sh # or other checkpoints
LIVE_VIEW_WS_PORT=6765 LIVE_VIEW_HTTP_PORT=6766 bash examples/getting_started/deploy.sh # modify the websocket/html viewer ports
bash examples/getting_started/deploy_yam.sh # bimanual_yam instead of DROID -- joint-space, MolmoAct2 server mode only (see the bimanual_yam paragraph under Installation's MolmoAct2 section)
Output: eval_outputs/getting_started_deploy/<CKPT_NAME>_<timestamp>/ (or
eval_outputs/getting_started_deploy_yam/<CKPT_NAME>_<timestamp>/ for deploy_yam.sh).
๐งฉ Sample-efficient adaptation to new embodiments
CLAP establishes a paradigm for training high-fidelity single-embodiment
video world models via sample-efficient, few-shot adaptation of cross-embodiment models to target robot
platforms.
This section provides a worked example using bimanual_yam (and g1_humanoid โ see the notes inline).
This repo ships one train-split sample episode for both, alongside their existing val episodes
(sample_data/oxe/{bimanual_yam,g1_humanoid}/{videos,annotation}/train/), just enough to
exercise this whole pipeline end to end.
1. Format your data as <oxe_base_path>/<dataset_name>/{videos,annotation}/<split>/... โ
sample_data/oxe/bimanual_yam is a concrete (tiny) reference for the expected layout: one
videos/<split>/<episode_id>/<cam>.mp4 per camera, one annotation/<split>/<episode_id>.json
per episode (state, texts, ... โ see Dataset registry). g1_humanoid's
annotations instead come from its own clap-preprocess-g1 pipeline, which builds this same
layout from unitreerobotics/* HF datasets.
CLAP_OXE_BASE_PATH=$CLAP_OXE_BASE_PATH bash examples/preprocess/compute_g1_meta_info.sh # only needed for g1_humanoid
2. Compute action-normalization stats (dataset_meta_info/<name>/stat.json, what
BoundNormalizer reads at train/eval time โ train split only, so val stays unseen by
anything derived from training data, including the normalization bounds themselves):
clap-preprocess-oxe-meta --oxe-base-path sample_data/oxe --dataset-name bimanual_yam --full-state
# --full-state: bimanual_yam's 14-dim action is the raw `state` array, not state[:6]+gripper
# like cartesian ee7 datasets. g1_humanoid gets its stat.json from clap-preprocess-g1 (see step 1 instead)
3. Point CLAP at your data โ two env vars (see env.example.sh):
export CLAP_OXE_BASE_PATH=sample_data/oxe # your real dataset root, in practice
export CLAP_META_INFO_ROOT=dataset_meta_info # where step 2 wrote stat.json (this is the default -- only needed if you chose a different --meta-info-path)
4. Launch adaptation training (finetunes from the cross-embodiment curriculum checkpoint;
configs/experiment/adapt_bimanual_yam.yaml resets the action encoder since the input dim
changes 7 โ 14; see Tips and Troubleshooting for how this
script picks up your CLAP_* env vars):
bash examples/adapt/adapt_bimanual_yam.sh
# g1_humanoid: bash examples/adapt/adapt_g1_humanoid.sh
5. Build a test set (episode selection cached under clap/eval/test_sets_cache/, so every
eval run pins to the same episodes):
clap-build-test-sets --names bimanual_yam_val --oxe-base-path "$CLAP_OXE_BASE_PATH" --no-lam-intersection
# --no-lam-intersection: episode selection normally also requires LAM latent-action data
# (ann_keys & lam_keys) -- skip that for datasets that never compute LAM at all, like
# bimanual_yam/g1_humanoid (joint-space-only), or it'll always select 0 episodes for them.
# g1_humanoid:
# clap-build-test-sets --names g1_humanoid_val --oxe-base-path "$CLAP_OXE_BASE_PATH" --no-lam-intersection
6. Evaluate the adapted checkpoint:
clap-eval --config configs/experiment/adapt_bimanual_yam.yaml --experiment adapt_bimanual_yam \
--test-set bimanual_yam_val
# g1_humanoid:
# clap-eval --config configs/experiment/adapt_g1_humanoid.yaml --experiment adapt_g1_humanoid \
# --test-set g1_humanoid_val
Trying this locally without touching your repo's own dataset_meta_info/bimanual_yam/stat.json โ point every step at
a scratch dir instead of its default output location:
SCRATCH=$(mktemp -d)
clap-preprocess-oxe-meta --oxe-base-path sample_data/oxe --dataset-name bimanual_yam --full-state \
--meta-info-path "$SCRATCH/dataset_meta_info"
export CLAP_OXE_BASE_PATH=sample_data/oxe
export CLAP_META_INFO_ROOT="$SCRATCH/dataset_meta_info"
clap-build-test-sets --names bimanual_yam_val --oxe-base-path "$CLAP_OXE_BASE_PATH" \
--no-lam-intersection --out-dir "$SCRATCH/test_sets_cache"
clap-eval --config configs/experiment/adapt_bimanual_yam.yaml --experiment adapt_bimanual_yam \
--test-set bimanual_yam_val --test-sets-cache-dir "$SCRATCH/test_sets_cache" \
--max-chunks 1 # fast test -- 1 autoregressive chunk (config.model.num_frames predicted
# frames) per episode instead of a full rollout; omit for a full-duration eval
๐๏ธ Checkpoints
We provide a broad suite of cross-embodiment video model checkpoints at omni-CLAP/CLAP โ trained for 100K steps โ and finetuned checkpoints derived from them for target embodiments.
๐ Cross-embodiment models
The cross-embodiment models are trained on a mix of OXE datasets: (fractal/fmb/bc_z/taco_play/furniture_bench/bridge/droid, egodex too for lam). All ee-conditioned models use absolute actions, while the lang-conditioned model uses relative-to-anchor-frame language captions.
| Model name | Conditioning | Use case |
|---|---|---|
clap-curr | ee, continued from a LAM-pretrained checkpoint | Default โ getting-started default; base checkpoint for novel-embodiment adaptation |
clap-ee | ee โ 7-dim end-effector cartesian | Cross-embodiment world model, EE-only (no LAM pretraining stage) |
clap-lam | lam โ 32-dim latent action | Curriculum LAM pretraining stage |
clap-lang | language, relative-to-anchor-frame captions | Language-conditioned generation/eval |
๐ฏ Post-trained on a single robot platform
Each finetunes the matching cross-embodiment checkpoint above onto one dataset
alone (still ee-conditioned regardless of the base's own conditioning โ see
clap.eval.experiments' _POST_TRAIN_BASES comment).
DROID
| Model name | Conditioning | Use case |
|---|---|---|
clap-curr-droid | ee โ 7-dim EE cartesian | Post-trained on droid, from the clap-curr base |
clap-ee-droid | ee โ 7-dim EE cartesian | Post-trained on droid, from the clap-ee base |
clap-lam-droid | ee โ 7-dim EE cartesian | Post-trained on droid, from the clap-lam base |
clap-lang-droid | ee โ 7-dim EE cartesian | Post-trained on droid, from the clap-lang base |
Bridge
| Model name | Conditioning | Use case |
|---|---|---|
clap-curr-bridge | ee โ 7-dim EE cartesian | Post-trained on bridge, from the clap-curr base |
clap-ee-bridge | ee โ 7-dim EE cartesian | Post-trained on bridge, from the clap-ee base |
clap-lam-bridge | ee โ 7-dim EE cartesian | Post-trained on bridge, from the clap-lam base |
clap-lang-bridge | ee โ 7-dim EE cartesian | Post-trained on bridge, from the clap-lang base |
๐ Novel-embodiment adaptation
Finetune on data for a new robot embodiment, builds on physical priors from the cross-embodiment models (defaults to clap-curr)
| Model name | Conditioning | Use case |
|---|---|---|
adapt-yam | ee, 14-dim joint-space | Novel-embodiment adaptation target: bimanual_yam |
adapt-g1 | ee, 26-dim joint-space | Novel-embodiment adaptation target: g1_humanoid |
๐ Project layout
src/clap/
config/ dataclass configs (CLAPModelConfig, DataConfig, TrainingConfig, PathConfig, ...)
+ load_config() (Hydra-style YAML composition)
data/ per-embodiment dataset registry + EE/LAM/Language dataset classes
models/ CLAPModel (SVD-based UNet + action/text conditioning)
training/ clap-train and its dataloader/checkpoint/validation helpers
eval/ clap-eval and the checkpoint-comparison/test-set-building utilities
rollout/ autoregressive replay, real-robot deployment, keyboard teleop
preprocess/ per-dataset stat.json / G1-humanoid data prep
utils/ shared rich-console logging setup
configs/ YAML configs consumed by load_config() (model/, data/, training/, experiment/)
examples/ runnable shell scripts wrapping the CLI entrypoints below (train/eval/rollout/adapt/slurm)
dataset_meta_info/ shipped stat.json per dataset (normalization bounds)
tests/ unit/ (no data needed) + integration/ (needs real OXE data / a GPU, auto-skipped otherwise)
๐ Reference
Full configuration reference, the complete entrypoint/CLI documentation, the dataset
registry, and testing instructions live in docs/REFERENCE.md โ
split out to keep this README focused on getting up and running.
๐ ๏ธ Tips and Troubleshooting
Getting-started demo knobs (--num-inference-steps, MAX_EPISODES, MAX_CHUNKS, KEYS)
Every getting-started script (replay.sh/teleop.sh/deploy.sh/deploy_yam.sh) runs with
--num-inference-steps 25 (vs. the real default of 50 โ see each entrypoint's --help) to
keep the demo quick; drop the flag in the script, or pass a higher value, for full-quality
output at the cost of slower inference. replay.sh's MAX_EPISODES=<n> rolls out <n>
sample episodes instead of the default 1, writing one video/metrics set per episode.
MAX_CHUNKS=<n> (replay/teleop) caps how many autoregressive chunks each episode runs for
โ useful for the much longer bimanual_yam/g1_humanoid sample episodes (1000+ frames vs.
tens of frames for droid/bridge/taco_play). teleop.sh's KEYS=<sequence> (e.g.
KEYS=wasdcv) replaces the default live interactive session with a fixed non-interactive
scripted key sequence โ useful for a demo/CI run.
Teleop tips: workspace bounds & g1_humanoid controls
If teleop's tracked cartesian pose runs out of a sensible range mid-session (droid/bridge/
taco_play only), _X_RANGE/_Y_RANGE/_Z_RANGE in clap.rollout.teleop_controls can be
widened directly in that file โ there's no CLI flag for it yet.
g1_humanoid's 26-dim joint-space control is higher-dimensional than the other targets and
can feel subtle at first โ e (an arm dim) tends to produce more visually obvious motion
and similarly for q (a hand target's first dim, the thumb); Tab cycles which arm/hand is active. Its
adapt_* checkpoint was also finetuned on comparatively limited data despite a harder
prediction landscape than the other embodiments, so fidelity may be lower than what you see
on DROID/bridge.
Deploy tips: live viewer, policy_type, history_idx, bimanual_yam's policy_skip_step_schedule
policy_type selects the policy: pi05/pi0/pi0fast (openpi, DROID only) or molmoact2
(DROID or bimanual_yam). The policy needs a language instruction per episode โ the shipped
sample data already provides one, so there's nothing to set up there. Like Teleop, this also
starts a live-preview server by default โ it prints a http://localhost:<port>/deploy_viewer.html
URL to open in a browser, showing each round's imagined prediction as it's generated; set
NO_LIVE_VIEW=1 to skip it, or override LIVE_VIEW_WS_PORT/LIVE_VIEW_HTTP_PORT (see the
examples above).
history_idx in deploy_config.yaml/deploy_config_yam.yaml is set to sparse offsets by
default ([0, 0, -48, -32, -24, -16]), giving the world model longer temporal context each
round, which is useful if predictions degrade under fast robot motion; comment it out to fall back to the last num_history contiguous frames instead.
bimanual_yam's MolmoAct2 policy can produce robot motion with higher accelerations than
DROID's โ policy_skip_step_schedule in deploy_config_yam.yaml ([4, 2, 2, 2, 2, 1] by
default) varies how many raw policy timesteps are skipped between world-model-conditioning
frames per round, covering more ground early on and settling to a finer step later; see
RolloutDeployConfig.policy_skip_step_schedule's docstring for the exact semantics.
DROID and bimanual_yam only, for now โ clap.rollout.deploy doesn't yet support
g1_humanoid's 4-camera/26-dim-joint-space policy interface (no MolmoAct2/openpi server
exists for it either). Pointing deploy_config.yaml at dataset_name: g1_humanoid will not
raise an error; it'll just silently misbehave (see PolicyInTheLoopAgent.__init__'s
is_joint_space note in deploy.py).
Adaptation training/finetuning: env vars & bash_scripts/setup.bash
examples/adapt/*.sh (used in Sample-efficient adaptation to new embodiments)
rely on whatever CLAP_* variables are already exported in your shell โ they only source
examples/_common.sh (GPU count/port setup), not any cluster-specific env file. The
SLURM-submitted variants (examples/slurm/*.slurm) instead auto-source
bash_scripts/setup.bash for you; if you maintain your own cluster config there, source it
before running the plain examples/adapt/*.sh scripts too. When finetuning, ensure that the CLAP model checkpoint is downloaded before training begins; if absent, the new model will train from scratch.
Camera stacking order (four_view / three_view / two_view)
Every embodiment's camera frames get resized to 192x320 and stacked vertically into one
fixed-shape input (clap.data.camera_stacking), so the world model always sees the same input
shape regardless of how many physical cameras an embodiment has:
| Stacking mode | Slots (top โ bottom) | Datasets |
|---|---|---|
four_view | 4 distinct cameras: right_high โ left_high โ right_wrist โ left_wrist | g1_humanoid |
three_view | 3 distinct cameras: right โ left โ wrist | droid, fmb, bimanual_yam |
two_view | 2 distinct cameras: right (scene) โ left (wrist) โ wrist duplicated into the middle+bottom slots to fill out 3 | furniture_bench, austin_sailor, berkeley_autolab_ur5, stanford_hydra, utaustin_mutex |
| single-camera | 1 camera, tiled into all 3 slots | bridge, fractal, bc_z, taco_play, egodex |
bimanual_yam deploy-time camera wire keys: clap.rollout.deploy sends bimanual_yam's 3 stacked
camera crops to MolmoAct2's host_server_yam.py, whose own HTTP wire keys don't match these slot
names directly โ EmbodimentConfig's three_view slots map to the server's wire keys as
right โ top_cam, left โ left_cam, wrist โ right_cam.
What's in the 7-dim EE-cartesian action ([x, y, z, roll, pitch, yaw, gripper])
ee-conditioned datasets (droid/bridge/taco_play) represent each action as 7 floats:
[x, y, z, roll, pitch, yaw, gripper]. The first 6 dims (state[:, :6]) are the
end-effector's cartesian pose โ xyz position plus roll/pitch/yaw orientation โ and the
7th is the continuous gripper state, concatenated on separately (see
EEDataset._load_action in src/clap/data/ee.py). This is the
"ee7" convention (action_mode="ee7", the default for these embodiments); it's distinct
from the raw joint-space actions (joint14/joint26) used by bimanual_yam/g1_humanoid,
which have no fixed cartesian meaning per dim. All 7 dims are normalized against the
dataset's stat.json p01/p99 bounds before being fed to the model. See also the EE
entry in the Glossary.
MolmoAct2 server error: predict_action() got an unexpected keyword argument 'action_mode'
examples/droid/host_server_droid.py's predict_action(...) call in the molmoact2 repo (cloned
per Installation, external to clap) passes action_mode="continuous", but the
currently-published allenai/MolmoAct2-DROID checkpoint's remote code expects
inference_action_mode="continuous" instead (same kwarg host_server_yam.py already uses
correctly) โ this fails at server warmup with that TypeError. It's a version-skew bug between
the molmoact2 GitHub repo and its HF Hub checkpoint's remote code, not a clap issue, so it
won't be fixed by anything in this repo โ patch your own clone:
# in the molmoact2 repo
sed -i 's/action_mode="continuous"/inference_action_mode="continuous"/' examples/droid/host_server_droid.py
If this resurfaces (e.g. after a fresh clone/checkpoint re-download), check the actually-cached
signature directly rather than trusting this note โ snapshot_download there isn't
revision-pinned, so upstream can rename the kwarg again:
~/.cache/huggingface/hub/models--allenai--MolmoAct2-DROID/snapshots/<rev>/modeling_molmoact2.py.
openpi: checkpoints & in-process vs. server
Checkpoints are hosted on GCS under gs://openpi-assets/checkpoints/<name>
โ e.g. the DROID pi05 checkpoint is gs://openpi-assets/checkpoints/pi05_droid.
Point deploy_config.yaml's policy_ckpt directly at a gs://... path (openpi
downloads/caches it on first use) to use any published checkpoint, or a local
path if you've already fetched one yourself. policy_type selects which
training config it loads under (pi05 / pi0 / pi0fast, see
OpenPIPolicy's docstring) โ set it to match whichever checkpoint you pick.
gs://... downloads cache under ~/.cache/openpi by default; set
OPENPI_DATA_HOME=/path/to/cache (before running clap-rollout-deploy) to
put that cache somewhere else.
Server mode is recommended (see Installation โธ openpi) โ start the server from the openpi repo:
cd optional_dependencies/openpi
OPENPI_POLICY_BASE_DIR=${OPENPI_POLICY_BASE_DIR:-~/.cache/openpi}
# an example with pi05
uv run scripts/serve_policy.py policy:checkpoint --port=8000 \
--policy.config=pi05_droid --policy.dir=${OPENPI_POLICY_BASE_DIR}/pi05_droid
then set deploy_config.yaml's policy_server: "host:port" instead of policy_ckpt.
clap-rollout-deploy --policy-server host:port / --in-process (see
clap-rollout-deploy) override whichever the YAML sets, without
editing it โ examples/getting_started/deploy.sh exposes the same override as
POLICY_SERVER_OVERRIDE=host:port / IN_PROCESS=1.
MolmoAct2: checkpoints & starting servers
Checkpoints (~22GB each) download from HF, from inside the molmoact2 repo. To put the
HF cache on a different disk, set HF_HOME=/path/to/cache before both the download below
and before starting the server (it re-resolves the checkpoint from the same cache at
load time).
export HF_HUB_ENABLE_HF_TRANSFER=1
uv run hf download allenai/MolmoAct2-DROID # for the DROID server
uv run hf download allenai/MolmoAct2-BimanualYAM # for the YAM server
Then start the server (from the molmoact2 repo):
uv run python examples/droid/host_server_droid.py --host 0.0.0.0 --port 8000 --dtype bfloat16
# or, for bimanual YAM:
uv run python examples/yam/host_server_yam.py --host 0.0.0.0 --port 8202 --dtype bfloat16
bimanual_yam (joint-space, MolmoAct2 server mode only โ no openpi checkpoint exists for it):
clap.rollout.deploy skips forward kinematics entirely and conditions the world model on the raw
predicted 14-dim dual-arm joint+gripper state directly, and sends 3 camera crops to
host_server_yam.py โ see the Camera stacking order note below for the exact slot/wire-key
mapping. examples/getting_started/deploy_config_yam.yaml/deploy_yam.sh has a runnable example
against this repo's shipped sample bimanual_yam episodes.
๐ Acknowledgment
CLAP builds on and integrates with several open-source projects:
- Stable Video Diffusion (Stability AI) โ the pretrained video diffusion backbone
CLAPModel's UNet is built on. - Ctrl-World โ state-of-the-art action-conditioned video world model for the DROID robot platform.
- openpi (Physical Intelligence) โ policy backend supported for policy-in-the-loop deployment (ฯโ/ฯโ.โ /ฯโ-FAST).
- MolmoAct2 (Allen Institute for AI) โ policy backend supported for policy-in-the-loop deployment.
We thank the authors of these projects for making their code and models available.
(More coming soon)
๐ BibTeX
Coming soon
๐ Glossary
EE, LAM, OXE, DROID, and other terms used throughout
| Term | Meaning |
|---|---|
| EE | End-effector โ the robot's gripper/hand; ee-conditioning uses its 7-dim cartesian pose (position + orientation) + gripper, as opposed to raw joint angles |
| LAM | Latent Action Model โ a learned, unsupervised action representation extracted directly from video (not a physical quantity), letting CLAP pretrain on video with no paired action labels, including egocentric human video |
| FK | Forward kinematics โ computing a robot's end-effector pose from its joint angles; used for DROID's cartesian-conditioned world model, skipped entirely for joint-space embodiments (bimanual_yam/g1_humanoid) |
| OXE | Open X-Embodiment โ the multi-robot, multi-dataset collection CLAP's cross-embodiment training draws from (fractal/fmb/bc_z/taco_play/furniture_bench/bridge/droid, egodex for lam) |
| DROID | A large-scale real-world Franka-arm manipulation dataset/platform; one of CLAP's core cross-embodiment/post-training targets |
| Franka | The single-arm robot platform DROID's data was collected on |
bimanual YAM / bimanual_yam | A dual-arm robot platform; one of CLAP's novel-embodiment adaptation targets (14-dim joint-space action) |
G1 / g1_humanoid | Unitree G1, a bipedal humanoid robot (2 arms + 2 hands); the other novel-embodiment adaptation target (26-dim joint-space action) |
| SVD | Stable Video Diffusion โ the pretrained video diffusion backbone CLAPModel's UNet is built on |
| FVD / FID | Frรฉchet Video/Inception Distance โ distributional video/image-quality metrics clap-eval reports alongside PSNR/SSIM/LPIPS |
| PSNR / SSIM / LPIPS | Per-frame image-similarity metrics (pixel error, structural similarity, learned perceptual similarity) clap-eval/clap-rollout-replay report against ground truth |
| policy-in-the-loop | A deployment mode where a real trained policy (openpi or MolmoAct2), not ground-truth replay, drives what the world model conditions on each round โ see clap-rollout-deploy |
โ๏ธ License
MIT โ see LICENSE.