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 verisons 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.earth_orientation_params(time: earth_orientation_params.time)

Get Earth Orientation Parameters at given instant

Parameters:

time (satkit.time) – Instant at which to query parameters

Returns:

Tuple with following elements:

0 : (UT1 - UTC) in seconds 1 : X polar motion in arcsecs 2 : Y polar motion in arcsecs 3 : LOD: instantaneous rate of change in (UT1-UTC), msec/day 4 : dX wrt IAU-2000A nutation, milli-arcsecs 5 : dY wrt IAU-2000A nutation, milli-arcsecs

Return type:

(float, float, float, float, float, float) | None

satkit.frametransform.earth_rotation_angle(tm: time | numpy.typing.ArrayLike[time] | datetime.datetime | numpy.typing.ArrayLike[datetime.datetime])

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

Parameters:

tm (satkit.time|datetime.datetime|list|numpy.array) – Time[s] at which to calculate Earth Rotation Angle

Returns:

Earth Rotation Angle at input time[s] in radians

Return type:

float|numpy.array

satkit.frametransform.gast(tm: time | numpy.typing.ArrayLike[time] | datetime.datetime | numpy.typing.ArrayLike[datetime.datetime])

Greenwich Apparent Sideral Time

Parameters:

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:

Greenwich apparant sidereal time, radians, at input time(s)

Return type:

float | npt.ArrayLike[np.float]

satkit.frametransform.gmst(tm: time | numpy.typing.ArrayLike[time] | datetime.datetime | numpy.typing.ArrayLike[datetime.datetime])

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)

Parameters:

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:

Greenwich Mean Sideral Time, radians, at intput time(s)

Return type:

float | npt.ArrayLike[np.float]

satkit.frametransform.qcirs2gcrf(tm: time | numpy.typing.ArrayLike[time] | datetime.datetime | numpy.typing.ArrayLike[datetime.datetime])

Rotation from Celestial Intermediate Reference System to Geocentric Celestial Reference Frame

Parameters:

tm (satkit.time | npt.ArrayLike[satkit.time] | datetime.datetime | npt.ArrayLike[datetime.datetime]) – Time[s] at which to calculate the quaternion

Returns:

Quaternion representing rotation from CIRS to GCRF at input time(s)

Return type:

quaternion | npt.ArrayLike[quaternion]

satkit.frametransform.qgcrf2itrf(tm: time | numpy.typing.ArrayLike[time] | datetime.datetime | numpy.typing.ArrayLike[datetime.datetime])

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

Parameters:

tm (satkit.time | npt.ArrayLike[satkit.time] | datetime.datetime | npt.ArrayLike[datetime.datetime]) – Time[s] at which to calculate the quaternion

Returns:

Quaternion representing rotation from GCRF to ITRF at input time(s)

Return type:

quaternion | npt.ArrayLike[quaternion]

satkit.frametransform.qgcrf2itrf_approx(tm: time | numpy.typing.ArrayLike[time] | datetime.datetime | numpy.typing.ArrayLike[datetime.datetime])

Quaternion representing approximate rotation from the Geocentric Celestial Reference Frame (GCRF) to the International Terrestrial Reference Frame (ITRF)

Notes

  • Accurate to approx. 1 arcsec

Parameters:

tm (satkit.time | npt.ArrayLike[satkit.time] | datetime.datetime | npt.ArrayLike[datetime.datetime]) – Time[s] at which to calculate the quaternion

Returns:

Quaternion representing rotation from GCRF to ITRF at input time(s)

Return type:

quaternion | npt.ArrayLike[quaternion]

satkit.frametransform.qitrf2gcrf(tm: time | numpy.typing.ArrayLike[time] | datetime.datetime | numpy.typing.ArrayLike[datetime.datetime])

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

Parameters:

tm (satkit.time | npt.ArrayLike[satkit.time] | datetime.datetime | npt.ArrayLike[datetime.datetime]) – Time[s] at which to calculate the quaternion

Returns:

Quaternion representing rotation from ITRF to GCRF at input time(s)

Return type:

quaternion | npt.ArrayLike[quaternion]

satkit.frametransform.qitrf2gcrf_approx(tm: time | numpy.typing.ArrayLike[time] | datetime.datetime | numpy.typing.ArrayLike[datetime.datetime])

Quaternion representing approximate rotation from the International Terrestrial Reference Frame (ITRF) to the Geocentric Celestial Reference Frame (GCRF)

Notes

  • Accurate to approx. 1 arcsec

Parameters:

tm (satkit.time | npt.ArrayLike[satkit.time] | datetime.datetime | npt.ArrayLike[datetime.datetime]) – Time[s] at which to calculate the quaternion

Returns:

Quaternion representing rotation from ITRF to GCRF at input time(s)

Return type:

quaternion | npt.ArrayLike[quaternion]

satkit.frametransform.qitrf2tirs(tm: time | numpy.typing.ArrayLike[time] | datetime.datetime | numpy.typing.ArrayLike[datetime.datetime])

Rotation from Terrestrial Intermediate Reference System to Celestial Intermediate Reference Systems

Parameters:

tm (satkit.time | npt.ArrayLike[satkit.time] | datetime.datetime | npt.ArrayLike[datetime.datetime]) – Time[s] at which to calculate the quaternion

Returns:

Quaternion representing rotation from ITRF to TIRS at input time(s)

Return type:

quaternion | npt.ArrayLike[quaternion]

satkit.frametransform.qteme2itrf(tm: time | numpy.typing.ArrayLike[time] | datetime.datetime | numpy.typing.ArrayLike[datetime.datetime])

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.

Parameters:

tm (satkit.time | npt.ArrayLike[satkit.time] | datetime.datetime | npt.ArrayLike[datetime.datetime]) – Time[s] at which to calculate the quaternion

Returns:

Quaternion representing rotation from TEME to ITRF at input time(s)

Return type:

quaternion | npt.ArrayLike[quaternion]

satkit.frametransform.qtirs2cirs(tm: time | numpy.typing.ArrayLike[time] | datetime.datetime | numpy.typing.ArrayLike[datetime.datetime])

Rotation from Terrestrial Intermediate Reference System (TIRS) to the Celestial Intermediate Reference System (CIRS)

Parameters:

tm (satkit.time | npt.ArrayLike[satkit.time] | datetime.datetime | npt.ArrayLike[datetime.datetime]) – Time[s] at which to calculate the quaternion

Returns:

Quaternion representing rotation from TIRS to CIRS at input time(s)

Return type:

quaternion | npt.ArrayLike[quaternion]