Coordinate Frame Transforms
Introduction
The satkit.frametransform module provides functions for transforming between various coordinate
frames used in satellite tracking and orbit determination. These include multiple variations of “inertial”
coordinate frames, and multiple versions of “Earth-fixed” coordinate frames.
Some notes:
Most of the algorithms in this module are from the book `”Fundamentals of Astrodynamics and Applications”`` by David Vallado.
The frame transforms are defined as arbitrary rotations in a 3-dimensional space. The rotations are a function of time, and are represented as Quaternions
The rotation from the Geocentric Celestial Reference Frame (GCRF) to the Earth-Centered Inertial (ECI) frame is defined by the International Astronomical Union (IAU), available here. See IERS Technical Note 36 for the latest values.
API Reference
Transformations between coordinate frames, and associated utility functions
Coordinate frame transforms are mostly pulled from Vallado: https://www.google.com/books/edition/Fundamentals_of_satkitdynamics_and_Applic/PJLlWzMBKjkC?hl=en&gbpv=0
or the IERS: https://www.iers.org/
- satkit.frametransform.disable_eop_time_warning()
Disable the warning printed to stderr when Earth Orientation Parameters (EOP) are not available for a given time.
Notes
This function is used to disable the warning printed when EOP are not available for a given time.
If not disabled, warning will be shown only once per library load,
- satkit.frametransform.earth_orientation_params(time)
Get Earth Orientation Parameters at given instant
Args:
time (satkit.time)Instant at which to query parameters
Returns:
(float, float, float, float, float, float) | NoneTuple with following elements:
0(UT1 - UTC) in seconds
1X polar motion in arcsecs
2Y polar motion in arcsecs
3LOD: instantaneous rate of change in (UT1-UTC), msec/day
4dX wrt IAU-2000A nutation, milli-arcsecs
5dY wrt IAU-2000A nutation, milli-arcsecs
Notes
Returns None if the time is outside the range of available Earth Orientation Parameters (EOP)
EOP are only available from 1962 to current, and predict to current + ~ 4 months
If EOP are not available, all values will be set to zero, and a warning will be printed to stderr
See: https://www.iers.org/IERS/EN/DataProducts/EarthOrientationData/eop.html
- satkit.frametransform.earth_rotation_angle(tm)
Earth Rotation Angle
Notes
See: IERS Technical Note 36, Chapter 5, Equation 5.15
Calculation Details:
Let t be UT1 Julian date
let f be fractional component of t (fraction of day)
ERA = 2𝜋 ((0.7790572732640 + f + 0.00273781191135448 * (t - 2451545.0)
Args:
tm (npt.ArrayLike[datetime.datetime] | npt.ArrayLike[time])list, or numpy array of astro.time or datetime.datetime representing time at which to calculate output
Returns:
npt.ArrayLike[np.float]Earth Rotation Angle at input time[s] in radians
- satkit.frametransform.eqeq(tm)
Equation of Equinoxes
- satkit.frametransform.gast(tm)
Greenwich Apparent Sidereal Time
Args:
tm (npt.ArrayLike[datetime.datetime] | npt.ArrayLike[time])list, or numpy array of astro.time or datetime.datetime representing time at which to calculate output
Returns:
npt.ArrayLike[np.float]Greenwich apparent sidereal time, radians, at input time(s)
- satkit.frametransform.gmst(tm)
Greenwich Mean Sidereal Time
Notes
GMST is the angle between the vernal equinox and the Greenwich meridian
Vallado algorithm 15
GMST = 67310.5481 + (876600h + 8640184.812866) * tᵤₜ₁ * (0.983104 + tᵤₜ₁ * −6.2e−6)
Args:
tm (satkit.time | npt.ArrayLike[satkit.time] | datetime.datetime | npt.ArrayLike[datetime.datetime])scalar, list, or numpy array of astro.time or datetime.datetime representing time at which to calculate output
Returns:
float | npt.ArrayLike[np.float]Greenwich Mean Sidereal Time, radians, at input time(s)
- satkit.frametransform.qcirs2gcrf(tm)
Rotation from Celestial Intermediate Reference System to Geocentric Celestial Reference Frame
Args:
tm (npt.ArrayLike[satkit.time] | npt.ArrayLike[datetime.datetime])Time[s] at which to calculate the quaternion
Returns:
npt.ArrayLike[quaternion]Quaternion representing rotation from CIRS to GCRF at input time(s)
- satkit.frametransform.qgcrf2itrf(tm)
Quaternion representing rotation from the Geocentric Celestial Reference Frame (GCRF) to the International Terrestrial Reference Frame (ITRF)
Notes
Uses full IAU2010 Reduction
See IERS Technical Note 36, Chapter 5
Does not include solid tides, ocean tides
Very computationally expensive
Args:
tm (npt.ArrayLike[satkit.time] | npt.ArrayLike[datetime.datetime])Time[s] at which to calculate the quaternion
Returns:
npt.ArrayLike[quaternion]Quaternion representing rotation from GCRF to ITRF at input time(s)
- satkit.frametransform.qgcrf2itrf_approx(tm)
Quaternion representing approximate rotation from the Geocentric Celestial Reference Frame (GCRF) to the International Terrestrial Reference Frame (ITRF)
Notes
Accurate to approx. 1 arcsec
Args:
tm (npt.ArrayLike[satkit.time] | npt.ArrayLike[datetime.datetime])Time[s] at which to calculate the quaternion
Returns:
npt.ArrayLike[quaternion]Quaternion representing rotation from GCRF to ITRF at input time(s)
- satkit.frametransform.qitrf2gcrf(tm)
Quaternion representing rotation from the International Terrestrial Reference Frame (ITRF) to the Geocentric Celestial Reference Frame (GCRF)
Notes
Uses full IAU2010 Reduction
See IERS Technical Note 36, Chapter 5
Does not include solid tides, ocean tides
Very computationally expensive
Args:
tm (npt.ArrayLike[satkit.time] | npt.ArrayLike[datetime.datetime])Time[s] at which to calculate the quaternion
Returns:
npt.ArrayLike[quaternion]Quaternion representing rotation from ITRF to GCRF at input time(s)
- satkit.frametransform.qitrf2gcrf_approx(tm)
Quaternion representing approximate rotation from the International Terrestrial Reference Frame (ITRF) to the Geocentric Celestial Reference Frame (GCRF)
Notes
Accurate to approx. 1 arcsec
Args:
tm (npt.ArrayLike[satkit.time] | npt.ArrayLike[datetime.datetime])Time[s] at which to calculate the quaternion
Returns:
npt.ArrayLike[quaternion]Quaternion representing rotation from ITRF to GCRF at input time(s)
- satkit.frametransform.qitrf2tirs(tm)
Rotation from Terrestrial Intermediate Reference System to Celestial Intermediate Reference Systems
Args:
tm (npt.ArrayLike[satkit.time] | datetime.datetime | npt.ArrayLike[datetime.datetime])Time[s] at which to calculate the quaternion
Returns:
npt.ArrayLike[quaternion]Quaternion representing rotation from ITRF to TIRS at input time(s)
- satkit.frametransform.qteme2gcrf(tm)
Rotation from True Equator Mean Equinox (TEME) to Geocentric Celestial Reference Frame (GCRF)
Args:
tm (npt.ArrayLike[satkit.time] | npt.ArrayLike[datetime.datetime])Time[s] at which to calculate the quaternion
Returns:
npt.ArrayLike[quaternion]Quaternion representing rotation from TEME to GCRF at input time(s)
- satkit.frametransform.qteme2itrf(tm)
Quaternion representing rotation from the True Equator Mean Equinox (TEME) frame to the International Terrestrial Reference Frame (ITRF)
Notes
This is equation 3-90 in Vallado
TEME is the output frame of the SGP4 propagator used to compute position from two-line element sets.
Args:
tm (npt.ArrayLike[satkit.time] | npt.ArrayLike[datetime.datetime])Time[s] at which to calculate the quaternion
Returns:
npt.ArrayLike[quaternion]Quaternion representing rotation from TEME to ITRF at input time(s)
- satkit.frametransform.qtirs2cirs(tm)
Rotation from Terrestrial Intermediate Reference System (TIRS) to the Celestial Intermediate Reference System (CIRS)
Args:
tm (npt.ArrayLike[satkit.time] | npt.ArrayLike[datetime.datetime])Time[s] at which to calculate the quaternion
Returns:
npt.ArrayLike[quaternion]Quaternion representing rotation from TIRS to CIRS at input time(s)