Profile GPS signal quality from a PX4 ULog — satellites, fix type, receiver accuracy, EKF innovations, stationary drift, and raw-position jitter. Supports a two-log compare mode for before/after flights (e.g. driver A/B, firmware bisects, receiver swaps). Use when the user wants to validate GPS behavior across a change.
Run the GPS signal quality analyzer on one or two ULog files and interpret the results. Two logs triggers compare mode — every time-series plot gets overlaid curves and every summary value gets a Δ column.
logs/ in this repo (by filename match).~/Downloads/.logs/<log-name>/, copy the .ulg there.logs/<log-name>/ directory (or a shared dir when comparing).--label-a / --label-b — they show up in every plot legend and the verdict sentence.# Single log
python3 scripts/gps_signal_quality.py <log-a.ulg> --output-dir <logs/log-name/>
# Compare two logs
python3 scripts/gps_signal_quality.py <log-a.ulg> <log-b.ulg> \
--output-dir <logs/compare-name/> \
--label-a "before-fix" --label-b "after-fix"
xdg-open <output-dir>/gps_signal_quality.pdf (or gps_signal_quality_compare.pdf in compare mode).gps_signal_quality.txt as well — it has the same stats in plain text and is easy to quote into a PR comment.ttff_s in the summary.The script auto-generates a one-sentence verdict on page 10 / in the text file. When relaying it to the user, add context:
noise_per_ms differs > 20% between logs, say so: you can't cleanly attribute deltas to the driver change.jamming_indicator p95 > 100, flag possible RF interference.Some topics may not be in the log:
estimator_aid_src_gnss_* (pos/vel/hgt) — absent on older logs. Page 6 will show a "topic missing" banner.estimator_gps_status — absent on older logs. Page 7 (the money plot) will be empty.satellite_info — per-satellite CN0 / band breakdown. Not consumed by this script but worth mentioning to the user: if they're trying to prove L5-band reception directly, enabling this topic (SDLOG_PROFILE includes it, or custom profile) gives the strongest evidence. ARK_FPV excludes it by default.If the board has two GPS receivers, both sensor_gps multi_ids will be populated. The script currently auto-picks the one with more samples and logs which it chose (as a NOTE: line). If the user cares about the other receiver, say so and we can add an --gps-instance flag.
When a log has multiple sensor_gps subscriptions (common on boards that subscribe multi_id 0 and 1 regardless of which receivers are wired up), PlotJuggler shows the topic as sensor_gps.00 / sensor_gps.01. The script handles this transparently — you don't need to rename anything.
logs/<log-name>/README.md per the catalogue convention in CLAUDE.md; tag the README with skills_used: - gps-signal-quality and a dated analysis-history entry.