PyRoboReplay
Forensic debugging and mission-replay platform for autonomous robots: replay ROS 2 missions, run causal / root-cause analysis on failures, and perform multispectral (RGB + thermal) forensics. Rust core with Python bindings.
What it is
PyRoboReplay ingests recorded robot missions (ROS 2 bags) into a unified timeline and answers why and what-if questions rather than only where and what: which events preceded a failure, what the perception stack missed, and what the robot should have detected. The heavy lifting is a Rust core (cdylib + rlib) built with PyO3, exposed to Python through maturin. The supported entry points are the Python API and a Rust CLI with replay, compare, analyze, list, terrain, forensics, nav2, session, and export.
Features
Exposed via CLI / Python (verified, tested):
- Mission replay — interactive timeline scrubber with keyboard controls (
replay). - Reality-gap analysis — probabilistic mismatch scoring, severity classification, evidence aggregation, JSON/text output (
analyze --detect-gaps). - Failure detection and diagnosis —
Mission.detect_failures(),Mission.analyze_failure()with hypotheses, confidence, and prioritized actions. - Mission comparison — side-by-side diff of two bags (
compare). - Topic listing — inspect available topics in a bag (
list). - Real ROS 2 CDR decoding — standard
sensor_msgs/nav_msgs/geometry_msgsbinary layouts are decoded from real message bytes (src/adapters/cdr.rs); poseconfidenceis derived from the real position-covariance trace, so localization-loss detection fires on real data. - Retrospective detection gaps (Phase 12) — ingest externally generated DINO detections and compare them with the robot's YOLO detections (
forensics --dino,analyze_detection_gaps()). - RGB + thermal fusion (Phase 13) — ingest RGB detections and a thermal frame, then fuse them (
forensics --rgb --thermal,fuse_rgb_thermal()). - Navigation sessions (Phase 14) — build a unified timeline from a recorded ROS 2 bag plus optional Linux logs and Nav2 exports (
session,build_navigation_session()). - Nav2 root-cause heuristics (Phase 15) — run localization/planner/costmap/obstacle/semantic analyzers and classification on a measurements document (
nav2,analyze_nav2_diagnostics()). - Recorded-mission exports — native MCAP (
export --format mcap) plus optional Rerun.rrdexport through the Python API orpyroboreplay-export. - PyTerrainMap grid interop — read the documented
pyterrainmap-gridmapv1 JSON export directly (terrain,load_pyterrainmap_grid()). - Phase 16-20 JSON operation bridge — six real Rust operations (causal graph, counterfactual query, fleet learning, temporal patterns, trend detection, decision tree) via
ops()/run_op(); see Advanced operations.
Implemented in the Rust core, not yet wired to CLI or Python (library API only):
- Persistent world knowledge (entities, locations, facts across missions) and spatial grounding.
- Multi-mission / longitudinal learning.
- Pluggable detection backends (YOLO / SAM / template fallback). Phase 12 accepts external DINO detections; it does not run a model itself.
Who it's for / Use cases
- Warehouse and logistics fleets — reconstruct why a run failed, find missed detections and coverage gaps, compare two strategy revisions.
- Safety and compliance review — produce auditable, saved JSON findings for an incident (
analyze --detect-gaps --format json --output report.json). - Perception R&D — compare perception strategies over matched missions and quantify regressions.
- Field autonomy teams — investigate localization loss, planner oscillation, and sensor disagreement from recorded missions.
What it is not
- Not a real-time monitoring or fleet dashboard. It works on recorded missions, not live streams. The
streamingmodules are internal building blocks, not a supported live fleet product. - Phases 16-20 are not typed Python APIs. Six implemented Rust operations are reachable through the JSON-only
ops()/run_op()bridge (Advanced operations); the rest of those modules, including decision reconstruction, clustering, scenario analysis, and rule extraction, remain Rust-library-only. - Phase 12 does not run DINO/SAM models. It ingests detections produced by an external open-vocabulary run and performs gap analysis; the in-crate
run_dino_detectionmethod remains a deterministic test stub. - PyTerrainMap interop is file-based, not a runtime dependency. PyRoboReplay reads the documented
pyterrainmap-gridmapv1 JSON export; there is still no Cargo/pip dependency, H3 store integration, or ROS bridge.src/core/pyterrain_bridge.rsremains self-contained terrain-modeling logic. - Not published to crates.io — build the Rust crate from source if you need it directly.
- Not a certified or safety-verified system.
Project status
Beta (Development Status 4). Current source version is 2.11.0; the latest PyPI release is also 2.11.0 (published 2026-10-19, before the operation-bridge work in this branch). The CLI and Python API are the tested, supported surface. 869 cargo test --lib unit tests pass plus public-surface Python tests (including 10 for the Phase 16-20 bridge) and 7 real-fixture ROS 2 CDR tests. cargo fmt --check and cargo clippy --all-targets --all-features -- -D warnings are clean (re-verified 2026-10-20). See ROADMAP_HONEST.md for the implemented/partial/missing breakdown.
Installation
2.11.0 packaging note: the published 2.11.0 wheel does not ship the CLI and does not declare
numpy. Usepip install pyroboreplay numpyfor the Python API, or build from source for the CLI. Both are fixed in the repository for the next release. See Install.
Wheel coverage: PyPI 2.11.0 has wheels only for Linux x86_64 and macOS arm64. The release workflow now builds Linux x86_64/aarch64, macOS arm64/x86_64, and Windows x86_64 for Python 3.10–3.13, with an installed-wheel smoke test, but those wheels do not exist until a new
v*tag is pushed and the release publishes successfully. See the platform matrix.
pip install pyroboreplay
# or with uv
uv pip install pyroboreplay
# verify
pyroboreplay --version
Requires Python 3.10+. From source (needs a Rust toolchain):
git clone https://github.com/Mullassery/PyRoboReplay.git
cd pyroboreplay
pip install maturin
maturin develop --release # install the Python package
# or, for the Rust binary/crate only:
cargo build --release
Quick start
CLI commands require a source build (or the next release) because the 2.11.0 wheel does not include the CLI. See Install.
# Interactive timeline scrubber
pyroboreplay replay mission.bag
# Reality-gap analysis, saved as JSON
pyroboreplay analyze mission.bag --detect-gaps --detail --format json --output investigation.json
from pyroboreplay import Mission
mission = Mission.from_ros_bag("warehouse.bag")
failures = mission.detect_failures()
print(f"Failures detected: {len(failures)}")
analysis = mission.analyze_failure(timestamp=1234567890.0)
print(f"Root cause: {analysis.get_primary_hypothesis()}")
print(f"Confidence: {analysis.get_diagnostic_confidence():.0%}")
for action in mission.recommend_actions(timestamp=1234567890.0):
print(f"[{action.get_priority()}] {action.get_description()}")
Interactive replay keys: Space play/pause, n / → next event, p / ← previous event, ↑ / ↓ speed, ? help, q / Esc quit.
MCAP export
Export a mission timeline to the indexed MCAP robotics log format. The native
CLI needs no extra dependency; the Python helper needs mcap.
pyroboreplay export mission.db3 mission.mcap --format mcap
pip install "pyroboreplay[mcap]"
from pyroboreplay import Mission, export_mcap
mission = Mission.from_ros_bag("mission.db3")
export_mcap(mission, "mission.mcap")
Events are written to /events/<sensor> and failures to /failures as JSON
messages with their original timestamps, so Foxglove/Rerun and other MCAP
readers can open the recording. MCAP (MIT) is an optional dependency.
Rerun mission playback
Export a mission timeline and detected failures to a Rerun recording:
pip install "pyroboreplay[rerun]"
pyroboreplay-export mission.db3 mission.rrd --format rerun
from pyroboreplay import Mission, export_mission
mission = Mission.from_ros_bag("mission.db3")
export_mission(mission, "mission.rrd")
# rerun mission.rrd
Events are logged under events/<sensor> on a time timeline; failures are
logged under failures with severity/confidence text. Rerun is an optional
Apache-2.0 viewer dependency, not a vendored component.
Alpamayo forensic reports
Turn an offline Alpamayo run (.json, .jsonl, .npz, or a mapping) into a
trajectory and reasoning report. Run timestamps are matched against failures
already detected in the mission:
from pyroboreplay import (
build_alpamayo_report,
load_alpamayo_run,
write_alpamayo_report,
)
run = load_alpamayo_run("alpamayo-run.json")
report = build_alpamayo_report(run, mission=mission, ground_truth=ego_future_xyz)
write_alpamayo_report(report, "alpamayo-report.md")
The report includes minADE/minFDE per run, per-sample reasoning traces, and
correlated failures. No torch or model weights are required; generate the
artifacts with the external Alpamayo inference stack.
Usage
pyroboreplay compare mission_a.bag mission_b.bag # side-by-side
pyroboreplay list mission.bag # topics in a bag
pyroboreplay analyze mission.bag --detect-gaps --detail # findings to stdout
pyroboreplay export mission.bag mission.mcap --format mcap
# Phase 12/13: ingest external detections and a thermal frame
pyroboreplay forensics --yolo detections.json --dino dino.json \
--rgb rgb.json --thermal thermal.json --format json
# Phase 15: Nav2 root-cause heuristics from a measurements document
pyroboreplay nav2 nav2-measurements.json --format json
# Phase 14: unified session from recorded sources
pyroboreplay session mission.bag --logs system.log --log-type syslog
# PyTerrainMap grid-map JSON export
pyroboreplay terrain terrain-grid.json --format json
The Python package exports Mission, Event, Failure, Hypothesis, RootCauseAnalysis, Action, FleetStatistics, GeoHotspot, plus load_pyterrainmap_grid, analyze_detection_gaps, fuse_rgb_thermal, analyze_nav2_diagnostics, build_navigation_session, and the Phase 16-20 JSON bridge (ops, run_op; see Advanced operations). World-knowledge and typed advanced-analysis APIs still live in the Rust core only.
Documentation
- Documentation index — start here
- Install — Python API vs CLI and platform matrix
- Advanced operations — Phase 16-20 JSON bridge
- Project status — current gaps and fixes
- Alternatives — Foxglove/Rerun comparison
- docs/CLAUDE.md — product vision and architecture
- docs/API.md — Python and Rust API reference
- docs/ARCHITECTURE.md — phase-by-phase architecture
- docs/QUICKSTART.md — getting started
- docs/STATS_DASHBOARD.md — live metrics dashboard (
replay --stats-dashboard) - examples/ — runnable demos (
cargo run --example root_cause_analysis_demo) - ROADMAP_HONEST.md — implemented vs planned, technical debt
- CHANGELOG.md — notable changes
Known issues and deferred work
Shipped:
- Phases 12-15 exposed through the CLI and Python (
forensics,session,nav2). - Six Phase 16-20 operations exposed through the JSON
ops()/run_op()bridge (not typed Python APIs). - MCAP export in the native CLI; Rerun export via
pyroboreplay-export. - Clippy is clean and gates CI (
-D warnings). - PyTerrainMap
pyterrainmap-gridmapv1 JSON reader.
Blocked / deferred:
- Typed Python APIs for the remaining Phase 16-20 library types.
- Full PyTerrainMap runtime integration (H3 store, ROS bridge).
Rejected / deferred:
- Live fleet dashboard.
Full shipped/blocked/rejected detail: QUEUE_STATUS.md.
Contributing
Contributions welcome — see CONTRIBUTING.md for setup, conventions, and PR guidelines. Bugs and ideas: GitHub Issues; questions: GitHub Discussions.
Part of the robotics & autonomy family
PyRoboReplay is one of six complementary, composable tools in the Mullassery robotics & autonomy family. Together they form a single stack: perceive → map → simulate → learn → debug → coordinate the fleet.
| Tool | Role | What it does |
|---|---|---|
| PyRoboVision | Perception | Multi-object tracker (Kalman filter + Hungarian algorithm) and trajectory predictor for robot perception. |
| PyTerrainMap | Mapping / SLAM | Fuses multi-robot terrain observations into a spatial-temporal store, with H3 spatial indexing and SLAM. |
| PyRoboSimulator | Simulation | World simulator for autonomous systems, with a FastAPI backend. |
| PyRoboFrames | Learning data | Rust-backed ML dataloader for robot-learning datasets (native LeRobot format, Apple Silicon hardware video decode). |
| PyRoboReplay | Mission forensics | This project — forensic-debugging and causal-analysis engine for autonomous robot mission replay. |
| SyncFleet | Fleet coordination | Rust + SQLite, peer-to-peer state sync for robotics fleets — mutual-TLS 1.3, version-vector replication, mDNS discovery; conflict resolution on the roadmap. |
Each works standalone, but they're complementary by design. Browse all projects →
License
Apache License 2.0 — see LICENSE.
Metadata
Release files for pyroboreplay 2.12.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | Provenance | |
|---|---|---|---|---|
| pyroboreplay-2.12.0.tar.gz | 743.5 kB | Without provenance | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pyroboreplay-2.12.0-cp312-cp312-macosx_11_0_arm64.whl | CPython 3.12 | CPython 3.12 | macOS 11.0+ ARM64 | Details |
Total release size: 5.5 MB
Release files / pyroboreplay-2.12.0.tar.gz
| Download URL | pyroboreplay-2.12.0.tar.gz |
|---|---|
| Size | 743.5 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
935364bb0974c4daa9a9e9ec8d83cabf900b569606194c38aa3ff32a12ba251b
|
|
BLAKE2b-256 checksum How to use checksums |
c86a4f602d77d90b30085c460fa805a94e28ed3c9345139692e929dd0a7e0ada
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Release files / pyroboreplay-2.12.0-cp312-cp312-macosx_11_0_arm64.whl
| Download URL | pyroboreplay-2.12.0-cp312-cp312-macosx_11_0_arm64.whl |
|---|---|
| Size | 4.8 MB |
| Tags | CPython 3.12 macOS 11.0+ ARM64 |
|
SHA-256 checksum How to use checksums |
602d8832332c71b145b1839a24093ce2a511ce7d21a09dedbe7e758abce771f2
|
|
BLAKE2b-256 checksum How to use checksums |
4e3e6ac5c0be50285078b47c2acd2ae7455ff3c74b3ac0344f3cfb32898c49dd
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.14.6
|
Security for pyroboreplay 2.12.0
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
No provenance found
None of the files in this release were uploaded with provenance metadata.
A note on package security
PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.