Skip to content

GCRF ↔ TEME ↔ ITRF Transformations

Transformations between the Geocentric Celestial Reference Frame (GCRF), the true equator and mean equinox of date (TEME) frame in which SGP4 expresses its output, and the International Terrestrial Reference Frame (ITRF).

Note

For conceptual explanations and examples, see GCRF ↔ TEME ↔ ITRF Transformations in the Learn section.

Building Blocks

greenwich_mean_sidereal_rotation builtin

greenwich_mean_sidereal_rotation(epc: Epoch) -> ndarray

Computes the rotation R3(GMST82) about the celestial pole by Greenwich mean sidereal time on the IAU 1982 model.

Parameters:

Name Type Description Default
epc Epoch

Epoch instant for computation of the rotation matrix.

required

Returns:

Type Description
ndarray

numpy.ndarray: 3x3 rotation matrix R3(GMST82), shape (3, 3).

Example
1
2
3
4
5
import brahe as bh

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
R = bh.greenwich_mean_sidereal_rotation(epc)

GCRF ↔ TEME

rotation_gcrf_to_teme builtin

rotation_gcrf_to_teme(epc: Union[Epoch, Sequence[Epoch]]) -> ndarray

Computes the rotation matrix transforming the GCRF to the true equator and mean equinox of date (TEME): R3(ERA - GMST82) C, the CIO-based bias-precession-nutation matrix followed by the rotation from the Celestial Intermediate Origin to the IAU 1982 mean equinox.

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for computation of the transformation matrix. A sequence evaluates one matrix per epoch.

required

Returns:

Type Description
ndarray

numpy.ndarray: 3x3 rotation matrix transforming GCRF -> TEME, shape (3, 3) for a single epoch or (n, 3, 3) for a sequence of n epochs.

Example
1
2
3
4
5
import brahe as bh

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
R = bh.rotation_gcrf_to_teme(epc)

rotation_teme_to_gcrf builtin

rotation_teme_to_gcrf(epc: Union[Epoch, Sequence[Epoch]]) -> ndarray

Computes the rotation matrix transforming the true equator and mean equinox of date (TEME) to the GCRF: the transpose of rotation_gcrf_to_teme.

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for computation of the transformation matrix. A sequence evaluates one matrix per epoch.

required

Returns:

Type Description
ndarray

numpy.ndarray: 3x3 rotation matrix transforming TEME -> GCRF, shape (3, 3) for a single epoch or (n, 3, 3) for a sequence of n epochs.

Example
1
2
3
4
5
import brahe as bh

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
R = bh.rotation_teme_to_gcrf(epc)

position_gcrf_to_teme builtin

position_gcrf_to_teme(epc: Union[Epoch, Sequence[Epoch]], x: Union[ndarray, Sequence], axis: int = -1) -> ndarray

Transforms a position vector from the GCRF to the true equator and mean equinox of date (TEME). The position is rotated by rotation_gcrf_to_teme.

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for the transformation. A sequence evaluates one epoch per vector (or broadcasts a single vector across all epochs).

required
x ndarray or list

Position vector in GCRF frame (m), shape (3,), or a batch of vectors with the 3 components along axis (for example shape (n, 3)).

required
axis int

The axis of x along which the 3 components of a single vector lie; the remaining axes enumerate the batch. For a batch of shape (n, 3) the components lie along the last axis, so the default -1 applies; a (3, n) column layout uses axis=0.

-1

Returns:

Type Description
ndarray

numpy.ndarray: Position vector in TEME frame (m), shape (3,) for a single input, or the batch layout of x (shape (n, 3) for a single vector with a sequence of n epochs).

Example
1
2
3
4
5
6
7
import brahe as bh
import numpy as np

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
r_gcrf = np.array([7000000.0, 0.0, 0.0])
r_teme = bh.position_gcrf_to_teme(epc, r_gcrf)

position_teme_to_gcrf builtin

position_teme_to_gcrf(epc: Union[Epoch, Sequence[Epoch]], x: Union[ndarray, Sequence], axis: int = -1) -> ndarray

Transforms a position vector from the true equator and mean equinox of date (TEME) to the GCRF. The position is rotated by rotation_teme_to_gcrf.

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for the transformation. A sequence evaluates one epoch per vector (or broadcasts a single vector across all epochs).

required
x ndarray or list

Position vector in TEME frame (m), shape (3,), or a batch of vectors with the 3 components along axis (for example shape (n, 3)).

required
axis int

The axis of x along which the 3 components of a single vector lie; the remaining axes enumerate the batch. For a batch of shape (n, 3) the components lie along the last axis, so the default -1 applies; a (3, n) column layout uses axis=0.

-1

Returns:

Type Description
ndarray

numpy.ndarray: Position vector in GCRF frame (m), shape (3,) for a single input, or the batch layout of x (shape (n, 3) for a single vector with a sequence of n epochs).

Example
1
2
3
4
5
6
7
import brahe as bh
import numpy as np

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
r_teme = np.array([7000000.0, 0.0, 0.0])
r_gcrf = bh.position_teme_to_gcrf(epc, r_teme)

state_gcrf_to_teme builtin

state_gcrf_to_teme(epc: Union[Epoch, Sequence[Epoch]], x_gcrf: Union[ndarray, Sequence], axis: int = -1) -> ndarray

Transforms a state vector (position and velocity) from the GCRF to the true equator and mean equinox of date (TEME). Both halves are rotated by rotation_gcrf_to_teme; the frames are non-rotating relative to each other, below 1e-11 rad/s, under 1e-4 m/s in low Earth orbit.

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for the transformation. A sequence evaluates one epoch per vector (or broadcasts a single vector across all epochs).

required
x_gcrf ndarray or list

State vector in GCRF frame [position (m), velocity (m/s)], shape (6,), or a batch of vectors with the 6 components along axis (for example shape (n, 6)).

required
axis int

The axis of x_gcrf along which the 6 components of a single vector lie; the remaining axes enumerate the batch. For a batch of shape (n, 6) the components lie along the last axis, so the default -1 applies; a (6, n) column layout uses axis=0.

-1

Returns:

Type Description
ndarray

numpy.ndarray: State vector in TEME frame [position (m), velocity (m/s)], shape (6,) for a single input, or the batch layout of x_gcrf (shape (n, 6) for a single vector with a sequence of n epochs).

Example
1
2
3
4
5
6
7
import brahe as bh
import numpy as np

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
state_gcrf = np.array([bh.R_EARTH + 500e3, 0.0, 0.0, 0.0, 7600.0, 0.0])
state_teme = bh.state_gcrf_to_teme(epc, state_gcrf)

state_teme_to_gcrf builtin

state_teme_to_gcrf(epc: Union[Epoch, Sequence[Epoch]], x_teme: Union[ndarray, Sequence], axis: int = -1) -> ndarray

Transforms a state vector (position and velocity) from the true equator and mean equinox of date (TEME) to the GCRF. Both halves are rotated by rotation_teme_to_gcrf; the frames are non-rotating relative to each other, below 1e-11 rad/s, under 1e-4 m/s in low Earth orbit.

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for the transformation. A sequence evaluates one epoch per vector (or broadcasts a single vector across all epochs).

required
x_teme ndarray or list

State vector in TEME frame [position (m), velocity (m/s)], shape (6,), or a batch of vectors with the 6 components along axis (for example shape (n, 6)).

required
axis int

The axis of x_teme along which the 6 components of a single vector lie; the remaining axes enumerate the batch. For a batch of shape (n, 6) the components lie along the last axis, so the default -1 applies; a (6, n) column layout uses axis=0.

-1

Returns:

Type Description
ndarray

numpy.ndarray: State vector in GCRF frame [position (m), velocity (m/s)], shape (6,) for a single input, or the batch layout of x_teme (shape (n, 6) for a single vector with a sequence of n epochs).

Example
1
2
3
4
5
6
7
import brahe as bh
import numpy as np

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
state_teme = np.array([bh.R_EARTH + 500e3, 0.0, 0.0, 0.0, 7600.0, 0.0])
state_gcrf = bh.state_teme_to_gcrf(epc, state_teme)

TEME ↔ ITRF

rotation_teme_to_itrf builtin

rotation_teme_to_itrf(epc: Union[Epoch, Sequence[Epoch]]) -> ndarray

Computes the rotation matrix transforming the true equator, mean equinox of date (TEME) to the ITRF: polar motion applied after the Greenwich mean sidereal rotation, W R3(GMST82).

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for computation of the transformation matrix. A sequence evaluates one matrix per epoch.

required

Returns:

Type Description
ndarray

numpy.ndarray: 3x3 rotation matrix transforming TEME -> ITRF, shape (3, 3) for a single epoch or (n, 3, 3) for a sequence of n epochs.

Example
1
2
3
4
5
import brahe as bh

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
R = bh.rotation_teme_to_itrf(epc)

rotation_itrf_to_teme builtin

rotation_itrf_to_teme(epc: Union[Epoch, Sequence[Epoch]]) -> ndarray

Computes the rotation matrix transforming the ITRF to the true equator, mean equinox of date (TEME): the transpose of rotation_teme_to_itrf.

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for computation of the transformation matrix. A sequence evaluates one matrix per epoch.

required

Returns:

Type Description
ndarray

numpy.ndarray: 3x3 rotation matrix transforming ITRF -> TEME, shape (3, 3) for a single epoch or (n, 3, 3) for a sequence of n epochs.

Example
1
2
3
4
5
import brahe as bh

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
R = bh.rotation_itrf_to_teme(epc)

position_teme_to_itrf builtin

position_teme_to_itrf(epc: Union[Epoch, Sequence[Epoch]], x: Union[ndarray, Sequence], axis: int = -1) -> ndarray

Transforms a position vector from the true equator, mean equinox of date (TEME) to the ITRF. Applies the Earth-rotation and polar-motion rotation W R3(GMST82).

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for the transformation. A sequence evaluates one epoch per vector (or broadcasts a single vector across all epochs).

required
x ndarray or list

Position vector in TEME frame (m), shape (3,), or a batch of vectors with the 3 components along axis (for example shape (n, 3)).

required
axis int

