[Python] RocketPy Error: multiple parachutes triggering simultaneously

Discussão em 'Python' iniciado por Stack, Fevereiro 5, 2025.

  1. Stack

    Stack Membro Participativo

    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)

    Continue reading...

Compartilhe esta Página