This example reads the two sample Nav2 recordings that ship with Flightops and makes an HTML results page. It needs the installed beta on an activated device. It does not need ROS 2, Docker, or a robot.
The sample recordings
The samples are two short Gazebo and Nav2 simulation runs. Each one is a rosbag2 directory with one MCAP file:
| Run | What happened |
|---|---|
working | The robot reached its navigation goal. 17.4 s, 6090 messages. |
lidar_topic | A deliberate fault: AMCL listens on /lidar/scan, which nothing publishes, so AMCL never publishes a pose. No navigation goal was sent. 25.9 s, 9554 messages. |
They are installed next to the offline documentation. flightops docs prints the path of the documentation's index.html; the samples are in ../samples/nav2 from that folder.
1. Compare the two recordings
samples="$(dirname "$(flightops docs)")/../samples/nav2"
splashdown stats "$samples/working/bag/bag_0.mcap"
splashdown stats "$samples/lidar_topic/bag/bag_0.mcap"Expected: both list the same nine topics. In the working run, /amcl_pose, /plan and /cmd_vel have messages (5, 5 and 104). In the lidar_topic run those three topics have count: 0: AMCL never published a pose, and with no goal there is no plan or velocity command. /scan, /odom and /tf have messages in both runs, so the lidar itself was publishing on /scan.
2. Save a bounded query as evidence
Query the velocity commands in a two-second window of the working run:
demo_dir=$(mktemp -d /tmp/flightops-recording-XXXXXX)
splashdown query bag_0.mcap --root "$samples/working/bag" \
--topic /cmd_vel \
--start-ns 1792304635000000000 --end-ns 1792304637000000000 \
--field linear.x --reduction mean --unit m/s --max-samples 20 \
> "$demo_dir/window.json"
flightops results "$demo_dir/window.json" -o "$demo_dir/results.html" --openExpected: window.json shows outcome: observed, complete: true, and measurements.message_count: 32. The two timestamps select a two-second window in the recording's log-time clock. flightops results prints the report path and asks your browser to open it; if no browser opens, open the printed file.
3. Read it again later
flightops-tui --plain "$demo_dir/window.json"This prints the same evidence as text: Observed 32 messages in the requested window. Both commands read the saved JSON; neither checks a live robot. Keep window.json if you need the exact evidence.
To replay the two runs side by side in a desktop window, run flightops workbench --sample; see the Scene Workbench guide. See bounded evidence windows for clock, completeness, and query limits.