Skip to main content
Ctrl+K
TudatPy version 1.0 has been released 🥳 For more information, see our migration guide! As always, you can post any questions or feedback in our Github Discussion forum
tudat.space 1.0.0 documentation - Home tudat.space 1.0.0 documentation - Home
  • Getting Started
  • Examples
  • User Guide
  • API Reference
  • About
  • Getting Started
  • Examples
  • User Guide
  • API Reference
  • About

Section Navigation

Tudat(Py) user guide

  • State Propagation
    • Environment Setup
      • Creating the bodies
        • Spacecraft macromodels
      • Modifying the bodies
      • Default environment models
        • Default bodies with a limited valid time range
      • Custom models
        • Interacting with the environment during propagation
      • Frames in the Environment
      • Times and dates
      • Available State Definitions and Conversions
      • Environment - Overall Architecture
    • Propagation Setup
      • Translational Dynamics
        • Acceleration Model Setup
        • Available Acceleration Models
        • Third-body accelerations
        • Radiation pressure acceleration
        • Use of thrust models
        • Use of aerodynamics
      • Rotational Dynamics
        • Torque Model Setup
        • Available Torque Models
      • Mass Dynamics
      • Multi-type dynamics
      • Multi-body dynamics
      • Multi- and hybrid-arc dynamics
      • Processed vs. Propagated State Elements
      • Integration Setup
      • Printing and processing the results
    • Propagating Dynamics
      • Propagation results
      • Propagation architecture
    • Propagating Variational Equations
      • Parameter Settings
      • Single-arc Variational Equations Propagation
  • State Estimation
    • Link Ends Setup
    • Observation Model Setup
      • Available Observation Models
    • Observation Creation
      • Creating Observations
        • Simulating Observations
        • Loading Real Tracking Data
        • Pseudo-observations from Ephemerides
        • Manual Observation Collections
      • Observation Collection Manipulation
        • Extracting Information
        • Modifying Collections
        • Using Dependent Variables
        • Processing Observations
    • Performing the estimation
  • Preliminary Mission Design
    • Multiple Gravity Assists Transfer
  • Mathematics
    • Interpolators
  • Mathematical model definition

Interface with other libraries

  • Optimization with PyGMO
  • Parallelization with Python
  • Post-processing Results in Python

TudatPy Project Updates

  • Migration Guide
  • User Guide
  • State Estimation
  • Link Ends Setup

Link Ends Setup#

To define an observation model, the various bodies, spacecraft, ground stations, etc. involved in the observation, and their role in the observation, must be defined. For a one-way range model, for instance, the definition of a transmitter and a receiver is required. In Tudat, the transmitter and receiver are both referred to as ‘link ends’. The full set of link ends in the observable, and their role in the observable, are stored in the LinkDefinition. Below, we describe the steps that are (or may be) required to set up this object.

Note

A LinkDefinition object does not define the observation model itself, but only the various reference points (link ends) that are required for it. For instance, a one-way range, one-way Doppler and angular position observation may all use an identical LinkDefinition (containing a transmitter and a receiver).

Ground Station Creation#

Often, you will need to define the positions of ground stations on celestial bodies to/from which observations are made. Note that in Tudat, a planetary lander is treated identically to a terrestrial ground station. The creation of a ground station is done when creating the environment, as one of the properties of a body. See ground_station for available ground station settngs.

For reference, we give example code to create settings for a ground station name Graz to the settings of body Earth:

graz_station_cartesian_position = [ 4194426.1, 1162694.5, 4647246.9 ]
graz_station_settings = environment_setup.ground_station.basic_station( "Graz", graz_station_position )

earth_ground_station_settings_list = list()
earth_ground_station_settings_list.append( graz_station_settings )

body_settings.get("Earth").ground_station_settings = earth_ground_station_settings_list

You can also define the station position in geodetic or spherical position elements. For instance:

graz_station_geodetic_position = [ 539.4, 0.821475864, 0.270409097 ]
graz_station_settings = environment_setup.ground_station.basic_station( "Graz", graz_station_position, element_conversion.geodetic_position_type )

earth_ground_station_settings_list = list()
earth_ground_station_settings_list.append( graz_station_settings )

