Universal GNSS is a modular GNSS/RTK runtime stack designed for ROS 2, embedded systems, and RTK base stations.
The goal is to provide a vendor-agnostic GNSS layer capable of parsing, normalizing, configuring, and exposing GNSS data from multiple receiver families through a common runtime model.
v0.6.0 is released.
Current phase: post-v0.6.x stabilization.
25 / 65 release-scoped tasks complete (38.46%), 40 not started.
Calculation: equal-weight checked tasks in the v0.7 Docker/deployment, lifecycle, device, configuration, health, networking, validation, and documentation sections of TODO.md. The later non-ROS API surface and v0.8 BlueOS scope are excluded; PARTIAL/BLOCKED receive no fractional credit. New mandatory v0.7 work may increase this denominator.
Current identified project work: 50 / 194 complete (25.77%), 144 not started.
Calculation: every current TODO checklist item has equal weight; only checked items count as complete. The UG-PLAN register is reported separately as 1 COMPLETE, 3 PARTIAL, 0 BLOCKED, and 2 NOT_STARTED. PARTIAL/BLOCKED phases receive no fractional credit. This indicator includes implementation planning; it does not alter the 205-item UGA metric below.
Baseline: 205 audited items. Unchecked worklist entries: 172. Checked or intentionally removed: 33.
The 33 accounted entries are 21 checked findings, 4 implemented findings intentionally removed from the worklist, and 8 intentionally removed duplicates; they are not a claim of 33 implemented findings.
Generated from docs/status/uga_backlog.json. Update with python3 scripts/update_backlog_status.py; verify CI/local state with python3 scripts/update_backlog_status.py --check.
Deployment progress is tracked separately from the UGA baseline above. UG-PLAN-005
Phase A has proven Kilted/Lyrical amd64 runtime, arm64 BuildKit/QEMU packaging,
same-host DDS, and live u-blox/Unicore GNSS, NTRIP, RTCM, and UM982 USB-loss
recovery behavior. Native arm64 hardware/runtime, external-LAN/robot DDS,
serial renumbering, MowgliNext, BlueOS, API, and WebUI remain pending.
Current project state includes:
- Auto Discovery v2 plus
ReceiverNodeauto-discovery wiring - Auto Configuration dry-run planning and operator-driven apply for supported families
ReceiverNode,NtripNode, andReplayNode- parser counters plus malformed/rejected diagnostic visibility in ROS2
- live RTCM forwarding from
NtripNodeintoReceiverNode - portable RTCM MSM correction-stream summary observability through the shared semantic monitor/tools surface
- ROS2 RTCM semantic diagnostics for base-station ARP,
1230, and MSM summary - additive portable dual-antenna baseline runtime/ROS2 surface:
- capabilities:
dual_antenna_baseline,baseline_azimuth,baseline_pitch,baseline_length,baseline_solution_status - runtime /
GnssStatusfields:dual_antenna_baseline,baseline_azimuth_deg,baseline_pitch_deg,baseline_length_m,baseline_solution_status - compatibility fields:
heading_deganddual_antenna_headingremain duringv0.6.x
- capabilities:
- u-blox persistent FLASH configuration and output-port selection
- model-aware Unicore signal-group planning/profile selection with:
- safe unknown-model fallback that skips
CONFIG SIGNALGROUP - documented UM982 dual-antenna baseline gating
- documented UM980 / UB9A0 single-antenna signal-group validation
- explicit known non-baseline model selection for UM960 / UM981 without guessing undocumented signal-group mappings
- safe unknown-model fallback that skips
- model-aware Unicore rover dynamic mode selection with:
MODE ROVER UAVforUM980MODE ROVER SURVEY MOWfor mower-oriented rover modelsUM960,UM982, andUB9A0- safe
MODE ROVERfallback when the model is unknown or the portable layer has no documented support - explicit
uav,survey_mow, orroveroverrides, with existing firmware warnings retained when Survey Mow requires an unverified receiver build
- Unicore rover correction-age defaults of
RTK 120 sandDGPS 300 s, with optional validated plan/apply overrides and unchangedRTK RELIABILITY 3 1 - Unicore binary
N4regression coverage for valid unknown-frame accounting, malformed/rejected decode handling, and ASCII/Binary portable-field consistency on sharedPVTSLN*mappings - UM982 / Unicore runtime field validation through downstream MowgliNext use
- decimal-degree latitude/longitude outputs preserving at least 9 decimal places
Current release guidance:
- live receiver writes do not occur unless
gnss_config_applyis given explicit--confirmor--yes - Unicore persistent apply is available through the reset/recovery workflow and remains an operator-driven path with manual rollback expectations
- Unicore
gnss_profile_preview,gnss_config_plan, andgnss_config_applyaccept an optional--modelselector; when the model is unknown, the safe fallback skipsCONFIG SIGNALGROUPand leaves the receiver's current signal-group configuration unchanged - the Unicore rover helper defaults
UM980toMODE ROVER UAV, defaultsUM960,UM982, andUB9A0toMODE ROVER SURVEY MOW, and keeps unknown models onMODE ROVER; explicit mode overrides win over those defaults - Unicore runtime output commands now follow the documented current-port form
MESSAGE <rate>orMESSAGE ONCHANGED; the oldLOG ... ONTIMEform is no longer generated by the portable Unicore profiles - Unicore live apply now treats
CONFIG SIGNALGROUPas a dedicated runtime step: it queries the current value first, skips the command when the receiver already reports the requested group, and requeries it after the apply step before continuing the rest of the profile - Unicore
--rate-hzplanning currently retimesBESTNAVAonly; exact documented5 Hzand10 Hzrequests are preserved, while unsupported requests such as7 Hzare normalized to the nearest documented Unicore rate with a warning instead of emitting a period such as0.143 - Unicore
factory_resetlive execution now uses the same reconnect / active probe recovery workflow, but it remains destructive and expert-only rather than a normal GUI recovery path - stable
/dev/serial/by-id/*paths are recommended over transient/dev/ttyACM*and/dev/ttyUSB*names whenever they exist - UM982 runtime-only live apply should use an operator timeout around
--timeout-ms 5000 - MowgliNext is treated as downstream field validation; GUI/install issues do not belong in the Universal GNSS core backlog unless they expose a missing portable feature or a bug in this repository
The current portable receiver-configuration surface is:
runtime_only- do not change receiver configuration
- only open the receiver and parse its current output
rover_high_precision- configure a conservative high-precision rover/runtime output profile
rover_high_precision_debug- extend
rover_high_precisionwith extra satellite / RF / hardware / correction diagnostics where supported
- extend
factory_reset- model a receiver factory-reset workflow where the vendor support is known
- requires explicit reconnect/recovery handling before normal profile apply resumes
Legacy aliases are still accepted by the current CLIs:
rover->rover_high_precisiondiagnostics->rover_high_precision_debug
Current receiver-family support:
- Unicore
runtime_onlyrover_high_precisionrover_high_precision_debugfactory_resetplanning/preview/live recovery apply- model-aware signal-group planning:
UM960andUM981are known non-baseline models and stay conservative when signal-group mappings are undocumentedUM982may emit the documented dual-antenna rover selectionCONFIG SIGNALGROUP 3 6UM980andUB9A0expose documented explicit signal-group selections but do not auto-enable dual-antenna baseline groups- unknown/unconfirmed models skip
CONFIG SIGNALGROUPand warn instead of guessing
- u-blox
runtime_onlyrover_high_precisionrover_high_precision_debugfactory_resetcurrently reported as unsupported by the portable planner
- generic NMEA
runtime_onlyonly- read-side RTK status can be inferred from standard
GGA fix_quality
Safety note:
- receiver factory reset may change the active baud rate
- the current Unicore
FRESETpath returns the receiver to115200 bps - the current Unicore recovery workflow uses an active
VERSIONAquery plus explicitCONFIG COM1 <target-baud> 8 n 1recovery before continuing the profile - the current Unicore
factory_resetpath is destructive and should not be treated as a routine runtime recovery mechanism
Universal GNSS currently exposes this receiver-profile surface through:
- the module-level planner/profile API in
gnss_driver - the standalone
gnss_profile_preview,gnss_config_plan, andgnss_config_applyCLIs - downstream integration hooks for ROS2 nodes, launch files, and later project-specific onboarding or UI layers
- Provide a portable GNSS core independent from ROS 2.
- Normalize GNSS runtime state across vendors.
- Support NMEA, RTCM3, u-blox UBX, Unicore, Quectel, and other protocols progressively.
- Expose consistent ROS 2 topics, services, and diagnostics.
- Support RTK rover and RTK base workflows.
- Keep parser, driver, transport, NTRIP, and ROS 2 layers separated.
- Supporting every GNSS vendor message from day one.
- Replacing vendor tools for firmware updates.
- Mixing ROS 2 code into the portable parser core.
Current implemented layers:
gnss_core- portable C++ runtime model
- runtime aggregation of partial normalized updates
- fix / RTK enums
- capability and value flag system
- canonical dual-antenna baseline fields plus
v0.6.xheading compatibility - no ROS 2 dependency
gnss_protocols- portable framing and checksum helpers
- NMEA semantic parsing:
GGA,RMC,GSA,GSV,GST,VTG,ZDA - standard
GGA fix_quality-> normalizedrtk_modemapping for generic runtime-only receivers - UBX semantic parsing:
NAV-STATUS,NAV-PVT,NAV-DOP,NAV-SAT,MON-HW,MON-HW2,MON-RF,RXM-RTCM,ACK/NAK - Unicore ASCII semantic parsing:
PVTSLNA,BESTNAVA,RTKSTATUSA,RTCMSTATUSA,SATSINFOA,BESTSATA,JAMSTATUSA,FREQJAMSTATUSA,HWSTATUSA,AGCA - Unicore binary
N4semantic parsing:BESTNAVB,PVTSLNB - RTCM3 framing, CRC24Q, message-type extraction/classification, and
semantic decode for
1005/1006base position,1007/1008station antenna metadata,1230, and portable MSM header/summary observability
gnss_driver- receiver profile declarations
- protocol support and feature flags
- lightweight stream-family detection and auto-discovery
- discovery-aware planner/report layer for portable receiver configuration
gnss_transport- portable byte source / sink interfaces
- memory-backed test / replay transport
- Linux POSIX serial transport
- transport metrics and buffer helpers
gnss_ntrip- portable NTRIP config types
- request and auth header generation
- GGA injection policy types
- connection metrics models
- synchronous live client foundation and caster-monitor support
gnss_toolsrtcm_inspectCLI for RTCM-only frame inspectiongnss_inspectCLI for structural mixed-stream frame inspectiongnss_replayCLI for semantic offline runtime replaygnss_compareCLI for deterministic comparison of two offline GNSS logsgnss_profile_previewCLI for offline receiver command/profile reviewgnss_config_planCLI for dry-run receiver config application planninggnss_config_applyCLI for operator-driven receiver config applicationgnss_serial_monitorCLI for live Linux serial monitoringgnss_ntrip_monitorCLI for live NTRIP caster testing
gnss_ros2- ROS 2 package
universal_gnss_ros2 GnssStatusmessageGnssRuntimeState -> GnssStatusadapterGnssRuntimeState -> NavSatFixadapterGnssHealthSummary -> DiagnosticArrayadapter- additive
GnssStatusbaseline capability constants and baseline fields ReceiverNodepublishingfix,status, anddiagnosticsReceiverNodeserial auto-discovery support forserial_device:=auto,serial_baud:=auto, andreceiver_family:=auto- discovery, correction, and parser-counter diagnostic reporting
- live RTCM forwarding from ROS2 into the receiver transport when writable
- ROS2 diagnostic projection of portable RTCM semantic observations for
base-station ARP, GLONASS
1230, and MSM summary/per-message activity ReplayNodefor hardware-freestatus/fix/diagnosticsreplay with optionalrtcmpublication from sanitized logsNtripNodewrapper publishing diagnostics for ROS-side NTRIP state- serial / TCP / replay / combined launch examples
- ROS 2 package
Later modules:
gnss_rtk_base- survey-in, fixed-base workflows, RTCM routing
gnss_esp32- lightweight embedded integration
The intended flow is:
flowchart TB
P["GNSS Receivers"]
R["Universal GNSS"]
ROS["ROS2 Messages"]
APP["Applications"]
P --> R
R --> ROS
ROS --> APP
See docs/ros2.md for the ROS 2 adapter contracts, the receiver/NTRIP node surfaces, and the current status / covariance policy.
See docs/devcontainer.md for the reproducible ROS 2 devcontainer setup, Kilted build flow, future Lyrical switch path, and optional serial hardware access examples.
See docs/ros2_end_to_end_audit.md for the current receiver-to-ROS2-to-NTRIP audit status, combined launch coverage, and the latest real receiver and real caster hardware smoke-test notes.
See docs/validation/README.md for the current boundary between Universal GNSS core validation, ROS2 package validation, receiver-backend validation, and downstream integration validation.
See docs/robot_localization.md for the first
example of connecting Universal GNSS fix output to
robot_localization/navsat_transform_node and ekf_node.
See docs/protocols.md for the current parser coverage, runtime mapping coverage, and intentionally deferred protocol support.
See docs/terminology.md for the canonical
GNSS/geodesy-first vocabulary, the current terminology audit, and the
compatibility plan for ambiguous public names such as heading_deg.
See docs/vendors/ublox/runtime_mapping.md for the current u-blox-specific runtime mapping policy used by the UBX semantic layer.
See docs/vendors/unicore/runtime_mapping.md for the current Unicore ASCII runtime mapping policy and extraction boundary from earlier Mowgli-specific prototypes.
See docs/driver.md for the current driver-layer boundary, receiver profiles, and stream-detection foundation.
See docs/runtime_aggregation.md for the generic
merge rules that combine partial protocol/runtime updates into one coherent
GnssRuntimeState.
See docs/tools.md for the current offline inspection CLIs, profile preview, config-plan, config-apply usage examples, runtime replay usage examples, and the live serial / NTRIP monitors.
See docs/transport.md for the current portable byte-stream abstraction layer and memory transport behavior.
See docs/ntrip.md for the current NTRIP layer scope, request-format policy, and deferred networking work.
This project is licensed under LGPLv3.
If Universal GNSS helps your projects and you would like to support development:
☕ Buy me a coffee: https://buymeacoffee.com/x8ndjtgsrwg
Your support helps fund:
- GNSS hardware (u-blox, Unicore, Quectel, etc.)
- RTK testing
- CI infrastructure
- Documentation and tooling
u-blox®, Unicore®, Quectel®, and Septentrio® are trademarks of their respective owners.
Universal GNSS is an independent open-source project and is not affiliated with, endorsed by, or sponsored by any of these companies.



