Sidereon.GNSS.StaticPositioning (Sidereon v3.0.0)

Copy Markdown View Source

Multi-epoch static GNSS single-point positioning.

A static solve estimates one shared receiver ECEF position from several pseudorange epochs while fitting epoch-local receiver clocks. It is useful when a receiver is known to be stationary and the caller wants the stacked solution covariance, residuals, and leave-one-out influence diagnostics from the core solver.

Summary

Types

One static epoch request.

A nested least-squares failure.

A nested single-point positioning failure retained by static solving.

A core static-positioning refusal with its owned fields and nested cause.

Functions

Solve one static receiver position from multiple pseudorange epochs.

Types

epoch_request()

@type epoch_request() ::
  %{
    :observations => [Sidereon.GNSS.Positioning.observation()],
    :epoch => Sidereon.GNSS.Positioning.epoch(),
    optional(:weights) => [number()],
    optional(:clock_initial_m) => number()
  }
  | {[Sidereon.GNSS.Positioning.observation()],
     Sidereon.GNSS.Positioning.epoch()}
  | {[Sidereon.GNSS.Positioning.observation()],
     Sidereon.GNSS.Positioning.epoch(), keyword()}

One static epoch request.

least_squares_error()

@type least_squares_error() ::
  :singular_jacobian | {:invalid_input, String.t(), String.t()}

A nested least-squares failure.

nested_spp_error()

@type nested_spp_error() ::
  {:invalid_input, String.t(), String.t()}
  | {:too_few_satellites, non_neg_integer(), non_neg_integer()}
  | {:singular_geometry, least_squares_error()}
  | {:duplicate_observation, String.t()}
  | {:ephemeris_lost, String.t()}
  | {:selection_unsettled, non_neg_integer()}
  | {:ut1_outside_coverage, :before_coverage | :after_coverage}

A nested single-point positioning failure retained by static solving.

static_solve_error()

@type static_solve_error() ::
  :empty_epochs
  | {:invalid_input, String.t(), String.t()}
  | {:epoch_input, non_neg_integer(), nested_spp_error()}
  | {:duplicate_observation, non_neg_integer(), String.t()}
  | {:too_few_measurements, non_neg_integer(), non_neg_integer()}
  | {:ephemeris_lost, non_neg_integer(), String.t()}
  | {:singular_geometry, least_squares_error()}
  | {:selection_unsettled, non_neg_integer()}
  | {:ut1_outside_coverage, :before_coverage | :after_coverage}

A core static-positioning refusal with its owned fields and nested cause.

Functions

solve(source, epochs, opts \\ [])

Solve one static receiver position from multiple pseudorange epochs.

source is a parsed SP3 precise product or broadcast navigation product. Each epoch supplies pseudorange observations and a receive epoch. Epoch options may override the solve-wide atmosphere, weights, clock seed, and GLONASS channel options for that epoch.

Options:

  • :initial_position - shared {x_m, y_m, z_m} position seed, default {0.0, 0.0, 0.0}.
  • :with_geodetic - include geodetic output, default true.
  • :ionosphere, :troposphere, :klobuchar_alpha, :klobuchar_beta, :pressure_hpa, :temperature_k, :relative_humidity, :glonass_channels, :pseudorange_code, :qzss_clock (:gps or :separate) and :troposphere_model (:rtklib or :saastamoinen_niell) match Sidereon.GNSS.Positioning.solve/4.
  • :huber plus :huber_k, :huber_sigma, and :huber_max_iter enables the core static Huber reweighting.

Returns {:ok, %Solution{}} or {:error, reason} with typed static solve errors from the core, among them {:ut1_outside_coverage, :before_coverage | :after_coverage} when the ephemeris source refuses a satellite state that reads UT1 outside the UT1 table, and {:selection_unsettled, passes} when the satellite selection, re-made at every iterate as RTKLIB estpos makes it, did not settle within passes passes. metadata.ut1_degraded names the side of the table a state was read outside under a permissive UT1 policy, or is nil. A converged solve reports metadata.status :selection_settled.