Orbis (Orbis v0.7.0)

Copy Markdown View Source

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

doppler(tle, datetime, station, frequency_hz)

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

eclipse(tle, datetime, ephemeris)

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)

geodetic(tle, datetime)

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

look_angle(tle, datetime, station)

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

moon_angle(satellite_gcrs_position, moon_position_from_earth)

Compute the angle between satellite nadir and the Moon direction.

See Orbis.Angles.moon_angle/2 for details.

parse_tle(line1, line2)

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_passes(tle, ground_station, start_time, end_time, opts \\ [])

Predict visible passes of a satellite over a ground station.

See Orbis.Passes.predict/5 for full documentation.

propagate(tle, datetime)

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

sun_angle(satellite_gcrs_position, sun_position_from_earth)

Compute the angle between satellite nadir and the Sun direction.

See Orbis.Angles.sun_angle/2 for details.

teme_to_gcrs(teme_state, datetime, opts \\ [])

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)