Orbis.GNSS.PPPCorrections (Orbis v0.29.0)

Copy Markdown View Source

Precomputed, state-independent PPP per-range corrections for the static-arc float/fixed solve: solid-earth tide, carrier-phase wind-up, and satellite antenna PCO/PCV.

All three depend only on epoch geometry (Sun/Moon direction, satellite position, and a fixed reference receiver position), not on the estimated receiver coordinates, so they are computed ONCE before the Gauss-Newton loop at the seed/approx position and looked up by the row builders and the shared range_corrections_m chokepoint. The sub-100 m seed-vs-truth offset moves each correction by far less than its own measurement noise (tide gradient ~1e-7 m/m; wind-up and PCO geometry vary at the milli-arcsec level over 100 m), so the state-independent precomputation is exact at solve precision.

Crate-backed pieces (Sun/Moon ECEF and the IERS DEHANTTIDEINEL kernel) come through Orbis.NIF. The wind-up and satellite-PCO vector algebra is here in Elixir against the crate Sun direction and the SP3 satellite geometry, where it is short dot/cross algebra and directly checkable against RTKLIB ppp.c / preceph.c.

Summary

Functions

Build the precomputed correction tables for the arc.

Empty correction tables (no precomputed corrections).

Types

t()

@type t() :: %{
  tide: %{optional(NaiveDateTime.t()) => vec3()},
  windup_m: %{optional({String.t(), NaiveDateTime.t()}) => float()},
  sat_pco_ecef: %{optional({String.t(), NaiveDateTime.t()}) => vec3()},
  sat_pcv_m: %{optional({String.t(), NaiveDateTime.t()}) => float()}
}

vec3()

@type vec3() :: {float(), float(), float()}

Functions

build(sp3, epochs, ref_pos, config)

@spec build(Orbis.GNSS.SP3.t(), [map()], vec3(), keyword() | map()) :: t()

Build the precomputed correction tables for the arc.

config keys (all optional; absent = that correction is off):

  • :solid_earth_tide - true to compute the per-epoch tide displacement.
  • :phase_windup - true to compute per-(sat,epoch) wind-up metres.
  • :satellite_antenna - %{antex: %Antex{}, freq1: "G01", freq2: "G02"} to compute per-(sat,epoch) satellite PCO (ECEF vector) and nadir PCV (metres).

ref_pos is the reference receiver ECEF {x,y,z} (the solve seed/approx).

empty()

@spec empty() :: t()

Empty correction tables (no precomputed corrections).