The axis of x along which the 3 components of a single vector lie; the remaining axes enumerate the batch. For a batch of shape (n, 3) the components lie along the last axis, so the default -1 applies; a (3, n) column layout uses axis=0.

-1

Returns:

Type Description
ndarray

numpy.ndarray: Position vector in ITRF frame (m), shape (3,) for a single input, or the batch layout of x (shape (n, 3) for a single vector with a sequence of n epochs).

Example
1
2
3
4
5
6
7
import brahe as bh
import numpy as np

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
r_teme = np.array([7000000.0, 0.0, 0.0])
r_itrf = bh.position_teme_to_itrf(epc, r_teme)

position_itrf_to_teme builtin

position_itrf_to_teme(epc: Union[Epoch, Sequence[Epoch]], x: Union[ndarray, Sequence], axis: int = -1) -> ndarray

Transforms a position vector from the ITRF to the true equator, mean equinox of date (TEME). Applies the transpose of the Earth-rotation and polar-motion rotation W R3(GMST82).

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for the transformation. A sequence evaluates one epoch per vector (or broadcasts a single vector across all epochs).

required
x ndarray or list

Position vector in ITRF frame (m), shape (3,), or a batch of vectors with the 3 components along axis (for example shape (n, 3)).

required
axis int

The axis of x along which the 3 components of a single vector lie; the remaining axes enumerate the batch. For a batch of shape (n, 3) the components lie along the last axis, so the default -1 applies; a (3, n) column layout uses axis=0.

-1

Returns:

Type Description
ndarray

numpy.ndarray: Position vector in TEME frame (m), shape (3,) for a single input, or the batch layout of x (shape (n, 3) for a single vector with a sequence of n epochs).

Example
1
2
3
4
5
6
7
import brahe as bh
import numpy as np

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
r_itrf = np.array([4000000.0, 3000000.0, 4000000.0])
r_teme = bh.position_itrf_to_teme(epc, r_itrf)

state_teme_to_itrf builtin

state_teme_to_itrf(epc: Union[Epoch, Sequence[Epoch]], x_teme: Union[ndarray, Sequence], axis: int = -1) -> ndarray

Transforms a state vector (position and velocity) from the true equator, mean equinox of date (TEME) to the ITRF. Accounts for the transport term from Earth's rotation, so the ITRF velocity is not simply a rotated TEME velocity.

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for the transformation. A sequence evaluates one epoch per vector (or broadcasts a single vector across all epochs).

required
x_teme ndarray or list

State vector in TEME frame [position (m), velocity (m/s)], shape (6,), or a batch of vectors with the 6 components along axis (for example shape (n, 6)).

required
axis int

The axis of x_teme along which the 6 components of a single vector lie; the remaining axes enumerate the batch. For a batch of shape (n, 6) the components lie along the last axis, so the default -1 applies; a (6, n) column layout uses axis=0.

-1

Returns:

Type Description
ndarray

numpy.ndarray: State vector in ITRF frame [position (m), velocity (m/s)], shape (6,) for a single input, or the batch layout of x_teme (shape (n, 6) for a single vector with a sequence of n epochs).

Example
1
2
3
4
5
6
7
import brahe as bh
import numpy as np

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
state_teme = np.array([bh.R_EARTH + 500e3, 0.0, 0.0, 0.0, 7600.0, 0.0])
state_itrf = bh.state_teme_to_itrf(epc, state_teme)

state_itrf_to_teme builtin

state_itrf_to_teme(epc: Union[Epoch, Sequence[Epoch]], x_itrf: Union[ndarray, Sequence], axis: int = -1) -> ndarray

Transforms a state vector (position and velocity) from the ITRF to the true equator, mean equinox of date (TEME). Accounts for the transport term from Earth's rotation, so the TEME velocity is not simply a rotated ITRF velocity.

Parameters:

Name Type Description Default
epc Epoch or Sequence[Epoch]

Epoch instant for the transformation. A sequence evaluates one epoch per vector (or broadcasts a single vector across all epochs).

required
x_itrf ndarray or list

State vector in ITRF frame [position (m), velocity (m/s)], shape (6,), or a batch of vectors with the 6 components along axis (for example shape (n, 6)).

required
axis int

The axis of x_itrf along which the 6 components of a single vector lie; the remaining axes enumerate the batch. For a batch of shape (n, 6) the components lie along the last axis, so the default -1 applies; a (6, n) column layout uses axis=0.

-1

Returns:

Type Description
ndarray

numpy.ndarray: State vector in TEME frame [position (m), velocity (m/s)], shape (6,) for a single input, or the batch layout of x_itrf (shape (n, 6) for a single vector with a sequence of n epochs).

Example
1
2
3
4
5
6
7
import brahe as bh
import numpy as np

bh.initialize_eop()
epc = bh.Epoch.from_datetime(2024, 1, 1, 12, 0, 0.0, 0.0, bh.TimeSystem.UTC)
state_itrf = np.array([bh.R_EARTH + 500e3, 0.0, 0.0, 0.0, 7600.0, 0.0])
state_teme = bh.state_itrf_to_teme(epc, state_itrf)

See Also