diff --git a/docs/notebooks/deployable_payload_example.ipynb b/docs/notebooks/deployable_payload_example.ipynb
new file mode 100644
index 000000000..1ff4b77be
--- /dev/null
+++ b/docs/notebooks/deployable_payload_example.ipynb
@@ -0,0 +1,932 @@
+{
+ "cells": [
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "# Deployable Payload Flight Simulation Example"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here we try to demonstrate how to use RocketPy to simulate a flight of a rocket\n",
+ "that presents a deployable payload."
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To run this notebook, we will need:\n",
+ "\n",
+ "* RocketPy\n",
+ "* netCDF4 (to get weather forecasts)\n",
+ "* Data files (we will clone RocketPy's repository for these)\n",
+ "\n",
+ "Therefore, let's run the following lines of code:"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "!pip install rocketpy netCDF4\n",
+ "!git clone https://github.com/RocketPy-Team/RocketPy.git"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": null,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import os\n",
+ "\n",
+ "os.chdir(\"RocketPy/docs/notebooks\")"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we can start!\n",
+ "\n",
+ "Here we go through a simplified rocket trajectory simulation to get you started. Let's start by importing the rocketpy module."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 17,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from rocketpy import Environment, SolidMotor, Rocket, Flight, Function, utilities"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "If you are using a version of Jupyter Notebooks, it is recommended to run the following lines of code to make plots that will be shown later interactive and/or higher quality."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 43,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "%config InlineBackend.figure_formats = ['svg']\n",
+ "%matplotlib inline"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Setting Up a Simulation"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Creating an Environment for Spaceport America"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 44,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Env = Environment(\n",
+ " railLength=5.2, latitude=32.990254, longitude=-106.974998, elevation=1400\n",
+ ")"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "To get weather data from the GFS forecast, available online, we run the following lines.\n",
+ "See [Environment Class Usage](environment_class_usage.ipynb) for more information on how to use the Environment class."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 45,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "import datetime\n",
+ "\n",
+ "tomorrow = datetime.date.today() + datetime.timedelta(days=1)\n",
+ "\n",
+ "Env.setDate((tomorrow.year, tomorrow.month, tomorrow.day, 12)) # Hour given in UTC time\n",
+ "\n",
+ "Env.setAtmosphericModel(type=\"Forecast\", file=\"GFS\")\n",
+ "Env.maxExpectedHeight = 8000"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 46,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Gravity Details\n",
+ "\n",
+ "Acceleration of Gravity: 9.80665 m/s²\n",
+ "\n",
+ "\n",
+ "Launch Site Details\n",
+ "\n",
+ "Launch Rail Length: 5.2 m\n",
+ "Launch Date: 2023-01-11 12:00:00 UTC\n",
+ "Launch Site Latitude: 32.99025°\n",
+ "Launch Site Longitude: -106.97500°\n",
+ "Reference Datum: SIRGAS2000\n",
+ "Launch Site UTM coordinates: 315468.64 W 3651938.65 N\n",
+ "Launch Site UTM zone: 13S\n",
+ "Launch Site Surface Elevation: 1471.5 m\n",
+ "\n",
+ "\n",
+ "Atmospheric Model Details\n",
+ "\n",
+ "Atmospheric Model Type: Forecast\n",
+ "Forecast Maximum Height: 8.000 km\n",
+ "Forecast Time Period: From 2023-01-10 12:00:00 to 2023-01-26 12:00:00 UTC\n",
+ "Forecast Hour Interval: 3 hrs\n",
+ "Forecast Latitude Range: From -90.0 ° To 90.0 °\n",
+ "Forecast Longitude Range: From 0.0 ° To 359.75 °\n",
+ "\n",
+ "\n",
+ "Surface Atmospheric Conditions\n",
+ "\n",
+ "Surface Wind Speed: 5.62 m/s\n",
+ "Surface Wind Direction: 190.79°\n",
+ "Surface Wind Heading: 10.79°\n",
+ "Surface Pressure: 850.80 hPa\n",
+ "Surface Temperature: 281.08 K\n",
+ "Surface Air Density: 1.054 kg/m³\n",
+ "Surface Speed of Sound: 336.09 m/s\n",
+ "\n",
+ "\n",
+ "\n",
+ "Atmospheric Model Plots\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {},
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "Env.info()"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "### Creating a Motor\n",
+ "\n",
+ "A solid rocket motor is used in this case. See [Solid Motor Class Usage](solid_motor_class_usage.ipynb) for more information on how to use the Motor class."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 47,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Pro75M1670 = SolidMotor(\n",
+ " thrustSource=\"../../data/motors/Cesaroni_M1670.eng\",\n",
+ " burnOut=3.9,\n",
+ " grainNumber=5,\n",
+ " grainSeparation=5 / 1000,\n",
+ " grainDensity=1815,\n",
+ " grainOuterRadius=33 / 1000,\n",
+ " grainInitialInnerRadius=15 / 1000,\n",
+ " grainInitialHeight=120 / 1000,\n",
+ " nozzleRadius=33 / 1000,\n",
+ " throatRadius=11 / 1000,\n",
+ " interpolationMethod=\"linear\",\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 48,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Motor Details\n",
+ "Total Burning Time: 3.9 s\n",
+ "Total Propellant Mass: 2.956 kg\n",
+ "Propellant Exhaust Velocity: 2038.745 m/s\n",
+ "Average Thrust: 1545.218 N\n",
+ "Maximum Thrust: 2200.0 N at 0.15 s after ignition.\n",
+ "Total Impulse: 6026.350 Ns\n",
+ "\n",
+ "Plots\n"
+ ]
+ },
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "Pro75M1670.info()"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Simulating the First Flight Stage"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Let's start to simulate our rocket's flight. We will use the Environment and Motor objects we created before.\n",
+ "\n",
+ "We will assume that the payload is ejected at apogee, however, this can be modified if needed."
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We start by defining the value of each relevant mass, ensuring they are correct before continuing."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 49,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "Rocket dry mass: 16.24 kg (with Payload)\n",
+ "Propellant Mass: 2.956 kg\n",
+ "Payload Mass: 4.5 kg\n",
+ "Fully loaded Rocket Mass: 19.2 kg\n"
+ ]
+ }
+ ],
+ "source": [
+ "# 16.241 is the mass of the rocket including the payload but without the propellant\n",
+ "PayloadMass = 4.5 # in kg\n",
+ "RocketMass = 16.241 - PayloadMass # in kg\n",
+ "\n",
+ "print(\"Rocket dry mass: {:.4} kg (with Payload)\".format(RocketMass + PayloadMass))\n",
+ "print(\"Propellant Mass: {:.4} kg\".format(Pro75M1670.mass(0)))\n",
+ "print(\"Payload Mass: {:.4} kg\".format(PayloadMass))\n",
+ "print(\n",
+ " \"Fully loaded Rocket Mass: {:.4} kg\".format(\n",
+ " RocketMass + Pro75M1670.mass(0) + PayloadMass\n",
+ " )\n",
+ ")"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Then we define our rocket. See [Getting Started](getting_started_colab.ipynb) for more information on defining a Rocket."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 50,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Rocket1 = Rocket(\n",
+ " motor=Pro75M1670,\n",
+ " radius=127 / 2000,\n",
+ " mass=RocketMass + PayloadMass,\n",
+ " inertiaI=6.60,\n",
+ " inertiaZ=0.0351,\n",
+ " distanceRocketNozzle=-1.255,\n",
+ " distanceRocketPropellant=-0.85704,\n",
+ " powerOffDrag=\"../../data/calisto/powerOffDragCurve.csv\",\n",
+ " powerOnDrag=\"../../data/calisto/powerOnDragCurve.csv\",\n",
+ ")\n",
+ "\n",
+ "Rocket1.setRailButtons([0.2, -0.5])\n",
+ "\n",
+ "NoseCone_Rocket1 = Rocket1.addNose(\n",
+ " length=0.55829, kind=\"vonKarman\", distanceToCM=0.71971\n",
+ ")\n",
+ "\n",
+ "FinSet_Rocket1 = Rocket1.addFins(\n",
+ " 4, span=0.100, rootChord=0.120, tipChord=0.040, distanceToCM=-1.04956\n",
+ ")\n",
+ "\n",
+ "Tail_Rocket1 = Rocket1.addTail(\n",
+ " topRadius=0.0635, bottomRadius=0.0435, length=0.060, distanceToCM=-1.194656\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 51,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Inertia Details\n",
+ "\n",
+ "Rocket Mass: 16.241 kg (No Propellant)\n",
+ "Rocket Mass: 19.197 kg (With Propellant)\n",
+ "Rocket Inertia I: 6.600 kg*m2\n",
+ "Rocket Inertia Z: 0.035 kg*m2\n",
+ "\n",
+ "\n",
+ "Geometrical Parameters\n",
+ "\n",
+ "Rocket Maximum Radius: 0.0635 m\n",
+ "Rocket Frontal Area: 0.012668 m2\n",
+ "\n",
+ "Rocket Distances\n",
+ "Rocket Center of Mass - Nozzle Exit Distance: -1.255 m\n",
+ "Rocket Center of Mass - Motor reference point: -0.85704 m\n",
+ "Rocket Center of Mass - Rocket Loaded Center of Mass: -0.132 m\n",
+ "\n",
+ "Aerodynamic Components Parameters\n",
+ "Currently not implemented.\n",
+ "\n",
+ "\n",
+ "Aerodynamics Lift Coefficient Derivatives\n",
+ "\n",
+ "Nose Cone Lift Coefficient Derivative: 2.000/rad\n",
+ "Fins Lift Coefficient Derivative: 5.145/rad\n",
+ "Tail Lift Coefficient Derivative: -1.061/rad\n",
+ "\n",
+ "Aerodynamics Center of Pressure\n",
+ "\n",
+ "Nose Cone Center of Pressure to CM: 0.999 m\n",
+ "Fins Center of Pressure to CM: -1.105 m\n",
+ "Tail Center of Pressure to CM: -1.223 m\n",
+ "Distance - Center of Pressure to CM: -0.392 m\n",
+ "Initial Static Margin: 2.051 c\n",
+ "Final Static Margin: 3.090 c\n",
+ "\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "Rocket1.info()"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Finally we create the flight simulation of this rocket, stopping at apogee"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 52,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "RocketFlight1 = Flight(\n",
+ " rocket=Rocket1, environment=Env, inclination=85, heading=25, terminateOnApogee=True, name=\"RocketFlight1\"\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Start the Second Flight Stage"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Now we will simulate the second flight stage, which is the landing phase of our Rocket.\n",
+ "Here we will consider that the payload was ejected at the apogee of the first stage.\n",
+ "Therefore we should be careful with the value of its mass."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 53,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "Rocket2 = Rocket(\n",
+ " motor=Pro75M1670, # This motor will not be used\n",
+ " radius=127 / 2000,\n",
+ " mass=RocketMass, # Rocket with the eject payload\n",
+ " inertiaI=6.60,\n",
+ " inertiaZ=0.0351,\n",
+ " distanceRocketNozzle=-1.255,\n",
+ " distanceRocketPropellant=-0.85704,\n",
+ " powerOffDrag=1,\n",
+ " powerOnDrag=1,\n",
+ ")\n",
+ "\n",
+ "\n",
+ "def drogueTrigger(p, y):\n",
+ " # p = pressure\n",
+ " # y = [x, y, z, vx, vy, vz, e0, e1, e2, e3, w1, w2, w3]\n",
+ " # activate drogue when vz < 0 m/s.\n",
+ " return True if y[5] < 0 else False\n",
+ "\n",
+ "\n",
+ "def mainTrigger(p, y):\n",
+ " # p = pressure\n",
+ " # y = [x, y, z, vx, vy, vz, e0, e1, e2, e3, w1, w2, w3]\n",
+ " # activate main when vz < 0 m/s and z < 800 + 1400 m (+1400 due to surface elevation).\n",
+ " return True if y[5] < 0 and y[2] < 800 + 1400 else False\n",
+ "\n",
+ "\n",
+ "# Define Parachutes for the rocket\n",
+ "Main_Rocket2 = Rocket2.addParachute(\n",
+ " \"Main\",\n",
+ " CdS=7.2,\n",
+ " trigger=mainTrigger,\n",
+ " samplingRate=105,\n",
+ " lag=1.5,\n",
+ " noise=(0, 8.3, 0.5),\n",
+ ")\n",
+ "\n",
+ "Drogue_Rocket2 = Rocket2.addParachute(\n",
+ " \"Drogue\",\n",
+ " CdS=0.72,\n",
+ " trigger=drogueTrigger,\n",
+ " samplingRate=105,\n",
+ " lag=1.5,\n",
+ " noise=(0, 8.3, 0.5),\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 54,
+ "metadata": {},
+ "outputs": [
+ {
+ "name": "stdout",
+ "output_type": "stream",
+ "text": [
+ "\n",
+ "Inertia Details\n",
+ "\n",
+ "Rocket Mass: 11.741 kg (No Propellant)\n",
+ "Rocket Mass: 14.697 kg (With Propellant)\n",
+ "Rocket Inertia I: 6.600 kg*m2\n",
+ "Rocket Inertia Z: 0.035 kg*m2\n",
+ "\n",
+ "\n",
+ "Geometrical Parameters\n",
+ "\n",
+ "Rocket Maximum Radius: 0.0635 m\n",
+ "Rocket Frontal Area: 0.012668 m2\n",
+ "\n",
+ "Rocket Distances\n",
+ "Rocket Center of Mass - Nozzle Exit Distance: -1.255 m\n",
+ "Rocket Center of Mass - Motor reference point: -0.85704 m\n",
+ "Rocket Center of Mass - Rocket Loaded Center of Mass: -0.172 m\n",
+ "\n",
+ "Aerodynamic Components Parameters\n",
+ "Currently not implemented.\n",
+ "\n",
+ "\n",
+ "Aerodynamics Lift Coefficient Derivatives\n",
+ "\n",
+ "\n",
+ "Aerodynamics Center of Pressure\n",
+ "\n",
+ "Distance - Center of Pressure to CM: 0.000 m\n",
+ "Initial Static Margin: -1.357 c\n",
+ "Final Static Margin: -0.000 c\n",
+ "\n",
+ "\n",
+ "Main Parachute\n",
+ "\n",
+ "CdS Coefficient: 7.2 m2\n",
+ "Ejection signal trigger: mainTrigger\n",
+ "Ejection system refresh rate: 105 Hz.\n",
+ "Time between ejection signal is triggered and the parachute is fully opened: 1.5 s\n",
+ "\n"
+ ]
+ }
+ ],
+ "source": [
+ "Rocket2.info()"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The magic line `initialSolution=RocketFlight1` will make the simulation start from the end of the first stage. \n",
+ "\n",
+ "This will simulate our rocket with its payload ejected, after reaching apogee."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 55,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "RocketFlight2 = Flight(\n",
+ " rocket=Rocket2,\n",
+ " environment=Env,\n",
+ " inclination=0,\n",
+ " heading=0,\n",
+ " maxTime=600,\n",
+ " initialSolution=RocketFlight1,\n",
+ " name=\"RocketFlight2\",\n",
+ ")"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Simulating the Third Flight Stage - Payload Flight"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Here we will simulate the payload flight, which is the third flight stage of our Rocket.\n",
+ "The Payload will be ejected at the apogee of the first stage.\n",
+ "Here, it will be modeled as a \"dummy\" rocket, which does not have any aerodynamic surfaces to stabilize it, nor a motor that ignites.\n",
+ "It does, however, have parachutes."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 56,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "# Define the \"Payload Rocket\"\n",
+ "\n",
+ "PayloadRocket = Rocket(\n",
+ " motor=Pro75M1670, # This motor will not be used\n",
+ " radius=127 / 2000,\n",
+ " mass=PayloadMass,\n",
+ " # The next arguments do not matter for the simulation since it is only a dummy rocket\n",
+ " # so we just add symbolic values:\n",
+ " inertiaI=6.60,\n",
+ " inertiaZ=0.0351,\n",
+ " distanceRocketNozzle=-1.255,\n",
+ " distanceRocketPropellant=-0.85704,\n",
+ " powerOffDrag=0.5,\n",
+ " powerOnDrag=0.5,\n",
+ ")\n",
+ "\n",
+ "\n",
+ "def drogueTrigger(p, y):\n",
+ " # p = pressure\n",
+ " # y = [x, y, z, vx, vy, vz, e0, e1, e2, e3, w1, w2, w3]\n",
+ " # activate drogue when vz < 0 m/s.\n",
+ " return True if y[5] < 0 else False\n",
+ "\n",
+ "\n",
+ "def mainTrigger(p, y):\n",
+ " # p = pressure\n",
+ " # y = [x, y, z, vx, vy, vz, e0, e1, e2, e3, w1, w2, w3]\n",
+ " # activate main when vz < 0 m/s and z < 800 + 1400 m (+1400 due to surface elevation).\n",
+ " return True if y[5] < 0 and y[2] < 800 + 1400 else False\n",
+ "\n",
+ "\n",
+ "PayloadDrogue = PayloadRocket.addParachute(\n",
+ " \"Drogue\",\n",
+ " CdS=0.35,\n",
+ " trigger=drogueTrigger,\n",
+ " samplingRate=105,\n",
+ " lag=1.5,\n",
+ " noise=(0, 8.3, 0.5),\n",
+ ")\n",
+ "\n",
+ "PayloadMain = PayloadRocket.addParachute(\n",
+ " \"Main\",\n",
+ " CdS=4.0,\n",
+ " trigger=mainTrigger,\n",
+ " samplingRate=105,\n",
+ " lag=1.5,\n",
+ " noise=(0, 8.3, 0.5),\n",
+ ")"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "The magic line `initialSolution=RocketFlight1` will make the simulation start from the end of the first stage."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 57,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "PayloadFlight = Flight(\n",
+ " rocket=PayloadRocket,\n",
+ " environment=Env,\n",
+ " inclination=0,\n",
+ " heading=0,\n",
+ " maxTime=600,\n",
+ " initialSolution=RocketFlight1,\n",
+ " name=\"PayloadFlight\",\n",
+ ")"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "## Plotting Everything together"
+ ]
+ },
+ {
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "We will invoke a method from RocketPy's utilities class in order to visualize \n",
+ "the trajectory."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 58,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "from rocketpy.plots.compare import CompareFlights"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "Then we create the `comparison` object, an instance of CompareFligths class"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 59,
+ "metadata": {},
+ "outputs": [],
+ "source": [
+ "comparison = CompareFlights([RocketFlight1, RocketFlight2, PayloadFlight])"
+ ]
+ },
+ {
+ "attachments": {},
+ "cell_type": "markdown",
+ "metadata": {},
+ "source": [
+ "And, finally, we are able to plot different aspects of the comparison object."
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 60,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "comparison.trajectories_3d(legend=True)"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 61,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "comparison.positions()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 62,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "comparison.velocities()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 63,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "comparison.accelerations()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 64,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "comparison.aerodynamic_forces()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 65,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "comparison.aerodynamic_moments()"
+ ]
+ },
+ {
+ "cell_type": "code",
+ "execution_count": 66,
+ "metadata": {},
+ "outputs": [
+ {
+ "data": {
+ "image/svg+xml": "\n\n\n",
+ "text/plain": [
+ ""
+ ]
+ },
+ "metadata": {
+ "needs_background": "light"
+ },
+ "output_type": "display_data"
+ }
+ ],
+ "source": [
+ "comparison.angles_of_attack()"
+ ]
+ }
+ ],
+ "metadata": {
+ "kernelspec": {
+ "display_name": "Python 3",
+ "language": "python",
+ "name": "python3"
+ },
+ "language_info": {
+ "codemirror_mode": {
+ "name": "ipython",
+ "version": 3
+ },
+ "file_extension": ".py",
+ "mimetype": "text/x-python",
+ "name": "python",
+ "nbconvert_exporter": "python",
+ "pygments_lexer": "ipython3",
+ "version": "3.10.5 (tags/v3.10.5:f377153, Jun 6 2022, 16:14:13) [MSC v.1929 64 bit (AMD64)]"
+ },
+ "orig_nbformat": 4,
+ "vscode": {
+ "interpreter": {
+ "hash": "26de051ba29f2982a8de78e945f0abaf191376122a1563185a90213a26c5da77"
+ }
+ }
+ },
+ "nbformat": 4,
+ "nbformat_minor": 2
+}
diff --git a/docs/user/index.rst b/docs/user/index.rst
index 24c56df79..3413d9276 100644
--- a/docs/user/index.rst
+++ b/docs/user/index.rst
@@ -14,5 +14,6 @@ Welcome to RocketPy's user documentation!
../notebooks/dispersion_analysis/dispersion_analysis.ipynb
../notebooks/utilities_usage.ipynb
../notebooks/compare_flights_usage.ipynb
+ ../notebooks/deployable_payload_example.ipynb
../matlab/matlab.rst