Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
080e316
ENH: first structure
MateusStano Mar 25, 2026
a927248
ENH: improve structure
MateusStano Mar 25, 2026
fae72c1
Merge remote-tracking branch 'origin/develop' into enh/events
MateusStano May 13, 2026
31952a1
ENH: Add flight phase management classes for simulation
MateusStano May 27, 2026
6e9876a
DOC: add .rst files
MateusStano Jun 2, 2026
2e86a37
ENH: adapt event affect code
MateusStano Jun 2, 2026
2ea45f3
ENH: class Event
MateusStano Jun 2, 2026
4241ff5
ENH: first final flight refactor
MateusStano Jun 2, 2026
2aabe20
DOC: improve docstrings
MateusStano Jun 7, 2026
73a9985
Merge remote-tracking branch 'origin/develop' into enh/events
MateusStano Jun 7, 2026
46b84ad
ENH: Refactor parachute trigger function and improve controller obser…
MateusStano Jun 8, 2026
4786f28
DOC: remove noise usage in docs and tests
MateusStano Jun 8, 2026
dfbba5d
ENH: optimize simulation speed
MateusStano Jun 9, 2026
33b98b0
ENH: imrpove plots and prints
MateusStano Jun 11, 2026
968dad4
DOC: improve/fix docs
MateusStano Jun 15, 2026
737bc98
MNT: pylint
MateusStano Jun 15, 2026
d954278
DOC: sensor docs
MateusStano Jun 15, 2026
97b5e90
TST: add tests
MateusStano Jun 15, 2026
7cb5b60
ENH: sensor data access via the Flight class, with prints, plots and …
MateusStano Jun 15, 2026
4cdf2b1
DOC: revert forecast.rst changes
MateusStano Jun 15, 2026
a1b4be9
MNT: ruff lint
MateusStano Jun 15, 2026
91e2130
TST: fix get_controller_observed_variables test
MateusStano Jun 15, 2026
dc12d23
MNT: pylint
MateusStano Jun 15, 2026
8f95df6
MNT: pylint
MateusStano Jun 15, 2026
5fff32c
DOC: add event class to references
MateusStano Jun 15, 2026
26de931
MNT: schedule the new deprecations for removal in v1.16
MateusStano Sep 14, 2026
05f4d55
DOC: describe the sensors and step_size trigger context keys correctly
MateusStano Sep 14, 2026
a9bac96
ENH: add Solution, SolutionSegment, StateSchema and StateView
MateusStano Jul 16, 2026
c13b417
TST: unit tests for the solution module
MateusStano Jul 16, 2026
63d5963
ENH: add internal _Dynamics wrapper and instances
MateusStano Jul 16, 2026
389a471
ENH: adopt Solution and _Dynamics in the flight pipeline
MateusStano Jul 16, 2026
7da2785
ENH: rebuild post-processed variables from per-segment derived buffers
MateusStano Jul 16, 2026
a7dae38
ENH: reduce parachute descent to a 6-state dynamics
MateusStano Jul 16, 2026
82c5249
ENH: deprecate solution_array, get_solution_at_time and the raw export
MateusStano Jul 16, 2026
06bb8f2
DOC: document the Solution container and canonical state guarantees
MateusStano Jul 16, 2026
3fff736
MNT: lint sweep for the solution refactor
MateusStano Jul 16, 2026
9c6c0cc
TST: build a real Solution in the core-event-builder integration test
MateusStano Jul 16, 2026
d0b1448
ENH: store the flight solution as per-phase states and derived quanti…
MateusStano Jul 29, 2026
3c9e4e8
ENH: flatten Solution onto one row list
MateusStano Aug 16, 2026
733615a
ENH: move the recorded post-process rows into Solution
MateusStano Aug 16, 2026
f64aea7
BUG: read the last state through the phase that owns it
MateusStano Aug 16, 2026
f88fd9b
ENH: read a single solution value without building a state dict
MateusStano Aug 16, 2026
ad349f9
DOC: document the flat solution layout
MateusStano Aug 16, 2026
210a805
MNT: make the solution phase record internal
MateusStano Aug 16, 2026
85943b3
STY: strip trailing whitespace from the phase dynamics docstring
MateusStano Aug 16, 2026
78d53d9
MNT: call the post-process entries values, not rows
MateusStano Aug 16, 2026
393d20a
MNT: drop the reader for a solution layout that never shipped
MateusStano Aug 16, 2026
f9e11bf
ENH: simplify the exact-time solvers to one function per method
MateusStano Sep 14, 2026
12841cd
MNT: simplify _PhaseDynamics to a single canonical mapping
MateusStano Sep 14, 2026
269f66e
MNT: keep Solution to simple reads, with private writes
MateusStano Sep 14, 2026
e042aff
ENH: pass the event context object to triggers and callbacks
MateusStano Sep 14, 2026
e49bae6
BUG: fly the lag before a new flight phase begins
MateusStano Sep 14, 2026
20a7646
BUG: use the angular rates in the solid propulsion equations of motion
MateusStano Sep 15, 2026
23bdc56
DOC: finish moving the docs to the event context convention
MateusStano Sep 15, 2026
517f7f9
DOC: add a flowchart of the simulation loop and pin the gate order
MateusStano Sep 15, 2026
d7490a1
DOC: say the solid propulsion equations are only valid for solid motors
MateusStano Sep 15, 2026
988bddf
DOC: drop the simulation loop flowchart and its mermaid dependency
MateusStano Sep 15, 2026
79a4f72
BUG: keep the quadratic roots accurate in find_roots_cubic_function
MateusStano Sep 19, 2026
67cbf13
BUG: find exact event times reliably and explain failed searches
MateusStano Sep 19, 2026
0a72660
BUG: stop the solver at motor ignition and burnout (#411)
MateusStano Sep 19, 2026
dd0d9ed
BUG: rebuild a loaded phase's canonical states from its dynamics
MateusStano Sep 19, 2026
44e188f
BUG: match a 13-value atol to a phase's states by name
MateusStano Sep 19, 2026
848d426
DOC: describe what each parameter is, not what other code does with it
MateusStano Sep 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion .pylintrc
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@ max-public-methods=25
max-returns=25

# Maximum number of statements in function / method body.
max-statements=25
max-statements=50

# Minimum number of public methods for a class (see R0903).
min-public-methods=0
Expand Down Expand Up @@ -481,6 +481,7 @@ disable=raw-checker-failed,
use-symbolic-message-instead,
use-implicit-booleaness-not-comparison-to-string,
use-implicit-booleaness-not-comparison-to-zero,
use-implicit-booleaness-not-comparison, # explicit == [] is clearer, esp. in tests
no-else-return, # this is a style preference, we don't need to follow it
inconsistent-return-statements,
unspecified-encoding, # this is not a relevant issue.
Expand Down
5 changes: 4 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -39,10 +39,13 @@ Attention: The newest changes should be on top -->

### Changed

-
- ENH: store the flight solution as one flat list of rows. `PhaseSolution` no longer holds rows and becomes internal as `_PhaseSolution`: it describes a phase and records where its rows begin. Per-phase reads move to `Solution.phase_rows`, `phase_time`, `phase_series`, `phase_canonical_array` and `phase_post`. `Solution.canonical_states`, `last_row` and `+=` are removed. Saved solutions store the rows once for the whole flight. The pre-`Solution` format, a bare list of rows, still loads.
- ENH: keep the post-process values recorded during a simulation on the `Solution`, beside the row they were computed from, so a rollback can no longer leave them on a different time grid from the states. `_PhaseDynamics.post_process_row` becomes `post_process_values` and no longer returns the time.
- ENH: replace the `state_history` event kwarg with `previous_state` / `previous_time`, both gated behind `needs`. Read the trajectory itself from `kwargs["flight"].solution`. Legacy positional controller functions now take 5, 6 or 7 arguments instead of 6, 7 or 8, since `state_history` is no longer passed as the 4th.

### Fixed

- BUG: read the last state through the flight phase that owns it, rather than the phase being flown, when starting a new phase. The two differ when a phase ends without taking a solver step.
- BUG: Add wraparound logic for wind direction in environment plots [#939](https://github.com/RocketPy-Team/RocketPy/pull/939)

## [v1.12.1] - 2026-04-03
Expand Down
2 changes: 0 additions & 2 deletions docs/development/testing.rst
Original file line number Diff line number Diff line change
Expand Up @@ -255,8 +255,6 @@ Consider the following integration test:
example_plain_env : rocketpy.Environment
Example environment object to be tested.
"""
# TODO:: this should be added to the set_atmospheric_model() method as a
# "file" option, instead of receiving the URL as a string.
URL = "http://weather.uwyo.edu/cgi-bin/sounding?region=samer&TYPE=TEXT%3ALIST&YEAR=2019&MONTH=02&FROM=0500&TO=0512&STNM=83779"
# give it at least 5 times to try to download the file
example_plain_env.set_atmospheric_model(type="wyoming_sounding", file=URL)
Expand Down
1 change: 0 additions & 1 deletion docs/examples/bella_lui_flight_sim.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -432,7 +432,6 @@
" trigger=\"apogee\",\n",
" sampling_rate=105,\n",
" lag=parameters.get(\"lag_rec\")[0],\n",
" noise=(0, 8.3, 0.5),\n",
")"
]
},
Expand Down
125 changes: 61 additions & 64 deletions docs/examples/camoes_flight_sim.ipynb

Large diffs are not rendered by default.

2 changes: 0 additions & 2 deletions docs/examples/genesis_flight_sim.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,6 @@
" trigger=\"apogee\",\n",
" sampling_rate=105,\n",
" lag=1,\n",
" noise=(0, 8.3, 0.5),\n",
")\n",
"\n",
"Main = GENESIS.add_parachute(\n",
Expand All @@ -286,7 +285,6 @@
" trigger=870,\n",
" sampling_rate=105,\n",
" lag=1,\n",
" noise=(0, 8.3, 0.5),\n",
")"
]
},
Expand Down
4 changes: 0 additions & 4 deletions docs/examples/hedy_flight_sim.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -804,13 +804,11 @@
"main_trigger = rocket_config[\"parachutes\"][\"main\"][\"trigger\"]\n",
"main_sampling_rate = rocket_config[\"parachutes\"][\"main\"][\"sampling_rate\"]\n",
"main_lag = rocket_config[\"parachutes\"][\"main\"][\"lag\"]\n",
"main_noise = rocket_config[\"parachutes\"][\"main\"][\"noise\"]\n",
"\n",
"drogue_cd_s = rocket_config[\"parachutes\"][\"drogue\"][\"cd_s\"]\n",
"drogue_trigger = rocket_config[\"parachutes\"][\"drogue\"][\"trigger\"]\n",
"drogue_sampling_rate = rocket_config[\"parachutes\"][\"drogue\"][\"sampling_rate\"]\n",
"drogue_lag = rocket_config[\"parachutes\"][\"drogue\"][\"lag\"]\n",
"drogue_noise = rocket_config[\"parachutes\"][\"drogue\"][\"noise\"]\n",
"\n",
"parachutes = {}\n",
"\n",
Expand All @@ -820,7 +818,6 @@
" trigger=main_trigger,\n",
" sampling_rate=main_sampling_rate,\n",
" lag=main_lag,\n",
" noise=main_noise,\n",
")\n",
"\n",
"parachutes[1] = Parachute(\n",
Expand All @@ -829,7 +826,6 @@
" trigger=drogue_trigger,\n",
" sampling_rate=drogue_sampling_rate,\n",
" lag=drogue_lag,\n",
" noise=drogue_noise,\n",
")"
]
},
Expand Down
1 change: 0 additions & 1 deletion docs/examples/juno3_flight_sim.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,6 @@
" cd_s=0.885,\n",
" trigger=\"apogee\",\n",
" sampling_rate=105,\n",
" noise=(0, 8.3, 0.5),\n",
" lag=0.5,\n",
")"
]
Expand Down
6 changes: 3 additions & 3 deletions docs/examples/lince_flight_sim.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -263,7 +263,7 @@
"outputs": [],
"source": [
"Main = LincePreDeploy.add_parachute(\n",
" \"Main\", cd_s=3.9, trigger=\"apogee\", sampling_rate=150, lag=0, noise=(0, 0, 0)\n",
" \"Main\", cd_s=3.9, trigger=\"apogee\", sampling_rate=150, lag=0\n",
")"
]
},
Expand Down Expand Up @@ -326,7 +326,7 @@
"outputs": [],
"source": [
"Main_stage_1 = LincePostDeploy.add_parachute(\n",
" \"Main\", cd_s=3.9, trigger=\"apogee\", sampling_rate=150, lag=0, noise=(0, 0, 0)\n",
" \"Main\", cd_s=3.9, trigger=\"apogee\", sampling_rate=150, lag=0\n",
")"
]
},
Expand Down Expand Up @@ -394,7 +394,7 @@
"outputs": [],
"source": [
"Main_stage_2 = Payload.add_parachute(\n",
" \"Main\", cd_s=0.159248, trigger=\"apogee\", sampling_rate=150, lag=0, noise=(0, 0, 0)\n",
" \"Main\", cd_s=0.159248, trigger=\"apogee\", sampling_rate=150, lag=0\n",
")"
]
},
Expand Down
2 changes: 0 additions & 2 deletions docs/examples/ndrt_2020_flight_sim.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -377,15 +377,13 @@
" trigger=\"apogee\",\n",
" sampling_rate=105,\n",
" lag=parameters.get(\"lag_rec\")[0],\n",
" noise=(0, 8.3, 0.5),\n",
")\n",
"main = ndrt2020.add_parachute(\n",
" \"Main\",\n",
" cd_s=parameters.get(\"cd_s_main\")[0],\n",
" trigger=167.64,\n",
" sampling_rate=105,\n",
" lag=parameters.get(\"lag_rec\")[0],\n",
" noise=(0, 8.3, 0.5),\n",
")"
]
},
Expand Down
1 change: 0 additions & 1 deletion docs/examples/valetudo_flight_sim.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -393,7 +393,6 @@
" trigger=\"apogee\",\n",
" sampling_rate=105,\n",
" lag=parameters.get(\"lag_rec\")[0],\n",
" noise=(0, 8.3, 0.5),\n",
")"
]
},
Expand Down
890 changes: 720 additions & 170 deletions docs/notebooks/getting_started.ipynb

Large diffs are not rendered by default.

12 changes: 2 additions & 10 deletions docs/notebooks/getting_started_colab.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -491,7 +491,6 @@
" trigger=800,\n",
" sampling_rate=105,\n",
" lag=1.5,\n",
" noise=(0, 8.3, 0.5),\n",
")\n",
"\n",
"Drogue = calisto.add_parachute(\n",
Expand All @@ -500,7 +499,6 @@
" trigger=\"apogee\",\n",
" sampling_rate=105,\n",
" lag=1.5,\n",
" noise=(0, 8.3, 0.5),\n",
")"
]
},
Expand Down Expand Up @@ -588,13 +586,7 @@
"execution_count": null,
"metadata": {},
"outputs": [],
"source": [
"test_flight.export_kml(\n",
" file_name=\"trajectory.kml\",\n",
" extrude=True,\n",
" altitude_mode=\"relative_to_ground\",\n",
")"
]
"source": "test_flight.exports.kml(\n file_name=\"trajectory.kml\",\n extrude=True,\n altitude_mode=\"relative_to_ground\",\n)"
},
{
"attachments": {},
Expand Down Expand Up @@ -824,4 +816,4 @@
},
"nbformat": 4,
"nbformat_minor": 2
}
}
13 changes: 2 additions & 11 deletions docs/notebooks/monte_carlo_analysis/monte_carlo_analysis.ipynb
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@
},
{
"cell_type": "code",
"execution_count": 6,
"execution_count": null,
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
Expand Down Expand Up @@ -416,14 +416,6 @@
")\n",
"\n",
"\n",
"# Set up parachutes. This rocket, named Valetudo, only has a drogue chute.\n",
"def drogue_trigger(p, h, y):\n",
" # Check if rocket is going down, i.e. if it has passed the apogee\n",
" vertical_velocity = y[5]\n",
" # Return true to activate parachute once the vertical velocity is negative\n",
" return True if vertical_velocity < 0 else False\n",
"\n",
"\n",
"# Iterate over flight settings\n",
"out = display(\"Starting\", display_id=True)\n",
"for setting in flight_settings(analysis_parameters, number_of_simulations):\n",
Expand Down Expand Up @@ -498,10 +490,9 @@
" Drogue = Valetudo.add_parachute(\n",
" \"Drogue\",\n",
" cd_s=setting[\"cd_s_drogue\"],\n",
" trigger=drogue_trigger,\n",
" trigger=\"apogee\",\n",
" sampling_rate=105,\n",
" lag=setting[\"lag_rec\"] + setting[\"lag_se\"],\n",
" noise=(0, 8.3, 0.5),\n",
" )\n",
"\n",
" # Run trajectory simulation\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -186,7 +186,6 @@
" trigger=800,\n",
" sampling_rate=105,\n",
" lag=1.5,\n",
" noise=(0, 8.3, 0.5),\n",
")\n",
"\n",
"Drogue = rocket.add_parachute(\n",
Expand All @@ -195,7 +194,6 @@
" trigger=\"apogee\",\n",
" sampling_rate=105,\n",
" lag=1.5,\n",
" noise=(0, 8.3, 0.5),\n",
")\n",
"\n",
"# Flight\n",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -141,7 +141,6 @@
lag=analysis_parameters["parachutes_main_lag"]["mean"],
trigger=800,
sampling_rate=105,
noise=(0, 8.3, 0.5),
)

Drogue = rocket.add_parachute(
Expand All @@ -150,7 +149,6 @@
lag=analysis_parameters["parachutes_drogue_lag"]["mean"],
trigger="apogee",
sampling_rate=105,
noise=(0, 8.3, 0.5),
)

# Flight
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -423,14 +423,6 @@
")\n",
"\n",
"\n",
"# Set up parachutes. This rocket, named Valetudo, only has a drogue chute.\n",
"def drogueTrigger(p, h, y):\n",
" # Check if rocket is going down, i.e. if it has passed the apogee\n",
" vertical_velocity = y[5]\n",
" # Return true to activate parachute once the vertical velocity is negative\n",
" return True if vertical_velocity < 0 else False\n",
"\n",
"\n",
"# Iterate over flight settings\n",
"out = display(\"Starting\", display_id=True)\n",
"for setting in flight_settings(analysis_parameters, number_of_simulations):\n",
Expand Down Expand Up @@ -496,10 +488,9 @@
" Drogue = Valetudo.addParachute(\n",
" \"Drogue\",\n",
" CdS=setting[\"CdSDrogue\"],\n",
" trigger=drogueTrigger,\n",
" trigger=\"apogee\",\n",
" samplingRate=105,\n",
" lag=setting[\"lag_rec\"] + setting[\"lag_se\"],\n",
" noise=(0, 8.3, 0.5),\n",
" )\n",
"\n",
" # Run trajectory simulation\n",
Expand Down
787 changes: 738 additions & 49 deletions docs/notebooks/sensors.ipynb

Large diffs are not rendered by default.

5 changes: 5 additions & 0 deletions docs/reference/classes/Event.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Event Class
-----------

.. autoclass:: rocketpy.Event
:members:
57 changes: 57 additions & 0 deletions docs/reference/classes/Solution.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
Solution Classes
----------------

These classes hold the state history produced by a :class:`rocketpy.Flight`
simulation. They are not part of RocketPy's top-level namespace; a flight's
solution is reached through :attr:`Flight.solution <rocketpy.Flight.solution>`.

The ``Solution`` holds every row of the flight in one list, in the order they
were flown. The flight phases sit alongside it, each saying where its own rows
begin. So a row is read from the solution, and a phase tells you what that row
means::

for index, phase in enumerate(flight.solution.phases):
start, stop = flight.solution.phase_span(index)
print(phase.name, stop - start)

:meth:`Solution.phase_span` gives where a phase's rows begin and end, so
``flight.solution[start:stop]``, ``flight.solution["vz"][start:stop]`` and
``flight.solution.canonical_array[start:stop]`` read just that phase.

.. autoclass:: rocketpy.simulation.solution.Solution
:members:

Post-process variables
~~~~~~~~~~~~~~~~~~~~~~

On its way to each state derivative, a flight phase works out quantities it
never integrates: the accelerations, the aerodynamic forces and moments, and
the net thrust. Read them through ``flight.solution.post``::

post = flight.solution.post
post.names # every variable this flight computes
post["az"] # its [t, value] history over the whole flight
post.at(3.0) # every variable at the nearest stored time

The same values back the flight's own :attr:`Flight.az <rocketpy.Flight.az>`
and its companions, which wrap them as a
:class:`Function <rocketpy.Function>` so they can be plotted and evaluated at
any time. Reach for ``post`` when you want the values exactly as the simulation
stored them, without interpolation.

.. autoclass:: rocketpy.simulation.solution.PostProcessSolution
:members:

The phase objects themselves are internal to RocketPy for now, so their shape
may change between releases. These are the values worth reading off one:

``name``
The phase's name, such as ``"rail"`` or ``"free_flight"``.
``t_start``
The time the phase began, in seconds.
``start``
Where the phase's first row sits in the solution's rows.
``dynamics.states``
The states the phase integrated, in the order it stored them.
``dynamics.name``
The kind of phase it was.
2 changes: 1 addition & 1 deletion docs/reference/classes/sensors/accelerometer.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Accelerometer Class
-------------------

.. autoclass:: rocketpy.sensors.Accelerometer
.. autoclass:: rocketpy.Accelerometer
:members:
2 changes: 1 addition & 1 deletion docs/reference/classes/sensors/barometer.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Barometer Class
---------------

.. autoclass:: rocketpy.sensors.Barometer
.. autoclass:: rocketpy.Barometer
:members:
2 changes: 1 addition & 1 deletion docs/reference/classes/sensors/gnss_receiver.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
GNSS Receiver Class
-------------------

.. autoclass:: rocketpy.sensors.GnssReceiver
.. autoclass:: rocketpy.GnssReceiver
:members:
2 changes: 1 addition & 1 deletion docs/reference/classes/sensors/gyroscope.rst
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
Gyroscope Class
---------------

.. autoclass:: rocketpy.sensors.Gyroscope
.. autoclass:: rocketpy.Gyroscope
:members:
2 changes: 2 additions & 0 deletions docs/reference/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,8 @@ This reference manual details functions, modules, methods and attributes include
classes/Parachute
classes/sensors/index.rst
classes/Flight
classes/Solution
classes/Event
Utilities <classes/utils/index>
classes/EnvironmentAnalysis
Monte Carlo Analysis <classes/monte_carlo/index>
Expand Down
1 change: 1 addition & 0 deletions docs/technical/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@ in their code.
Roll Moment <aerodynamics/roll_equations.rst>
Sensitivity Analysis <sensitivity.rst>
References <references.rst>
Simulation Loop <simulation_loop.rst>

This section is still a work in progress, however, and not everything is documented yet.
If you have any questions, please contact the maintainers of RocketPy.
Loading