Propagators
All propagators follow the Propagator
interface.
- class beyond.propagators.base.Propagator
Base class for propagators
- class beyond.propagators.base.NumericalPropagator
Bases:
Propagator
Base class for numerical propagators (e.g. Cowell)
- class beyond.propagators.base.AnalyticalPropagator
Bases:
Speaker
,Propagator
Base class for analytical propagators (SGP4, Eckstein-Heschler, etc.)
Kepler
Basic analytical Keplerian propagator, computing the position by only taking the evolution of the mean anomaly into account.
- class beyond.propagators.kepler.Kepler
Bases:
AnalyticalPropagator
Analytical propagator only taking the evolution of the Mean anomaly
J2
Analytical propagator, taking the central body effect on the orbit, and the J2 term
- class beyond.propagators.j2.J2
Bases:
AnalyticalPropagator
Analytical propagator taking only the Earth-J2 effect into account
SGP4
The SGP4 is the historical model for TLE propagation. It allows low-precision orbit extrapolation, but is sufficient enough for amateurs and wide-beams antenna pointing.
There is currently two implementation available:
Brandon Rhodes’ sgp4
a rewrite from scratch of the SGP4 model specifically done for this library
Brandon Rhodes’
This module provide a interface to the sgp4 module, which is a direct adaptation of the C++ SGP4 reference implementation. As the reference, it implements both SGP4 and SDP4 models in one interface. For these reasons, this module is to be preferred over the rewrite.
- class beyond.propagators.sgp4.Sgp4
Bases:
AnalyticalPropagator
Interface to the sgp4 library
Rewrite
This module provides the SGP4 extrapolator and all its required constants and configurations
- class beyond.propagators.sgp4beta.Sgp4Beta
Bases:
object
This class is a simplistic implementation of SGP4 model. It doesn’t implement SDP4 model at the moment.
It is highly under-optimized, and serves only the purpose of testing.
Following are gravitational constants used in the SGP4 propagator, the default being WGS72.
- class beyond.propagators.sgp4beta.WGS72Old
Constants for WGS72 old model
- class beyond.propagators.sgp4beta.WGS72
Constants for WGS72 model
- class beyond.propagators.sgp4beta.WGS84
Constants for WGS84 model
KeplerNum
Basic numerical Keplerian propagator, computing the position of the next iteration by integrating of the acceleration components applied to the satellite by numerous bodies (Earth, Moon, Sun, etc.). This propagator is currently in development.
This propagator is able do handle maneuvers, as exposed in the Maneuvers example.
- class beyond.propagators.keplernum.KeplerNum(step, bodies, *, method='rk4', frame='EME2000', tol=0.001)
Bases:
NumericalPropagator
Keplerian motion numerical propagator
This propagator provide three methods of propagation
euler
,rk4
anddopri
See Runge-Kutta methods for details.For adaptive step size, the highest order is used to compute the next state, and the lowest to determine the error and adapt the stepsize. For example RKF54 use order 5 for state computation, and order 4 for error estimation.
- DOPRI54 = 'dopri54'
Dormand-Prince 5th order adaptive stepsize integrator
- EULER = 'euler'
Euler fixed-step integrator
- RK4 = 'rk4'
Runge-Kutta 4th order fixed stepsize integrator
- RKF54 = 'rkf54'
Runge-Kutta 5th order adaptive stepsize integrator
- __init__(step, bodies, *, method='rk4', frame='EME2000', tol=0.001)
- Parameters:
step (datetime.timedelta) – Step size of the propagator
bodies (tuple) – List of bodies to take into account
method (str) – Integration method (see class attributes)
frame (str) – Frame to use for the propagation
tol (float) – Error tolerance for adaptive stepsize methods
ClohessyWiltshire
- class beyond.propagators.cw.ClohessyWiltshire(sma, frame='Hill')
Bases:
AnalyticalPropagator
Clohessy-Wiltshire analytical propagator for relative motion
This propagator does not work like other propagators found in the beyond library. It works only with orbits defined in the
Hill frame
, which is centered on a target spacecraft and is curvilinear along its track.The initial Orbit is treated as the chaser spacecraft at a relative distance and velocity from the target, and propagated Orbits are the evolution of the motion of the chaser relative to the target.
This analytical propagator is able to propagate through impulsive and continuous maneuvers.
You can use
CWHelper
for intilisation and maneuvers- __init__(sma, frame='Hill')
- Parameters:
sma (float) – Semi major-axis of the target object (in meters)
orientation (str) – Local orbital reference frame orientation (QSW or TNW)
body (str) – Central body
- classmethod from_orbit(orbit, orientation='QSW', name='cw_frame')
Use an Orbit object as target for a Clohessy-Wiltshire propagator
- Parameters:
orbit (Orbit) – target
orientation (str) –
name (str) – name of the reference frame
- property n
Mean motion of the target spacecraft
Sphere of Influence
There is two propagators handling Sphere of Influence transitions.
- class beyond.propagators.soi.SoIAnalytical(central, alt, *, frame=None)
Bases:
_SoI
,Kepler
Kepler (analytical) propagator capable of switching between Sphere of Influence of different solar system bodies
- class beyond.propagators.soi.SoINumerical(central_step, alt_step, central, alt, *, method='rk4', frame=None)
Bases:
_SoI
,KeplerNum
KeplerNum propagator capable of switching between the Sphere of Influence of different solar system bodies
- __init__(central_step, alt_step, central, alt, *, method='rk4', frame=None)
- Parameters:
central_step (timedelta) – Step to use in computation when only the central body is taken into account
alt_step (timedelta) – Step to use in computations under the influence of an alternate body
central (Body) – Central body
alt (list of Body) – Objects to potentially use
method (str) – Method of extrapolation (see
KeplerNum
)frame (str) – Frame of the resulting extrapolation. If
None
, the result will change frame depending on the sphere of influence it is in
Listeners
Listeners allow to watch for state transition during the propagation of an orbit. For example, the AOS and LOS of a satellite as seen from a station.
Each time a propagator (a subclass of Speaker
) detects a state transition, it
creates an Orbit instance at the date of the event, and add an event
attribute which
is an Event
instance.
- class beyond.propagators.listeners.AnomalyListener(value, anomaly='true', frame=None)
Listener for anomaly (in the orbital sense)
- __init__(value, anomaly='true', frame=None)
- Parameters:
value (float) –
anomaly (str) – Type of anomaly, can be any from ‘true’, ‘mean’, ‘eccentric’ or ‘aol’
frame (str) –
- check(orb)
Method that check whether or not the listener is triggered
- Parameters:
orb (Orbit) –
- Returns:
True if there is a zero-crossing for the parameter watched by the listener
- Return type:
bool
- event
alias of
AnomalyEvent
- class beyond.propagators.listeners.ApsideListener(frame=None)
Listener for Periapside and Apoapside detection
- __init__(frame=None)
- Parameters:
frame (str) – Name of the reference frame from which to compute If
None
the frame is unchanged.
- event
alias of
ApsideEvent
- class beyond.propagators.listeners.LightListener(type='umbra', frame=None)
This class compute, for a given orbit, its illumination by the sun, allowing to detect umbra and penumbra events.
Angles in this image are over-exaggerated
- PENUMBRA = 'penumbra'
Light <-> Penumbra
- UMBRA = 'umbra'
Penumbra <-> Shadow
- __init__(type='umbra', frame=None)
- Parameters:
type (str) – Choose which event to trigger between umbra or penumbra
frame (str) – Name of the reference frame from which to compute. If
None
the frame is unchanged.
- event
alias of
LightEvent
- class beyond.propagators.listeners.Listener
Base class for listeners
- check(orb)
Method that check whether or not the listener is triggered
- Parameters:
orb (Orbit) –
- Returns:
True if there is a zero-crossing for the parameter watched by the listener
- Return type:
bool
- clear()
Clear the state of the listener, in order to make a new iteration
- class beyond.propagators.listeners.NodeListener(frame=None)
Listener for Ascending and Descending Node detection
- __init__(frame=None)
- Parameters:
frame (str) – Name of the reference frame from which to compute If
None
the frame is unchanged.
- event
alias of
NodeEvent
- class beyond.propagators.listeners.RadialVelocityListener(frame, sight=False)
- __init__(frame, sight=False)
- Parameters:
frame (Frame) – Frame from which the computation is made
sight (bool) – If the frame used is a station, it could be interesting to only compute the Zero Doppler when the object is in sight
- check(orb)
Method that check whether or not the listener is triggered
- Parameters:
orb (Orbit) –
- Returns:
True if there is a zero-crossing for the parameter watched by the listener
- Return type:
bool
- event
alias of
RadialVelocityEvent
- class beyond.propagators.listeners.Speaker
This class is used to trigger Listeners.
By calling
listen()
, the subclass can trigger the listeners.- classmethod clear_listeners(listeners)
Clear Listeners in order to do a propagation with a clean state
- listen(orb, listeners)
This method allows to loop over the listeners and trigger the
_bisect()
method in case a watched parameter has its state changed.
- class beyond.propagators.listeners.StationMaskListener(station)
Listener for time of rising above the physical horizon (real horizon may be blocked by terrain, vegetation, buildings, etc.).
- __init__(station)
- Parameters:
station (TopocentricFrame) – Station from which to listen to elevation events
- check(orb)
Method that check whether or not the listener is triggered
- Parameters:
orb (Orbit) –
- Returns:
True if there is a zero-crossing for the parameter watched by the listener
- Return type:
bool
- event
alias of
MaskEvent
- class beyond.propagators.listeners.StationMaxListener(station)
Listener for max elevation of a pass over a station
- __init__(station)
- Parameters:
station (TopocentricFrame) – Station from which to listen to elevation events
- check(orb)
Method that check whether or not the listener is triggered
- Parameters:
orb (Orbit) –
- Returns:
True if there is a zero-crossing for the parameter watched by the listener
- Return type:
bool
- event
alias of
MaxEvent
- class beyond.propagators.listeners.StationSignalListener(station, elev=0)
Listener for AOS and LOS of a given station
- __init__(station, elev=0)
- Parameters:
station (TopocentricFrame) – Station from which to listen to elevation events
elev (float) – Elevation from which to trigger the listener (in radians)
- event
alias of
SignalEvent
- class beyond.propagators.listeners.TerminatorListener
Detect the night/day transition at the surface of the earth, at the zenith
- event
alias of
TerminatorEvent
- beyond.propagators.listeners.events_iterator(iterator, *events)
Iterate only over the listed events
- Parameters:
iterator (Iterable[Orbit]) –
events (List[str]) –
- Yields:
Orbit
- beyond.propagators.listeners.find_event(iterator, event, offset=0)
Find an specific event in a extropolation
- Parameters:
iterator (Iterable[Orbit]) – Itertator in which to look for the event
event (str or Event) – Event to look for
offset (int) – The function will return the Nth event detected
- Returns:
Orbit
- beyond.propagators.listeners.stations_listeners(stations)
Function for creating listeners for a a list of station
Each station will have the following Listeners attached:
StationMaskListener
if the station has a mask defined (seecreate_station()
for details)
- Parameters:
stations (iterable) – List of TopocentricFrame
- Returns:
list of Listeners