Skip to content

Osculating elements in OMM seem to change when creating an EarthSatellite object #1037

Open
@scottshambaugh

Description

@scottshambaugh

I am comparing orbital elements before and after creation of an EarthSatellite from an OMM, and am getting slightly different values. I expect this is benign, but am not sure what's going on.

Here's a quick example script that shows what's happening:

from skyfield.api import EarthSatellite, load
from skyfield.elementslib import osculating_elements_of

ts = load.timescale()
omm_data = {
    'OBJECT_NAME': 'TEST SAT',
    'OBJECT_ID': '2024-001A',
    'NORAD_CAT_ID': '12345',
    'EPOCH': '2024-01-01T00:00:00.000000',
    'MEAN_MOTION': 15.5,      # rev/day
    'ECCENTRICITY': 0.01,     # unitless
    'INCLINATION': 51.6,      # degrees
    'RA_OF_ASC_NODE': 180.0,  # degrees
    'ARG_OF_PERICENTER': 0.0, # degrees
    'MEAN_ANOMALY': 0.0,      # degrees
    'BSTAR': 0.0,             # 1/earth radius
    'MEAN_MOTION_DOT': 0.0,   # rev/day^2
    'MEAN_MOTION_DDOT': 0.0,  # rev/day^3
    'CLASSIFICATION_TYPE': 'U',
    'EPHEMERIS_TYPE': '0',
    'ELEMENT_SET_NO': '999',
    'REV_AT_EPOCH': '0',
}
sat = EarthSatellite.from_omm(ts, omm_data)

pos = sat.at(sat.epoch)
osc_elements = osculating_elements_of(pos)  # ICRF frame

print(sat.epoch.utc)
print(osc_elements.eccentricity, omm_data['ECCENTRICITY'])
print(osc_elements.inclination.degrees, omm_data['INCLINATION'])
print(osc_elements.longitude_of_ascending_node.degrees, omm_data['RA_OF_ASC_NODE'])
print(osc_elements.argument_of_periapsis.degrees, omm_data['ARG_OF_PERICENTER'])
print(osc_elements.mean_anomaly.degrees, omm_data['MEAN_ANOMALY'])

# All values are at least somewhat different.
'''
CalendarTuple(year=2024, month=1, day=1, hour=0, minute=0, second=0.0)
0.010881909723842008 0.01
51.62267299309298 51.6
179.58708119720018 180.0
4.705040984693307 0.0
355.46545250154924 0.0
'''

I thought this might have to do with the frame conversion between TEME and ICRF, but when I try to check it the results are very roughly the same as before.

from skyfield.sgp4lib import TEME
osc_elements = osculating_elements_of(pos, reference_frame=TEME.rotation_at(sat.epoch))  # TEME frame

'''
CalendarTuple(year=2024, month=1, day=1, hour=0, minute=0, second=0.0)
0.010881909723847644 0.01
51.61995468574305 51.6
179.99991187961967 180.0
4.535383674828455 0.0
355.46545250155054 0.0
'''

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions