Satellite toolkit for Elixir. SGP4 orbit propagation, coordinate transformations, and ground station pass prediction.
Summary
Functions
Compute Doppler shift for a satellite-ground link.
Check whether a satellite is in Earth's shadow (eclipse) at a given time.
Compute geodetic coordinates (lat/lon/alt) for a satellite at a given time.
Compute the look angle (azimuth/elevation/range) from a ground station to a satellite at a given time.
Compute the angle between satellite nadir and the Moon direction.
Parse a Two-Line Element set.
Predict visible passes of a satellite over a ground station.
Propagate orbital elements to a specific datetime, returning TEME position and velocity.
Compute the angle between satellite nadir and the Sun direction.
Convert a TEME state vector to GCRS (Geocentric Celestial Reference System).
Functions
Compute Doppler shift for a satellite-ground link.
Propagates the TLE, transforms to GCRS, and computes the range rate and Doppler shift at the given carrier frequency.
The station is a map: %{latitude: deg, longitude: deg, altitude_m: meters}.
Returns {:ok, %{range_rate_km_s: float, doppler_hz: float, doppler_ratio: float}}.
Example
station = %{latitude: 40.0, longitude: -74.0, altitude_m: 0.0}
{:ok, d} = Orbis.doppler(tle, datetime, station, 437.0e6)
d.doppler_hz # => ~10_000.0
Check whether a satellite is in Earth's shadow (eclipse) at a given time.
Propagates the TLE, transforms to GCRS, fetches the Sun position from the ephemeris, and returns the eclipse status.
Returns {:ok, :sunlit | :penumbra | :umbra} or {:error, reason}.
Example
eph = Orbis.Ephemeris.load("de421.bsp")
{:ok, status} = Orbis.eclipse(tle, datetime, eph)
Compute geodetic coordinates (lat/lon/alt) for a satellite at a given time.
Propagates the TLE, transforms TEME -> GCRS -> ITRS, and converts to WGS84.
Returns {:ok, %{latitude: deg, longitude: deg, altitude_km: km}}.
Example
{:ok, tle} = Orbis.parse_tle(line1, line2)
{:ok, geo} = Orbis.geodetic(tle, datetime)
geo.latitude # => 51.23
Compute the look angle (azimuth/elevation/range) from a ground station to a satellite at a given time.
The station is a map: %{latitude: deg, longitude: deg, altitude_m: meters}.
Returns {:ok, %{azimuth: deg, elevation: deg, range_km: km}}.
Example
station = %{latitude: 40.0, longitude: -74.0, altitude_m: 0.0}
{:ok, look} = Orbis.look_angle(tle, datetime, station)
look.elevation # => 25.7
Compute the angle between satellite nadir and the Moon direction.
See Orbis.Angles.moon_angle/2 for details.
Parse a Two-Line Element set.
Returns {:ok, %Orbis.Elements{}} or {:error, reason}.
Examples
iex> {:ok, el} = Orbis.parse_tle(
...> "1 25544U 98067A 18184.80969102 .00001614 00000-0 31745-4 0 9993",
...> "2 25544 51.6414 295.8524 0003435 262.6267 204.2868 15.54005638121106"
...> )
iex> el.catalog_number
"25544"
Predict visible passes of a satellite over a ground station.
See Orbis.Passes.predict/5 for full documentation.
Propagate orbital elements to a specific datetime, returning TEME position and velocity.
Returns {:ok, %Orbis.TemeState{}} with position in km and velocity in km/s,
or {:error, reason}.
Examples
iex> {:ok, el} = Orbis.parse_tle(
...> "1 25544U 98067A 18184.80969102 .00001614 00000-0 31745-4 0 9993",
...> "2 25544 51.6414 295.8524 0003435 262.6267 204.2868 15.54005638121106"
...> )
iex> {:ok, teme} = Orbis.propagate(el, ~U[2018-07-04 00:00:00Z])
iex> {x, _y, _z} = teme.position
iex> x > 3000 and x < 4000
true
Compute the angle between satellite nadir and the Sun direction.
See Orbis.Angles.sun_angle/2 for details.
Convert a TEME state vector to GCRS (Geocentric Celestial Reference System).
Pass skyfield_compat: true for IEEE 754 bit-identical output to
Python Skyfield (0 ULP oracle test). Default uses direct km arithmetic
which is more numerically precise.
Example
gcrs = Orbis.teme_to_gcrs(teme, datetime)
gcrs = Orbis.teme_to_gcrs(teme, datetime, skyfield_compat: true)