Orbit Models
Two Line Elements
- pydantic model tatc.schemas.TwoLineElements[source]
Orbit defined with standard two line elements.
Show JSON schema
{ "title": "TwoLineElements", "description": "Orbit defined with standard two line elements.", "type": "object", "properties": { "type": { "const": "tle", "default": "tle", "description": "Orbit type discriminator.", "title": "Type", "type": "string" }, "tle": { "description": "Two line elements. Multiple TLEs must be in chronological order.", "examples": [ [ "1 25544U 98067A 21156.30527927 .00003432 00000-0 70541-4 0 9993", "2 25544 51.6455 41.4969 0003508 68.0432 78.3395 15.48957534286754" ] ], "items": { "type": "string" }, "minItems": 2, "title": "Tle", "type": "array" } }, "required": [ "tle" ] }
- Fields:
tle (List[str])type (Literal['tle'])
- field tle: Annotated[List[str], AfterValidator(utils.is_chronological_tle), AfterValidator(utils.is_valid_tle), AfterValidator(utils.is_even_length_list)] [Required]
Two line elements. Multiple TLEs must be in chronological order.
- Constraints:
min_length = 2
func = <function is_even_length_list at 0x71bc28092680>
- field type: Literal['tle'] = 'tle'
Orbit type discriminator.
- as_skyfield(tle_i=0)[source]
Converts this orbit to a Skyfield EarthSatellite.
- Parameters:
tle_i (int) – the TLE index.
- Returns:
the Skyfield EarthSatellite
- Return type:
skyfield.api.EarthSatellite
- get_classification(tle_i=0) str[source]
Gets the TLE classification type (U: unclassified; C: classified).
- get_closest_tle_index(at_times: datetime | List[datetime]) int | List[int][source]
Gets the closest TLE index to specified time(s).
- get_derived_orbit(delta_mean_anomaly: float, delta_raan: float) TwoLineElements[source]
Gets a derived orbit with perturbations to the mean anomaly and right ascension of ascending node.
- Parameters:
- Returns:
the derived orbit
- Return type:
- get_epoch(tle_i=0) datetime[source]
Gets the TLE epoch time.
- Parameters:
tle_i (int) – the TLE index.
- Returns:
the epoch datetime
- Return type:
datetime
- get_first_derivative_mean_motion(tle_i=0) float[source]
Gets the first derivative of mean motion (ballistic coefficient).
- get_observation_events(point: Point, start: datetime, end: datetime, min_elevation_angle: float, try_repeat: bool | None = None) tuple[source]
Gets the observation events of this orbit using Skyfield.
- Parameters:
point (Point) – Target location to observe.
start (datetime) – Start time of the observation period.
end (datetime) – End time of the observation period.
min_elevation_angle (float) – Minimum elevation angle (deg) to constrain observation.
try_repeat (bool) – True, if a repeat orbit should be used to improve long-term accuracy.
- Returns:
the orbit track position/velocity
- Return type:
skyfield.positionlib.Geocentric
- get_orbit_period(tle_i=0) timedelta[source]
Gets the approximate orbit period.
- Parameters:
tle_i (int) – the TLE index.
- Returns:
the orbit period
- Return type:
timedelta
- get_orbit_track(times: datetime | List[datetime], try_repeat: bool | None = None) Geocentric[source]
Gets the orbit track of this orbit using Skyfield.
- Parameters:
times (Union[datetime, List[datetime]]) – time(s) at which to compute position/velocity.
try_repeat (bool) – True, if a repeat orbit should be used to improve long-term accuracy.
- Returns:
the orbit track position/velocity
- Return type:
skyfield.positionlib.Geocentric
- get_repeat_cycle(max_delta_position: float | None = None, max_delta_velocity: float | None = None, min_elevation_angle: float | None = None, max_search_duration: timedelta | None = None, lazy_load: bool | None = None) timedelta[source]
Compute the orbit repeat cycle. Lazy-loads a previously-computed repeat cycle if available.
- Parameters:
max_delta_position (float) – the maximum difference in position (m) allowed for a repeat.
max_delta_velocity (float) – the maximum difference in velocity (m/s) allowed for a repeat.
min_elevation_angle (float) – the minimum elevation angle (deg) for screening repeats.
max_search_duration (timedelta) – the maximum period of time to search for repeats.
lazy_load (bool) – True, if the previously-computed repeat cycle should be loaded.
- Returns:
the repeat cycle duration (if it exists)
- Return type:
timedelta
- get_revolution_number_at_epoch(tle_i=0) int[source]
Gets the revolution number at epoch.
- Parameters:
tle_i (int) – the TLE index.
- Returns:
the revolution number
- Return type:
timedelta
- get_right_ascension_ascending_node(tle_i=0) float[source]
Gets the right ascension of ascending node (decimal degrees).
- get_second_derivative_mean_motion(tle_i=0) float[source]
Gets the second derivative of mean motion.
- get_tle_count() int[source]
Gets the number of TLEs specified for this orbit.
- Returns:
the number of TLEs
- Return type:
- partition_by_tle_index(start: datetime, end: datetime) Tuple[List[datetime], List[int]][source]
Partition a timeline based on closest TLE index.
- Parameters:
start (datetime) – Start time.
end (datetime) – End time.
- Returns:
list of partitioned times and assigned TLE indices
- Return type:
Tuple[List[datetime], List[int]]
- to_tle() TwoLineElements[source]
Converts this orbit to a two line elements representation.
- Returns:
the two line elements orbit
- Return type:
Circular Orbit
- pydantic model tatc.schemas.CircularOrbit[source]
Orbit specification using Keplerian elements for elliptical motion – circular motion case.
Show JSON schema
{ "title": "CircularOrbit", "description": "Orbit specification using Keplerian elements for elliptical motion -- circular motion case.", "type": "object", "properties": { "altitude": { "description": "Mean altitude (meters).", "title": "Altitude", "type": "number" }, "true_anomaly": { "default": 0, "description": "True anomaly (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "True Anomaly", "type": "number" }, "epoch": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "default": "2025-10-15T22:46:44.656850Z", "description": "Timestamp (epoch) of the initial orbital state.", "title": "Epoch" }, "type": { "const": "circular", "default": "circular", "description": "Orbit type discriminator.", "title": "Type", "type": "string" }, "inclination": { "default": 0, "description": "Inclination (degrees).", "exclusiveMaximum": 180, "minimum": 0, "title": "Inclination", "type": "number" }, "right_ascension_ascending_node": { "default": 0, "description": "Right ascension of ascending node (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "Right Ascension Ascending Node", "type": "number" } }, "required": [ "altitude" ] }
- Fields:
altitude (float)epoch (datetime.datetime | None)inclination (float)right_ascension_ascending_node (float)true_anomaly (float)type (Literal['circular'])
- field epoch: datetime | None = datetime.datetime(2025, 10, 15, 22, 46, 44, 656850, tzinfo=datetime.timezone.utc)
Timestamp (epoch) of the initial orbital state.
- field right_ascension_ascending_node: float = 0
Right ascension of ascending node (degrees).
- Constraints:
ge = 0
lt = 360
- field type: Literal['circular'] = 'circular'
Orbit type discriminator.
- get_derived_orbit(delta_mean_anomaly: float, delta_raan: float) CircularOrbit[source]
Gets a derived orbit with perturbations to the mean anomaly and right ascension of ascending node.
- Parameters:
- Returns:
the derived orbit
- Return type:
- get_mean_anomaly() float
Gets the mean anomaly (decimal degrees).
- Returns:
the mean anomaly
- Return type:
- get_mean_motion() float
Gets the mean motion (revolutions per day).
- Returns:
the mean motion
- Return type:
- get_orbit_period() timedelta
Gets the approximate orbit period.
- Returns:
the orbit period
- Return type:
timedelta
- get_semimajor_axis() float
Gets the semimajor axis (meters).
- Returns:
the semimajor axis
- Return type:
Sun-synchronous Orbit
- pydantic model tatc.schemas.SunSynchronousOrbit[source]
Orbit defined by sun synchronous parameters.
Show JSON schema
{ "title": "SunSynchronousOrbit", "description": "Orbit defined by sun synchronous parameters.", "type": "object", "properties": { "altitude": { "description": "Mean altitude (meters).", "exclusiveMaximum": 5980991.228584941, "minimum": 0, "title": "Altitude", "type": "number" }, "true_anomaly": { "default": 0, "description": "True anomaly (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "True Anomaly", "type": "number" }, "epoch": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "default": "2025-10-15T22:46:44.656850Z", "description": "Timestamp (epoch) of the initial orbital state.", "title": "Epoch" }, "type": { "const": "sso", "default": "sso", "description": "Orbit type discriminator.", "title": "Type", "type": "string" }, "equator_crossing_time": { "description": "Equator crossing time (local solar time).", "format": "time", "title": "Equator Crossing Time", "type": "string" }, "equator_crossing_ascending": { "default": true, "description": "True, if the equator crossing time is ascending (south-to-north).", "title": "Equator Crossing Ascending", "type": "boolean" } }, "required": [ "altitude", "equator_crossing_time" ] }
- Fields:
altitude (float)epoch (datetime.datetime | None)equator_crossing_ascending (bool)equator_crossing_time (datetime.time)true_anomaly (float)type (Literal['sso'])
- field altitude: float [Required]
Mean altitude (meters).
- Constraints:
ge = 0
lt = 5980991.228584941
- field epoch: datetime | None = datetime.datetime(2025, 10, 15, 22, 46, 44, 656850, tzinfo=datetime.timezone.utc)
Timestamp (epoch) of the initial orbital state.
- field equator_crossing_ascending: bool = True
True, if the equator crossing time is ascending (south-to-north).
- field equator_crossing_time: time [Required]
Equator crossing time (local solar time).
- field type: Literal['sso'] = 'sso'
Orbit type discriminator.
- get_derived_orbit(delta_mean_anomaly: float, delta_raan: float) CircularOrbit[source]
Gets a derived orbit with perturbations to the mean anomaly and right ascension of ascending node.
- Parameters:
- Returns:
the derived orbit
- Return type:
- get_inclination() float[source]
Gets the inclination (decimal degrees).
- Returns:
the inclination
- Return type:
- get_mean_anomaly() float
Gets the mean anomaly (decimal degrees).
- Returns:
the mean anomaly
- Return type:
- get_mean_motion() float
Gets the mean motion (revolutions per day).
- Returns:
the mean motion
- Return type:
- get_orbit_period() timedelta
Gets the approximate orbit period.
- Returns:
the orbit period
- Return type:
timedelta
- get_right_ascension_ascending_node() float[source]
Gets the right ascension of ascending node (decimal degrees).
- Returns:
the right ascension of ascending node
- Return type:
- get_semimajor_axis() float
Gets the semimajor axis (meters).
- Returns:
the semimajor axis
- Return type:
Keplerian Orbit
- pydantic model tatc.schemas.KeplerianOrbit[source]
Orbit specification using Keplerian elements for elliptical motion.
Show JSON schema
{ "title": "KeplerianOrbit", "description": "Orbit specification using Keplerian elements for elliptical motion.", "type": "object", "properties": { "altitude": { "description": "Mean altitude (meters).", "title": "Altitude", "type": "number" }, "true_anomaly": { "default": 0, "description": "True anomaly (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "True Anomaly", "type": "number" }, "epoch": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "default": "2025-10-15T22:46:44.656850Z", "description": "Timestamp (epoch) of the initial orbital state.", "title": "Epoch" }, "type": { "const": "keplerian", "default": "keplerian", "description": "Orbit type discriminator.", "title": "Type", "type": "string" }, "inclination": { "default": 0, "description": "Inclination (degrees).", "exclusiveMaximum": 180, "minimum": 0, "title": "Inclination", "type": "number" }, "right_ascension_ascending_node": { "default": 0, "description": "Right ascension of ascending node (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "Right Ascension Ascending Node", "type": "number" }, "eccentricity": { "default": 0, "description": "Eccentricity.", "minimum": 0, "title": "Eccentricity", "type": "number" }, "perigee_argument": { "default": 0, "description": "Perigee argument (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "Perigee Argument", "type": "number" } }, "required": [ "altitude" ] }
- Fields:
altitude ()eccentricity (float)epoch ()inclination ()perigee_argument (float)right_ascension_ascending_node ()true_anomaly ()type (Literal['keplerian'])
- field epoch: datetime | None = datetime.datetime(2025, 10, 15, 22, 46, 44, 656850, tzinfo=datetime.timezone.utc)
Timestamp (epoch) of the initial orbital state.
- field right_ascension_ascending_node: float = 0
Right ascension of ascending node (degrees).
- Constraints:
ge = 0
lt = 360
- field type: Literal['keplerian'] = 'keplerian'
Orbit type discriminator.
- get_derived_orbit(delta_mean_anomaly: float, delta_raan: float) KeplerianOrbit[source]
Gets a derived orbit with perturbations to the mean anomaly and right ascension of ascending node.
- Parameters:
- Returns:
the derived orbit
- Return type:
- get_mean_anomaly() float[source]
Gets the mean anomaly (decimal degrees).
- Returns:
the mean anomaly
- Return type:
- get_mean_motion() float
Gets the mean motion (revolutions per day).
- Returns:
the mean motion
- Return type:
- get_orbit_period() timedelta
Gets the approximate orbit period.
- Returns:
the orbit period
- Return type:
timedelta
- get_semimajor_axis() float
Gets the semimajor axis (meters).
- Returns:
the semimajor axis
- Return type:
Molniya Orbit
- pydantic model tatc.schemas.MolniyaOrbit[source]
Orbit defined by Molniya parameters. The altitude parameter is considered the altitude at perigee.
Show JSON schema
{ "title": "MolniyaOrbit", "description": "Orbit defined by Molniya parameters. The altitude parameter is considered the altitude at perigee.", "type": "object", "properties": { "altitude": { "description": "Mean altitude (meters).", "title": "Altitude", "type": "number" }, "true_anomaly": { "default": 0, "description": "True anomaly (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "True Anomaly", "type": "number" }, "epoch": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "default": "2025-10-15T22:46:44.656850Z", "description": "Timestamp (epoch) of the initial orbital state.", "title": "Epoch" }, "type": { "const": "molniya", "default": "molniya", "description": "Orbit type discriminator.", "title": "Type", "type": "string" }, "inclination": { "default": 0, "description": "Inclination (degrees).", "exclusiveMaximum": 180, "minimum": 0, "title": "Inclination", "type": "number" }, "right_ascension_ascending_node": { "default": 0, "description": "Right ascension of ascending node (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "Right Ascension Ascending Node", "type": "number" }, "orbital_period": { "default": 43080, "description": "Orbital period (seconds).", "exclusiveMinimum": 0, "title": "Orbital Period", "type": "number" }, "perigee_argument": { "default": 0, "description": "Perigee argument (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "Perigee Argument", "type": "number" } }, "required": [ "altitude" ] }
- Fields:
altitude (float)epoch (datetime.datetime | None)inclination (float)orbital_period (float)perigee_argument (float)right_ascension_ascending_node (float)true_anomaly (float)type (Literal['molniya'])
- field epoch: datetime | None = datetime.datetime(2025, 10, 15, 22, 46, 44, 656850, tzinfo=datetime.timezone.utc)
Timestamp (epoch) of the initial orbital state.
- field right_ascension_ascending_node: float = 0
Right ascension of ascending node (degrees).
- Constraints:
ge = 0
lt = 360
- field type: Literal['molniya'] = 'molniya'
Orbit type discriminator.
- get_derived_orbit(delta_mean_anomaly: float, delta_raan: float) MolniyaOrbit[source]
Gets a derived orbit with perturbations to the mean anomaly and right ascension of ascending node.
- get_eccentricity() float[source]
Gets the eccentricity (float between 0 and 1).
- Returns:
the eccentricity
- Return type:
- get_mean_anomaly() float[source]
Gets the mean anomaly (decimal degrees).
- Returns:
the mean anomaly
- Return type:
- get_mean_motion() float
Gets the mean motion (revolutions per day).
- Returns:
the mean motion
- Return type:
- get_orbit_period() timedelta
Gets the approximate orbit period.
- Returns:
the orbit period
- Return type:
timedelta
- get_semimajor_axis() float[source]
Gets the semimajor axis (meters).
- Returns:
the semimajor axis
- Return type:
Tundra Orbit
- pydantic model tatc.schemas.TundraOrbit[source]
Orbit defined by Tundra parameters, inherits the Molniya class.
Show JSON schema
{ "title": "TundraOrbit", "description": "Orbit defined by Tundra parameters, inherits the Molniya class.", "type": "object", "properties": { "altitude": { "description": "Mean altitude (meters).", "title": "Altitude", "type": "number" }, "true_anomaly": { "default": 0, "description": "True anomaly (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "True Anomaly", "type": "number" }, "epoch": { "anyOf": [ { "format": "date-time", "type": "string" }, { "type": "null" } ], "default": "2025-10-15T22:46:44.656850Z", "description": "Timestamp (epoch) of the initial orbital state.", "title": "Epoch" }, "type": { "const": "tundra", "default": "tundra", "description": "Orbit type discriminator.", "title": "Type", "type": "string" }, "inclination": { "default": 63.4, "description": "Inclination (degrees).", "exclusiveMaximum": 180, "minimum": 0, "title": "Inclination", "type": "number" }, "right_ascension_ascending_node": { "default": 0, "description": "Right ascension of ascending node (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "Right Ascension Ascending Node", "type": "number" }, "orbital_period": { "default": 86400, "description": "Orbital period (seconds).", "exclusiveMinimum": 0, "title": "Orbital Period", "type": "number" }, "perigee_argument": { "default": 270, "description": "Perigee argument (degrees).", "exclusiveMaximum": 360, "minimum": 0, "title": "Perigee Argument", "type": "number" }, "eccentricity": { "default": 0.2, "description": "Eccentricity.", "minimum": 0, "title": "Eccentricity", "type": "number" } }, "required": [ "altitude" ] }
- Fields:
altitude ()eccentricity (float)epoch ()inclination (float)orbital_period (float)perigee_argument (float)right_ascension_ascending_node ()true_anomaly ()type (Literal['tundra'])
- field epoch: datetime | None = datetime.datetime(2025, 10, 15, 22, 46, 44, 656850, tzinfo=datetime.timezone.utc)
Timestamp (epoch) of the initial orbital state.
- field right_ascension_ascending_node: float = 0
Right ascension of ascending node (degrees).
- Constraints:
ge = 0
lt = 360
- field type: Literal['tundra'] = 'tundra'
Orbit type discriminator.
- get_derived_orbit(delta_mean_anomaly: float, delta_raan: float) TundraOrbit[source]
Gets a derived orbit with perturbations to the mean anomaly and right ascension of ascending node.
- get_eccentricity()[source]
Gets the eccentricity (float between 0 and 1).
- Returns:
the eccentricity
- Return type:
- get_mean_anomaly() float
Gets the mean anomaly (decimal degrees).
- Returns:
the mean anomaly
- Return type:
- get_mean_motion() float
Gets the mean motion (revolutions per day).
- Returns:
the mean motion
- Return type:
- get_orbit_period() timedelta
Gets the approximate orbit period.
- Returns:
the orbit period
- Return type:
timedelta
- get_semimajor_axis() float
Gets the semimajor axis (meters).
- Returns:
the semimajor axis
- Return type:
- to_tle(lazy_load: bool | None = None) TwoLineElements
Converts this orbit to a two line elements representation.
- Parameters:
lazy_load (bool) – True, if this tle should be lazy-loaded.
- Returns:
the two line elements orbit
- Return type: