AntennaRadiationPressure#

class AntennaRadiationPressure(origin: CelestialBody, spacecraft: Spacecraft, base_frame: Frame, emitters: list, t0: float = None, tf: float = None)#

Bases: DynamicModel

Recoil acceleration from power the spacecraft transmits: radio antennas and active instruments such as a LIDAR.

An emitter of radiated power \(P\) whose beam is a cone of half-power beamwidth \(\alpha_0\) around the boresight \(\hat{\mathbf{a}}_z\) pushes the spacecraft with

\[\mathbf{a}_k = -\frac{P_k}{m\,c}\, \cos^2\!\left(\frac{\alpha_{0,k}}{4}\right)\hat{\mathbf{a}}_{z,k}\]

where \(m\) is the spacecraft mass and \(c\) the speed of light. The factor \(\cos^2(\alpha_0/4)\) is the boresight share of the momentum of a beam spread uniformly over the cone; it is close to one for a high-gain antenna and about 0.91 for a 70 degree low-gain antenna. The total acceleration is

\[\mathbf{a}_\text{ant} = \eta_\text{ant} \sum_{k\,\text{on}} \mathbf{a}_k\]

with \(\eta_\text{ant}\) an estimable scale factor (default 1), read from the state under ("eta_antenna", spice_id).

Emitters. emitters is a list of dicts, each holding

  • "name": label;

  • "power": ArrayWUnits radiated power;

  • "hpbw": ArrayWUnits half-power beamwidth, within [0, 360) degrees;

  • "boresight": beam direction in the spacecraft frame;

  • "on_intervals" (optional): list of (start, end) pairs, in TDB seconds past J2000 or as EpochArray, when the emitter transmits (start <= t < end). Omitted or None means always on; an empty list means never on.

Quantities with units may also be given in their serialized form ({"values", "units"}), which is what emitters_to_dict() writes.

Attitude. Boresights are fixed in the spacecraft frame and reach the inertial frame through the spacecraft-fixed to inertial rotation \(C\) of DynamicalUtils, for the "CK", "inertialFixedAttitude" and "nadirPointingSun" values of Spacecraft.attitudeMode. Only in the last one, where the spacecraft \(-X\) axis points at the Sun and the Y axis follows the heliocentric velocity, does the acceleration depend on the state, through the rotation of the boresights, and the model reports depends_on_velocity.

Parameters:
originCelestialBody

Propagation origin. Used for the Sun-relative geometry of the nadirPointingSun attitude.

spacecraftSpacecraft

The emitting spacecraft. Its mass and attitude are read at evaluation time.

base_frameFrame

Inertial frame of the propagated state.

emitterslist of dict

The emitters, as described above.

t0, tffloat, optional

Propagation span in TDB seconds past J2000. When both are given and the frame is J2000, the Sun position is read from a Chebyshev ephemeris cache instead of SPICE.

Attributes:
depends_on_velocity

Whether the acceleration depends on the spacecraft velocity.

emitter_names

Emitter names, in the order of active_emitters().

emitters

The validated emitters.

frame

The inertial frame of the propagated state.

origin

The propagation origin.

origin_name

The name of the propagation origin.

param_name

State key of the estimable scale factor.

spacecraft

The emitting spacecraft.

Methods

active_emitters(epoch)

Which emitters transmit at epoch.

compute_acceleration(position, ...)

Antenna and instrument recoil acceleration.

emitters_from_dict(emitters)

Validate emitters and return them with live quantities.

emitters_to_dict(emitters)

Serialize emitters to plain JSON types.

to_dict()

Serialize this model's emitters; see emitters_to_dict().

Raises:
InvalidEmitterError

If an emitter is malformed.

DynamicalUtils.InvalidAttitudeModeError

If the spacecraft attitude mode is not one of the three above.

DynamicalUtils.InvalidFixedAttitudeError

If an inertialFixedAttitude spacecraft has no 3x3 attitude.

DynamicalUtils.MissingVelocityError

If a nadirPointingSun spacecraft has no velocity in the state.

See also

scarabaeus.ThermalRadiation

Thermal re-radiation recoil.

scarabaeus.nPlateSRP

Solar radiation pressure on a plate model.

scarabaeus.DynamicalUtils

Spacecraft attitude modes.

Notes

Switching an emitter on or off is a step in the acceleration; the partials take the emitters on at the evaluation epoch. The scale-factor partial is the acceleration with \(\eta_\text{ant} = 1\).

References

J. L. Geeraert, J. M. Leonard, P. W. Kenneally, P. G. Antreasian, M. C. Moreau, and D. S. Lauretta, “OSIRIS-REx Navigation Small Force Models,” in AAS/AIAA Astrodynamics Specialist Conference, 2019, Advances in the Astronautical Sciences, Vol. 171, Univelt, 2020, pp. 931-946.

classmethod emitters_from_dict(emitters) → list#

Validate emitters and return them with live quantities.

Parameters:
emitterslist of dict

The emitters, live or as written by emitters_to_dict(); see the class docstring.

Returns:
list of dict

Each emitter with power and hpbw as ArrayWUnits, a unit boresight, and on_intervals as None or a list of (start, end) floats in TDB seconds past J2000.

Raises:
InvalidEmitterError

If emitters is not a non-empty list or an emitter is malformed.

classmethod emitters_to_dict(emitters) → list#

Serialize emitters to plain JSON types.

Parameters:
emitterslist of dict

The emitters in any form emitters_from_dict() accepts.

Returns:
list of dict

The emitters with quantities as {"values", "units"} dicts; emitters_from_dict() reads them back.

active_emitters(epoch: float) → ndarray#

Which emitters transmit at epoch.

Parameters:
epochfloat

TDB epoch (seconds past J2000).

Returns:
numpy.ndarray

Boolean flag per emitter, in the order of emitter_names.

compute_acceleration(position: ndarray, current_state: dict, epoch: float, body: Spacecraft) → ndarray#

Antenna and instrument recoil acceleration.

Parameters:
positionnumpy.ndarray

(3,) spacecraft position relative to the origin, km.

current_statedict

The propagated state, holding ("eta_antenna", spice_id) when the scale factor is estimated.

epochfloat

TDB epoch (seconds past J2000).

bodySpacecraft

The emitting spacecraft.

Returns:
numpy.ndarray

(3,) acceleration in km/s^2.

to_dict() → list#

Serialize this model’s emitters; see emitters_to_dict().

Returns:
list of dict

The serialized emitters.

PARAMETER_NAME = 'eta_antenna'#

State key of the estimable scale factor.

property depends_on_velocity: bool#

Whether the acceleration depends on the spacecraft velocity.

True only for the nadirPointingSun attitude, where the spacecraft Y axis follows the heliocentric velocity.

property emitter_names: list#

Emitter names, in the order of active_emitters().

property emitters: list#

The validated emitters.

property frame: Frame#

The inertial frame of the propagated state.

property origin: CelestialBody#

The propagation origin.

property origin_name: str#

The name of the propagation origin.

property param_name: str#

State key of the estimable scale factor.

property spacecraft: Spacecraft#

The emitting spacecraft.

exception InvalidEmitterError#

Bases: Exception

An emitter is malformed.

An emitter needs a name, a non-negative power quantity, a half-power beamwidth angle within [0, 360) degrees, a nonzero spacecraft-fixed boresight, and on_intervals that are None or a list of (start, end) pairs with start < end.