body_settings.get("Earth").ground_station_settings = earth_ground_station_settings_list

We also offer default settings for DSN stations:

body_settings.get("Earth").ground_station_settings = environment_setup.ground_station.dsn_stations

Creating a Set of Link Ends#

The creation of the link definition requires the definition of a set of link ends used for a given observable. These are stored in a dictionary as follows:

  • The dictionary key denotes the role in the observation (e.g. receiver, transmitter, etc.), given by an entry from the LinkEndType enum. For each observation model in the API documentation, it is specified which link end types are required.

  • The dictionary value represents the identifier of the link end (spacecraft, ground station, etc.), as a LinkEndId object. To use a reference point on a body (for instance, a ground station on Earth), the body_reference_point_link_end_id() function can be used to create an object of this type. To use the origin (typically, but not necessarily its center of mass) of a body as link end, use the body_origin_link_end_id() function. Although using a center of mass is unrealistic for data analysis, such a setup can often be useful for a simulated analysis. Example of defining link ends are given below.

Each type of observable requires a specific combination of types of link ends. Below, a number of examples are given for one-, two- and three-way observables (see here for the distinction between two- and three-way observables when creating observation models):

one_way_link_ends = dict( )
one_way_link_ends[ transmitter ] = estimation.observable_model_setup.links.body_reference_point_link_end_id( "Earth", "Graz" )
one_way_link_ends[ receiver ] = estimation.observable_model_setup.links.body_origin_link_end_id( "LRO" )

This defines a link for which the ground station termed Graz on the body called Earth acts as transmitter, and the body called LRO is used as the receiver (in this case placed at the body’s center of mass).

An example of link-ends for a two-way link from Graz to LRO and back to Graz is identified below. Note that below example is a representation of the manual creation of link ends. There are also a number of functions that allow you to generate a list of link ends for one- two- and three-way observables (one_way_downlink_link_ends(), one_way_uplink_link_ends(), two_way_link_ends(), three_way_link_ends()).

two_way_link_ends = dict( )
two_way_link_ends[ transmitter ] = estimation.observable_model_setup.links.body_reference_point_link_end_id( "Earth", "Graz" )
two_way_link_ends[ reflector ] = estimation.observable_model_setup.links.body_origin_link_end_id( "LRO" )
two_way_link_ends[ receiver ] = estimation.observable_model_setup.links.body_reference_point_link_end_id( "Earth", "Graz" )

Where the Graz station now acts as both transmitter and receiver. Similarly, the receiver may be different from the transmitter (in what is typically called a three-way observable in Deep Space tracking), so:

two_way_link_ends = dict( )
two_way_link_ends[ transmitter ] = estimation.observable_model_setup.links.body_reference_point_link_end_id( "Earth", "Graz" )
two_way_link_ends[ reflector ] = estimation.observable_model_setup.links.body_origin_link_end_id( "LRO" )
two_way_link_ends[ receiver ] = estimation.observable_model_setup.links.body_reference_point_link_end_id( "Earth", "Matera" )

where the signal is transmitter by Graz station, retransmitter or reflected by LRO, and then received by the Matera station.

After the creation of the link ends dictionary, the LinkDefinition object can be created as:

two_way_link_ends[ transmitter ] = estimation.observable_model_setup.links.body_reference_point_link_end_id( "Earth", "Graz" )
two_way_link_ends[ reflector ] = estimation.observable_model_setup.links.body_origin_link_end_id( "LRO" )
two_way_link_ends[ receiver ] = estimation.observable_model_setup.links.body_reference_point_link_end_id( "Earth", "Matera" )
two_way_link_definition = estimation.observable_model_setup.links.link_definition( two_way_link_ends )

where, for this basic example, the link definition is simply a wrapper class for the link ends.

Having defined the link definition, we can create the observation model.

previous

State Estimation

next

Observation Model Setup

On this page
  • Ground Station Creation
  • Creating a Set of Link Ends
Edit on GitHub
Show Source

© Copyright 2026, Tudat Team.

Created using Sphinx 7.4.7.

Built with the PyData Sphinx Theme 0.17.1.