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.