REPLAY

Plays a recorded episode back through the dataset transport — no policy server, run continuously or release chunk-by-chunk.

REPLAY: load a recorded episode on the left, watch it play back on the live 3D arm and cameras on the right.

Overview

REPLAY is one of the console's six tabs (DEBUG · MANUAL · COLLECT · REPLAY · EVAL · RESULT). DEBUG asks a live policy for the next action; REPLAY reads actions from a recording on disk and re-publishes them in order. Anything COLLECT or an inference run records can be replayed — both save the same LeRobot v2.1 format. See Data collection for the on-disk layout.

Loading an episode

Launch against the dataset-replay preset (see Arming REPLAY from config):

bash
eva --config configs/00_openloop/dual_agilex_AGILEX_openloop.py --web-port 8080

Open http://localhost:8080 and click REPLAY. Fill in the left-panel inputs; the console mounts that episode as a read-only source for the session — no relaunch needed.

InputWhat to enter
Dataset directoryPath to the recording's root folder — the one holding meta/, data/, videos/. Example: examples/agilex_dataset/. The console reads this first to learn the episode count and columns.
EpisodeWhich run to play, 0-indexed. A 5-episode dataset accepts 0–4. The count is shown after inspection.
State / action columnsWhich saved columns supply state and action. Leave blank to infer from the dataset.
Action modeWhether the recorded action is qpos or eef. EEF actions are resolved through the same IK step a live run uses.

Once loaded, the playback speed is adjustable and a seek bar scrubs to any frame, freezing the 3D arm there. Current and total frame counts appear in the status feed.

Playing back: continuous or step-by-step

Like DEBUG, REPLAY offers two modes: continuous playback, or pause before every chunk and release one at a time. The only difference from DEBUG is the chunk source — disk, not a live policy.

ControlWhat it does
RUN / STOP / RESETPlay continuously, halt, or return the arm to its start pose.
SIM ↻Advance one chunk on the simulated arm only — the real robot does not move.
REAL ▶Send the previewed chunk to the real robot.

SIM-then-REAL is the same staged release flow as DEBUG — see DEBUG → STEP.

The live view

The right side is the shared 3D view. During playback:

Full live-view mechanics: DEBUG → The live stage.

Arming REPLAY from config

REPLAY can be armed entirely from config so actions are read from disk on launch. EVA ships dataset-replay presets per robot at configs/00_openloop/<robot>_openloop.py. These set the transport to read from a saved dataset — no robot, no ROS, no policy server.

Copy the preset matching your robot (dual-arm AGILEX: configs/00_openloop/dual_agilex_AGILEX_openloop.py) and edit the two fields pointing it at your recording. Transport keys:

Key (under transport)Purpose
type'dataset'. Leave as-is.
dataset_dirRequired — path to the recording's root folder.
episode_idWhich episode to play, 0-indexed. Defaults to 0.
dataset_keysMaps saved columns to state/action/video. Defaults match EVA recordings; an empty video_keys falls back to observation.images.{camera}.
python
transport = dict(
    type='dataset',
    dataset_dir='<path/to/your/dataset>',  # ← required.
    episode_id=0,
)

Launch:

bash
eva --config <path/to/your_openloop.py> --web-port 8080
vs. the replay policy backend. Use the dataset-replay preset for plain playback. Use the replay policy backend only when the recording must flow through the normal policy machinery; see Backends.

What you can replay

Any LeRobot v2.1 recording EVA produces:

SourceContents
COLLECT episodesTeleop recordings — measured state paired with the demonstrated action.
Inference runsOne episode per run — state paired with the action the policy sent.

A sample dataset ships at examples/agilex_dataset/ (dual-arm AGILEX, three cameras). Point Dataset directory or dataset_dir at it. On-disk layout: Data collection.