Compare Flights example#
[ ]:
%load_ext autoreload
%autoreload 2
[ ]:
%matplotlib inline
Importing libraries#
[ ]:
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.
[ ]:
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",
burn_time=3.9,
grains_center_of_mass_position=-0.85704,
grain_number=5,
grain_separation=5 / 1000,
grain_density=1815,
grain_outer_radius=33 / 1000,
grain_initial_inner_radius=15 / 1000,
grain_initial_height=120 / 1000,
nozzle_radius=33 / 1000,
throat_radius=11 / 1000,
interpolation_method="linear",
nozzle_position=-1.255,
coordinate_system_orientation="nozzle_to_combustion_chamber",
)
calisto = Rocket(
radius=127 / 2000,
mass=19.197 - 2.956,
inertia_i=6.60,
inertia_z=0.0351,
power_off_drag="../../data/calisto/powerOffDragCurve.csv",
power_on_drag="../../data/calisto/powerOnDragCurve.csv",
center_of_dry_mass_position=0,
coordinate_system_orientation="tail_to_nose",
)
calisto.set_rail_buttons(0.2, -0.5)
calisto.add_motor(Pro75M1670, position=-1.255)
nosecone = calisto.add_nose(
length=0.55829, kind="vonKarman", position=0.71971 + 0.55829
)
fin_set = calisto.add_trapezoidal_fins(
n=4,
root_chord=0.120,
tip_chord=0.040,
span=0.100,
position=-1.04956,
cant_angle=0,
radius=None,
airfoil=None,
)
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:
[ ]:
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
inclination=inclination,
heading=heading,
name=f"Incl {inclination} Head {heading}",
)
flights.append(flight)
[ ]:
print("Number of flights: ", len(flights))
Start the comparison#
[ ]:
comparison = CompareFlights(flights)
Linear Kinematics#
[ ]:
comparison.trajectories_3d(legend=True)
[ ]:
comparison.positions()
[ ]:
comparison.trajectories_2d(plane="xy", legend=True)
[ ]:
comparison.velocities()
[ ]:
comparison.stream_velocities()
[ ]:
comparison.accelerations()
Angular kinematics#
[ ]:
comparison.angular_velocities()
[ ]:
comparison.angular_accelerations()
Attitudes#
[ ]:
comparison.attitude_angles()
[ ]:
comparison.euler_angles()
[ ]:
comparison.quaternions()
[ ]:
comparison.angles_of_attack()
Forces and Moments#
[ ]:
comparison.aerodynamic_forces()
[ ]:
comparison.aerodynamic_moments()
[ ]:
# comparison.rail_buttons_forces() # Currently not working!
Energies and Power#
[ ]:
comparison.fluid_mechanics()
[ ]:
comparison.energies()
[ ]:
comparison.powers()
Plotting everything together#
Alternatively, we can plot all the results together by calling one simple method:
[ ]:
comparison.all()