Compare Flights#
This example demonstrates how to use the rocketpy CompareFlights
class.
This class has many applications, including the comparison of different flight
setups for a single rocket, the simulation of deployable systems, and the
multi-stage rocket analysis.
Importing classes#
We will start by importing the necessary classes and modules:
from rocketpy.plots.compare import CompareFlights
from rocketpy import Environment, Flight, Rocket, SolidMotor
from datetime import datetime, timedelta
Create Environment, Motor and Rocket#
First, let’s create the environment, motor and rocket objects. This is done following the same steps as in the First Simulation with RocketPy example.
after_tomorrow = datetime.now() + timedelta(days=2)
env = Environment(latitude=-23, longitude=-49, date=after_tomorrow)
env.set_atmospheric_model(type="Forecast", file="GFS")
cesaroni_motor = 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(cesaroni_motor, 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
)
main_chute = calisto.add_parachute(
"Main",
cd_s=10.0,
trigger=800,
sampling_rate=105,
lag=1.5,
noise=(0, 8.3, 0.5),
)
drogue_chute = calisto.add_parachute(
"Drogue",
cd_s=1.0,
trigger="apogee",
sampling_rate=105,
lag=1.5,
noise=(0, 8.3, 0.5),
)
Creating the Flight objects#
Now we can create different flights varying the launch angle and the rail inclination:
inclinations = [85, 75]
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)
We can easily visualize the number of flights created:
print("Number of flights: ", len(flights))
Number of flights: 4
Start the comparison#
It is easy to initialize the CompareFlights
object:
comparison = CompareFlights(flights)
After the initialization, we can use different methods to plot the results in a comparative way. To see a full description of the available methods, you can check the CompareFlights documentation.
Plotting results one by one#
The flights results are divided into different methods, so we can plot them one by one. This is practical when we want to focus on a specific aspect of the flights.
comparison.trajectories_3d(legend=True)
comparison.positions()
comparison.trajectories_2d(plane="xy", legend=True)
comparison.velocities()
comparison.stream_velocities()
comparison.accelerations()
comparison.angular_velocities()
comparison.angular_accelerations()
comparison.attitude_angles()
comparison.euler_angles()
comparison.quaternions()
comparison.angles_of_attack()
comparison.aerodynamic_forces()
comparison.aerodynamic_moments()
comparison.fluid_mechanics()
comparison.energies()
comparison.powers()
Plotting using the all
method#
Alternatively, we can plot the results altogether by calling one simple method:
comparison.all()
This method is not implemented yet
This method is not implemented yet