Compare Flights example#

[1]:
%load_ext autoreload
%autoreload 2
[2]:
%matplotlib inline

Importing libraries#

[3]:
from rocketpy.plots.compare import CompareFlights
from rocketpy import Environment, Flight, Rocket, SolidMotor
from datetime import datetime, timedelta

Creating the Flight objects#

First, let’s create the environment, motor and rocket objects.

[5]:
after_tomorrow = datetime.now() + timedelta(days=2)
env = Environment(latitude=-23, longitude=-49, date=after_tomorrow)
env.set_atmospheric_model(type="Forecast", file="GFS")

Pro75M1670 = SolidMotor(
    thrust_source="../../data/motors/Cesaroni_M1670.eng",
    dry_mass=1.815,
    dry_inertia=(0.125, 0.125, 0.002),
    nozzle_radius=33 / 1000,
    grain_number=5,
    grain_density=1815,
    grain_outer_radius=33 / 1000,
    grain_initial_inner_radius=15 / 1000,
    grain_initial_height=120 / 1000,
    grain_separation=5 / 1000,
    grains_center_of_mass_position=0.397,
    center_of_dry_mass_position=0.317,
    nozzle_position=0,
    burn_time=3.9,
    throat_radius=11 / 1000,
    coordinate_system_orientation="nozzle_to_combustion_chamber",
)

calisto = Rocket(
    radius=127 / 2000,
    mass=14.426,
    inertia=(6.321, 6.321, 0.034),
    power_off_drag="../../data/calisto/powerOffDragCurve.csv",
    power_on_drag="../../data/calisto/powerOnDragCurve.csv",
    center_of_mass_without_motor=0,
    coordinate_system_orientation="tail_to_nose",
)

calisto.set_rail_buttons(
    upper_button_position=0.0818,
    lower_button_position=-0.618,
    angular_position=45,
)

calisto.add_motor(Pro75M1670, position=-1.255)

nosecone = calisto.add_nose(length=0.55829, kind="vonKarman", position=1.278)

fin_set = calisto.add_trapezoidal_fins(
    n=4,
    root_chord=0.120,
    tip_chord=0.060,
    span=0.110,
    position=-1.04956,
    cant_angle=0.5,
    airfoil=("../../data/calisto/NACA0012-radians.csv", "radians"),
)

tail = calisto.add_tail(
    top_radius=0.0635, bottom_radius=0.0435, length=0.060, position=-1.194656
)


def drogue_trigger(p, h, y):
    # p = pressure considering parachute noise signal
    # h = height above ground level considering parachute noise signal
    # y = [x, y, z, vx, vy, vz, e0, e1, e2, e3, w1, w2, w3]

    # activate drogue when vz < 0 m/s.
    return True if y[5] < 0 else False


def main_trigger(p, h, y):
    # p = pressure considering parachute noise signal
    # h = height above ground level considering parachute noise signal
    # y = [x, y, z, vx, vy, vz, e0, e1, e2, e3, w1, w2, w3]

    # activate main when vz < 0 m/s and z < 800 m
    return True if y[5] < 0 and h < 800 else False


Main = calisto.add_parachute(
    "Main",
    cd_s=10.0,
    trigger=main_trigger,
    sampling_rate=105,
    lag=1.5,
    noise=(0, 8.3, 0.5),
)

Drogue = calisto.add_parachute(
    "Drogue",
    cd_s=1.0,
    trigger=drogue_trigger,
    sampling_rate=105,
    lag=1.5,
    noise=(0, 8.3, 0.5),
)

Now we can create different flights varying the launch angle and the rail inclination:

[6]:
inclinations = [85, 75, 60]
headings = [90, 135]
flights = []

for heading in headings:
    for inclination in inclinations:
        flight = Flight(
            environment=env,
            rocket=calisto,
            rail_length=5.2,
            inclination=inclination,
            heading=heading,
            name=f"Incl {inclination} Head {heading}",
        )
        flights.append(flight)
[7]:
print("Number of flights: ", len(flights))
Number of flights:  6

Start the comparison#

[8]:
comparison = CompareFlights(flights)

Linear Kinematics#

[9]:
comparison.trajectories_3d(legend=True)
../_images/notebooks_compare_flights_usage_14_0.png
[12]:
comparison.positions()
../_images/notebooks_compare_flights_usage_15_0.png
[13]:
comparison.trajectories_2d(plane="xy", legend=True)
../_images/notebooks_compare_flights_usage_16_0.png
[14]:
comparison.velocities()
../_images/notebooks_compare_flights_usage_17_0.png
[15]:
comparison.stream_velocities()
../_images/notebooks_compare_flights_usage_18_0.png
[16]:
comparison.accelerations()
../_images/notebooks_compare_flights_usage_19_0.png

Angular kinematics#

[17]:
comparison.angular_velocities()
../_images/notebooks_compare_flights_usage_21_0.png
[18]:
comparison.angular_accelerations()
../_images/notebooks_compare_flights_usage_22_0.png

Attitudes#

[19]:
comparison.attitude_angles()
../_images/notebooks_compare_flights_usage_24_0.png
[20]:
comparison.euler_angles()
../_images/notebooks_compare_flights_usage_25_0.png
[21]:
comparison.quaternions()
../_images/notebooks_compare_flights_usage_26_0.png
[22]:
comparison.angles_of_attack()
../_images/notebooks_compare_flights_usage_27_0.png

Forces and Moments#

[37]:
comparison.aerodynamic_forces()
../_images/notebooks_compare_flights_usage_29_0.png
[24]:
comparison.aerodynamic_moments()
../_images/notebooks_compare_flights_usage_30_0.png
[25]:
# comparison.rail_buttons_forces() # Currently not working!

Energies and Power#

[26]:
comparison.fluid_mechanics()
../_images/notebooks_compare_flights_usage_33_0.png
[27]:
comparison.energies()
../_images/notebooks_compare_flights_usage_34_0.png
[28]:
comparison.powers()
../_images/notebooks_compare_flights_usage_35_0.png

Plotting everything together#

Alternatively, we can plot all the results together by calling one simple method:

[29]:
comparison.all()
../_images/notebooks_compare_flights_usage_38_0.png
../_images/notebooks_compare_flights_usage_38_1.png
../_images/notebooks_compare_flights_usage_38_2.png
../_images/notebooks_compare_flights_usage_38_3.png
../_images/notebooks_compare_flights_usage_38_4.png
../_images/notebooks_compare_flights_usage_38_5.png
../_images/notebooks_compare_flights_usage_38_6.png
../_images/notebooks_compare_flights_usage_38_7.png
../_images/notebooks_compare_flights_usage_38_8.png
../_images/notebooks_compare_flights_usage_38_9.png
../_images/notebooks_compare_flights_usage_38_10.png
../_images/notebooks_compare_flights_usage_38_11.png
This method is not implemented yet
../_images/notebooks_compare_flights_usage_38_13.png
../_images/notebooks_compare_flights_usage_38_14.png
../_images/notebooks_compare_flights_usage_38_15.png
../_images/notebooks_compare_flights_usage_38_16.png
../_images/notebooks_compare_flights_usage_38_17.png
../_images/notebooks_compare_flights_usage_38_18.png
This method is not implemented yet