Orbis.GNSS.Positioning.Solution (Orbis v0.32.0)

Copy Markdown View Source

A single-point-positioning solution at one receive epoch.

position is the converged ITRF/IGS ECEF position in meters. geodetic is the same point as %{lat_rad, lon_rad, height_m} when geodetic output was requested (the default), otherwise nil. rx_clock_s is the reference-system receiver clock bias in seconds; system_clocks_s is a map of GNSS letter (e.g. "G", "E") to that system's absolute receiver clock in seconds (a single entry for a one-system solve, one per constellation for a mixed solve). These are per-system clocks, not biases: the inter-system bias of a system is its clock minus the reference system's (rx_clock_s). dop carries the dilution-of-precision scalars for any full-rank geometry — a single-system solve uses the bit-exact four-state cofactor, a multi-system solve a general inverse with one clock column per constellation — and is nil only when the geometry is rank-deficient. residuals_m are the post-fit pseudorange residuals in meters, in used_sats order. used_sats are the contributing satellite id strings (e.g. "G01"); rejected_sats pairs each excluded satellite id with its reason atom (:no_ephemeris or :low_elevation). metadata reports solver iterations, convergence, the corrections applied, and the geometry redundancy: used_count, the distinct systems, the redundancy (degrees of freedom, used_count - (3 + systems)), and raim_checkable? (redundancy >= 1). An exactly determined fix has redundancy < 1, forcing the residuals near zero and leaving the fix unverifiable by RAIM. When the opt-in :huber reweighting runs, metadata also carries :huber with the outer_iterations count and the final_scale_m (the last MAD robust scale in meters); the key is absent on the default static path.

Summary

Types

dop()

@type dop() :: %{
  gdop: float(),
  pdop: float(),
  hdop: float(),
  vdop: float(),
  tdop: float()
}

geodetic()

@type geodetic() :: %{lat_rad: float(), lon_rad: float(), height_m: float()}

metadata()

@type metadata() :: %{
  :iterations => non_neg_integer(),
  :converged => boolean(),
  :status => atom(),
  :ionosphere_applied => boolean(),
  :troposphere_applied => boolean(),
  :used_count => non_neg_integer(),
  :systems => [String.t()],
  :redundancy => integer(),
  :raim_checkable? => boolean(),
  optional(:fde) => %{
    excluded: [{String.t(), :raim_excluded}],
    iterations: non_neg_integer()
  },
  optional(:huber) => %{
    outer_iterations: non_neg_integer(),
    final_scale_m: float()
  }
}

position()

@type position() :: %{x_m: float(), y_m: float(), z_m: float()}

t()

@type t() :: %Orbis.GNSS.Positioning.Solution{
  dop: dop() | nil,
  geodetic: geodetic() | nil,
  metadata: metadata(),
  position: position(),
  rejected_sats: [{String.t(), :no_ephemeris | :low_elevation}],
  residuals_m: [float()],
  rx_clock_s: float(),
  system_clocks_s: %{required(String.t()) => float()},
  used_sats: [String.t()]
}