Multi-type dynamics

Tudat permits the propagation of any combination of types of dynamics, for any number of bodies. One example is the simulation of coupled translational-rotational dynamics of one or more bodies, or the combined translational and mass dynamics of a body (e.g. spacecraft under thrust).

To define multi-type propagator settings, you must first define the propagator settings for each type of dynamics separately, after which you combine these using the multitype() function as follows:

Required
# Create physical environment
bodies = environment_setup.create_system_of_bodies( ... )

# Define central bodies
central_bodies = ["Earth"]

# Define bodies that are propagated
bodies_to_propagate = ["Spacecraft"]

# Define acceleration settings acting on spacecraft
acceleration_settings_spacecraft = dict( Sun=[propagation_setup.acceleration.point_mass_gravity()])
acceleration_settings = {"Spacecraft": acceleration_settings_spacecraft}

# Create acceleration models.
acceleration_models = propagation_setup.create_acceleration_models( 
    bodies, acceleration_settings, bodies_to_propagate, central_bodies) 

# Define initial conditions as Cartesian elements w.r.t. central body (Earth) with axes along global orientation
initial_state = [5.89960424e+06, 2.30545977e+06, 1.74910449e+06, -1.53482795e+03, -1.71707683e+03, 7.44010957e+03]

# Define numerical integrator (RK4; step size 2 seconds)
integrator_settings = propagation_setup.integrator.runge_kutta_4( 2.0 )

# Start of simulation
simulation_start_epoch = 9120.0 * constants.JULIAN_DAY

# Define termination settings
simulation_end_epoch = 9140.0 * constants.JULIAN_DAY
termination_settings = propagation_setup.propagator.time_termination(
    simulation_end_epoch )

# Define propagator type
propagator_type = propagation_setup.propagator.encke

# Define dependent variables
dependent_variables_to_save = [propagation_setup.dependent_variable.total_acceleration( "Spacecraft" )]

# Define translational propagator settings
translational_propagator_settings = propagation_setup.propagator.translational(
    central_bodies,
    acceleration_models,
    bodies_to_propagate,
    initial_state,
    simulation_start_epoch,
    integrator_settings,
    termination_settings,
    propagator=propagator_type,
    output_variables= dependent_variables_to_save)
# Create physical environment
bodies = environment_setup.create_system_of_bodies( ... )

# Define bodies that are propagated
bodies_to_propagate = ["Spacecraft"]

# Define torque models
# Define torque settings acting on spacecraft
torque_settings_spacecraft = dict( Sun=[propagation_setup.torque.second_degree_gravitational()])
torque_settings = {"Spacecraft": torque_settings_spacecraft}

# Create torque models.
torque_models = propagation_setup.create_torque_models( 
    bodies, torque_settings, bodies_to_propagate) 

# Below, we define the initial state in a somewhat trivial manner (body axes along global frame
# axes; no initial rotation). A real application should use a more realistic initial rotational state
# Set initial rotation matrix (identity matrix)
initial_rotation_matrix = np.eye(3)
# Set initial orientation by converting a rotation matrix to a Tudat-compatible quaternion
initial_state = element_conversion.rotation_matrix_to_quaternion_entries(initial_rotation_matrix)
# Complete initial state by adding angular velocity vector (zero in this case)
initial_state = np.hstack((inital_state, [0,0,0]))

# Define numerical integrator (RK4; step size 2 seconds)
integrator_settings = propagation_setup.integrator.runge_kutta_4( 2.0 )

# Start of simulation
simulation_start_epoch = 9120.0 * constants.JULIAN_DAY 

# Define termination settings
simulation_end_epoch = 9140.0 * constants.JULIAN_DAY
termination_settings = propagation_setup.propagator.time_termination(
    simulation_end_epoch )

# Define propagator type
propagator_type = propagation_setup.propagator.modified_rodrigues_parameters

# Define dependent variables
dependent_variables_to_save = [propagation_setup.dependent_variable.total_torque_norm("Spacecraft")]

# Define rotational propagator settings
rotational_propagator_settings = propagation_setup.propagator.rotational(
    torque_models,
    bodies_to_propagate,
    initial_state,
    simulation_start_epoch,
    integrator_settings,
    termination_settings,
    propagator=propagator_type,
    output_variables=dependent_variables_to_save)
# Create physical environment
bodies = environment_setup.create_system_of_bodies( ... )

# Define bodies that are propagated
bodies_to_propagate = ["Spacecraft"]

# Create mass rate models, note that the model below will only work as part of a
# multitype propagation, where mass and translational state are propagated, and
# a thrust acceleration is acting on the spacecraft
mass_rate_settings = dict(Vehicle=[propagation_setup.mass_rate.from_thrust()])
mass_rate_models = propagation_setup.create_mass_rate_models(
    bodies,
    mass_rate_settings,
    acceleration_models
)
# Define initial conditions
initial_mass = 3400.0  # kg

# Define numerical integrator (RK4; step size 2 seconds)
integrator_settings = propagation_setup.integrator.runge_kutta_4( 2.0 )

# Start of simulation
simulation_start_epoch = 9120.0 * constants.JULIAN_DAY

# Define termination settings
simulation_end_epoch = 9140 * constants.JULIAN_DAY
termination_settings = propagation_setup.propagator.time_termination(
    simulation_end_epoch )

# Define dependent variables
dependent_variables_to_save = [propagation_setup.dependent_variable.total_mass_rate("Spacecraft")]

# Define mass propagator settings
mass_propagator_settings = propagation_setup.propagator.mass(
    mass_rate_models,
    bodies_to_propagate,
    initial_mass,
    simulation_start_epoch,
    integrator_settings,
    termination_settings,
    output_variables=dependent_variables_to_save)
# Create list of propagator settings
propagator_settings_list =[
	translational_propagator_settings, rotational_propagator_settings, mass_propagator_settings ]

# Define settings for multi-type propagator
propagator_settings = propagation_setup.propagator.multitype(
    propagator_settings_list,
    integrator_settings,
    simulation_start_epoch,
    termination_condition,
    output_variables =  dependent_variables_to_save )

This example (note the collapsed combined code for the translational, rotational, and mass dynamics examples) shows the use of the translational, rotational and mass dynamics of a single body Spacecraft. However, the framework is not limited to propagating the different types of dynamics for only one body. You may for instance propagate the translational state and mass of a spacecraft concurrently with the rotational state of the Earth. Also, you may propagate any number of any type of dynamics of any body, e.g. translational dynamics of 6 bodies, rotational dynamics of 4 bodies and mass of 2 bodies, where these three sets of bodies may but need not fully or partially overlap.

When using multi-type propagator settings, the following settings:

  • Output variables

  • Termination settings

  • Integrator settings

  • Initial time

  • Console output and processing settings

that are passed to the propagation_setup.propagator.multitype function are used. Settings of the same kind are also stored in the constituent single-type propagator settings (above, in the propagator_settings_list input), but these are fully ignored when using multi-type settings! Only the settings of these types explicitly added to the propagation_setup.propagator.multitype function are used.

Conversely, the propagation_setup.propagator.multitype function does not take any initial states as inputs. The complete, multitype, initial state vector is set up from its constituent single-arc settings (with the order as noted below)

Note

The order of the state entries in the multi-type state vector will, in general, be different from the order provided in the propagator_settings_list When different state types are propagated, the state output contains the states in following order:

  • Translational state ( T )

  • Rotational state ( R )

  • Body mass state ( M )

  • Custom state ( C )

To retrieve the definition of the multitype state vector, see Console Output.