From 4531ed5079d2ecd7066d91fd470b51367c93a1e7 Mon Sep 17 00:00:00 2001 From: MateusStano <69485049+MateusStano@users.noreply.github.com> Date: Sun, 4 Aug 2024 03:07:36 -0300 Subject: [PATCH] ENH: Rocket Axes Definition (#635) * ENH: make aerosurface position a Vector * DOC: fixes to addsurfaces refs * DOC: mv rocket.rst to rocket\rocket_usage.rst * ENH: remaining changes for vector position * DOC: aero surfaces docs minor improvements * DOC: create rocket axes description page * DOC: 3d csys correction * ENH: add rail button angular position to initial flight state * REV: revert position to Vector * ENH: consider buttons angular position in initial flight state * DOC: improve docstrings and add references * TST: adapt tests for new buttons angular position * DOC: final additions to flight csys * DEV: changelog * MNT: isort again * DOC: minor fixes * DOC: minor fixes * DOC: minor adjustments --------- Co-authored-by: Gui-FernandesBR --- .vscode/settings.json | 6 + CHANGELOG.md | 1 + docs/static/rocket/3dcsys.png | Bin 0 -> 41123 bytes docs/static/rocket/angularpos.png | Bin 0 -> 46215 bytes docs/static/rocket/flightcsys.png | Bin 0 -> 34974 bytes docs/user/index.rst | 2 +- docs/user/rocket/rocket.rst | 15 ++ docs/user/rocket/rocket_axes.rst | 156 ++++++++++++++++++ .../{rocket.rst => rocket/rocket_usage.rst} | 2 +- rocketpy/mathutils/vector_matrix.py | 4 + .../aero_surface/fins/elliptical_fins.py | 8 +- rocketpy/rocket/aero_surface/fins/fins.py | 8 +- .../aero_surface/fins/trapezoidal_fins.py | 8 +- rocketpy/rocket/aero_surface/nose_cone.py | 6 +- rocketpy/rocket/aero_surface/rail_buttons.py | 13 +- rocketpy/rocket/aero_surface/tail.py | 6 +- rocketpy/rocket/rocket.py | 32 +++- rocketpy/simulation/flight.py | 39 +++-- rocketpy/tools.py | 60 ++++++- tests/fixtures/rockets/rocket_fixtures.py | 4 +- tests/unit/test_flight.py | 8 +- 21 files changed, 325 insertions(+), 53 deletions(-) create mode 100644 docs/static/rocket/3dcsys.png create mode 100644 docs/static/rocket/angularpos.png create mode 100644 docs/static/rocket/flightcsys.png create mode 100644 docs/user/rocket/rocket.rst create mode 100644 docs/user/rocket/rocket_axes.rst rename docs/user/{rocket.rst => rocket/rocket_usage.rst} (99%) diff --git a/.vscode/settings.json b/.vscode/settings.json index 45bd304e9..ac2bb1cab 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -14,12 +14,14 @@ "cSpell.language": "en-US", "cSpell.words": [ "Abdulklech", + "addsurface", "adjugate", "akima", "allclose", "altitudemode", "Alves", "amax", + "angularpos", "arange", "arccos", "arcsin", @@ -39,6 +41,7 @@ "axvline", "axvspan", "Barrowman", + "Baruh", "behaviour", "Bigl", "Bigr", @@ -77,6 +80,7 @@ "csys", "datapoints", "datetime", + "dcsys", "ddot", "deepcopy", "deletechars", @@ -105,6 +109,7 @@ "figsize", "filt", "firstsimulation", + "flightcsys", "Fluxogram", "fmax", "fmin", @@ -130,6 +135,7 @@ "Gonçalvez", "grav", "Guilherme", + "Haim", "hemis", "hgtprs", "hgtsfc", diff --git a/CHANGELOG.md b/CHANGELOG.md index 37c2bb0d0..d9aa30969 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -32,6 +32,7 @@ Attention: The newest changes should be on top --> ### Added +- ENH: Rocket Axis Definition [#635](https://github.com/RocketPy-Team/RocketPy/pull/635) ### Changed diff --git a/docs/static/rocket/3dcsys.png b/docs/static/rocket/3dcsys.png new file mode 100644 index 0000000000000000000000000000000000000000..57c8a718429d5926dd3cf711d2fdf13f63c34346 GIT binary patch literal 41123 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 literal 0 HcmV?d00001 diff --git a/docs/static/rocket/angularpos.png b/docs/static/rocket/angularpos.png new file mode 100644 index 0000000000000000000000000000000000000000..d68300beffa17df66768332aeeccf41e22274fdb GIT binary patch literal 46215 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%0DBH@ii>dam{qitn@N;7iIirkqWL#Al$ue@x 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

0qnI=?O%|=`pLmC$NS3W2;pW{Qi}y( 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 KU&I=F-2XphG>&Be literal 0 HcmV?d00001 diff --git a/docs/user/index.rst b/docs/user/index.rst index 7d8c12241..5698aafcc 100644 --- a/docs/user/index.rst +++ b/docs/user/index.rst @@ -14,7 +14,7 @@ RocketPy's User Guide Positions and Coordinate Systems Motors - Rocket + Rocket Environment .. toctree:: diff --git a/docs/user/rocket/rocket.rst b/docs/user/rocket/rocket.rst new file mode 100644 index 000000000..17ec63c1a --- /dev/null +++ b/docs/user/rocket/rocket.rst @@ -0,0 +1,15 @@ +Rocket Usage +============ + +.. toctree:: + :maxdepth: 2 + :caption: Rocket Class Usage + + Rocket Class Usage + +.. toctree:: + :maxdepth: 3 + :caption: Rocket Class Axes Definitions + + Rocket Class Axes Definitions + \ No newline at end of file diff --git a/docs/user/rocket/rocket_axes.rst b/docs/user/rocket/rocket_axes.rst new file mode 100644 index 000000000..3dfaced8c --- /dev/null +++ b/docs/user/rocket/rocket_axes.rst @@ -0,0 +1,156 @@ +Rocket Class Axes Definitions +============================= + +The Rocket class has two different coordinate systems: + +1. **User Defined Coordinate System**: Used for geometrical inputs of the \ + aerodynamic surfaces and motor. +2. **Body Axes Coordinate System**: Used during the flight simulation to assess \ + the governing equations of motion. + +All inputs are automatically converted from the user's coordinate system to the +rocket body axes coordinate system for use during the simulation. + +Let's dive into the definitions of these coordinate systems: + + +1. User Defined Coordinate System +--------------------------------- + +Two things are set by the user in the user input coordinate system: + +1. **Coordinate System Origin**: The origin of the coordinate system is set at \ + any point along the rocket's center line. This point can be arbitrarily chosen \ + and is not explicitly defined. All inputs must be given relative to this \ + point. +2. **Direction of Center Axis**: Specified by the ``coordinate_system_orientation`` \ + argument when initializing the Rocket (:class:`rocketpy.Rocket.__init__`). This \ + argument defines the direction of the axis that follows the rocket's center \ + line. It can be either ``"nose_to_tail"`` or ``"tail_to_nose"``. + +.. tip:: + + If you are using some CAD software to design your rocket, you can imagine the \ + coordinate system as the one used in the CAD software. The origin of the \ + coordinate system is the origin of the rocket in the CAD software, and the \ + direction of the center axis is the direction of the rocket's centerline. \ + You don't need to worry about the exact position of the origin, as long as \ + all inputs are given relative to this point. + +.. seealso:: + + See `Positions and Coordinate Systems `_ for more \ + information on the definitions of the rocket's aerodynamic surfaces and motor. + +The ``x`` and ``y`` axes are defined at the plane perpendicular to the center axis, +while the ``z`` axis is defined along the center axis. Depending on the choice of +``coordinate_system_orientation``, the ``x`` axis and ``y`` axis can be inverted. + +The following figure shows the two possibilities for the user input coordinate system: + +.. figure:: ../../static/rocket/3dcsys.png + :align: center + :alt: Rocket axes + +.. note:: + + When ``coordinate_system_orientation`` is set to ``"tail_to_nose"``, the direction \ + of the ``x``, ``y``, and ``z`` axes of the **User Defined Coordinate System** is \ + the same as the **Body Axes Coordinate System**. The origin of the coordinate \ + system may still be different. + +Angular Position Inputs +~~~~~~~~~~~~~~~~~~~~~~~ + +Angular position inputs (``angular_position``) refer to the roll angle position +of that surface along the rocket's tube. The roll angle is defined as the angle +from the ``y`` axis to the surface. +Currently, only the :class:`rocketpy.RailButtons` class uses this kind of input. + +The following figure shows the roll angle +definition for both ``coordinate_system_orientation`` options: + +.. figure:: ../../static/rocket/angularpos.png + :align: center + :alt: Angular position + + +.. note:: + + The positive direction of the roll angle is defined as the direction that \ + rotates the surface in the positive direction of the ``z`` axis. + +.. _rocket_axes_body_axes: + +2. Body Axes Coordinate System +------------------------------ + +The body axes coordinate system is used inside the simulation to assess the +governing equations of motion. The body axes coordinate system is defined as follows: + +- The origin is at the rocket's center of dry mass (``center_of_dry_mass_position``). +- The ``z`` axis is defined along the rocket's centerline, pointing from the center of dry mass towards the nose. +- The ``x`` and ``y`` axes are perpendicular. + +3. Relation to Flight Coordinates +--------------------------------- + +The ``Flight`` class uses a coordinate system defined as follows: + +- The origin is at the launch rail. +- The ``Z`` axis is positive upwards. +- The ``X`` axis is position eastwards. +- The ``Y`` axis is positive northwards. + +The following figure shows the rotational relationship between the +**Body Axes Coordinate System** and the **Flight Coordinate System**: + +.. figure:: ../../static/rocket/flightcsys.png + :align: center + :alt: Flight coordinate system + +In the figure above, :math:`\bf{i}` is the ``inclination`` and :math:`\bf{h}` +is the ``heading`` of the launch rail. + +The heading and inclination can be described in terms of Euler angles. +The relation is given by: + +.. math:: + \begin{aligned} + &\text{Precession:} \quad &\psi &= -\bf{h} \\ + &\text{Nutation:} \quad &\theta &= \bf{i} - 90° \\ + \end{aligned} + +A last rotation is defined by the ``angular_position`` of the rocket's rail buttons. +This is a rotation around the rocket's centerline, and describes the last +Euler angle: + +.. math:: + \begin{aligned} + &\text{Spin:} \quad &φ & \\ + \end{aligned} + +If no rail buttons pair ir present, the spin angle is set to **0°**. + +.. note:: + + With spin angle set to **0°**, if the launch rail ``heading`` is set to \ + **0°** and rail ``inclination`` to **90°**, the **Body Axes Coordinate \ + System** is aligned with the **Flight Coordinate System**. + +Rocket's initial orientation +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The initial orientation of the rocket is expressed in Euler parameters (quaternions). +The Euler parameters are defined using the 3-1-3 rotation sequence: + +.. math:: + + \begin{aligned} + e_{0} &= \cos\left(\frac{φ}{2}\right) \cos\left(\frac{θ}{2}\right) \cos\left(\frac{ψ}{2}\right) - \sin\left(\frac{φ}{2}\right) \cos\left(\frac{θ}{2}\right) \sin\left(\frac{ψ}{2}\right) \\ + e_{1} &= \cos\left(\frac{φ}{2}\right) \cos\left(\frac{ψ}{2}\right) \sin\left(\frac{θ}{2}\right) + \sin\left(\frac{φ}{2}\right) \sin\left(\frac{θ}{2}\right) \sin\left(\frac{ψ}{2}\right) \\ + e_{2} &= \cos\left(\frac{φ}{2}\right) \sin\left(\frac{θ}{2}\right) \sin\left(\frac{ψ}{2}\right) - \sin\left(\frac{φ}{2}\right) \cos\left(\frac{ψ}{2}\right) \sin\left(\frac{θ}{2}\right) \\ + e_{3} &= \cos\left(\frac{φ}{2}\right) \cos\left(\frac{θ}{2}\right) \sin\left(\frac{ψ}{2}\right) + \cos\left(\frac{θ}{2}\right) \cos\left(\frac{ψ}{2}\right) \sin\left(\frac{φ}{2}\right) \\ + \end{aligned} + + diff --git a/docs/user/rocket.rst b/docs/user/rocket/rocket_usage.rst similarity index 99% rename from docs/user/rocket.rst rename to docs/user/rocket/rocket_usage.rst index 8f5ebf8d9..d25608dc7 100644 --- a/docs/user/rocket.rst +++ b/docs/user/rocket/rocket_usage.rst @@ -209,7 +209,7 @@ to the rocket in one step: .. caution:: - Once again, pay special attention to the ``position`` parameter. Check + Once again, pay special attention to the ``position`` parameter. Check \ the :meth:`rocketpy.Rocket.add_surfaces` method for more information. .. seealso:: diff --git a/rocketpy/mathutils/vector_matrix.py b/rocketpy/mathutils/vector_matrix.py index 03d2d5b51..6060d387f 100644 --- a/rocketpy/mathutils/vector_matrix.py +++ b/rocketpy/mathutils/vector_matrix.py @@ -955,6 +955,10 @@ def transformation(quaternion): ------- Matrix The transformation matrix from frame B to frame A. + + Reference + --------- + https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles """ q_w, q_x, q_y, q_z = quaternion return Matrix( diff --git a/rocketpy/rocket/aero_surface/fins/elliptical_fins.py b/rocketpy/rocket/aero_surface/fins/elliptical_fins.py index 5622900d6..d30cf9aa1 100644 --- a/rocketpy/rocket/aero_surface/fins/elliptical_fins.py +++ b/rocketpy/rocket/aero_surface/fins/elliptical_fins.py @@ -13,9 +13,11 @@ class EllipticalFins(Fins): Note ---- - Local coordinate system: Z axis along the longitudinal axis of symmetry, - positive downwards (top -> bottom). Origin located at the top of the root - chord. + Local coordinate system: + - Origin located at the top of the root chord. + - Z axis along the longitudinal axis of symmetry, positive downwards (top -> bottom). + - Y axis perpendicular to the Z axis, in the span direction, positive upwards. + - X axis completes the right-handed coordinate system. See Also -------- diff --git a/rocketpy/rocket/aero_surface/fins/fins.py b/rocketpy/rocket/aero_surface/fins/fins.py index 2de0176b0..74f7922f7 100644 --- a/rocketpy/rocket/aero_surface/fins/fins.py +++ b/rocketpy/rocket/aero_surface/fins/fins.py @@ -11,9 +11,11 @@ class Fins(AeroSurface): Note ---- - Local coordinate system: Z axis along the longitudinal axis of symmetry, - positive downwards (top -> bottom). Origin located at the top of the root - chord. + Local coordinate system: + - Origin located at the top of the root chord. + - Z axis along the longitudinal axis of symmetry, positive downwards (top -> bottom). + - Y axis perpendicular to the Z axis, in the span direction, positive upwards. + - X axis completes the right-handed coordinate system. Attributes ---------- diff --git a/rocketpy/rocket/aero_surface/fins/trapezoidal_fins.py b/rocketpy/rocket/aero_surface/fins/trapezoidal_fins.py index 15caa38e8..3040e21c9 100644 --- a/rocketpy/rocket/aero_surface/fins/trapezoidal_fins.py +++ b/rocketpy/rocket/aero_surface/fins/trapezoidal_fins.py @@ -13,9 +13,11 @@ class TrapezoidalFins(Fins): Note ---- - Local coordinate system: Z axis along the longitudinal axis of symmetry, - positive downwards (top -> bottom). Origin located at the top of the root - chord. + Local coordinate system: + - Origin located at the top of the root chord. + - Z axis along the longitudinal axis of symmetry, positive downwards (top -> bottom). + - Y axis perpendicular to the Z axis, in the span direction, positive upwards. + - X axis completes the right-handed coordinate system. See Also -------- diff --git a/rocketpy/rocket/aero_surface/nose_cone.py b/rocketpy/rocket/aero_surface/nose_cone.py index 8886be8c5..1ad07bd07 100644 --- a/rocketpy/rocket/aero_surface/nose_cone.py +++ b/rocketpy/rocket/aero_surface/nose_cone.py @@ -15,9 +15,9 @@ class NoseCone(AeroSurface): Note ---- - The local coordinate system has the origin at the tip of the nose cone - and the Z axis along the longitudinal axis of symmetry, positive - downwards (top -> bottom). + Local coordinate system: + - the origin at the tip of the nose cone and + - the Z axis along the longitudinal axis of symmetry, positive downwards (top -> bottom). Attributes ---------- diff --git a/rocketpy/rocket/aero_surface/rail_buttons.py b/rocketpy/rocket/aero_surface/rail_buttons.py index 102f35737..facd8b157 100644 --- a/rocketpy/rocket/aero_surface/rail_buttons.py +++ b/rocketpy/rocket/aero_surface/rail_buttons.py @@ -1,3 +1,5 @@ +import numpy as np + from rocketpy.mathutils.function import Function from rocketpy.prints.aero_surface_prints import _RailButtonsPrints @@ -15,6 +17,8 @@ class RailButtons(AeroSurface): Angular position of the rail buttons in degrees measured as the rotation around the symmetry axis of the rocket relative to one of the other principal axis. + RailButtons.angular_position_rad : float + Angular position of the rail buttons in radians. """ def __init__( @@ -40,11 +44,6 @@ def __init__( Radius of the rocket at the location of the rail buttons in meters. If not provided, it will be calculated when the RailButtons object is added to a Rocket object. - - Returns - ------- - None - """ super().__init__(name, None, None) self.buttons_distance = buttons_distance @@ -56,6 +55,10 @@ def __init__( self.prints = _RailButtonsPrints(self) + @property + def angular_position_rad(self): + return np.radians(self.angular_position) + def evaluate_center_of_pressure(self): """Evaluates the center of pressure of the rail buttons. Rail buttons do not contribute to the center of pressure of the rocket. diff --git a/rocketpy/rocket/aero_surface/tail.py b/rocketpy/rocket/aero_surface/tail.py index a5c5cf939..b053eae2f 100644 --- a/rocketpy/rocket/aero_surface/tail.py +++ b/rocketpy/rocket/aero_surface/tail.py @@ -12,9 +12,9 @@ class Tail(AeroSurface): Note ---- - Local coordinate system: Z axis along the longitudinal axis of symmetry, - positive downwards (top -> bottom). Origin located at top of the tail - (generally the portion closest to the rocket's nose). + Local coordinate system: + - Z axis along the longitudinal axis of symmetry, positive downwards (top -> bottom). + - Origin located at top of the tail (generally the portion closest to the rocket's nose). Attributes ---------- diff --git a/rocketpy/rocket/rocket.py b/rocketpy/rocket/rocket.py index 7eb1610f6..952390723 100644 --- a/rocketpy/rocket/rocket.py +++ b/rocketpy/rocket/rocket.py @@ -885,7 +885,7 @@ def add_motor(self, motor, position): # pylint: disable=too-many-statements See Also -------- - :ref:`positions` + :ref:`addsurface` Returns ------- @@ -951,7 +951,7 @@ def add_surfaces(self, surfaces, positions): See Also -------- - :ref:`positions` + :ref:`addsurface` Returns ------- @@ -1015,10 +1015,16 @@ def add_tail( By tail position, understand the point belonging to the tail which is highest in the rocket coordinate system (i.e. the point closest to the nose cone). + radius : int, float, optional + Reference radius of the tail. This is used to calculate lift + coefficient. If None, which is default, the rocket radius will + be used. + name : string + Tail name. Default is "Tail". See Also -------- - :ref:`positions` + :ref:`addsurface` Returns ------- @@ -1047,7 +1053,6 @@ def add_nose( along the rocket and its derivative of the coefficient of lift in respect to angle of attack. - Parameters ---------- length : int, float @@ -1073,7 +1078,7 @@ def add_nose( See Also -------- - :ref:`positions` + :ref:`addsurface` Returns ------- @@ -1260,6 +1265,10 @@ def add_elliptical_fins( The tuple's second item is the unit of the angle of attack, accepting either "radians" or "degrees". + See Also + -------- + :ref:`addsurface` + Returns ------- fin_set : EllipticalFins @@ -1486,7 +1495,11 @@ def add_air_brakes( return air_brakes def set_rail_buttons( - self, upper_button_position, lower_button_position, angular_position=45 + self, + upper_button_position, + lower_button_position, + angular_position=45, + radius=None, ): """Adds rail buttons to the rocket, allowing for the calculation of forces exerted by them when the rocket is sliding in the launch rail. @@ -1511,10 +1524,12 @@ def set_rail_buttons( relative to one of the other principal axis. Default value is 45 degrees, generally used in rockets with 4 fins. + radius : int, float, optional + Fuselage radius where the rail buttons are located. See Also -------- - :ref:`positions` + :ref:`addsurface` Returns ------- @@ -1525,7 +1540,8 @@ def set_rail_buttons( rail_buttons = RailButtons( buttons_distance=buttons_distance, angular_position=angular_position ) - rail_buttons.rocket_radius = rail_buttons.rocket_radius or self.radius + self.rail_buttons = Components() + rail_buttons.rocket_radius = radius or self.radius self.rail_buttons.add(rail_buttons, lower_button_position) return rail_buttons diff --git a/rocketpy/simulation/flight.py b/rocketpy/simulation/flight.py index 68033c07f..73bc715cb 100644 --- a/rocketpy/simulation/flight.py +++ b/rocketpy/simulation/flight.py @@ -14,6 +14,7 @@ from ..prints.flight_prints import _FlightPrints from ..tools import ( calculate_cubic_hermite_coefficients, + euler_angles_to_euler_parameters, find_closest, find_root_linear_interpolation, find_roots_cubic_function, @@ -291,15 +292,15 @@ class Flight: # pylint: disable=too-many-public-methods of time. Can be called or accessed as array. Flight.phi : Function Rocket's Spin Euler Angle, φ, according to the 3-2-3 rotation - system (NASA Standard Aerospace). Measured in degrees and + system nomenclature (NASA Standard Aerospace). Measured in degrees and expressed as a function of time. Can be called or accessed as array. Flight.theta : Function Rocket's Nutation Euler Angle, θ, according to the 3-2-3 rotation - system (NASA Standard Aerospace). Measured in degrees and + system nomenclature (NASA Standard Aerospace). Measured in degrees and expressed as a function of time. Can be called or accessed as array. Flight.psi : Function Rocket's Precession Euler Angle, ψ, according to the 3-2-3 rotation - system (NASA Standard Aerospace). Measured in degrees and + system nomenclature (NASA Standard Aerospace). Measured in degrees and expressed as a function of time. Can be called or accessed as array. Flight.R1 : Function Resultant force perpendicular to rockets axis due to @@ -523,7 +524,7 @@ def __init__( # pylint: disable=too-many-arguments,too-many-statements Default is 80. heading : int, float, optional Heading angle relative to north given in degrees. - Default is 90, which points in the x direction. + Default is 90, which points in the x (east) direction. initial_solution : array, Flight, optional Initial solution array to be used. Format is: @@ -1073,12 +1074,26 @@ def __init_flight_state(self): vx_init, vy_init, vz_init = 0, 0, 0 w1_init, w2_init, w3_init = 0, 0, 0 # Initialize attitude - psi_init = -self.heading * (np.pi / 180) # Precession / Heading Angle - theta_init = (self.inclination - 90) * (np.pi / 180) # Nutation Angle - e0_init = np.cos(psi_init / 2) * np.cos(theta_init / 2) - e1_init = np.cos(psi_init / 2) * np.sin(theta_init / 2) - e2_init = np.sin(psi_init / 2) * np.sin(theta_init / 2) - e3_init = np.sin(psi_init / 2) * np.cos(theta_init / 2) + # Precession / Heading Angle + self.psi_init = np.radians(-self.heading) + # Nutation / Attitude Angle + self.theta_init = np.radians(self.inclination - 90) + # Spin / Bank Angle + self.phi_init = 0 + + # Consider Rail Buttons position, if there is rail buttons + try: + self.phi_init += ( + self.rocket.rail_buttons[0].component.angular_position_rad + * self.rocket._csys + ) + except IndexError: + pass + + # 3-1-3 Euler Angles to Euler Parameters + e0_init, e1_init, e2_init, e3_init = euler_angles_to_euler_parameters( + self.phi_init, self.theta_init, self.psi_init + ) # Store initial conditions self.initial_solution = [ self.t_initial, @@ -2823,9 +2838,7 @@ def __calculate_rail_button_forces(self): # TODO: complex method. rail_buttons_tuple.component.buttons_distance + rail_buttons_tuple.position ) lower_button_position = rail_buttons_tuple.position - angular_position_rad = ( - rail_buttons_tuple.component.angular_position * np.pi / 180 - ) + angular_position_rad = rail_buttons_tuple.component.angular_position_rad D1 = ( upper_button_position - self.rocket.center_of_dry_mass_position ) * self.rocket._csys diff --git a/rocketpy/tools.py b/rocketpy/tools.py index 40fbaefea..6cddb2327 100644 --- a/rocketpy/tools.py +++ b/rocketpy/tools.py @@ -888,16 +888,14 @@ def parallel_axis_theorem_from_com(com_inertia_moment, mass, distance): float Moment of inertia relative to the new axis. - Reference - --------- + References + ---------- https://en.wikipedia.org/wiki/Parallel_axis_theorem """ return com_inertia_moment + mass * distance**2 # Flight - - def quaternions_to_precession(e0, e1, e2, e3): """Calculates the Precession angle @@ -911,11 +909,17 @@ def quaternions_to_precession(e0, e1, e2, e3): Euler parameter 2, must be between -1 and 1 e3 : float Euler parameter 3, must be between -1 and 1 + Returns ------- float Euler Precession angle in degrees + + References + ---------- + Baruh, Haim. Analytical dynamics """ + # minus sign in e2 and e1 is due to changing from 3-1-3 to 3-2-3 convention return (180 / np.pi) * (np.arctan2(e3, e0) + np.arctan2(-e2, -e1)) @@ -937,7 +941,12 @@ def quaternions_to_spin(e0, e1, e2, e3): ------- float Euler Spin angle in degrees + + References + ---------- + Baruh, Haim. Analytical dynamics """ + # minus sign in e2 and e1 is due to changing from 3-1-3 to 3-2-3 convention return (180 / np.pi) * (np.arctan2(e3, e0) - np.arctan2(-e2, -e1)) @@ -950,14 +959,57 @@ def quaternions_to_nutation(e1, e2): Euler parameter 1, must be between -1 and 1 e2 : float Euler parameter 2, must be between -1 and 1 + Returns ------- float Euler Nutation angle in degrees + + References + ---------- + Baruh, Haim. Analytical dynamics """ + # we are changing from 3-1-3 to 3-2-3 conventions return (180 / np.pi) * 2 * np.arcsin(-((e1**2 + e2**2) ** 0.5)) +def euler_angles_to_euler_parameters(phi, theta, psi): + """Convert 3-1-3 Euler Angles to Euler Parameters (quaternions). + + Parameters + ---------- + phi : float + Rotation angle around the z-axis (in radians). Represents the precession angle. + theta : float + Rotation angle around the x-axis (in radians). Represents the nutation angle. + psi : float + Rotation angle around the z-axis (in radians). Represents the spin angle. + + + Returns + ------- + tuple[float, float, float, float] + The Euler parameters or quaternions (e0, e1, e2, e3) + + References + ---------- + https://www.astro.rug.nl/software/kapteyn-beta/_downloads/attitude.pdf + """ + e0 = np.cos(phi / 2) * np.cos(theta / 2) * np.cos(psi / 2) - np.sin( + phi / 2 + ) * np.cos(theta / 2) * np.sin(psi / 2) + e1 = np.cos(phi / 2) * np.cos(psi / 2) * np.sin(theta / 2) + np.sin( + phi / 2 + ) * np.sin(theta / 2) * np.sin(psi / 2) + e2 = np.cos(phi / 2) * np.sin(theta / 2) * np.sin(psi / 2) - np.sin( + phi / 2 + ) * np.cos(psi / 2) * np.sin(theta / 2) + e3 = np.cos(phi / 2) * np.cos(theta / 2) * np.sin(psi / 2) + np.cos( + theta / 2 + ) * np.cos(psi / 2) * np.sin(phi / 2) + return e0, e1, e2, e3 + + if __name__ == "__main__": import doctest diff --git a/tests/fixtures/rockets/rocket_fixtures.py b/tests/fixtures/rockets/rocket_fixtures.py index 702506d06..ceab9d15a 100644 --- a/tests/fixtures/rockets/rocket_fixtures.py +++ b/tests/fixtures/rockets/rocket_fixtures.py @@ -83,7 +83,7 @@ def calisto_nose_to_tail(cesaroni_m1670): calisto.set_rail_buttons( upper_button_position=-0.082, lower_button_position=0.618, - angular_position=45, + angular_position=0, ) return calisto @@ -177,7 +177,7 @@ def calisto_robust( calisto.set_rail_buttons( upper_button_position=0.082, lower_button_position=-0.618, - angular_position=45, + angular_position=0, ) calisto.parachutes.append(calisto_main_chute) calisto.parachutes.append(calisto_drogue_chute) diff --git a/tests/unit/test_flight.py b/tests/unit/test_flight.py index 078c682c9..cea54e575 100644 --- a/tests/unit/test_flight.py +++ b/tests/unit/test_flight.py @@ -334,10 +334,10 @@ def test_rail_buttons_forces(flight_calisto_custom_wind): """ test = flight_calisto_custom_wind atol = 5e-3 - assert pytest.approx(3.833613, abs=atol) == test.max_rail_button1_normal_force - assert pytest.approx(1.648938, abs=atol) == test.max_rail_button1_shear_force - assert pytest.approx(1.165307, abs=atol) == test.max_rail_button2_normal_force - assert pytest.approx(0.501229, abs=atol) == test.max_rail_button2_shear_force + assert pytest.approx(3.876749, abs=atol) == test.max_rail_button1_normal_force + assert pytest.approx(1.544799, abs=atol) == test.max_rail_button1_shear_force + assert pytest.approx(1.178420, abs=atol) == test.max_rail_button2_normal_force + assert pytest.approx(0.469574, abs=atol) == test.max_rail_button2_shear_force def test_max_values(flight_calisto_robust):