MAVLINKGPS

GNSS Raw Measurements (RTK Feasibility)

The Dream: Phone as RTK Base

A common question in the ArduPilot community: "My phone has L1/L5 GPS. Can I use it as an RTK Base Station for my drone?"

The theoretical answer is Yes. The practical answer is No.

The Android API (GnssMeasurement)

Android 7.0 (Nougat) introduced the ability to read raw GNSS observables, bypassing the standard "processed" location.

Key Data Fields

To perform Real-Time Kinematic (RTK) processing, you need Carrier Phase data. Android exposes this via:

  • getAccumulatedDeltaRangeMeters(): This is the raw Carrier Phase measurement.
  • getAccumulatedDeltaRangeState(): Tells you if the phase lock is valid or if a "Cycle Slip" occurred.
  • getCarrierFrequencyHz(): Distinguishes L1 (1575.42 MHz) from L5 (1176.45 MHz).
// From android.location.GnssMeasurement
public double getAccumulatedDeltaRangeMeters() {
    return mAccumulatedDeltaRangeMeters;
}

The Hardware Bottleneck

While the software supports RTK, the hardware (Antenna) usually does not.

1. Linearly Polarized Antennas

Survey-grade RTK antennas are Circularly Polarized (RHCP) to reject multipath reflections (which reverse polarization upon bounce). Phone antennas are Linearly Polarized (to fit in the slim case).

  • Result: Phones accept reflected signals as valid data. This causes "Cycle Slips" where the receiver loses count of the carrier wave cycles.

2. Duty Cycling

To save battery, phone GNSS chips often turn off the RF front-end between updates (Duty Cycling).

  • Result: The continuous phase lock required for RTK is broken 5 times per second.
  • Note: Android 9 introduced forceFullGnssMeasurements(true) to disable this, but it drains battery fast.

Conclusion

You can use raw measurements for Post-Processed Kinematic (PPK) or smoothed DGPS to get sub-meter accuracy. But achieving a reliable RTK Fixed (1-2cm accuracy) solution with a phone's internal antenna is physically impossible in most environments due to multipath susceptibility.

Source Code Reference