Orbis.GNSS.Velocity (Orbis v0.31.0)

Copy Markdown View Source

Recover receiver velocity and clock drift from one epoch of range-rate or Doppler observations against a precise SP3 or broadcast ephemeris source.

The numerical model and least-squares solve live in the Rust GNSS core. This module preserves the Elixir API shape: input normalization, per-satellite option resolution, and public result/error maps.

Summary

Functions

Convert a Doppler shift in Hz to a pseudorange rate in m/s.

Convert a pseudorange rate in m/s to a Doppler shift in Hz.

Solve for receiver velocity and clock drift at one receive epoch.

Types

observation()

@type observation() :: {String.t(), number()}

receiver()

@type receiver() :: vec3() | %{x_m: number(), y_m: number(), z_m: number()}

result()

@type result() :: %{
  velocity_m_s: vec3(),
  speed_m_s: float(),
  clock_drift_s_s: float(),
  residuals_m_s: %{required(String.t()) => float()},
  used_sats: [String.t()],
  n_satellites: non_neg_integer()
}

vec3()

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

Functions

doppler_to_range_rate(doppler_hz, carrier_hz \\ Constants.gps_l1_hz())

@spec doppler_to_range_rate(number(), number()) :: float()

Convert a Doppler shift in Hz to a pseudorange rate in m/s.

range_rate_to_doppler(rho_dot_m_s, carrier_hz \\ Constants.gps_l1_hz())

@spec range_rate_to_doppler(number(), number()) :: float()

Convert a pseudorange rate in m/s to a Doppler shift in Hz.

solve(source, observations, epoch, receiver_position, opts \\ [])

@spec solve(
  Orbis.GNSS.SP3.t() | Orbis.GNSS.Broadcast.t(),
  [observation()],
  NaiveDateTime.t(),
  receiver(),
  keyword()
) :: {:ok, result()} | {:error, term()}

Solve for receiver velocity and clock drift at one receive epoch.

observations are {satellite_id, value} pairs. Values are pseudorange rates in m/s by default, or Doppler shifts in Hz with observable: :doppler.