Files
StarPilot/openpilot/tools/replay
2026-11-02 15:05:14 -06:00
..
2026-11-02 12:28:46 -06:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-16 04:51:00 -04:00
2026-10-16 04:51:00 -04:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-10-14 20:02:39 -05:00
2026-11-02 15:05:14 -06:00
2026-10-18 01:00:03 -05:00
2026-10-14 20:02:39 -05:00
2026-10-17 06:34:08 -04:00
2026-10-17 06:34:08 -04:00
2026-08-08 09:44:21 -07:00

Replay

replay allows you to simulate a driving session by replaying all messages logged during the use of openpilot. This provides a way to analyze and visualize system behavior as if it were live.

Logged CarParams are not written to persistent caches: doing that requires source schema provenance and explicit conversion. Raw live CarParams seeding is allowed only with a dedicated --prefix replay-<name> namespace; run consumers under the same prefix. Other namespaces receive a diagnostic and no Params seeding. Playback remains available, but isolation does not establish compatibility of logged schemas or qualify a replay for vehicle validation.

Setup

Before starting a replay, you need to authenticate with your comma account using auth.py. This will allow you to access your routes from the server.

# Authenticate to access routes from your comma account:
python3 openpilot/tools/lib/auth.py

Replay a Remote Route

You can replay a route from your comma account by specifying the route name.

# Start a replay with a specific route:
openpilot/tools/replay/replay <route-name>

# Example:
openpilot/tools/replay/replay '5beb9b58bd12b691/0000010a--a51155e496'

# Replay the default demo route:
openpilot/tools/replay/replay --demo

Replay a Local Route

To replay a route stored locally on your machine, specify the route name and provide the path to the directory where the route files are stored.

# Replay a local route
openpilot/tools/replay/replay <route-name> --data_dir="/path_to/route"

# Example:
# If you have a local route stored at /path_to_routes with segments like:
# 5beb9b58bd12b691/0000010a--a51155e496--0
# 5beb9b58bd12b691/0000010a--a51155e496--1
# You can replay it like this:
openpilot/tools/replay/replay "5beb9b58bd12b691/0000010a--a51155e496" --data_dir="/path_to_routes"

Send Messages via ZMQ

By default, replay sends messages via MSGQ. To switch to ZMQ, set the ZMQ environment variable.

# Start replay and send messages via ZMQ:
ZMQ=1 openpilot/tools/replay/replay <route-name>

Usage

For more information on available options and arguments, use the help command:

$ openpilot/tools/replay/replay -h
Usage: openpilot/tools/replay/replay [options] route
Mock openpilot components by publishing logged messages.

Options:
  -h, --help             Displays this help.
  -a, --allow <allow>    whitelist of services to send (comma-separated)
  -b, --block <block>    blacklist of services to send (comma-separated)
  -c, --cache <n>        cache <n> segments in memory. default is 5
  -s, --start <seconds>  start from <seconds>
  -x <speed>             playback <speed>. between 0.2 - 3
  --demo                 use a demo route instead of providing your own
  --auto                 Auto load the route from the best available source (no video):
                         internal, openpilotci, comma_api, car_segments, testing_closet
  --data_dir <data_dir>  local directory with routes
  --prefix <prefix>      set OPENPILOT_PREFIX
  --cabin                  load cabin camera
  --wide-road                 load wide road camera
  --no-loop              stop at the end of the route
  --no-cache             turn off local cache
  --qcam                 load qcamera
  --no-hw-decoder        disable HW video decoding
  --no-vipc              do not output video
  --all                  do output all messages including uiDebug, userBookmark.
                         this may causes issues when used along with UI

Arguments:
  route                  the drive to replay. find your drives at
                         connect.comma.ai

Visualize the Replay in the openpilot UI

To visualize the replay within the openpilot UI, run the following commands:

openpilot/tools/replay/replay <route-name>
cd openpilot/selfdrive/ui && ./ui.py

Work with plotjuggler

If you want to use replay with plotjuggler, you can stream messages by running:

openpilot/tools/replay/replay <route-name>
openpilot/tools/plotjuggler/juggle.py --stream

watch3

watch all three cameras simultaneously from your comma three routes with watch3

simply replay a route using the --cabin and --wide-road flags:

# start a replay
cd openpilot/tools/replay && ./replay --demo --cabin --wide-road

# then start watch3
cd openpilot/selfdrive/ui && ./watch3.py

Stream CAN messages to your device

Replay CAN messages as they were recorded using a panda jungle. The jungle has 6x OBD-C ports for connecting all your comma devices. Check out the jungle repo for more info.

In order to run your device as if it was in a car:

  • connect a panda jungle to your PC
  • connect a comma device or panda to the jungle via OBD-C
  • run can_replay.py
batman:replay$ ./can_replay.py -h
usage: can_replay.py [-h] [route_or_segment_name]

Replay CAN messages from a route to all connected pandas and jungles
in a loop.

positional arguments:
  route_or_segment_name
                        The route or segment name to replay. If not
                        specified, a default public route will be
                        used. (default: None)

optional arguments:
  -h, --help            show this help message and exit

Isolated StarPilot desktop replay

./onroad [jobs] [--c3|--c4|--all|--replay-only] [--prefix replay-NAME] <route-or-replay-options> starts the current replay binary and selected native UI in one private host session. Without a UI choice, logged initData.deviceType chooses compact for mici/C4 and large otherwise. --replay-only starts no UI and does not load initData for display selection. The wrapper preserves replay arguments after its own options, and --help needs no host build. It uses a separate replay-* message namespace and disposable Params directory, copies only validated logged display booleans, and stops its owned children on normal exit or SIGINT/SIGTERM/SIGHUP. It creates and removes only its own native message-queue directory; an existing explicit replay prefix is rejected. Route playback may need the usual route access and can download data requested by the route argument.

This port has no fake nav, CEM, CSC, alert, or Galaxy demo publishers. Their old flags fail clearly. The current replay binary exposes its ncurses playback controls, not the old state-file control bar. --auto alone is rejected because the current replay binary still requires a route. A native UI preview also requires the complete reviewed bitmap font bundle described in the StarPilot UI README; this is an open zero-configuration host dependency.