feat(gsdc2023): GLONASS DGNSS base correction + FGO GLO constellation (parked: FDMA IFB wall)#100
Draft
rsasaki0109 wants to merge 2 commits into
Draft
feat(gsdc2023): GLONASS DGNSS base correction + FGO GLO constellation (parked: FDMA IFB wall)#100rsasaki0109 wants to merge 2 commits into
rsasaki0109 wants to merge 2 commits into
Conversation
…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.
92e4207 to
ee1f74a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
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_constellationspath: PR + carrier + Doppler onweights_fgoonly).What works
Why it's a KILL
4-trip A/B (GLO on vs off, base correction on, same branch):
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_idR-mapping,fgo_glonass_constellationplumbing, base-correction GLO support) is preserved as the prerequisite for the per-channel IFB solution.