Changelog¶
All notable changes to bagx are documented here. The format follows Keep a Changelog, and versions follow the policy in Versioning and compatibility.
Unreleased¶
Added¶
bagx tf: TF tree validation (multiple parents, cycles, disconnected trees, transforms on both/tfand/tf_static, pauses and early stops, zero or regressing stamps, clock mismatches between topics, sensorframe_ids missing from the tree,--require-frames,--fail-on). The same checks run insidebagx eval(tf.*findings,TF:recommendations,report.tf) and as the MCP toolcheck_tf. They do not change scores.- Message content checks in
bagx eval(msg.*findings,Data:recommendations): scans with no or few valid ranges, invalid scan config, beam count changes, uncalibrated or zero-sizecamera_info,camera_infovs image size mismatch, truncated images, resolution or encoding changes,joint_statesshared by publishers with different joint sets, name/position length mismatch, NaN joints, and emptyframe_id. These do not change scores. - CDR fallback parsers (no ROS needed) for
sensor_msgsLaserScan, CameraInfo, Image, CompressedImage and JointState. - Header-stamp matched pipeline latency: when a stage's output carries its input's stamp,
latency is measured exactly per message and reported with
(header-stamp matched). - Scoreboard manifest integrity:
provenance,availability, bag fingerprints andscripts/generate_scoreboard.py --check. - CI runs the test suite on ROS 2 Humble and Jazzy, including rosbag2_py vs SQLite backend parity tests.
Changed¶
- Report
schema_version1.3.0 → 1.4.0. This is additive: eval JSON gainstfand new finding categoriestf_treeandmessage_content. eval.pyis split intoeval_topics,eval_workflow,eval_latencyandeval_domains. This is a code move with no behavior change, and the oldbagx.evalimports still work.- Scoreboard: TurtleBot3 Walker and Franka Panda rows are marked
source_unavailable; r2b rows point at NVIDIA NGC. Livox MID-360 is pinned to the AIST Zenodo bag (the same bag the 0.4.0 score came from) and NTU VIRAL toeee_03on DR-NTU. Newer College (download needs a request form) is unscored until a sequence is pinned. Ouster OS0-32 issource_unavailable, because its recording was never tied to a public file. Every available public bag is rescored after the sync fix below, and rows scored on unreleased code recordbagx_versionasX.Y.Z+dev.
Fixed¶
- Sync score (
bagx eval, all SLAM / Autoware / perception bags with two or more sensor streams): each pair walked whichever topic sorted first by name and took the nearest message on the other. For a dense/sparse pair such as 200 Hz IMU ↔ 10 Hz LiDAR this measured a quarter of the LiDAR period (~25 ms) however well the streams were aligned, and raised a false "enable per-point deskew" warning. The pair now walks the sparser topic, so sync scores rise on bags with mixed rates (Livox MID-360 70 → 100, Autoware bag4 67.7 → 87.4) and the tuned FAST-LIO comment about deskew disappears where it was spurious.bagx scenariosync_degradeduses the same rule. sensor_msgsTemperature, MagneticField, FluidPressure, RelativeHumidity, Illuminance and BatteryState topics no longer count as sync candidates because their name containsimuorcamera(e.g./imu/temperaturewas paired with a camera on NTU VIRAL).- NavSatFix CDR parser misread
status/serviceunlesslen(frame_id) + 1was a multiple of 4 (e.g.gnss_link), which skewed the GNSS fix rate on the SQLite fallback. - On ROS 2 Jazzy every rclpy-decoded message failed to convert (
_check_fieldsslot), so the ROS backend silently fell back to the CDR parser and custom message types lost their content. pip install bagx[mcp]pulled mcp 2.x, which brokebagx mcp; mcp is now<2.- pyarrow 26 needs NumPy 2 at import time, so
bagx exportfailed on ROS 2 systems with NumPy 1.x; pyarrow is now<26. - Ruff rule selection is pinned, so CI no longer breaks when ruff changes its defaults.
0.6.0 - 2026-06-10¶
Added¶
- ROS 1
.bagsupport viapip install bagx[ros1](verified on TUM VI and EuRoC). bagx mcp: stdio MCP server (eval_bag,list_topics,detect_anomalies,compare_bags,query_messages).- Public scoreboard: 26 datasets scored, with reproduction commands.
bagx-actioncomposite GitHub Action and CI dogfooding.
0.5.0 - 2026-06-10¶
Added¶
bagx eval --tunegenerates FAST-LIO / LIO-SAM / GLIM / KISS-ICP configs from a bag.bagx eval --htmlself-contained visual reports;bagx reportconverts saved JSON.
0.4.0 - 2026-06-10¶
Added¶
Finding.time_rangefor temporal findings across eval / anomaly / diff / benchmark.- Per-check custom rule findings with optional severity.
- Domain plugin SDK for stack detection (
bagx.domainsentry points). bagx eval --badgeshields.io readiness badges.
0.3.0 - 2026-05-21¶
Added¶
bagx diff: compare two eval reports by stable finding id (text/markdown/json,--exit-on).bagx eval --findings-onlyand--severity-min.- Benchmark
forbidden_findings, per-categorymax_severity, andbagx benchmark --exit-on. bagx/schema/findings.schema.jsonships with the wheel.- GitHub Actions PR-check example workflow.
Changed¶
- Eval and benchmark JSON
schema_version1.1.0 → 1.2.0. Benchmark reports addworst_severity.
0.2.0 - 2026-05-21¶
Added¶
- Structured
findingsineval --jsonwith stable<domain>.<area>.<qualifier>ids. - Benchmark
expected_findings. - Custom rules from JSON files,
BAGX_RULE_PLUGIN_PATHorbagx.rulesentry points;bagx rules list. - Action / service workflow outcome observability and a generic control-loop latency check.
- Built-in
perceptionandrobotarmdomains. - Versioned report contract (
schema_version,report_type,bagx_version).
0.1.3 - 2026-03-24¶
Added¶
- Pipeline latency between Nav2 / Autoware / MoveIt stages.
- Actionable recommendations at the end of
bagx eval.
Fixed¶
- IMU frequency with bursty timestamps (28306 Hz → 388 Hz).
- Anomaly output summarised instead of listing thousands of events.
- No false
sync_degradedfrom/rosout; clean errors on corrupt or empty bags.
0.1.2 - 2026-03-23¶
Fixed¶
- Meta topics (
/rosout,/parameter_events,/tf_static, …) are excluded from scenario sync and dropout detection.
0.1.1 - 2026-03-18¶
Changed¶
- IMU noise via first-order differencing (= Allan deviation at τ = dt); multi-IMU evaluation; full Allan variance on static data.
Fixed¶
- Anomaly false positives on real data (31,972 → 640 on Newer College).
0.1.0 - 2026-03-18¶
Initial release: eval, compare, sync, export, anomaly, scenario, ask, scene,
batch, info. Works without ROS 2 via the SQLite + CDR fallback; supports .mcap,
multi-segment bags and both CDR endiannesses.