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 access_time_fixed: bool = False

True, if access time is fixed to minimum value.

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 name: str = 'Default'

Instrument name.

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:
  • orbit_track (skyfield.positionlib.Geocentric) – The satellite position/velocity.

  • number_points (int) – The required number of polygon points to generate.

  • elevation (float) – The elevation (meters) at which project the footprint.

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.

Parameters:

height (float) – Height (meters) above surface of the observation.

Returns:

The minimum elevation angle (degrees) for observation.

Return type:

float

get_swath_width(height: float) float[source]

Gets the instrument swath width projected to the Earth’s surface.

Parameters:

height (float) – Height (meters) above surface of the observation.

Returns:

The observation diameter (meters).

Return type:

float

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 along_track_pixels: int = 1

Number of pixels in along-track direction.

Constraints:
  • ge = 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 cross_track_pixels: int = 1

Number of pixels in cross-track direction.

Constraints:
  • ge = 1

field is_rectangular: bool = False

True, if this instrument produces a rectangular view.

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:
  • orbit_track (skyfield.positionlib.Geocentric) – The satellite position/velocity.

  • number_points (int) – The required number of polygon points to generate.

  • elevation (float) – The elevation (meters) at which project the footprint.

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:
  • orbit_track (skyfield.positionlib.Geocentric) – the satellite orbit track.

  • cross_track_index (int) – cross-track pixel index (left-to-right).

  • along_track_index (int) – along-track pixel index (fore-to-aft).

  • elevation (float) – The elevation (meters) at which project the pixel.

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:

float

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:

float

get_pixel_cone_and_clock_angle(cross_track_index: int, along_track_index: int) Tuple[float, float][source]

Gets the cone () and clock angles (degrees) for given pixel.

Parameters:
  • cross_track_index (int) – pixel index in cross-track dimension (left to right).

  • along_track_index (int) – pixel index in along-track dimension (fore to aft).

Returns:

cone (from nadir-looking) and clock

(counter-clockwise from right-looking) angles (degrees).

Return type:

Tuple[float, float]

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:28:29.351647Z",
               "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:28:29.351647Z",
               "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:28:29.351647Z",
               "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 name: str [Required]

Space system name.

field orbit: TwoLineElements | CircularOrbit | SunSynchronousOrbit | KeplerianOrbit [Required]

Orbit specification.

field type: Literal['satellite'] = 'satellite'

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]

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:28:29.351647Z",
               "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:28:29.351647Z",
               "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:28:29.351647Z",
               "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 name: str [Required]

Space system name.

field number_satellites: int = 1

The count of the number of satellites.

Constraints:
  • ge = 1

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]

get_delta_mean_anomaly() float[source]

Gets the difference in mean anomaly (decimal degrees) for adjacent member satellites.

Returns:

the difference in mean anomaly

Return type:

float

get_delta_raan() float[source]

Gets the difference in right ascension of ascending node (decimal degrees) for adjacent member satellites.

Returns:

the difference in right ascension of ascending node

Return type:

float

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:28:29.351647Z",
               "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:28:29.351647Z",
               "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:28:29.351647Z",
               "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 fields

  • relative_spacing_lt_number_planes » all fields

field configuration: WalkerConfiguration = WalkerConfiguration.DELTA

Walker configuration.

Validated by:
  • number_planes_le_number_satellites

  • relative_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_satellites

  • relative_spacing_lt_number_planes

field name: str [Required]

Space system name.

Validated by:
  • number_planes_le_number_satellites

  • relative_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_satellites

  • relative_spacing_lt_number_planes

field number_satellites: int = 1

Number of satellites in the constellation.

Constraints:
  • ge = 1

Validated by:
  • number_planes_le_number_satellites

  • relative_spacing_lt_number_planes

field orbit: TwoLineElements | SunSynchronousOrbit | CircularOrbit | KeplerianOrbit [Required]

Lead orbit for this constellation.

Validated by:
  • number_planes_le_number_satellites

  • relative_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_satellites

  • relative_spacing_lt_number_planes

field type: Literal['walker'] = 'walker'

Space system type discriminator.

Validated by:
  • number_planes_le_number_satellites

  • relative_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:

float

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:

float

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:

float

get_satellites_per_plane() int[source]

Gets the (max) number of satellites per plane.

Returns:

number of satellites per plane

Return type:

int

validator number_planes_le_number_satellites  »  all fields[source]

Validates the number of planes given the number of satellites.

validator relative_spacing_lt_number_planes  »  all fields[source]

Validates the relative spacing given the number of planes.

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:28:29.351647Z",
               "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 clockwise: bool = True

True, if the mutual orbit is clockwise.

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 name: str [Required]

Space system name.

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.

generate_members() List[Satellite][source]

Generate space system member satellites. :returns: the member satellites :rtype: List[Satellite]

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:28:29.351647Z",
               "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 name: str [Required]

Space system name.

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:

WalkerConstellation