Propagators

All propagators follow the Propagator interface.

class beyond.propagators.base.Propagator

Base class for propagators

abstract propagate(date)

Propagate the orbit to a given date

Parameters:

date (Date) –

Return type:

Orbit

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

propagate(date)

Propagate the orbit to a given date

Parameters:

date (Date) –

Return type:

Orbit

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

propagate(date)

Propagate the orbit to a given date

Parameters:

date (Date) –

Return type:

Orbit

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

propagate(date)

Propagate the initialized orbit

Parameters:

date (Date or datetime.timedelta) –

Returns:

Orbit

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.

MODEL

alias of WGS72

propagate(date)

Compute state of orbit at a given date, past or future

Parameters:

date (Date) –

Return type:

Orbit

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 and dopri 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)

  • frame (str) – Local orbital reference frame, must be a HillFrame object

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

propagate(date)

Propagate the orbit to a given date

Parameters:

date (Date) –

Return type:

Orbit

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

__init__(central, alt, *, frame=None)
Parameters:
  • central (Body) – Central body

  • alt (list of Body) – Objects to potentially use

  • frame (str) – Frame of the resulting extrapolation. If None, the result will change frame depending on the sphere of influence it is in

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

Eckstein-Hechler

class beyond.propagators.eh.EcksteinHechler(osculating=True)

Bases: AnalyticalPropagator

Eckstein-Hechler propagator

This analytical propagator takes into account the central force and zonal harmonics up to J6. This propagator is suited for orbits that are nearly circular (e < 0.1) and does not work for orbits near the critical inclination (63.43 and 116.57 deg) or equatorial (both direct or retrograde).

Based on Eckstein, M. C., and F. Hechler. “A reliable Derivation of the perturbations due to any zonal and tesseral harmonics of the geopotential for nearly-circular satellite orbits” ESRO-SR-13, 1970.

While the original publication uses all terms up to degree 9 and order 6, this implementation is limited to zonal harmonics up to degree 6.

This is an adaptation of the Scilab implementation present in Celestlab, developped by A. Lamy.

__init__(osculating=True)
Parameters:

osculating (bool) – When True the propagator will provide osculating elements, otherwise it will provide mean elements.

classmethod fit_statevector(target)

Find the MeanOrbit that provide the input StateVector

Parameters:

target (StateVector) –

Returns:

MeanOrbit object which, when propagated at the same date, returns the input StateVector

Return type:

MeanOrbit

propagate(date)
Parameters:

date (Date or timedelta) –

Returns:

StateVector if osculating == True,

MeanOrbit otherwise : Orbit at the given date

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

info(orb)
Parameters:

orb (Orbit) –

Returns:

Information concerning the event listened to

Return type:

Event

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

info(orb)
Parameters:

orb (Orbit) –

Returns:

Information concerning the event listened to

Return type:

Event

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.

../_images/light.svg

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

info(orb)
Parameters:

orb (Orbit) –

Returns:

Information concerning the event listened to

Return type:

Event

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

abstract info(orb)
Parameters:

orb (Orbit) –

Returns:

Information concerning the event listened to

Return type:

Event

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

info(orb)
Parameters:

orb (Orbit) –

Returns:

Information concerning the event listened to

Return type:

Event

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

info(orb)
Parameters:

orb (Orbit) –

Returns:

Information concerning the event listened to

Return type:

Event

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.

Parameters:
  • orb (Orbit) – The current state of the orbit

  • listeners (iterable) – List of Listener objects

Returns:

Orbits corresponding to events, sorted by dates

Return type:

list of Orbit

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

info(orb)
Parameters:

orb (Orbit) –

Returns:

Information concerning the event listened to

Return type:

Event

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

info(orb)
Parameters:

orb (Orbit) –

Returns:

Information concerning the event listened to

Return type:

Event

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

info(orb)
Parameters:

orb (Orbit) –

Returns:

Information concerning the event listened to

Return type:

Event

class beyond.propagators.listeners.TerminatorListener

Detect the night/day transition at the surface of the earth, at the zenith

event

alias of TerminatorEvent

info(orb)
Parameters:

orb (Orbit) –

Returns:

Information concerning the event listened to

Return type:

Event

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 a specific event in an 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:

Parameters:

stations (iterable) – List of TopocentricFrame

Returns:

list of Listeners