Skip to content

feat(gsdc2023): GLONASS DGNSS base correction + FGO GLO constellation (parked: FDMA IFB wall)#100

Draft
rsasaki0109 wants to merge 2 commits into
mainfrom
feat/fgo-glonass-base-correction
Draft

feat(gsdc2023): GLONASS DGNSS base correction + FGO GLO constellation (parked: FDMA IFB wall)#100
rsasaki0109 wants to merge 2 commits into
mainfrom
feat/fgo-glonass-base-correction

Conversation

@rsasaki0109

Copy link
Copy Markdown
Owner

Draft / parked. GLONASS pseudorange in FGO is a KILL (see A/B below). This PR is kept open to preserve the working infrastructure for a future per-channel IFB solution, not to merge as-is.

Goal

Revive GLONASS in the FGO objective — our dual-frequency selection drops GLO+BDS entirely, costing ~24–47% of factors (constellation gap). This branch extends the DGNSS base correction to GLONASS and adds GLO as a base-corrected FGO-only constellation (same shape as the BeiDou fgo_extra_constellations path: PR + carrier + Doppler on weights_fgo only).

What works

  • Base correction reaches GLO pseudorange — toggling GLO PR on/off moves it by -7…-13 m = the DCB itself, i.e. the satellite-side bias removal succeeds.
  • GLO enters the FGO graph cleanly (mtv-h: PR 3540 / Doppler 3737 / carrier 3457 factors, zero WLS leakage).
  • 139 tests green.

Why it's a KILL

4-trip A/B (GLO on vs off, base correction on, same branch):

trip Δ
mtv-h +6.9 cm
sjc-q +7.0 cm
lax-o +123.2 cm
lax-t +1.2 cm
mean +34.6 cm regression

Root cause = GLONASS FDMA receiver inter-frequency bias (IFB). Each GLO satellite transmits on a different frequency, so the receiver IFB differs per channel — and differs between the base station (geodetic) and the phone (consumer). DGNSS cancels the satellite bias but not the per-channel receiver IFB. A single GLO clock state (kind 1) absorbs only the mean, leaving a multi-metre residual per-channel IFB that blows up dense-GLO trips (lax-o +123 cm).

The proper fix is per-satellite GLO bias states in the solver — heavy native CUDA work, out of scope here.

Relationship to #99

A GLONASS-independent lever surfaced during this work — base-correcting FGO-only rows (rows whose WLS weight was masked while the FGO weight was kept) — is shipped separately and cleanly in #99 (net -12.1 cm on a 26-trip A/B). This branch retains its own copy of that flag commit; the mergeable version lives in #99.

Disposition

Parked as draft. The GLONASS infrastructure (RK4 ephemeris dispatch, slot_sat_id R-mapping, fgo_glonass_constellation plumbing, base-correction GLO support) is preserved as the prerequisite for the per-channel IFB solution.

…stellation

Extends the DGNSS base correction to GLONASS (slot_sat_id R-mapping, nav read
+R, supported_pairs +R) and adds GLONASS as an opt-in base-corrected FGO-only
constellation (--fgo-glonass-constellation / fgo_glonass_constellation): GLO
PR+carrier+Doppler enter weights_fgo only, never the WLS gate, and the base
correction is applied to FGO-only rows (gate widened to weights_fgo>0) so the
GLO code bias is cancelled. GLONASS gets its own receiver clock kind (1).

Verified: base correction reaches GLO pseudorange (-7..-13 m DCB removed per
satellite) and GLO enters the FGO graph (mtv-h: 3540 PR / 3737 Doppler / 3457
carrier factors), with zero leakage into WLS.

A/B verdict (4 trips, GLO on vs off, base correction on): NET NEGATIVE
(+34.6 cm mean; lax-o +123 cm). The DGNSS base correction removes the
satellite-side GLO bias but NOT the GLONASS FDMA receiver inter-frequency bias,
which differs per channel between the geodetic base and the consumer phone and
is not absorbable by a single GLO clock. GLO PR is therefore parked; the
base-correction GLONASS support is kept as it is correct and is the prerequisite
for any future per-satellite GLO bias-state solution.

Tests: signal-model selection, config validation, base-correction R-mapping,
and a fill-level test asserting GLONASS is FGO-only with its own clock kind.
Splits the "base-correct FGO-only rows" behaviour out of the GLONASS work
into its own opt-in flag (base_correction_fgo_only_rows, default False =
legacy WLS-active-only). When set, the DGNSS base correction is also applied
to rows that are FGO-only — FGO-only constellations and, notably, rows whose
WLS weight was masked out while the FGO weight was retained — so the FGO
objective sees corrected pseudoranges on those rows too.

This isolates a GLONASS-independent lever surfaced during the GLO work
(lax-o -23cm on a 2-trip probe) for clean A/B evaluation. GLONASS PR now
requires this flag in addition to fgo_glonass_constellation.
@rsasaki0109 rsasaki0109 force-pushed the feat/fgo-glonass-base-correction branch 2 times, most recently from 92e4207 to ee1f74a Compare June 17, 2026 15:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant