Ephemerides.jl
Pure-Julia, allocation-free, thread-safe reader for JPL binary SPK and PCK ephemeris kernels. Repo: JuliaSpaceMissionDesign/Ephemerides.jl
Note: This package only reads kernel data. For frame transformations, use FrameTransformations.jl.
Loading Kernels
eph = EphemerisProvider("de440.bsp")
eph = EphemerisProvider(["de440.bsp", "moon_pa_de440.bpc"])
State Vector Queries
# from/to are NAIF integer IDs, time is TDB seconds since J2000
r = ephem_vector3(eph, from, to, time) # SVector{3} position
rv = ephem_vector6(eph, from, to, time) # SVector{6} pos + vel
rva = ephem_vector9(eph, from, to, time) # SVector{9} pos + vel + acc
rvaj = ephem_vector12(eph, from, to, time) # SVector{12} pos + vel + acc + jerk
Orientation Queries
ang = ephem_rotation3(eph, from, to, time) # SVector{3} angles
angd = ephem_rotation6(eph, from, to, time) # SVector{6} angles + rates
angdd = ephem_rotation9(eph, from, to, time) # SVector{9}
Kernel Inspection
ephem_get_points(eph) # Available NAIF IDs
ephem_get_axes(eph) # Available frame IDs
ephem_timescale_id(eph) # 1=TDB, 2=TCB
ephem_spk_records(eph) # Vector{EphemRecordSPK}
ephem_spk_timespan(eph) # (first_time, last_time, continuity)
Key Conventions
- Time: TDB seconds since J2000
- Bodies: NAIF integer IDs (399=Earth, 301=Moon, 10=Sun, etc.)
- Returns
SVector -- allocation-free
- AD-compatible (ForwardDiff)
- SPK segment types: 1, 2, 3, 5, 8, 9, 12, 13, 14, 15, 17, 18, 19, 20, 21
- Interpolation: Chebyshev, Hermite, and Lagrange internally
1---2name: ephemerides-jl3description: Ephemerides.jl for reading JPL binary SPK and PCK ephemeris kernels. Use when loading SPICE kernels, computing celestial body positions/velocities, or querying ephemeris data for orbit propagation.4---5
6# Ephemerides.jl
7
8Pure-Julia, allocation-free, thread-safe reader for JPL binary SPK and PCK ephemeris kernels. Repo: [JuliaSpaceMissionDesign/Ephemerides.jl](https://github.com/JuliaSpaceMissionDesign/Ephemerides.jl)
9
10Note: This package only *reads* kernel data. For frame transformations, use FrameTransformations.jl.
11
12## Loading Kernels
13
14```julia
15eph = EphemerisProvider("de440.bsp")
16eph = EphemerisProvider(["de440.bsp", "moon_pa_de440.bpc"])
17```
18
19## State Vector Queries
20
21```julia
22# from/to are NAIF integer IDs, time is TDB seconds since J2000
23r = ephem_vector3(eph, from, to, time) # SVector{3} position
24rv = ephem_vector6(eph, from, to, time) # SVector{6} pos + vel
25rva = ephem_vector9(eph, from, to, time) # SVector{9} pos + vel + acc
26rvaj = ephem_vector12(eph, from, to, time) # SVector{12} pos + vel + acc + jerk
27```
28
29## Orientation Queries
30
31```julia
32ang = ephem_rotation3(eph, from, to, time) # SVector{3} angles
33angd = ephem_rotation6(eph, from, to, time) # SVector{6} angles + rates
34angdd = ephem_rotation9(eph, from, to, time) # SVector{9}
35```
36
37## Kernel Inspection
38
39```julia
40ephem_get_points(eph) # Available NAIF IDs
41ephem_get_axes(eph) # Available frame IDs
42ephem_timescale_id(eph) # 1=TDB, 2=TCB
43ephem_spk_records(eph) # Vector{EphemRecordSPK}
44ephem_spk_timespan(eph) # (first_time, last_time, continuity)
45```
46
47## Key Conventions
48- Time: **TDB seconds since J2000**
49- Bodies: **NAIF integer IDs** (399=Earth, 301=Moon, 10=Sun, etc.)
50- Returns `SVector` -- allocation-free
51- AD-compatible (ForwardDiff)
52- SPK segment types: 1, 2, 3, 5, 8, 9, 12, 13, 14, 15, 17, 18, 19, 20, 21
53- Interpolation: Chebyshev, Hermite, and Lagrange internally