.db from Record & replay holding every camera frame, lidar scan, and pose from the session. This page is about asking that file questions:
- Where did the robot go, and how fast? Debug navigation without re-running the robot.
- What did the environment look like? Map room lighting, coverage, sensor quality.
- When and where did the robot see X? Search hours of video with a sentence, then jump straight to those frames and places.
go2_bigoffice, a bundled five-minute Go2 drive around an office. Swap in your own recording and everything works the same. The query API used throughout is documented in The memory2 library.
The session
Open the store and see what was recorded:Python
Draw where the robot went
Space is a top-down spatial canvas: add any stream to it and each observation is drawn at the pose where it was captured, colored by time (turbo colormap, blue early to red late). Adding the camera stream literally draws the robotโs trajectory:
Python
Derive new streams
Queries are lazy stream pipelines:.transform() and .map() build new streams from recorded ones without touching the database until you draw or iterate. Two practical examples.
How fast was the robot moving, where? Useful for spotting where navigation slowed down or got stuck:
Python
Python
Make the camera stream searchable
To search video with text, embed the frames with CLIP once and save the result as a new stream in the same store. The pipeline filters dark frames (see the lighting map above), picks the sharpest frame in each half-second window, embeds, and saves:Python
.drain():
skip
color_image_embedded stream (267 embedded frames of the 4164 recorded).
Search by text
Now the session is queryable in natural language. Embed a text query and search - matches come back as ordinary observations, so they draw on the map like anything else:Python
Python
Python

Case study: find the plants
A full worked example, end to end: did the robot see plants during the session, where exactly are they in the building, and can we verify with a detector? This is the workflow for any โfind X in my recordingsโ task. It also plots over time rather than space, using thePlot API (time-series companion to Space).
First, a feel for the session on a timeline - speed, brightness, and elapsed time on separate axes:
session=robotdata output=none
Score every frame against โplantโ
Search the embedded stream and re-sort by time, giving a โplant-ness over the sessionโ signal:session=robotdata
session=robotdata
session=robotdata
Auto-detect the peaks and verify with a VLM
Obvious peaks. Auto-detect them, pull the frames at those moments, and run a detector (Moondream, one of the VLM backends) to verify there really are plants:skip session=robotdata

Which peaks are significant?
We got 15 peaks back. Most prominences sit around 0.02-0.03 and only a couple (0.067 at t=37s, 0.047 at t=240s) really stand out.significant() replaces eyeballing that cutoff by thresholding on the distribution of prominences itself (default: MAD, median absolute deviation).
Once the surviving peaks go on the timeline, we get two very obvious plants:
skip session=robotdata

peaks(prominence=...) to reject shape-noise, then let significant() pick the statistical cutoff.
Zoom into a hotspot
Focus on the strongest peak: load every image captured within 2.5 m of it (filtered for brightness and sharpness), rebuild the local 3D map from the lidar around it, and run the detector on all nearby views:skip session=robotdata

Project detections into 3D
Finally, lift the 2D detections into 3D boxes on the map using the camera model and the pointcloud - from โthe robot saw a plant at t=37sโ to โthere is a plant hereโ:skip session=robotdata output=none
Appendix: plotting API notes
Small things worth knowing aboutPlot when you build your own analyses.
Colors auto-cycle as you add series:
session=plot output=none
session=plot output=none
