Skip to main content
Replays one episode of an existing LeRobot-format dataset on Axol: the episode’s recorded 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. This command is configured via draccus. The robot subsystem is exposed as the nested robot_config config (CAN channels, per-joint gains) — nest into it with dots or pass a whole-config file. See Command configuration.
Replay drives the arms open-loop from the recorded actions — it does not watch the scene. Make sure the workspace is clear and matches roughly what the episode was recorded in before starting, and keep the Stop control (or Ctrl+C) within reach. Match the stiffness used at collection time so the arm tracks the same way it did when recorded.