Skip to content
View as markdown

RecordingΒΆ

--record writes the selected streams from a blueprint to one recording artifact. The stable default remains the Python SQLite recorder. The Rust engine is an explicit experimental option while it is evaluated.

dimos --record --simulation run unitree-go2
dimos --record --robot-ip 192.168.123.161 run unitree-go2

Bare --record means --record sqlite. SQLite lands at recordings/<run-id>/memory.db; MCAP lands at recordings/<run-id>/memory.mcap. The root is under the checkout, or ~/.local/state/dimos/recordings/ for an installed package. <run-id> is the same YYYYMMDD-HHMMSS-<blueprint> used by the run's logs/ directory.

Experimental Rust engineΒΆ

Select the native engine explicitly:

dimos --record sqlite --record-engine rust run unitree-go2
dimos --record mcap --record-engine rust run unitree-go2
dimos --record mcap --record-engine rust --record-encoding-threads 8 run unitree-go2

--record-encoding-threads defaults to 4 and is valid only for the Rust engine. Python remains the default because the native recorder is experimental; MCAP recording currently requires the Rust engine.

The Rust engine records exact LCMTransport and ZenohTransport streams. It rejects SHM, DDS, ROS, WebRTC, pickled, JPEG-transport, mixed LCM/Zenoh, and other specialized transports before creating an artifact. Narrow --record-topics or use the Python engine when a selection contains one of those transports. Payloads must also be dimOS LCM message types.

The native process must report ready within 10 seconds, so build, configuration, and subscription failures stop startup. If it exits unexpectedly after startup, the error is logged and the rest of dimos run continues. Normal shutdown sends SIGTERM and lets the existing native module runtime flush the artifact. There is no automatic fallback to Python.

Choosing streamsΒΆ

--record-topics takes comma-separated globs on the stream name (the blueprint name, e.g. lidar, not /lidar). Default *.

dimos --record --record-topics color_image run unitree-go2
dimos --record --record-topics lidar,odom,tf run unitree-go2
dimos --record --record-topics 'global_*' run unitree-go2

A pattern that matches no stream throws an error at startup, listing the valid stream names of the given blueprint.

Streams whose type is not a dimOS message (Any, dict) are not recorded. If none of the selected streams is recordable, startup fails.

Inspecting and replayingΒΆ

View contents of the memory by stream:

$ dimos mem summary recordings/<run-id>/memory.db

┏━━━━━━━━━━━━━━━━┳━━━━━━━━┳━━━━━━━┳━━━━━━━━━━━━━━━━━━━━━┳━━━━━━━━━━┳━━━━━━━━━━━━┓
┃ Stream         ┃  Items ┃    Hz ┃ Start (UTC)         ┃ Duration ┃       Size ┃
┑━━━━━━━━━━━━━━━━╇━━━━━━━━╇━━━━━━━╇━━━━━━━━━━━━━━━━━━━━━╇━━━━━━━━━━╇━━━━━━━━━━━━┩
β”‚ lidar          β”‚     43 β”‚   2.0 β”‚ 2026-08-27 03:39:06 β”‚    21.2s β”‚   5.14 MiB β”‚
β”‚ color_image    β”‚    376 β”‚  17.3 β”‚ 2026-08-27 03:39:06 β”‚    21.6s β”‚   4.26 MiB β”‚
β”‚ global_map     β”‚      9 β”‚   0.4 β”‚ 2026-08-27 03:39:07 β”‚    20.2s β”‚   3.08 MiB β”‚
β”‚ global_costmap β”‚      9 β”‚   0.4 β”‚ 2026-08-27 03:39:07 β”‚    20.2s β”‚ 421.03 KiB β”‚
β”‚ tf             β”‚    981 β”‚  45.2 β”‚ 2026-08-27 03:39:06 β”‚    21.7s β”‚ 292.19 KiB β”‚
β”‚ cmd_vel        β”‚  1,855 β”‚  99.7 β”‚ 2026-08-27 03:39:07 β”‚    18.6s β”‚ 101.45 KiB β”‚
β”‚ tele_cmd_vel   β”‚  1,855 β”‚  98.6 β”‚ 2026-08-27 03:39:07 β”‚    18.8s β”‚ 101.45 KiB β”‚
β”‚ goal           β”‚  1,855 β”‚  98.9 β”‚ 2026-08-27 03:39:07 β”‚    18.8s β”‚  94.20 KiB β”‚
β”‚ way_point      β”‚  1,855 β”‚  98.9 β”‚ 2026-08-27 03:39:07 β”‚    18.8s β”‚  94.20 KiB β”‚
β”‚ odom           β”‚    981 β”‚  45.2 β”‚ 2026-08-27 03:39:06 β”‚    21.7s β”‚  82.39 KiB β”‚
β”‚ stop_movement  β”‚  1,855 β”‚  98.9 β”‚ 2026-08-27 03:39:07 β”‚    18.7s β”‚  16.30 KiB β”‚
β”‚ camera_info    β”‚     24 β”‚     - β”‚ 2026-08-27 03:38:56 β”‚     0.0s β”‚   8.67 KiB β”‚
β”‚ nav_cmd_vel    β”‚      3 β”‚  32.8 β”‚ 2026-08-27 03:39:28 β”‚     0.1s β”‚   168.00 B β”‚
β”‚ goal_request   β”‚      1 β”‚     - β”‚ 2026-08-27 03:39:28 β”‚     0.0s β”‚    86.00 B β”‚
β”‚ path           β”‚      2 β”‚ 289.1 β”‚ 2026-08-27 03:39:28 β”‚     0.0s β”‚    68.00 B β”‚
β”‚ goal_reached   β”‚      1 β”‚     - β”‚ 2026-08-27 03:39:28 β”‚     0.0s β”‚     9.00 B β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”Όβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚ total          β”‚ 11,705 β”‚       β”‚                     β”‚          β”‚  13.66 MiB β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
Replay memory from DB:
dimos --replay --replay-db recordings/<run-id>/memory.db run unitree-go2

--replay swaps the robot connection for the recording; it needs lidar, odom, and color_image, so record all streams (the default) if you intend to replay. Poses are not stored per frame; tf is recorded like any other stream and dimos map global uses it to register clouds. dimos map pose-fill instead derives poses from odom by default.

BehaviorΒΆ

  • Off unless --record; never active under --replay.
  • The Python recorder uses one writer thread. Its queue holds 1000 messages, then drops and warns. The Rust recorder uses its existing native encoding pool and ordered writer pipeline.
  • We also still have explicit recorder modules (unitree-go2-memory, unitree-go2-mid360-record, unitree-g1-record) that are unaffected and still record their own streams. These will be deprecated shortly.