diff --git a/docs/examples/bella_lui_3dof_flight_sim.ipynb b/docs/examples/bella_lui_3dof_flight_sim.ipynb new file mode 100644 index 000000000..01eec4ba7 --- /dev/null +++ b/docs/examples/bella_lui_3dof_flight_sim.ipynb @@ -0,0 +1,484 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Bella Lui - 3 DOF Simulation with Point Mass Objects\n", + "\n", + "This notebook demonstrates the 3 DOF flight simulation capabilities of RocketPy using a simplified version of the Bella Lui rocket from EPFL Rocket Team. The rocket is modeled using PointMassMotor and PointMassRocket for a 3 DOF trajectory simulation.\n", + "\n", + "**Note**: This is a simplified model for demonstration purposes. For accurate flight predictions, use the full 6 DOF model in `bella_lui_flight_sim.ipynb`." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "# Importing libraries\n", + "import matplotlib.pyplot as plt\n", + "import numpy as np\n", + "\n", + "from rocketpy import Environment, Flight\n", + "from rocketpy.motors.point_mass_motor import PointMassMotor\n", + "from rocketpy.rocket.point_mass_rocket import PointMassRocket" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Environment Setup\n", + "\n", + "Setting up the environment for the Bella Lui launch at Kaltbrunn, Switzerland." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "Gravity Details\n", + "\n", + "Acceleration of gravity at surface level: 9.8100 m/s²\n", + "Acceleration of gravity at 2.000 km (ASL): 9.8100 m/s²\n", + "\n", + "\n", + "Launch Site Details\n", + "\n", + "Launch Date: 2020-02-22 13:00:00 UTC\n", + "Launch Site Latitude: 47.21348°\n", + "Launch Site Longitude: 9.00334°\n", + "Reference Datum: SIRGAS2000\n", + "Launch Site UTM coordinates: 500252.61 E 5228887.37 N\n", + "Launch Site UTM zone: 32T\n", + "Launch Site Surface Elevation: 407.0 m\n", + "\n", + "\n", + "Atmospheric Model Details\n", + "\n", + "Atmospheric Model Type: standard_atmosphere\n", + "standard_atmosphere Maximum Height: 2.000 km\n", + "\n", + "Surface Atmospheric Conditions\n", + "\n", + "Surface Wind Speed: 0.00 m/s\n", + "Surface Wind Direction: 0.00°\n", + "Surface Wind Heading: 0.00°\n", + "Surface Pressure: 965.65 hPa\n", + "Surface Temperature: 285.51 K\n", + "Surface Air Density: 1.178 kg/m³\n", + "Surface Speed of Sound: 338.62 m/s\n", + "\n", + "\n", + "Earth Model Details\n", + "\n", + "Earth Radius at Launch site: 6366.66 km\n", + "Semi-major Axis: 6378.14 km\n", + "Semi-minor Axis: 6356.75 km\n", + "Flattening: 0.0034\n", + "\n", + "\n", + "Atmospheric Model Plots\n", + "\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "# Environment conditions for Kaltbrunn launch site\n", + "env = Environment(\n", + " gravity=9.81,\n", + " latitude=47.213476,\n", + " longitude=9.003336,\n", + " date=(2020, 2, 22, 13),\n", + " elevation=407,\n", + ")\n", + "\n", + "# Set atmospheric model - using standard atmosphere for simplicity\n", + "env.set_atmospheric_model(type=\"standard_atmosphere\")\n", + "env.max_expected_height = 2000\n", + "\n", + "# Display environment info\n", + "env.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Motor Configuration\n", + "\n", + "Creating a PointMassMotor with **time-varying thrust** using the actual AeroTech K828FJ thrust curve:\n", + "- Thrust varies realistically over time (not constant!)\n", + "- Peak thrust: ~1300 N at t=0.04s\n", + "- Average thrust: ~888 N\n", + "- Total impulse: ~2157 N·s\n", + "- Burn time: ~2.5 s\n", + "- Propellant mass: ~1.373 kg\n", + "\n", + "**Note**: PointMassMotor supports multiple thrust input types:\n", + "- Constant value (e.g., `thrust_source=888`)\n", + "- Time-varying function (e.g., `thrust_source=lambda t: 1000 * np.exp(-t)`)\n", + "- Thrust curve from file (e.g., `.eng`, `.csv`)\n", + "- NumPy array of [time, thrust] pairs" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [ + { + "ename": "SyntaxError", + "evalue": "invalid syntax. Perhaps you forgot a comma? (1751141860.py, line 4)", + "output_type": "error", + "traceback": [ + " \u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[3]\u001b[39m\u001b[32m, line 4\u001b[39m\n\u001b[31m \u001b[39m\u001b[31mthrust_source=\"../../data/motors/aerotech/AeroTech_K828FJ.eng\" # Actual thrust curve file\u001b[39m\n ^\n\u001b[31mSyntaxError\u001b[39m\u001b[31m:\u001b[39m invalid syntax. Perhaps you forgot a comma?\n" + ] + } + ], + "source": [ + "# Motor with TIME-VARYING thrust using actual K828FJ thrust curve\n", + "# The PointMassMotor can accept thrust curves from files, arrays, or functions\n", + "motor = PointMassMotor(\n", + " thrust_source=\"../../data/motors/aerotech/AeroTech_K828FJ.eng\", # Actual thrust curve file\n", + " dry_mass=1.0, # Motor casing mass in kg\n", + " propellant_initial_mass=1.373, # Propellant mass in kg\n", + ")\n", + "\n", + "# Display motor information\n", + "motor.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Rocket Configuration\n", + "\n", + "Creating a PointMassRocket with Bella Lui's key characteristics:\n", + "- Radius: 0.078 m (156 mm diameter)\n", + "- Dry mass (without motor): ~17.227 kg\n", + "- Drag coefficients based on Bella Lui data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Bella Lui rocket parameters\n", + "rocket = PointMassRocket(\n", + " radius=0.078, # 156 mm diameter\n", + " mass=17.227, # Dry mass without motor (18.227 - 1.0 motor dry mass)\n", + " center_of_mass_without_motor=0.0, # Simplified CM position\n", + " power_off_drag=0.43, # Drag coefficient when motor is off\n", + " power_on_drag=0.43, # Drag coefficient when motor is on\n", + ")\n", + "\n", + "# Add motor to the rocket\n", + "rocket.add_motor(motor, position=0)\n", + "\n", + "# Display rocket information\n", + "rocket.info()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Flight Simulation (3 DOF)\n", + "\n", + "Running the flight simulation in 3 DOF mode with launch parameters similar to the Bella Lui mission." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Create 3 DOF flight simulation\n", + "flight = Flight(\n", + " rocket=rocket,\n", + " environment=env,\n", + " rail_length=4.2, # Rail length in meters\n", + " inclination=89, # Nearly vertical launch (89 degrees from horizontal)\n", + " heading=45, # Launch heading in degrees\n", + " simulation_mode=\"3 DOF\", # 3 DOF simulation mode\n", + " max_time=100, # Maximum simulation time in seconds\n", + ")\n", + "\n", + "# Display basic flight information\n", + "print(f\"Simulation Mode: {flight.simulation_mode}\")\n", + "print(f\"Apogee Altitude: {flight.apogee:.2f} m\")\n", + "print(f\"Apogee Time: {flight.apogee_time:.2f} s\")\n", + "print(f\"Maximum Velocity: {flight.max_speed:.2f} m/s\")\n", + "print(f\"Impact Velocity: {flight.impact_velocity:.2f} m/s\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Flight Plots\n", + "\n", + "The following cells demonstrate that all plotting functions work correctly with 3 DOF simulations, including the `energy_data()` plot that previously failed." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Trajectory 3D Plot" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flight.plots.trajectory_3d()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Linear Kinematics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flight.plots.linear_kinematics_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Attitude Data" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flight.plots.attitude_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Flight Path Angle" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flight.plots.flight_path_angle_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Angular Kinematics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flight.plots.angular_kinematics_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Aerodynamic Forces" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flight.plots.aerodynamic_forces()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Energy Data\n", + "\n", + "**This plot previously failed for 3 DOF simulations but now works correctly!**" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# This plot requires net_thrust, which is now available in 3 DOF mode\n", + "flight.plots.energy_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Fluid Mechanics" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flight.plots.fluid_mechanics_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Stability and Control" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flight.plots.stability_and_control_data()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Pressure vs Altitude" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "flight.plots.pressure_rocket_altitude()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## All Plots at Once\n", + "\n", + "The `plots.all()` method generates all available plots. This demonstrates that all plotting functionality works correctly for 3 DOF simulations." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# Generate all plots\n", + "flight.plots.all()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Summary\n", + "\n", + "This notebook demonstrates:\n", + "\n", + "1. **3 DOF Simulation**: Using PointMassMotor and PointMassRocket for simplified trajectory analysis\n", + "2. **Complete Plotting Support**: All plot methods work correctly in 3 DOF mode, including:\n", + " - Trajectory plots\n", + " - Kinematics (linear and angular)\n", + " - Energy data (previously failed, now fixed!)\n", + " - Aerodynamic forces\n", + " - Fluid mechanics\n", + " - Stability and control\n", + "3. **Bella Lui Model**: Simplified version based on real flight data from EPFL Rocket Team\n", + "\n", + "### Key Differences from 6 DOF:\n", + "\n", + "- **3 DOF**: Simplified point mass model, faster computation, suitable for preliminary analysis\n", + "- **6 DOF**: Full rigid body dynamics with rotation, more accurate, required for detailed flight analysis\n", + "\n", + "### When to Use 3 DOF:\n", + "\n", + "- Quick trajectory estimates\n", + "- Preliminary design studies\n", + "- Monte Carlo simulations with many runs\n", + "- When rotational dynamics are not critical\n", + "\n", + "For the complete 6 DOF simulation of Bella Lui with full aerodynamic surfaces and detailed motor modeling, see `bella_lui_flight_sim.ipynb`." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": ".venv", + "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.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/rocketpy/simulation/flight.py b/rocketpy/simulation/flight.py index 84ab880dc..ceb6f7fad 100644 --- a/rocketpy/simulation/flight.py +++ b/rocketpy/simulation/flight.py @@ -2041,11 +2041,21 @@ def u_dot_generalized_3dof(self, t, u, post_processing=False): R3 += fz # Thrust and weight - thrust = self.rocket.motor.thrust.get_value_opt(t) + # Calculate net thrust including pressure thrust correction if motor is burning + if self.rocket.motor.burn_start_time < t < self.rocket.motor.burn_out_time: + pressure = self.env.pressure.get_value_opt(z) + net_thrust = max( + self.rocket.motor.thrust.get_value_opt(t) + + self.rocket.motor.pressure_thrust(pressure), + 0, + ) + else: + net_thrust = 0 + gravity = self.env.gravity.get_value_opt(z) weight_body = Kt @ Vector([0, 0, -total_mass * gravity]) - total_force = Vector([0, 0, thrust]) + weight_body + Vector([R1, R2, R3]) + total_force = Vector([0, 0, net_thrust]) + weight_body + Vector([R1, R2, R3]) # Dynamics v_dot = K @ (total_force / total_mass) @@ -2133,7 +2143,7 @@ def u_dot_generalized_3dof(self, t, u, post_processing=False): if post_processing: self.__post_processed_variables.append( - [t, *v_dot, *w_dot, R1, R2, R3, 0, 0, 0] + [t, *v_dot, *w_dot, R1, R2, R3, 0, 0, 0, net_thrust] ) return u_dot diff --git a/tests/integration/simulation/test_flight_3dof.py b/tests/integration/simulation/test_flight_3dof.py index ef4c35c14..1ce705ea4 100644 --- a/tests/integration/simulation/test_flight_3dof.py +++ b/tests/integration/simulation/test_flight_3dof.py @@ -301,3 +301,64 @@ def test_weathercock_anti_aligned_uses_perp_axis_and_evolves(flight_weathercock_ assert e_dot_magnitude > 1e-6, ( "Quaternion derivatives should be non-zero for anti-aligned" ) + + +def test_3dof_all_plots_work(flight_3dof, tmp_path): + """Tests that all plot methods work correctly for 3 DOF flights. + + This test ensures that the plotting functionality is compatible with + 3 DOF simulations, which have different internal data structures + compared to 6 DOF simulations. Specifically, it verifies that plots + requiring net_thrust work correctly. + + Parameters + ---------- + flight_3dof : rocketpy.simulation.flight.Flight + A Flight object configured for 3-DOF simulation. + tmp_path : pathlib.Path + Pytest fixture providing a temporary directory path. + """ + import matplotlib + + matplotlib.use("Agg") # Use non-interactive backend + import matplotlib.pyplot as plt + + # Test individual plot methods that previously failed in 3 DOF mode + try: + energy_plot_path = tmp_path / "test_3dof_energy.png" + flight_3dof.plots.energy_data(filename=str(energy_plot_path)) + except Exception as e: + pytest.fail(f"energy_data plot failed for 3 DOF flight: {e}") + + # Test the all() method which calls all plots + try: + flight_3dof.plots.all() + except Exception as e: + pytest.fail(f"plots.all() failed for 3 DOF flight: {e}") + + # Close all figures to avoid memory issues + plt.close("all") + + +def test_3dof_net_thrust_available(flight_3dof): + """Tests that net_thrust property is available in 3 DOF mode. + + The net_thrust property is required for energy plots and should be + available in both 3 DOF and 6 DOF modes. + + Parameters + ---------- + flight_3dof : rocketpy.simulation.flight.Flight + A Flight object configured for 3-DOF simulation. + """ + # Check that net_thrust can be accessed + assert hasattr(flight_3dof, "net_thrust"), "net_thrust attribute not found" + + # Check that it returns a Function object with data + net_thrust = flight_3dof.net_thrust + assert len(net_thrust) > 0, "net_thrust should have data points" + + # Verify that thrust_power can be computed (uses net_thrust internally) + assert hasattr(flight_3dof, "thrust_power"), "thrust_power attribute not found" + thrust_power = flight_3dof.thrust_power + assert len(thrust_power) > 0, "thrust_power should have data points"