Space System Models
Instrument
- pydantic model tatc.schemas.Instrument[source]
Remote sensing instrument.
Show JSON schema
{ "title": "Instrument", "description": "Remote sensing instrument.", "type": "object", "properties": { "name": { "default": "Default", "description": "Instrument name.", "title": "Name", "type": "string" }, "field_of_regard": { "default": 180, "description": "Angular field (degrees) of possible observations (with pointing).", "examples": [ 50 ], "exclusiveMinimum": 0, "maximum": 360, "title": "Field Of Regard", "type": "number" }, "min_access_time": { "default": "PT0S", "description": "Minimum access (integration) time to record an observation.", "examples": [ "PT10S" ], "format": "duration", "title": "Min Access Time", "type": "string" }, "req_self_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required instrument sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Self Sunlit" }, "req_target_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required target sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Target Sunlit" }, "access_time_fixed": { "default": false, "description": "`True`, if access time is fixed to minimum value.", "title": "Access Time Fixed", "type": "boolean" } } }
- Fields:
access_time_fixed (bool)field_of_regard (float)min_access_time (datetime.timedelta)name (str)req_self_sunlit (bool | None)req_target_sunlit (bool | None)
- field field_of_regard: float = 180
Angular field (degrees) of possible observations (with pointing).
- Constraints:
gt = 0
le = 360
- field min_access_time: timedelta = datetime.timedelta(0)
Minimum access (integration) time to record an observation.
- field req_self_sunlit: bool | None = None
Required instrument sunlit state for valid observation (True: sunlit, False: eclipse, None: no requirement).
- field req_target_sunlit: bool | None = None
Required target sunlit state for valid observation (True: sunlit, False: eclipse, None: no requirement).
- compute_footprint(orbit_track: Geocentric, number_points: int | None = None, elevation: float = 0) Geometry | List[Geometry][source]
Compute the instanteous instrument footprint.
- Parameters:
- Returns:
The instrument footprint(s).
- Return type:
Union[shapely.Geometry, List[shapely.Geometry]
- compute_footprint_center(orbit_track: Geocentric, elevation: float = 0) GeographicPosition[source]
Compute the center of an instaneous instrument footprint.
- Parameters:
orbit_track (skyfield.positionlib.Geocentric) – The satellite position/velocity.
elevation (float) – The elevation (meters) at which project the footprint.
- Returns:
The instrument footprint center.
- Return type:
skyfield.toposlib.GeographicPosition
- get_min_elevation_angle(height: float) float[source]
Get the minimum elevation angle required to observe a point.
- get_swath_width(height: float) float[source]
Gets the instrument swath width projected to the Earth’s surface.
- is_valid_observation(orbit_track: Geocentric, target: GeographicPosition | None = None) bool | ndarray[tuple[int, ...], dtype[_ScalarType_co]][source]
Determines if an instrument can provide a valid observations.
- Parameters:
orbit_track (skyfield.positionlib.Geocentric) – orbit track position/velocity from Skyfield
target (skyfield.toposlib.GeographicPosition) – target position from Skyfield
- Returns:
Array of indicators: True if instrument provides a valid observation.
- Return type:
numpy.typing.NDArray
Pointed Instrument
- pydantic model tatc.schemas.PointedInstrument[source]
Remote sensing instrument with optional off-nadir orientation.
Show JSON schema
{ "title": "PointedInstrument", "description": "Remote sensing instrument with optional off-nadir orientation.", "type": "object", "properties": { "name": { "default": "Default", "description": "Instrument name.", "title": "Name", "type": "string" }, "field_of_regard": { "default": 180, "description": "Angular field (degrees) of possible observations (with pointing).", "examples": [ 50 ], "exclusiveMinimum": 0, "maximum": 360, "title": "Field Of Regard", "type": "number" }, "min_access_time": { "default": "PT0S", "description": "Minimum access (integration) time to record an observation.", "examples": [ "PT10S" ], "format": "duration", "title": "Min Access Time", "type": "string" }, "req_self_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required instrument sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Self Sunlit" }, "req_target_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required target sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Target Sunlit" }, "access_time_fixed": { "default": false, "description": "`True`, if access time is fixed to minimum value.", "title": "Access Time Fixed", "type": "boolean" }, "cross_track_field_of_view": { "description": "Angular field (degrees) of view orthogonal to instrument motion.", "exclusiveMinimum": 0, "maximum": 180, "title": "Cross Track Field Of View", "type": "number" }, "along_track_field_of_view": { "description": "Angular field (degrees) of view in direction of instrument motion.", "exclusiveMinimum": 0, "maximum": 180, "title": "Along Track Field Of View", "type": "number" }, "roll_angle": { "default": 0, "description": "Left/right look angle (degrees) orthogonal to instrument motion.", "maximum": 180, "minimum": -180, "title": "Roll Angle", "type": "number" }, "pitch_angle": { "default": 0, "description": "Fore/aft look angle (degrees) in direction of instrument motion.", "maximum": 180, "minimum": -180, "title": "Pitch Angle", "type": "number" }, "is_rectangular": { "default": false, "description": "True, if this instrument produces a rectangular view.", "title": "Is Rectangular", "type": "boolean" }, "cross_track_pixels": { "default": 1, "description": "Number of pixels in cross-track direction.", "minimum": 1, "title": "Cross Track Pixels", "type": "integer" }, "along_track_pixels": { "default": 1, "description": "Number of pixels in along-track direction.", "minimum": 1, "title": "Along Track Pixels", "type": "integer" }, "cross_track_oversampling": { "default": 0, "description": "Fraction of pixel overlap in cross-track diraction.", "exclusiveMaximum": 1, "minimum": 0, "title": "Cross Track Oversampling", "type": "number" }, "along_track_oversampling": { "default": 0, "description": "Fraction of pixel overlap in along-track diraction.", "exclusiveMaximum": 1, "minimum": 0, "title": "Along Track Oversampling", "type": "number" } }, "required": [ "cross_track_field_of_view", "along_track_field_of_view" ] }
- Fields:
along_track_field_of_view (float)along_track_oversampling (float)along_track_pixels (int)cross_track_field_of_view (float)cross_track_oversampling (float)cross_track_pixels (int)is_rectangular (bool)pitch_angle (float)roll_angle (float)
- field along_track_field_of_view: float [Required]
Angular field (degrees) of view in direction of instrument motion.
- Constraints:
gt = 0
le = 180
- field along_track_oversampling: float = 0
Fraction of pixel overlap in along-track diraction.
- Constraints:
ge = 0
lt = 1
- field cross_track_field_of_view: float [Required]
Angular field (degrees) of view orthogonal to instrument motion.
- Constraints:
gt = 0
le = 180
- field cross_track_oversampling: float = 0
Fraction of pixel overlap in cross-track diraction.
- Constraints:
ge = 0
lt = 1
- field pitch_angle: float = 0
Fore/aft look angle (degrees) in direction of instrument motion.
- Constraints:
ge = -180
le = 180
- field roll_angle: float = 0
Left/right look angle (degrees) orthogonal to instrument motion.
- Constraints:
ge = -180
le = 180
- compute_footprint(orbit_track: Geocentric, number_points: int | None = None, elevation: float = 0) Geometry | List[Geometry][source]
Compute the instanteous instrument footprint.
- Parameters:
- Returns:
The instrument footprint(s).
- Return type:
Union[shapely.Geometry, List[shapely.Geometry]
- compute_footprint_center(orbit_track: Geocentric, elevation: float = 0) GeographicPosition[source]
Compute the center of an instaneous instrument footprint.
- Parameters:
orbit_track (skyfield.positionlib.Geocentric) – The satellite position/velocity.
elevation (float) – The elevation (meters) at which project the footprint.
- Returns:
The instrument footprint center.
- Return type:
skyfield.toposlib.GeographicPosition
- compute_footprint_pixel_array(orbit_track: Geocentric, elevation: float = 0) MultiPoint | List[MultiPoint][source]
Compute the instanteous footprint pixel array.
- Parameters:
orbit_track (skyfield.positionlib.Geocentric) – The satellite position/velocity.
elevation (float) – The elevation (meters) at which project the footprint.
- Returns:
The instrument pixel array(s).
- Return type:
Union[shapely.geometry.MultiPoint, List[shapely.geometry.MultiPoint]]
- compute_projected_pixel_position(orbit_track: Geocentric, cross_track_index: int, along_track_index: int, elevation: float = 0) GeographicPosition[source]
Get the location of a projected pixel.
- Parameters:
- Returns:
the geographic position of the projected pixel
- Return type:
(skyfield.toposlib.GeographicPosition)
- get_along_track_instantaneous_field_of_view() float[source]
Gets the instananeous field of view (degrees) for along-track pixels.
- Returns:
the along-track instantaneous pixel field of view (degrees)
- Return type:
- get_cross_track_instantaneous_field_of_view() float[source]
Gets the instananeous field of view (degrees) for cross-track pixels.
- Returns:
the cross-track instantaneous pixel field of view (degrees)
- Return type:
Satellite
- pydantic model tatc.schemas.Satellite[source]
Single satellite.
Show JSON schema
{ "title": "Satellite", "description": "Single satellite.", "type": "object", "properties": { "name": { "description": "Space system name.", "examples": [ "International Space Station" ], "title": "Name", "type": "string" }, "orbit": { "anyOf": [ { "$ref": "#/$defs/TwoLineElements" }, { "$ref": "#/$defs/CircularOrbit" }, { "$ref": "#/$defs/SunSynchronousOrbit" }, { "$ref": "#/$defs/KeplerianOrbit" } ], "description": "Orbit specification.", "title": "Orbit" }, "instruments": { "default": [ { "name": "Default", "field_of_regard": 180.0, "min_access_time": "PT0S", "req_self_sunlit": null, "req_target_sunlit": null, "access_time_fixed": false } ], "description": "List of assigned instruments.", "items": { "$ref": "#/$defs/Instrument" }, "minItems": 1, "title": "Instruments", "type": "array" }, "type": { "const": "satellite", "default": "satellite", "description": "Space system type discriminator.", "title": "Type", "type": "string" } }, "$defs": { "CircularOrbit": { "description": "Orbit specification using Keplerian elements for elliptical motion -- circular motion case.", "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" ], "title": "CircularOrbit", "type": "object" }, "Instrument": { "description": "Remote sensing instrument.", "properties": { "name": { "default": "Default", "description": "Instrument name.", "title": "Name", "type": "string" }, "field_of_regard": { "default": 180, "description": "Angular field (degrees) of possible observations (with pointing).", "examples": [ 50 ], "exclusiveMinimum": 0, "maximum": 360, "title": "Field Of Regard", "type": "number" }, "min_access_time": { "default": "PT0S", "description": "Minimum access (integration) time to record an observation.", "examples": [ "PT10S" ], "format": "duration", "title": "Min Access Time", "type": "string" }, "req_self_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required instrument sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Self Sunlit" }, "req_target_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required target sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Target Sunlit" }, "access_time_fixed": { "default": false, "description": "`True`, if access time is fixed to minimum value.", "title": "Access Time Fixed", "type": "boolean" } }, "title": "Instrument", "type": "object" }, "KeplerianOrbit": { "description": "Orbit specification using Keplerian elements for elliptical motion.", "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" ], "title": "KeplerianOrbit", "type": "object" }, "SunSynchronousOrbit": { "description": "Orbit defined by sun synchronous parameters.", "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" ], "title": "SunSynchronousOrbit", "type": "object" }, "TwoLineElements": { "description": "Orbit defined with standard two line elements.", "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" ], "title": "TwoLineElements", "type": "object" } }, "required": [ "name", "orbit" ] }
- Fields:
instruments (List[tatc.schemas.instrument.Instrument])name (str)orbit (tatc.schemas.orbit.TwoLineElements | tatc.schemas.orbit.CircularOrbit | tatc.schemas.orbit.SunSynchronousOrbit | tatc.schemas.orbit.KeplerianOrbit)type (Literal['satellite'])
- field instruments: List[Instrument] = [Instrument(name='Default', field_of_regard=180, min_access_time=datetime.timedelta(0), req_self_sunlit=None, req_target_sunlit=None, access_time_fixed=False)]
List of assigned instruments.
- Constraints:
min_length = 1
- field orbit: TwoLineElements | CircularOrbit | SunSynchronousOrbit | KeplerianOrbit [Required]
Orbit specification.
- field type: Literal['satellite'] = 'satellite'
Space system type discriminator.
Train Constellation
- pydantic model tatc.schemas.TrainConstellation[source]
A constellation that arranges member satellites in sequence.
Show JSON schema
{ "title": "TrainConstellation", "description": "A constellation that arranges member satellites in sequence.", "type": "object", "properties": { "name": { "description": "Space system name.", "examples": [ "International Space Station" ], "title": "Name", "type": "string" }, "orbit": { "anyOf": [ { "$ref": "#/$defs/TwoLineElements" }, { "$ref": "#/$defs/SunSynchronousOrbit" }, { "$ref": "#/$defs/CircularOrbit" }, { "$ref": "#/$defs/KeplerianOrbit" } ], "description": "Lead orbit for this constellation.", "title": "Orbit" }, "instruments": { "default": [ { "name": "Default", "field_of_regard": 180.0, "min_access_time": "PT0S", "req_self_sunlit": null, "req_target_sunlit": null, "access_time_fixed": false } ], "description": "List of assigned instruments.", "items": { "$ref": "#/$defs/Instrument" }, "minItems": 1, "title": "Instruments", "type": "array" }, "type": { "const": "train", "default": "train", "description": "Space system type discriminator.", "title": "Type", "type": "string" }, "number_satellites": { "default": 1, "description": "The count of the number of satellites.", "minimum": 1, "title": "Number Satellites", "type": "integer" }, "interval": { "description": "The local time interval between satellites in a train constellation.", "format": "duration", "title": "Interval", "type": "string" }, "repeat_ground_track": { "default": true, "description": "True, if the train satellites should repeat the same ground track.", "title": "Repeat Ground Track", "type": "boolean" } }, "$defs": { "CircularOrbit": { "description": "Orbit specification using Keplerian elements for elliptical motion -- circular motion case.", "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" ], "title": "CircularOrbit", "type": "object" }, "Instrument": { "description": "Remote sensing instrument.", "properties": { "name": { "default": "Default", "description": "Instrument name.", "title": "Name", "type": "string" }, "field_of_regard": { "default": 180, "description": "Angular field (degrees) of possible observations (with pointing).", "examples": [ 50 ], "exclusiveMinimum": 0, "maximum": 360, "title": "Field Of Regard", "type": "number" }, "min_access_time": { "default": "PT0S", "description": "Minimum access (integration) time to record an observation.", "examples": [ "PT10S" ], "format": "duration", "title": "Min Access Time", "type": "string" }, "req_self_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required instrument sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Self Sunlit" }, "req_target_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required target sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Target Sunlit" }, "access_time_fixed": { "default": false, "description": "`True`, if access time is fixed to minimum value.", "title": "Access Time Fixed", "type": "boolean" } }, "title": "Instrument", "type": "object" }, "KeplerianOrbit": { "description": "Orbit specification using Keplerian elements for elliptical motion.", "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" ], "title": "KeplerianOrbit", "type": "object" }, "SunSynchronousOrbit": { "description": "Orbit defined by sun synchronous parameters.", "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" ], "title": "SunSynchronousOrbit", "type": "object" }, "TwoLineElements": { "description": "Orbit defined with standard two line elements.", "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" ], "title": "TwoLineElements", "type": "object" } }, "required": [ "name", "orbit", "interval" ] }
- Fields:
instruments ()interval (timedelta)name ()number_satellites (int)orbit (Union[TwoLineElements, SunSynchronousOrbit, CircularOrbit, KeplerianOrbit])repeat_ground_track (bool)type (Literal['train'])
- field instruments: List[Instrument] = [Instrument(name='Default', field_of_regard=180, min_access_time=datetime.timedelta(0), req_self_sunlit=None, req_target_sunlit=None, access_time_fixed=False)]
List of assigned instruments.
- Constraints:
min_length = 1
- field interval: timedelta [Required]
The local time interval between satellites in a train constellation.
- field orbit: TwoLineElements | SunSynchronousOrbit | CircularOrbit | KeplerianOrbit [Required]
Lead orbit for this constellation.
- field repeat_ground_track: bool = True
True, if the train satellites should repeat the same ground track.
- field type: Literal['train'] = 'train'
Space system type discriminator.
- generate_members() List[Satellite][source]
Generate space system member satellites.
- Returns:
the member satellites
- Return type:
List[Satellite]
Walker Constellation
- pydantic model tatc.schemas.WalkerConstellation[source]
A constellation that arranges member satellites following the Walker pattern.
Show JSON schema
{ "title": "WalkerConstellation", "description": "A constellation that arranges member satellites following the Walker pattern.", "type": "object", "properties": { "name": { "description": "Space system name.", "examples": [ "International Space Station" ], "title": "Name", "type": "string" }, "orbit": { "anyOf": [ { "$ref": "#/$defs/TwoLineElements" }, { "$ref": "#/$defs/SunSynchronousOrbit" }, { "$ref": "#/$defs/CircularOrbit" }, { "$ref": "#/$defs/KeplerianOrbit" } ], "description": "Lead orbit for this constellation.", "title": "Orbit" }, "instruments": { "default": [ { "name": "Default", "field_of_regard": 180.0, "min_access_time": "PT0S", "req_self_sunlit": null, "req_target_sunlit": null, "access_time_fixed": false } ], "description": "List of assigned instruments.", "items": { "$ref": "#/$defs/Instrument" }, "minItems": 1, "title": "Instruments", "type": "array" }, "type": { "const": "walker", "default": "walker", "description": "Space system type discriminator.", "title": "Type", "type": "string" }, "configuration": { "$ref": "#/$defs/WalkerConfiguration", "default": "delta", "description": "Walker configuration." }, "number_satellites": { "default": 1, "description": "Number of satellites in the constellation.", "minimum": 1, "title": "Number Satellites", "type": "integer" }, "number_planes": { "default": 1, "description": "The number of equally-spaced planes in a Walker Delta constellation. Ranges from 1 to (number of satellites).", "minimum": 1, "title": "Number Planes", "type": "integer" }, "relative_spacing": { "default": 0, "description": "Relative spacing of satellites between plans for a Walker Delta constellation. Ranges from 0 for equal true anomaly to (number of planes) - 1. For example, `relative_spacing=1` means the true anomaly is shifted by `360/number_satellites` between adjacent planes.", "minimum": 0, "title": "Relative Spacing", "type": "integer" } }, "$defs": { "CircularOrbit": { "description": "Orbit specification using Keplerian elements for elliptical motion -- circular motion case.", "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" ], "title": "CircularOrbit", "type": "object" }, "Instrument": { "description": "Remote sensing instrument.", "properties": { "name": { "default": "Default", "description": "Instrument name.", "title": "Name", "type": "string" }, "field_of_regard": { "default": 180, "description": "Angular field (degrees) of possible observations (with pointing).", "examples": [ 50 ], "exclusiveMinimum": 0, "maximum": 360, "title": "Field Of Regard", "type": "number" }, "min_access_time": { "default": "PT0S", "description": "Minimum access (integration) time to record an observation.", "examples": [ "PT10S" ], "format": "duration", "title": "Min Access Time", "type": "string" }, "req_self_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required instrument sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Self Sunlit" }, "req_target_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required target sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Target Sunlit" }, "access_time_fixed": { "default": false, "description": "`True`, if access time is fixed to minimum value.", "title": "Access Time Fixed", "type": "boolean" } }, "title": "Instrument", "type": "object" }, "KeplerianOrbit": { "description": "Orbit specification using Keplerian elements for elliptical motion.", "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" ], "title": "KeplerianOrbit", "type": "object" }, "SunSynchronousOrbit": { "description": "Orbit defined by sun synchronous parameters.", "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" ], "title": "SunSynchronousOrbit", "type": "object" }, "TwoLineElements": { "description": "Orbit defined with standard two line elements.", "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" ], "title": "TwoLineElements", "type": "object" }, "WalkerConfiguration": { "description": "Enumeration of different Walker constellation configurations.", "enum": [ "delta", "star" ], "title": "WalkerConfiguration", "type": "string" } }, "required": [ "name", "orbit" ] }
- Fields:
configuration (WalkerConfiguration)instruments ()name ()number_planes (int)number_satellites (int)orbit (Union[TwoLineElements, SunSynchronousOrbit, CircularOrbit, KeplerianOrbit])relative_spacing (int)type (Literal['walker'])
- Validators:
number_planes_le_number_satellites»all fieldsrelative_spacing_lt_number_planes»all fields
- field configuration: WalkerConfiguration = WalkerConfiguration.DELTA
Walker configuration.
- Validated by:
number_planes_le_number_satellitesrelative_spacing_lt_number_planes
- field instruments: List[Instrument] = [Instrument(name='Default', field_of_regard=180, min_access_time=datetime.timedelta(0), req_self_sunlit=None, req_target_sunlit=None, access_time_fixed=False)]
List of assigned instruments.
- Constraints:
min_length = 1
- Validated by:
number_planes_le_number_satellitesrelative_spacing_lt_number_planes
- field name: str [Required]
Space system name.
- Validated by:
number_planes_le_number_satellitesrelative_spacing_lt_number_planes
- field number_planes: int = 1
The number of equally-spaced planes in a Walker Delta constellation. Ranges from 1 to (number of satellites).
- Constraints:
ge = 1
- Validated by:
number_planes_le_number_satellitesrelative_spacing_lt_number_planes
- field number_satellites: int = 1
Number of satellites in the constellation.
- Constraints:
ge = 1
- Validated by:
number_planes_le_number_satellitesrelative_spacing_lt_number_planes
- field orbit: TwoLineElements | SunSynchronousOrbit | CircularOrbit | KeplerianOrbit [Required]
Lead orbit for this constellation.
- Validated by:
number_planes_le_number_satellitesrelative_spacing_lt_number_planes
- field relative_spacing: int = 0
Relative spacing of satellites between plans for a Walker Delta constellation. Ranges from 0 for equal true anomaly to (number of planes) - 1. For example, relative_spacing=1 means the true anomaly is shifted by 360/number_satellites between adjacent planes.
- Constraints:
ge = 0
- Validated by:
number_planes_le_number_satellitesrelative_spacing_lt_number_planes
- field type: Literal['walker'] = 'walker'
Space system type discriminator.
- Validated by:
number_planes_le_number_satellitesrelative_spacing_lt_number_planes
- generate_members() List[Satellite][source]
Generate space system member satellites.
- Returns:
the member satellites
- Return type:
List[Satellite]
- get_delta_mean_anomaly_between_planes() float[source]
Gets the difference in mean anomaly (decimal degrees) for adjacent member satellites between adjacent planes.
- Returns:
difference in mean anomaly
- Return type:
- get_delta_mean_anomaly_within_planes() float[source]
Gets the difference in mean anomaly (decimal degrees) for adjacent member satellites within a single plane.
- Returns:
difference in mean anomaly
- Return type:
- get_delta_raan_between_planes() float[source]
Gets the difference in right ascension of ascending node (decimal degrees) for adjacent planes of member satellites.
- Returns:
difference in right ascension of ascending node
- Return type:
- get_satellites_per_plane() int[source]
Gets the (max) number of satellites per plane.
- Returns:
number of satellites per plane
- Return type:
MOG Constellation
- pydantic model tatc.schemas.MOGConstellation[source]
A constellation that arranges member satellites following the mutual orbiting group pattern.
Based on Stephen Leroy, Riley Fitzgerald, Kerri Cahoy, James Abel, and James Clark (2020). “Orbital Maintenance of a Constellation of CubeSats for Internal Gravity Wave Tomography,” IEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing, vol. 13, pp. 307-317. doi: 10.1109/JSTARS.2019.2961084
Show JSON schema
{ "title": "MOGConstellation", "description": "A constellation that arranges member satellites following the mutual orbiting group pattern.\n\nBased on Stephen Leroy, Riley Fitzgerald, Kerri Cahoy, James Abel, and James Clark (2020).\n\"Orbital Maintenance of a Constellation of CubeSats for Internal Gravity Wave Tomography,\"\nIEEE Journal of Selected Topics in Applied Earth Observations and Remote Sensing, vol. 13,\npp. 307-317. doi: 10.1109/JSTARS.2019.2961084", "type": "object", "properties": { "name": { "description": "Space system name.", "examples": [ "International Space Station" ], "title": "Name", "type": "string" }, "orbit": { "$ref": "#/$defs/CircularOrbit", "description": "Reference circular orbit for this constellation." }, "instruments": { "default": [ { "name": "Default", "field_of_regard": 180.0, "min_access_time": "PT0S", "req_self_sunlit": null, "req_target_sunlit": null, "access_time_fixed": false } ], "description": "List of assigned instruments.", "items": { "$ref": "#/$defs/Instrument" }, "minItems": 1, "title": "Instruments", "type": "array" }, "type": { "const": "mog", "default": "mog", "description": "Space system type discriminator.", "title": "Type", "type": "string" }, "parallel_axis": { "description": "Mutual orbit axis length (m) parallel to velocity vector.", "exclusiveMinimum": 0, "title": "Parallel Axis", "type": "number" }, "transverse_axis": { "description": "Mutual orbit axis length (m) transverse to velocity vector.", "exclusiveMinimum": 0, "title": "Transverse Axis", "type": "number" }, "clockwise": { "default": true, "description": "True, if the mutual orbit is clockwise.", "title": "Clockwise", "type": "boolean" }, "number_satellites": { "default": 2, "description": "Number of equally-spaced mutually orbiting satellites.", "exclusiveMinimum": 0, "title": "Number Satellites", "type": "integer" } }, "$defs": { "CircularOrbit": { "description": "Orbit specification using Keplerian elements for elliptical motion -- circular motion case.", "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" ], "title": "CircularOrbit", "type": "object" }, "Instrument": { "description": "Remote sensing instrument.", "properties": { "name": { "default": "Default", "description": "Instrument name.", "title": "Name", "type": "string" }, "field_of_regard": { "default": 180, "description": "Angular field (degrees) of possible observations (with pointing).", "examples": [ 50 ], "exclusiveMinimum": 0, "maximum": 360, "title": "Field Of Regard", "type": "number" }, "min_access_time": { "default": "PT0S", "description": "Minimum access (integration) time to record an observation.", "examples": [ "PT10S" ], "format": "duration", "title": "Min Access Time", "type": "string" }, "req_self_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required instrument sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Self Sunlit" }, "req_target_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required target sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Target Sunlit" }, "access_time_fixed": { "default": false, "description": "`True`, if access time is fixed to minimum value.", "title": "Access Time Fixed", "type": "boolean" } }, "title": "Instrument", "type": "object" } }, "required": [ "name", "orbit", "parallel_axis", "transverse_axis" ] }
- Fields:
clockwise (bool)instruments ()name ()number_satellites (int)orbit (CircularOrbit)parallel_axis (float)transverse_axis (float)type (Literal['mog'])
- field instruments: List[Instrument] = [Instrument(name='Default', field_of_regard=180, min_access_time=datetime.timedelta(0), req_self_sunlit=None, req_target_sunlit=None, access_time_fixed=False)]
List of assigned instruments.
- Constraints:
min_length = 1
- field number_satellites: int = 2
Number of equally-spaced mutually orbiting satellites.
- Constraints:
gt = 0
- field orbit: CircularOrbit [Required]
Reference circular orbit for this constellation.
- field parallel_axis: float [Required]
Mutual orbit axis length (m) parallel to velocity vector.
- Constraints:
gt = 0
- field transverse_axis: float [Required]
Mutual orbit axis length (m) transverse to velocity vector.
- Constraints:
gt = 0
- field type: Literal['mog'] = 'mog'
Space system type discriminator.
SOC Constellation
- pydantic model tatc.schemas.SOCConstellation[source]
A constellation that arranges member satellites following the streets of coverage pattern.
Based on Joshua F. Anderson, Michel-Alexandre Cardin, and Paul T. Grogan (2022). “Design and analysis of flexible multi-layer staged deployment for satellite mega-constellations under demand uncertainty” Acta Astronautica, vol. 198, pp. 179-193. doi: 10.1016/j.actaastro.2022.05.022
Show JSON schema
{ "title": "SOCConstellation", "description": "A constellation that arranges member satellites following the streets of coverage pattern.\n\nBased on Joshua F. Anderson, Michel-Alexandre Cardin, and Paul T. Grogan (2022).\n\"Design and analysis of flexible multi-layer staged deployment for satellite\nmega-constellations under demand uncertainty\"\nActa Astronautica, vol. 198,\npp. 179-193. doi: 10.1016/j.actaastro.2022.05.022", "type": "object", "properties": { "name": { "description": "Space system name.", "examples": [ "International Space Station" ], "title": "Name", "type": "string" }, "orbit": { "$ref": "#/$defs/CircularOrbit", "description": "Reference circular orbit for this constellation." }, "instruments": { "default": [ { "name": "Default", "field_of_regard": 180.0, "min_access_time": "PT0S", "req_self_sunlit": null, "req_target_sunlit": null, "access_time_fixed": false } ], "description": "List of assigned instruments.", "items": { "$ref": "#/$defs/Instrument" }, "minItems": 1, "title": "Instruments", "type": "array" }, "type": { "const": "soc", "default": "soc", "description": "Space system type discriminator.", "title": "Type", "type": "string" }, "swath_width": { "description": "Observation diameter (meters) at specified elevation.", "exclusiveMinimum": 0, "title": "Swath Width", "type": "number" }, "packing_distance": { "description": "Relative distance between footprint centers", "exclusiveMinimum": 0, "maximum": 1, "title": "Packing Distance", "type": "number" } }, "$defs": { "CircularOrbit": { "description": "Orbit specification using Keplerian elements for elliptical motion -- circular motion case.", "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" ], "title": "CircularOrbit", "type": "object" }, "Instrument": { "description": "Remote sensing instrument.", "properties": { "name": { "default": "Default", "description": "Instrument name.", "title": "Name", "type": "string" }, "field_of_regard": { "default": 180, "description": "Angular field (degrees) of possible observations (with pointing).", "examples": [ 50 ], "exclusiveMinimum": 0, "maximum": 360, "title": "Field Of Regard", "type": "number" }, "min_access_time": { "default": "PT0S", "description": "Minimum access (integration) time to record an observation.", "examples": [ "PT10S" ], "format": "duration", "title": "Min Access Time", "type": "string" }, "req_self_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required instrument sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Self Sunlit" }, "req_target_sunlit": { "anyOf": [ { "type": "boolean" }, { "type": "null" } ], "default": null, "description": "Required target sunlit state for valid observation (`True`: sunlit, `False`: eclipse, `None`: no requirement).", "title": "Req Target Sunlit" }, "access_time_fixed": { "default": false, "description": "`True`, if access time is fixed to minimum value.", "title": "Access Time Fixed", "type": "boolean" } }, "title": "Instrument", "type": "object" } }, "required": [ "name", "orbit", "swath_width", "packing_distance" ] }
- Fields:
instruments ()name ()orbit (CircularOrbit)packing_distance (float)swath_width (float)type (Literal['soc'])
- field instruments: List[Instrument] = [Instrument(name='Default', field_of_regard=180, min_access_time=datetime.timedelta(0), req_self_sunlit=None, req_target_sunlit=None, access_time_fixed=False)]
List of assigned instruments.
- Constraints:
min_length = 1
- field orbit: CircularOrbit [Required]
Reference circular orbit for this constellation.
- field packing_distance: float [Required]
Relative distance between footprint centers
- Constraints:
gt = 0
le = 1
- field swath_width: float [Required]
Observation diameter (meters) at specified elevation.
- Constraints:
gt = 0
- field type: Literal['soc'] = 'soc'
Space system type discriminator.
- generate_members() List[Satellite][source]
Generate space system member satellites (returns a list containing this satellite).
- Returns:
the member satellites
- Return type:
List[Satellite]
- generate_walker() WalkerConstellation[source]
Generate a WalkerConstellation fitting the Streets of Coverage description.
- Returns:
the member satellites following the Walker pattern.
- Return type: