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
@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.
A nested least-squares failure.
@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.
@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
@spec solve( Sidereon.GNSS.SP3.t() | Sidereon.GNSS.Broadcast.t(), [epoch_request()], keyword() ) :: {:ok, Sidereon.GNSS.StaticPositioning.Solution.t()} | {:error, static_solve_error()}
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, defaulttrue.:ionosphere,:troposphere,:klobuchar_alpha,:klobuchar_beta,:pressure_hpa,:temperature_k,:relative_humidity,:glonass_channels,:pseudorange_code,:qzss_clock(:gpsor:separate) and:troposphere_model(:rtklibor:saastamoinen_niell) matchSidereon.GNSS.Positioning.solve/4.:huberplus:huber_k,:huber_sigma, and:huber_max_iterenables 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.