Quick Start

Let's suppose we obtained the Orbit Mean-Elements Message (OMM) below describing the orbit of the Amazonia 1 satellite. This is the XML format returned by services such as Space-Track:

<?xml version="1.0" encoding="utf-8"?>
<ndm><omm id="CCSDS_OMM_VERS" version="3.0">
  <header>
    <COMMENT>GENERATED VIA SPACE-TRACK.ORG API</COMMENT>
    <CREATION_DATE>2025-12-30T23:36:37</CREATION_DATE>
    <ORIGINATOR>18 SPCS</ORIGINATOR>
  </header>
  <body><segment>
    <metadata>
      <OBJECT_NAME>AMAZONIA 1</OBJECT_NAME>
      <OBJECT_ID>2021-015A</OBJECT_ID>
      <CENTER_NAME>EARTH</CENTER_NAME>
      <REF_FRAME>TEME</REF_FRAME>
      <TIME_SYSTEM>UTC</TIME_SYSTEM>
      <MEAN_ELEMENT_THEORY>SGP4</MEAN_ELEMENT_THEORY>
    </metadata>
    <data>
      <meanElements>
        <EPOCH>2025-12-30T18:12:04.533984</EPOCH>
        <MEAN_MOTION>14.40772474</MEAN_MOTION>
        <ECCENTRICITY>0.00011240</ECCENTRICITY>
        <INCLINATION>98.3721</INCLINATION>
        <RA_OF_ASC_NODE>75.0877</RA_OF_ASC_NODE>
        <ARG_OF_PERICENTER>97.3772</ARG_OF_PERICENTER>
        <MEAN_ANOMALY>262.7545</MEAN_ANOMALY>
      </meanElements>
    </data>
  </segment></body>
</omm></ndm>

Assuming the string above is stored in the variable omm_xml, we can parse it into an OrbitMeanElementsMessage object using parse_omm:

julia> omm = parse_omm(omm_xml)OrbitMeanElementsMessage:
  ├─ Header
  │    Comment       : GENERATED VIA SPACE-TRACK.ORG API
  │    Creation Date : 2025-12-30T23:36:37
  │    Originator    : 18 SPCS
  ├─ Metadata
  │    Object Name         : AMAZONIA 1
  │    Object ID           : 2021-015A
  │    Center Name         : EARTH
  │    Ref. Frame          : TEME
  │    Time System         : UTC
  │    Mean Element Theory : SGP4
  └─ Data
       ├─ Mean Keplerian Elements
       │    Epoch              : 2025-12-30T18:12:04.533984
       │    Mean Motion        : 14.40772474 rev/day
       │    Eccentricity       : 0.0001124
       │    Inclination        : 98.3721°
       │    RA of Asc. Node    : 75.0877°
       │    Arg. of Pericenter : 97.3772°
       │    Mean Anomaly       : 262.7545°
       └─ TLE Related Parameters
            Ephemeris Type      : 0
            Classification Type : U
            NORAD Cat ID        : 47699
            Element Set Number  : 999
            Rev at Epoch        : 25439
            B*                  : 0.0001533 1/ER
            ∂(Mean Motion)/∂t   : 4.47e-6 rev/day²
            ∂²(Mean Motion)/∂t² : 0.0 rev/day³

The message fields are organized into the three sections defined by the CCSDS standard (header, metadata, and data). We can access them directly:

julia> omm.header.originator"18 SPCS"
julia> omm.metadata.object_name"AMAZONIA 1"
julia> omm.data.epoch2025-12-30T18:12:04.533984
julia> omm.data.inclination98.3721

Every field of the sections is also available as a property of the message itself, which flattens the hierarchy for the common fields:

julia> omm.originator"18 SPCS"
julia> omm.object_name"AMAZONIA 1"
julia> omm.epoch2025-12-30T18:12:04.533984
julia> omm.inclination98.3721

The only exception is the comments field, which exists in every section and must be accessed through it (e.g. omm.header.comments). See OrbitMeanElementsMessage for the details.

If the OMM is stored in a file, use read_omm instead:

omm = read_omm("amazonia_1.xml")

From here, you can explore the rest of the manual to learn how to create OMMs from scratch, write them to files, fetch them online, or convert them to a TLE.