{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Tutorial 11 - Missions\n", "Welcome to this tutorial outlining the mission creation process in RCAIDE. This guide will walk you through the code, explain its components, and highlight where modifications can be made to customize the simulation for different vehicle designs. It breaks down tutorial 01 into smaller sections, although the reader is encouraged to subsequently refer to tutorial 01 for the full context. \n", "\n", "---" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## 1. Header and Imports\n", "\n", "The **Imports** section is divided into two parts: general-purpose Python libraries and simulation-specific libraries. Here, only the numpy Library, general RCAIDE, and the Units module are imported. \n", "\n", "---" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "Matplotlib created a temporary cache directory at /var/folders/r4/4h9x29hj6f95kyhjsltxc6_00000gn/T/matplotlib-i1geoih0 because the default path (/Users/aidanmolloy/.matplotlib) is not a writable directory; it is highly recommended to set the MPLCONFIGDIR environment variable to a writable directory, in particular to speed up the import of Matplotlib and to better support multiprocessing.\n", "Fontconfig warning: ignoring UTF-8: not a valid region tag\n", "Matplotlib is building the font cache; this may take a moment.\n" ] } ], "source": [ "\n", "import RCAIDE\n", "from RCAIDE.Framework.Core import Units\n", "\n", "import numpy as np" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Missions Setup\n", "\n", "The **`setup`** function creates a **missions container** that holds a single mission profile. This container allows for the bundling of multiple missions, but only includes the base mission in this tutorial. To add additional missions, define the mission in a function similar to **`mission_setup`** and then append it to the **missions** container with a new tag.\n", "\n", "If multiple missions are added here, they still must be called individually for evaluation.\n", "\n", "Note the distinction between mission and missions here. The **mission** is the actual mission profile, while **missions** is a container that holds the individual mission profiles. Missions container is subsequently returned by the **`setup`** function." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "def setup(analyses): \n", " # ------------------------------------------------------------------\n", " # Base Mission\n", " # ------------------------------------------------------------------\n", " mission = mission_setup(analyses) \n", " missions = RCAIDE.Framework.Mission.Missions() \n", " mission.tag = 'base'\n", " missions.append(mission)\n", "\n", " return missions\n", " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "# Mission Setup\n", "\n", "The **`mission_setup`** function defines the baseline **mission profile** used to compute the aircraft's performance. A mission profile consists of sequential **segments** that represent different phases of flight, such as climb, cruise, and descent.\n", "\n", "---\n", "\n", "### Mission Profile and Conditions\n", "\n", "A mission profile is made up of individual flight segments. Each segment specifies the aircraft's flight conditions, such as:\n", "\n", "- **Altitude**\n", "- **Speed**\n", "- **Range**\n", "- **Time**\n", "\n", "A segment can also include dynamic flight conditions, including among others:\n", "\n", "- **Acceleration**\n", "- **Climb Rate**\n", "- **Pitch Rate**\n", "- **Roll Rate**\n", "\n", "These segments are simulated sequentially, allowing for a detailed performance analysis of the vehicle across all phases of flight. \n", "\n", "---\n", "\n", "### Segments in the Mission Profile\n", "\n", "Common segments in a mission profile include:\n", "\n", "- **Taxi**: Ground movement of the aircraft before takeoff and after landing.\n", "- **Takeoff**: Acceleration and lift-off phase with high-lift devices deployed.\n", "- **Climb**: Gradual ascent to cruise altitude, often with reduced flap/slat deployment.\n", "- **Cruise**: Level flight at a constant altitude and speed for fuel-efficient operation.\n", "- **Descent**: Controlled reduction in altitude as the aircraft prepares for landing.\n", "- **Landing**: Final phase of flight with maximum flap and slat deployment for touchdown.\n", "\n", "Each segment defines specific performance conditions and parameters, such as speed, altitude, and duration. Selected segments are explained in more detail below, but for more information on the types of segments available, refer to the RCAIDE documentation under RCAIDE/Library/Mission/Segments.\n", "\n", "---" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ " \n", "\n", "def mission_setup(analyses):\n", " \"\"\"This function defines the baseline mission that will be flown by the aircraft in order\n", " to compute performance.\"\"\"\n", "\n", " # ------------------------------------------------------------------\n", " # Initialize the Mission\n", " # ------------------------------------------------------------------\n", "\n", " mission = RCAIDE.Framework.Mission.Sequential_Segments()\n", " mission.tag = 'the_mission'\n", " \n", " Segments = RCAIDE.Framework.Mission.Segments \n", " base_segment = Segments.Segment()\n", "\n", " # ------------------------------------------------------------------------------------------------------------------------------------ \n", " # Takeoff Roll\n", " # ------------------------------------------------------------------------------------------------------------------------------------ \n", "\n", " segment = Segments.Ground.Takeoff(base_segment)\n", " segment.tag = \"Takeoff\" \n", " segment.analyses.extend( analyses.takeoff )\n", " segment.velocity_start = 10.* Units.knots\n", " segment.velocity_end = 125.0 * Units['m/s']\n", " segment.friction_coefficient = 0.04\n", " segment.altitude = 0.0 \n", " mission.append_segment(segment)\n", "\n", " # ------------------------------------------------------------------\n", " # First Climb Segment: Constant Speed Constant Rate \n", " # ------------------------------------------------------------------\n", "\n", " segment = Segments.Climb.Constant_Speed_Constant_Rate(base_segment)\n", " segment.tag = \"climb_1\" \n", " segment.analyses.extend( analyses.takeoff ) \n", " segment.altitude_start = 0.0 * Units.km\n", " segment.altitude_end = 3.0 * Units.km\n", " segment.air_speed = 125.0 * Units['m/s']\n", " segment.climb_rate = 6.0 * Units['m/s'] \n", " \n", " # define flight dynamics to model \n", " segment.flight_dynamics.force_x = True \n", " segment.flight_dynamics.force_z = True \n", " \n", " # define flight controls \n", " segment.assigned_control_variables.throttle.active = True \n", " segment.assigned_control_variables.throttle.assigned_propulsors = [['starboard_propulsor','port_propulsor']] \n", " segment.assigned_control_variables.pitch_angle.active = True \n", " \n", " mission.append_segment(segment)\n", "\n", "\n", " # ------------------------------------------------------------------\n", " # Second Climb Segment: Constant Speed Constant Rate \n", " # ------------------------------------------------------------------ \n", "\n", " segment = Segments.Climb.Constant_Speed_Constant_Rate(base_segment)\n", " segment.tag = \"climb_2\" \n", " segment.analyses.extend( analyses.cruise ) \n", " segment.altitude_end = 8.0 * Units.km\n", " segment.air_speed = 190.0 * Units['m/s']\n", " segment.climb_rate = 6.0 * Units['m/s'] \n", " \n", " # define flight dynamics to model \n", " segment.flight_dynamics.force_x = True \n", " segment.flight_dynamics.force_z = True \n", " \n", " # define flight controls \n", " segment.assigned_control_variables.throttle.active = True \n", " segment.assigned_control_variables.throttle.assigned_propulsors = [['starboard_propulsor','port_propulsor']] \n", " segment.assigned_control_variables.pitch_angle.active = True \n", " \n", " mission.append_segment(segment)\n", "\n", "\n", " # ------------------------------------------------------------------\n", " # Third Climb Segment: Constant Speed Constant Rate \n", " # ------------------------------------------------------------------ \n", "\n", " segment = Segments.Climb.Constant_Speed_Constant_Rate(base_segment)\n", " segment.tag = \"climb_3\" \n", " segment.analyses.extend( analyses.cruise ) \n", " segment.altitude_end = 10.5 * Units.km\n", " segment.air_speed = 226.0 * Units['m/s']\n", " segment.climb_rate = 3.0 * Units['m/s'] \n", " \n", " # define flight dynamics to model \n", " segment.flight_dynamics.force_x = True \n", " segment.flight_dynamics.force_z = True \n", " \n", " # define flight controls \n", " segment.assigned_control_variables.throttle.active = True \n", " segment.assigned_control_variables.throttle.assigned_propulsors = [['starboard_propulsor','port_propulsor']] \n", " segment.assigned_control_variables.pitch_angle.active = True \n", " \n", " mission.append_segment(segment)\n", "\n", "\n", " # ------------------------------------------------------------------ \n", " # Cruise Segment: Constant Speed Constant Altitude\n", " # ------------------------------------------------------------------ \n", "\n", " segment = Segments.Cruise.Constant_Speed_Constant_Altitude(base_segment)\n", " segment.tag = \"cruise\" \n", " segment.analyses.extend( analyses.cruise ) \n", " segment.altitude = 10.668 * Units.km \n", " segment.air_speed = 230.412 * Units['m/s']\n", " segment.distance = 1000 * Units.nmi \n", " \n", " # define flight dynamics to model \n", " segment.flight_dynamics.force_x = True \n", " segment.flight_dynamics.force_z = True \n", " \n", " # define flight controls \n", " segment.assigned_control_variables.throttle.active = True \n", " segment.assigned_control_variables.throttle.assigned_propulsors = [['starboard_propulsor','port_propulsor']] \n", " segment.assigned_control_variables.pitch_angle.active = True \n", " \n", " mission.append_segment(segment)\n", "\n", "\n", " # ------------------------------------------------------------------\n", " # First Descent Segment: Constant Speed Constant Rate \n", " # ------------------------------------------------------------------\n", "\n", " segment = Segments.Descent.Constant_Speed_Constant_Rate(base_segment)\n", " segment.tag = \"descent_1\" \n", " segment.analyses.extend( analyses.cruise ) \n", " segment.altitude_start = 10.5 * Units.km \n", " segment.altitude_end = 8.0 * Units.km\n", " segment.air_speed = 220.0 * Units['m/s']\n", " segment.descent_rate = 4.5 * Units['m/s'] \n", " \n", " # define flight dynamics to model \n", " segment.flight_dynamics.force_x = True \n", " segment.flight_dynamics.force_z = True \n", " \n", " # define flight controls \n", " segment.assigned_control_variables.throttle.active = True \n", " segment.assigned_control_variables.throttle.assigned_propulsors = [['starboard_propulsor','port_propulsor']] \n", " segment.assigned_control_variables.pitch_angle.active = True \n", " \n", " mission.append_segment(segment)\n", "\n", "\n", " # ------------------------------------------------------------------\n", " # Second Descent Segment: Constant Speed Constant Rate \n", " # ------------------------------------------------------------------\n", "\n", " segment = Segments.Descent.Constant_Speed_Constant_Rate(base_segment)\n", " segment.tag = \"descent_2\" \n", " segment.analyses.extend( analyses.cruise ) \n", " segment.altitude_end = 6.0 * Units.km\n", " segment.air_speed = 195.0 * Units['m/s']\n", " segment.descent_rate = 5.0 * Units['m/s'] \n", " \n", " # define flight dynamics to model \n", " segment.flight_dynamics.force_x = True \n", " segment.flight_dynamics.force_z = True \n", " \n", " # define flight controls \n", " segment.assigned_control_variables.throttle.active = True \n", " segment.assigned_control_variables.throttle.assigned_propulsors = [['starboard_propulsor','port_propulsor']] \n", " segment.assigned_control_variables.pitch_angle.active = True \n", " \n", " mission.append_segment(segment)\n", "\n", "\n", " # ------------------------------------------------------------------\n", " # Third Descent Segment: Constant Speed Constant Rate \n", " # ------------------------------------------------------------------\n", "\n", " segment = Segments.Descent.Constant_Speed_Constant_Rate(base_segment)\n", " segment.tag = \"descent_3\" \n", " segment.analyses.extend( analyses.cruise ) \n", " segment.altitude_end = 4.0 * Units.km\n", " segment.air_speed = 170.0 * Units['m/s']\n", " segment.descent_rate = 5.0 * Units['m/s'] \n", " \n", " # define flight dynamics to model \n", " segment.flight_dynamics.force_x = True \n", " segment.flight_dynamics.force_z = True \n", " \n", " # define flight controls \n", " segment.assigned_control_variables.throttle.active = True \n", " segment.assigned_control_variables.throttle.assigned_propulsors = [['starboard_propulsor','port_propulsor']] \n", " segment.assigned_control_variables.pitch_angle.active = True \n", " \n", " mission.append_segment(segment)\n", "\n", "\n", " # ------------------------------------------------------------------\n", " # Fourth Descent Segment: Constant Speed Constant Rate \n", " # ------------------------------------------------------------------\n", "\n", " segment = Segments.Descent.Constant_Speed_Constant_Rate(base_segment)\n", " segment.tag = \"descent_4\" \n", " segment.analyses.extend( analyses.cruise ) \n", " segment.altitude_end = 2.0 * Units.km\n", " segment.air_speed = 150.0 * Units['m/s']\n", " segment.descent_rate = 5.0 * Units['m/s'] \n", " \n", " # define flight dynamics to model \n", " segment.flight_dynamics.force_x = True \n", " segment.flight_dynamics.force_z = True \n", " \n", " # define flight controls \n", " segment.assigned_control_variables.throttle.active = True \n", " segment.assigned_control_variables.throttle.assigned_propulsors = [['starboard_propulsor','port_propulsor']] \n", " segment.assigned_control_variables.pitch_angle.active = True \n", " \n", " mission.append_segment(segment)\n", "\n", "\n", "\n", " # ------------------------------------------------------------------\n", " # Fifth Descent Segment:Constant Speed Constant Rate \n", " # ------------------------------------------------------------------\n", "\n", " segment = Segments.Descent.Constant_Speed_Constant_Rate(base_segment)\n", " segment.tag = \"descent_5\" \n", " segment.analyses.extend( analyses.landing ) \n", " segment.altitude_end = 0.0 * Units.km\n", " segment.air_speed = 145.0 * Units['m/s']\n", " segment.descent_rate = 3.0 * Units['m/s'] \n", " \n", " # define flight dynamics to model \n", " segment.flight_dynamics.force_x = True \n", " segment.flight_dynamics.force_z = True \n", " \n", " # define flight controls \n", " segment.assigned_control_variables.throttle.active = True \n", " segment.assigned_control_variables.throttle.assigned_propulsors = [['starboard_propulsor','port_propulsor']] \n", " segment.assigned_control_variables.pitch_angle.active = True \n", " \n", " mission.append_segment(segment)\n", " \n", "\n", " return mission" ] } ], "metadata": { "kernelspec": { "display_name": ".rcaideenv", "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.11.6" } }, "nbformat": 4, "nbformat_minor": 2 }