REPLAY
Plays a recorded episode back through the dataset transport — no policy server, run continuously or release chunk-by-chunk.
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):
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.
| Input | What to enter |
|---|---|
| Dataset directory | Path 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. |
| Episode | Which run to play, 0-indexed. A 5-episode dataset accepts 0–4. The count is shown after inspection. |
| State / action columns | Which saved columns supply state and action. Leave blank to infer from the dataset. |
| Action mode | Whether 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.
| Control | What it does |
|---|---|
| RUN / STOP / RESET | Play 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:
- 3D arm — driven by the joint angles of the chunk in flight.
- Camera strip — the recorded camera videos saved with the data.
- ACTION / STATE charts — per-axis graph of the chunk in flight; on stop, a scrub bar unlocks the history.
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_dir | Required — path to the recording's root folder. |
episode_id | Which episode to play, 0-indexed. Defaults to 0. |
dataset_keys | Maps saved columns to state/action/video. Defaults match EVA recordings; an empty video_keys falls back to observation.images.{camera}. |
transport = dict( type='dataset', dataset_dir='<path/to/your/dataset>', # ← required. episode_id=0, )
Launch:
eva --config <path/to/your_openloop.py> --web-port 8080
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:
| Source | Contents |
|---|---|
| COLLECT episodes | Teleop recordings — measured state paired with the demonstrated action. |
| Inference runs | One 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.