最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

python - RocketPy Error: multiple parachutes triggering simultaneously - Stack Overflow

programmeradmin10浏览0评论

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)

发布评论

评论列表(0)

  1. 暂无评论