Python tools for working with Orbit Ephemeris Messages (OEMs).
The oem
package is available through pip
.
pip install oem
See the full documentation here
The OrbitEphemerisMessage
class is the primary interface for OEM Files.
from oem import OrbitEphemerisMessage
ephemeris = OrbitEphemerisMessage.open("input_file.oem")
Each OEM is made up of one or more segments of state and optional covariance data. The OrbitEphemerisMessage
class provides iterables for both.
for segment in ephemeris:
for state in segment:
print(state.epoch, state.position, state.velocity, state.acceleration)
for covariance in segment.covariances:
print(covariance.epoch, covariance.matrix)
All vectors and matrices are numpy arrays.
It is also possible to retrieve a complete list of states and covariances through the .states
and .covariances
properties. These attributes streamline interaction with single-segment ephemerides.
for state in ephemeris.states:
print(state.epoch, state.position, state.velocity)
for covariance in ephemeris.covariances:
print(covariance.epoch, covariance.matrix)
To sample a state at an arbitrary epoch, simply call the ephemeris with an astropy Time object
epoch = Time("2020-01-01T00:00:00", scale="utc")
sampled_state = ephemeris(epoch)
Note that this type of sampling is only supported if the time system of the target ephemeris is supported by astropy Time objects. The .steps
method of both OrbitEphemerisMessage
and EphemerisSegment
objects enables iterable, equal-time sampling of ephemeris data. The following example samples an OEM at a 60-second interval.
for state in oem.steps(60)
pass
The above example works for both single- and multi-segment OEMs, however the step sizes may vary at the boundary of the segments. To get consistent step sizes with multiple segments, use the segment interface directly.
for segment in oem:
for state in segment.steps(60):
pass
The OrbitEphemerisMessage
facilitates writing of OEMs. To save an already-open OEM, use .save_as
:
ephemeris.save_as("output.oem", file_format="xml")
To convert an ephemeris from one type to another, use the .convert
class method.
OrbitEphemerisMessage.convert("input_file.oem", "output_file.oem", "kvn")
This implementation follows the CCSDS recommended standards for Orbit Data Messages.
[1] Orbit Data Messages, CCSDS 502.0-B-3, 2023. Available: https://public.ccsds.org/Pubs/502x0b3e1.pdf
[2] XML Specification for Navigation Data Messages, CCSDS 505.0-B-3, 2023. Available: https://public.ccsds.org/Pubs/505x0b3.pdf