High-Precision Orbit Propagator
High-precision satellite propagation using Runga-Kutta methods for differential equation solving
Force models are mostly pulled from Montenbruck & Gill: https://link.springer.com/book/10.1007/978-3-642-58351-3
The propagator can also compute the state transition matrix, meaning position and velocity covariances can be propagated as well.
The default propagator uses a Runga-Kutta 9(8) integrator with coefficient computed by Verner: https://www.sfu.ca/~jverner/
This works much better than lower-order Runga-Kutta solvers such as Dormund-Prince, and I don’t know why it isn’t more popular in numerical packages
This module includes a function to propagate a position and time directly, and a convenience “satstate” object that represents satellite position, velocity, and optionally covariance and can propagate itself to different times
Forces included in the propagator:
Earth gravity with higher-order zonal terms
Sun, Moon gravity
Radiation pressure
Atmospheric drag: NRL-MISE 2000 density model, with option to include space weather effects (can be large)
- satkit.satprop.propagate(pos: numpy.typing.ArrayLike[float], vel: numpy.typing.ArrayLike[float], start: satkit.time, **kwargs)
High-precision orbit propagator
Notes
- Propagator uses advanced Runga-Kutta integrators and includes the following forces:
Earth gravity with higher-order zonal terms
Sun, Moon gravity
Radiation pressure
Atmospheric drag: NRL-MISE 2000 density model, with option to include space weather effects (can be large)
Stop time must be set by keyword argument, either explicitely or by duration
Solid Earth tides are not (yet) included in the model
Propagate statellite ephemeris (position, velocity in gcrs & time) to new time and output new position and velocity via Runge-Kutta integration.
Inputs and outputs are all in the Geocentric Celestial Reference Frame (GCRF)
- Parameters:
pos (npt.ArrayLike[float]) – 3-element numpy array representing satellite GCRF position in meters
vel (npt.ArrayLike[float]) – 3-element numpy array representing satellite GCRF velocity in m/s
tm (satkit.time) – satkit.time object representing instant at which satellite is at “pos” & “vel”
- Keyword Arguments:
stop_time (satkit.time) – satkit.time object representing instant at which new position and velocity will be computed
duration_secs (float) – duration in seconds from “tm” for at which new position and velocity will be computed.
duration_days (float) – duration in days from “tm” at which new position and velocity will be computed.
duration (satkit.duration) – duration from “tm” at which new position & velocity will be computed.
output_phi (bool) – Output 6x6 state transition matrix between “starttime” and “stoptime” (and at intervals, if specified)
propsettings (propsettings) – “propsettings” object with input settings for the propagation. if left out, default will be used.
satproperties (satproperties_static) – “SatPropertiesStatic” object with drag and radiation pressure succeptibility of satellite. If left out, drag and radiation pressure are neglected
output_dense – boolean indicting whether or not dense output should be recorded. Default is false. If true, this will allow for calling the “interp” function to query states at arbitrary times between the start time and the stop time
- Returns:
Propagation result object holding state outputs, statistics, and dense output if requested
- Return type:
- class satkit.satprop.propresult
Results of a satellite propagation
This class lets the user access results of the satellite propagation
- interp(output_phi: bool = False)
Interpolate state at given time
- Parameters:
time (satkit.time) – Time at which to interpolate state
- Keyword Arguments:
output_phi (bool) – Output 6x6 state transition matrix at the interpolated time
- Returns:
6-element vector representing state at given time if output_phi, also output 6x6 state transition matrix at given time
- property phi
6x6 State transition matrix or None if not computed
- property pos
GCRF position of satellite, meters
- property state
6-element state (pos + vel) of satellite in meters & meters/second
- property stats
Statistics of propagation
- property time
Time at which state is valid
- property vel
GCRF velocity of satellite, meters/second
- class satkit.satprop.propsettings
This class contains settings used in the high-precision orbit propgator part of the “satkit” python toolbox
- property abs_error
Maxmum absolute value of error for any element in propagated state following ODE integration
Default: 1e-8
- property gravity_order
Earth gravity order to use in ODE integration
Default: 4
- property rel_error
Maximum relative error of any element in propagated state following ODE integration
Default: 1e-8
- property use_jplephem
Use high-precision but computationally expensive JPL ephemerides for sun and mun when computing their gravitational force
- property use_spaceweather
Use space weather data when computing atmospheric density for drag forces
Default: true
Notes
Space weather data can have a large effect on the density of the atmosphere
This can be important for accurate drag force calculations
Space weather data is updated every 3 hours. Most-recent data can be downloaded with
satkit.utils.update_datafiles()
- class satkit.satprop.propstats
- property num_accept
Number of accepted steps in adaptive RK integrator
- property num_eval
Number of function evaluations
- property num_reject
Number of rejected steps in adaptive RK integrator
- class satkit.satprop.satproperties_static(*args, **kwargs)
Satellite properties relevant for drag and radiation pressure
This class lets the satellite radiation pressure and drag paramters be set to static values for duration of propagation