JPL SPK/BSP ephemeris file reader.
Computes positions of solar system bodies, spacecraft, and minor planets using JPL SPK/BSP kernels (DE421, DE440, Horizons exports, etc.).
Reading is delegated to sidereon_core::astro::spk, the validated SPK reader
shared by the rest of the engine. It evaluates SPK segment types 2 (Chebyshev
position), 3 (Chebyshev state), and 21 (Extended Modified Difference Arrays),
so DE-series planetary kernels and Horizons spacecraft / asteroid kernels are
all supported through the same code path.
Example
{:ok, eph} = Sidereon.Ephemeris.load("de421.bsp")
{:ok, {x, y, z}} = Sidereon.Ephemeris.position(eph, :sun, :earth, ~U[2024-01-01 12:00:00Z])Bodies
Bodies may be given as atoms (:ssb / :solar_system_barycenter, :mercury,
:venus, :earth_moon_barycenter / :emb, :mars, :jupiter, :saturn,
:uranus, :neptune, :pluto, :sun, :moon, :earth) or as raw NAIF
integer codes. Integer codes pass straight through to the reader, which is how
spacecraft and minor-planet kernels are queried (e.g. 20000433 for 433 Eros).
Summary
Functions
Load an SPK/BSP ephemeris file.
Like load/1 but raises on failure.
Compute the position of target relative to observer at the given time.
Like position/4 but raises on failure.
Types
@type epoch() :: DateTime.t() | NaiveDateTime.t() | float() | integer()
@type load_error() :: {:file_error, File.posix()} | {:invalid_path, term()}
@type t() :: %Sidereon.Ephemeris{path: String.t()}
Functions
@spec load(term()) :: {:ok, t()} | {:error, load_error()}
Load an SPK/BSP ephemeris file.
Returns {:ok, ephemeris} with a handle that can be passed to position/4,
or {:error, reason} when the file cannot be loaded.
The file is not held open; it is read on each position/4 call.
Example
{:ok, eph} = Sidereon.Ephemeris.load("/path/to/de421.bsp")
Like load/1 but raises on failure.
Compute the position of target relative to observer at the given time.
Returns {:ok, {x, y, z}} in km in the J2000/ICRF reference frame, or
{:error, reason}.
The target and observer are body atoms (see module docs) or
NAIF integer codes.
The datetime can be a DateTime, a NaiveDateTime, or a Julian Date
(TDB) as a float.
Examples
{:ok, {x, y, z}} = Sidereon.Ephemeris.position(eph, :moon, :earth, datetime)
# Raw NAIF code (433 Eros) against a Horizons kernel:
{:ok, {x, y, z}} = Sidereon.Ephemeris.position(eph, 20_000_433, :sun, jd_tdb)
Like position/4 but raises on failure.