Extend visibility-aware search and fix dual-band acquisition scheduling

Visibility-aware acquisition search (GNSS-SDR.enable_visibility_aware_search):
- Classify GLONASS and QZSS satellites too. GLONASS positions come from the
  GNAV almanac (new Glonass_Gnav_Almanac::satellite_position with the
  standard perturbation model), so the search order benefits before any
  GLONASS ephemeris is decoded.
- PVT publishes a lock-free navigation snapshot (ephemeris, almanac, UTC
  models per system) that the classifier reads instead of locking the PVT
  maps on every recompute.
- Recompute on new navigation data, on position changes larger than
  visibility_recompute_position_threshold_m, every
  visibility_recompute_interval_s, and when the almanac ages out; fix the
  periodic and position-triggered recomputes that never fired, and the
  off-by-one that excluded satellites in [mask, mask+1) degrees.
- Enter the start-up standby only when the feature is enabled, so the
  default search order is untouched.

Secondary-frequency acquisition assistance:
- Do not start an acquisition on the PRN 0 placeholder left on assisted
  channels at connect time; it threw inside the control thread and left the
  flowgraph running headless with the secondary band never acquired.
- Match GLONASS assistance by FDMA frequency channel: the search pool keeps
  one slot per channel while tracked L1 channels report the decoded slot, so
  L2 was never picked.
- Assist from locked channels before their telemetry is decoded: the
  observables status now reports tracking-only channels and the flowgraph
  keeps a separate tracking map for the assisted search.
This commit is contained in:
Carles Fernandez
2026-09-12 14:15:00 +02:00
parent a191c50008
commit bcb5b7228b
32 changed files with 1859 additions and 992 deletions
+27
View File
@@ -132,6 +132,25 @@ All notable changes to GNSS-SDR will be documented in this file.
the generic rule
`doppler(col) = -doppler_max + doppler_center + doppler_step * col` decodes
both full and narrowed grids. Contributed by @joebre.
- Added an optional visibility-aware acquisition search, enabled with
`GNSS-SDR.enable_visibility_aware_search=true` (default `false`, which leaves
the existing search order untouched). Once a receiver position is available,
either from a fix or from `GNSS-SDR.AGNSS_ref_location`, satellites are
continuously classified as visible, excluded (elevation at or below
`GNSS-SDR.search_elevation_mask`, default 0 degrees, or flagged unhealthy), or
not yet known, using the freshest ephemeris or almanac decoded for GPS,
Galileo, BeiDou, GLONASS, and QZSS. Idle channels then favor visible
satellites over unknown ones, at the ratio given by
`GNSS-SDR.visible_vs_mayvisible_search_ratio` (default 3), and skip known
excluded ones, so less CPU is spent acquiring satellites that are below the
horizon. The classification is refreshed whenever new navigation data arrives,
when the receiver moves more than
`GNSS-SDR.visibility_recompute_position_threshold_m` (default 1000 m), every
`GNSS-SDR.visibility_recompute_interval_s` (default 120 s), and when almanac
data becomes older than `GNSS-SDR.visibility_almanac_max_age_s` (default 3
days). A satellite that is already being tracked is never released because of
this classification, and `PVT.elevation_mask` still decides which observations
enter the navigation solution. Contributed by @joebre.
### Improvements in Interoperability:
@@ -333,6 +352,14 @@ All notable changes to GNSS-SDR will be documented in this file.
metadata in satellite status, and the NMEA printer emits the strongest
available C/N0 with the corresponding NMEA signal identifier. Contributed by
@vladisslav2011.
- The custom output stream defined by `monitor_pvt.proto` now includes a
`tracked_satellites` list. Each entry reports one tracked signal (`system`,
`prn`, `signal`), its `azimuth_deg` and `elevation_deg`, whether it was
`combined` with another signal of the same satellite (e.g., the Galileo E1+E5a
ionosphere-free combination), and a `used` flag telling whether it contributed
to the reported fix. Satellites that were tracked but left out of the solution
(below `PVT.elevation_mask`, or excluded by RAIM) are listed with
`used = false`. Contributed by @joebre.
### Improvements in Maintainability: