Introduction: The Transition from NMEA to Raw Observables
Historically, mobile applications received location data solely through estimated Cartesian fixes (latitude, longitude, altitude) derived by the operating system’s internal navigation engine. While sufficient for turn-by-turn routing, these pre-computed fixes discard critical raw physical data: satellite pseudoranges, carrier phase observations, Doppler shifts, hardware clock discontinuities, and multi-path reflection metrics.
Beginning with Android 7.0 (API 24) and significantly enhanced in Android 10+, the platform introduced the GnssMeasurement and GnssClock APIs. This opened the door for smartphones to function as true geodetic receivers capable of capturing the fundamental physical observables required for post-processing kinematic (PPK) and carrier-phase integer ambiguity resolution.
The Fundamental Observation Equation
The geometric distance between a satellite \(s\) and the receiver antenna \(r\) is encoded in the pseudorange measurement \(P_r^s\):
P_r^s = ρ_r^s + c · (δt_r - δt^s) + I_r^s + T_r^s + ε_P
Where:
- \(\rho_r^s\) is the true geometric distance.
- \(c\) is the speed of light in a vacuum.
- \(\delta t_r\) and \(\delta t^s\) represent receiver and satellite clock biases.
- \(I_r^s\) is ionospheric delay (dispersive, inversely proportional to frequency squared \(1/f^2\)).
- \(T_r^s\) is tropospheric delay (non-dispersive refraction).
- \(\varepsilon_P\) encompasses multipath reflection and receiver noise.
Dual-Frequency Reception: L1/E1 and L5/E5a
Single-frequency receivers (L1 only at 1575.42 MHz) cannot directly calculate ionospheric delay and must rely on broad broadcast models (Klobuchar model) that remove only 50–70% of ionospheric error.
Dual-frequency chipsets (e.g. Qualcomm Snapdragon 8 Gen 2/3, Google Tensor G3) receive both L1 and L5 (1176.45 MHz) or Galileo E1 and E5a. By taking the linear ionosphere-free combination of both frequencies:
P_IF = (f_1^2 · P_1 - f_5^2 · P_5) / (f_1^2 - f_5^2)
FluxMap leverages dual-frequency telemetry to eliminate first-order ionospheric refraction, reducing atmospheric ranging error from several meters down to decimeter levels.
Accumulated Delta Range (ADR) and Carrier Phase
While pseudorange measurements provide meter-level precision, the carrier phase measurement provides millimeter-level precision. In Android, carrier phase is exposed via Accumulated Delta Range (ADR):
| ADR State Flag | Bit Mask | Physical Interpretation |
|---|---|---|
ADR_STATE_VALID |
0x01 | Carrier phase tracking loop is locked and accumulating range. |
ADR_STATE_RESET |
0x02 | Cycle slip detected or tracking loop reset; integer ambiguity reset. |
ADR_STATE_CYCLE_SLIP |
0x04 | Loss of carrier lock between consecutive epochs. |
ADR_STATE_HALF_CYCLE_RESOLVED |
0x08 | Half-cycle ambiguity has been resolved by receiver firmware. |
How FluxMap Archives Raw Observables: The .fluxraw Package
Capturing 50+ satellite measurements every second generates substantial data volume. FluxMap’s RawGnssRecordingEngine handles this through crash-safe append-only NDJSON chunking:
- Raw epochs are committed to private storage in 5-minute chunk files (
00000.ndjson,00001.ndjson). - Upon session completion, SHA-256 cryptographic digests are verified for every chunk.
- The session is packaged into a standardized
session.fluxrawcontainer withmetadata.jsonand published atomically via Storage Access Framework.
By preserving uncompromised raw GNSS observables in standardized container formats today, FluxMap users can re-process their historical journeys with future RTK, PPP, and Galileo HAS solvers to achieve centimeter accuracy.