I'm doing some Monte Carlo simulations in RocketPy. I am trying to simulate what a rocket launch that uses 2 parachutes; a drogue and a main parachute. I think this is a simple solution, but for whatever reason I can't see why this error is occurring.
Below is the last bit of the code I run which specifies 2 parachutes being deployed:
# Setting up the directory for where to save these files:
filename = "monte_carlo_analysis_outputs/Valetudo_V0"
number_of_simulations = 100
# Create data files for inputs, outputs and error logging
dispersion_error_file = open(str(filename) + ".disp_errors.txt", "w")
dispersion_input_file = open(str(filename) + ".disp_inputs.txt", "w")
dispersion_output_file = open(str(filename) + ".disp_outputs.txt", "w")
# Set iterator value
i = 0
initial_wall_time = time()
initial_cpu_time = process_time()
# Define basic Environment object
Env = Environment(date=(2025, 2, 7, 0), latitude=67.89325597913002, longitude=21.065756056273834, elevation=300)
Env.max_expected_height = 40000
Env.set_atmospheric_model(
type="Ensemble",
file="GEFS",
#dictionary="ECMWF",
)
# Set up parachutes.
# Drogue is set off after apogee to slow rocket down. This continues all the way down to a certain altitude when the main parachute is then deployed.
def drogue_trigger(p, h, y):
# If rocket is going down (has passed the apogee) then set off the trigger
vertical_velocity = y[5]
return True if vertical_velocity < 0 else False
# Main is set to trigger 1km from the ground to minimise drift from original launch site.
def main_trigger(p, h, y):
return True if h < 1000 else False
# Iterating over flight settings
out = display("Starting", display_id=True)
###############################################################
output_lines = ["Starting"]
for setting in flight_settings(analysis_parameters, number_of_simulations):
start_time = process_time()
i += 1
# Update the chosen environment object
Env.select_ensemble_member(setting["ensemble_member"])
# Create motor
ValetudoMotor = SolidMotor(
thrust_source=r"...\Python Modelling\Thrust curves\Valetudo.eng"
burn_time=13.1,
reshape_thrust_curve=(setting["burn_time"], setting["impulse"]),
nozzle_radius=setting["nozzle_radius"],
throat_radius=setting["throat_radius"],
grain_number=1,
grain_separation=setting["grain_separation"],
grain_density=setting["grain_density"],
grain_outer_radius=setting["grain_outer_radius"],
grain_initial_inner_radius=setting["grain_initial_inner_radius"],
grain_initial_height=setting["grain_initial_height"],
interpolation_method="linear",
coordinate_system_orientation="nozzle_to_combustion_chamber",
nozzle_position=setting["nozzle_position"],
grains_center_of_mass_position=setting["grains_center_of_mass_position"],
dry_mass=setting["motor_dry_mass"],
dry_inertia=(
setting["motor_inertia_11"],
setting["motor_inertia_11"],
setting["motor_inertia_33"],
),
center_of_dry_mass_position=setting["motor_dry_mass_position"],
)
# Creating the rocket
Valetudo = Rocket(
radius=setting["radius"],
mass=setting["rocket_mass"],
inertia=(
setting["rocket_inertia_11"],
setting["rocket_inertia_11"],
setting["rocket_inertia_33"],
),
power_off_drag=r"...\Python Modelling\Drag curves\Cesaroni_6026M1670_PpowerOffDragCurve.eng",
power_on_drag=r"...\Python Modelling\Drag curves\Cesaroni_6026M1670_PpowerOnDragCurve.eng",
center_of_mass_without_motor=4.45,
coordinate_system_orientation="tail_to_nose",
)
Valetudo.set_rail_buttons(1.3, 4)
Valetudo.add_motor(ValetudoMotor, position=6.6428125)
# Edit rocket drag
Valetudo.power_off_drag *= setting["power_off_drag"]
Valetudo.power_on_drag *= setting["power_on_drag"]
NoseCone = Valetudo.add_nose(
length=setting["nose_length"],
kind="ogive",
position=setting["nose_distance_to_CM"] +setting["nose_length"],
)
Finset = Valetudo.add_trapezoidal_fins(
n=3,
span=setting["fin_span"],
root_chord=setting["fin_root_chord"],
tip_chord=setting["fin_tip_chord"],
position=setting["fin_distance_to_CM"],
cant_angle=0,
airfoil=None,
)
# Add parachutes
Drogue = Valetudo.add_parachute(
"Drogue",
cd_s=setting["cd_s_drogue"],
trigger=drogue_trigger,
sampling_rate=105,
lag=setting["lag_rec"] +setting["lag_se"],
noise=(0, 8.3, 0.5),
)
Main = Valetudo.add_parachute(
"Main",
cd_s=setting["cd_s_main"],
trigger=main_trigger,
sampling_rate=105,
lag=setting["lag_rec"] + setting["lag_se"],
noise=(0, 8.3, 0.5),
)
# Running simulation
try:
test_flight = Flight(
rocket=Valetudo,
environment = Env,
rail_length = setting["rail_length"],
inclination = setting["inclination"],
heading = setting["heading"],
max_time = 600,
)
export_flight_data(setting, test_flight, process_time() - start_time)
except Exception as E:
print(E)
export_flight_error(setting)
# Register time
out.update(
f"Current iteration: {i:06d} | Average Time per Iteration: {(process_time() - initial_cpu_time)/i:2.6f} s"
)
iteration_message = f"Current iteration: {i:06d} "
output_lines.append(iteration_message)
out.update(output_lines)
# Done
(The rest of the example is extremely similar to the Monte Carlo simulations page on the RocketPy website :rocketpy_docs.
But here is the error message I am receiving:
WARNING: Trying to add flight phase starting *together* with the one *preceding* it. This may be caused by multiple parachutes being triggered simultaneously.
array must not contain infs or NaNs
I am not sure what is causing this, as I have different triggers for the 2 parachutes. Does anyone have any suggestions?
(P.S. I can put the entire code in here, just did not want to overwhelm)