action column is streamed back to the arms frame by frame, then the robot returns to its rest pose. It’s the inverse of collect-data — instead of recording teleop actions it plays an already-recorded episode straight onto the hardware.
No cameras, teleop, or policy server are involved: replay only drives the arms, so the robot config carries no cameras. The robot is first moved to the rest pose (the same collision-aware return-to-rest run-policy uses) so the arm starts where every recorded episode does — episodes are recorded from rest, so the first replayed action is ~rest and there’s no jump. Each frame is sent at the dataset’s recorded fps to reproduce the original timing — paced on the robot’s control loop so command intervals stay regular and the motion stays smooth — and a final return-to-rest leaves the arm parked. With --interpolate the recorded actions are upsampled to ~120 Hz commands for even smoother tracking, without changing the episode’s timing.
Pass --loop to replay the episode continuously (returning to rest between takes) until you stop it with Ctrl+C (or Stop in the control panel); either way the arm returns to the rest pose before the operation exits.
The hosted control panel resolves
--repo_id against the configured dataset
root only; passing a dataset directory as --repo_id is a direct-CLI
shorthand.robot_config config (CAN channels, per-joint gains) — nest into it with dots or pass a whole-config file. See Command configuration.
