Skip to content

Commit

Permalink
Merge pull request #683 from RocketPy-Team/enh/sensors-impl
Browse files Browse the repository at this point in the history
* ENH: sensors class

* ENH: add accelerometer and gyroscope classes

* ENH: euler to quaternions tool function

* ENH: add sensors to other classes

* ENH: prints and sensors draw

* ENH: add sensors to parachutes

* TST: add sensors fixtures

* TST: add sensors tests

* DEV: sensors testing notebook

* ENH: add option to add noise to each axis seperatly

* MNT: run isort

* ENH: calculate u_dot only once for all sensors

* MNT: change `measured_values` to `measured_data`

* TST: unite gyro and accel tests

* Update rocketpy/plots/rocket_plots.py

Co-authored-by: Pedro Henrique Marinho Bressan <[email protected]>

* ENH: normalize quaternions for transform matrix

* TST: lower tolerances

* BUG: handle zero norm differently due to numpy.float64

* MNT: quantization typos

* DOCS: mention Hadamard product

* DOC: complete sensors class docstrings

* Squashed commit of the following:

commit b18ae9c
Merge: 67515f6 9a8e0c1
Author: Gui-FernandesBR <[email protected]>
Date:   Thu Apr 25 18:15:24 2024 -0400

    Merge branch 'develop' into bug/airbrakes-postprocess

commit 67515f6
Author: MateusStano <[email protected]>
Date:   Thu Apr 25 23:02:11 2024 +0200

    ENH: automatically disable time overshoot for controllers

commit f60c53b
Merge: 4974e8d 3df7586
Author: MateusStano <[email protected]>
Date:   Thu Apr 25 22:53:10 2024 +0200

    Merge branch 'bug/airbrakes-postprocess' of https://github.com/RocketPy-Team/RocketPy into bug/airbrakes-postprocess

commit 4974e8d
Author: MateusStano <[email protected]>
Date:   Thu Apr 25 22:52:48 2024 +0200

    BUG: initialize state derivatives for controllers

commit a49baf4
Author: MateusStano <[email protected]>
Date:   Thu Apr 25 22:52:13 2024 +0200

    MNT: move controller initialization to private method

commit 9a8e0c1
Merge: 14375ed 2cbaa77
Author: MateusStano <[email protected]>
Date:   Thu Apr 25 15:37:05 2024 -0300

    Merge pull request #580 from RocketPy-Team/mnt/modularize-rocket-draw

    MNT: Modularize Rocket Draw

commit 2cbaa77
Merge: 822a89e 14375ed
Author: MateusStano <[email protected]>
Date:   Thu Apr 25 11:44:22 2024 -0300

    Merge branch 'develop' into mnt/modularize-rocket-draw

commit 3df7586
Merge: bf8c68b 14375ed
Author: Gui-FernandesBR <[email protected]>
Date:   Thu Apr 25 06:49:58 2024 -0400

    Merge branch 'develop' into bug/airbrakes-postprocess

commit 14375ed
Merge: c31c6f8 b899064
Author: Gui-FernandesBR <[email protected]>
Date:   Thu Apr 25 06:47:36 2024 -0400

    Merge pull request #588 from RocketPy-Team/enh/exponential-backoff-decorator

    ENH: Exponential backoff decorator (fix #449)

commit c31c6f8
Merge: a011c5a 684b997
Author: Gui-FernandesBR <[email protected]>
Date:   Thu Apr 25 06:45:26 2024 -0400

    Merge pull request #587 from RocketPy-Team/mnt/delete-cached-property

    DEP: delete deprecated rocketpy.tools.cached_property

commit b899064
Author: Gui-FernandesBR <[email protected]>
Date:   Fri Apr 19 12:13:23 2024 -0400

    DEV: adds PR 588 to the CHANGELOG

commit a8a185e
Author: Gui-FernandesBR <[email protected]>
Date:   Fri Apr 19 12:08:58 2024 -0400

    TST: Fix tests with Environment class after exponential_backoff decorator was used

commit d0fbcd7
Author: Gui-FernandesBR <[email protected]>
Date:   Fri Apr 19 12:07:45 2024 -0400

    MNT: Refactor code to use the exponential_backoff decorator

commit ccd78af
Author: Gui-FernandesBR <[email protected]>
Date:   Fri Apr 19 12:07:17 2024 -0400

    ENH: Add exponential backoff decorator to tools.py

commit 684b997
Author: Gui-FernandesBR <[email protected]>
Date:   Thu Apr 18 21:47:19 2024 -0400

    DEV: Adds PR 587 to the CHANGELOG.md

commit bb0f46a
Author: Gui-FernandesBR <[email protected]>
Date:   Thu Apr 18 21:41:38 2024 -0400

    MNT: refactors cached_property imports

commit afb3b32
Author: dyu056 <[email protected]>
Date:   Fri Jan 26 00:35:36 2024 +1300

    Completed changes

commit bf8c68b
Merge: aaa3f7b a011c5a
Author: Gui-FernandesBR <[email protected]>
Date:   Thu Apr 18 21:17:06 2024 -0400

    Merge branch 'develop' into bug/airbrakes-postprocess

commit a011c5a
Merge: 624cc15 6b26f61
Author: Gui-FernandesBR <[email protected]>
Date:   Thu Apr 18 15:12:40 2024 -0400

    Merge pull request #585 from RocketPy-Team/enh/swap-diff-for-flow-rate

    BUG: Swap `rocket.total_mass.differentiate` for `motor.total_mass_flow rate`

commit 6b26f61
Author: MateusStano <[email protected]>
Date:   Wed Apr 17 22:19:16 2024 +0200

    DEV: changelog

commit 8ee2c95
Author: MateusStano <[email protected]>
Date:   Wed Apr 17 22:16:59 2024 +0200

    ENH: create rocket total_mass_flow_rate attribute

commit aaa3f7b
Author: MateusStano <[email protected]>
Date:   Mon Apr 15 16:52:49 2024 +0200

    DOCS: change accelerations names in docs

commit 7fe3d0b
Author: MateusStano <[email protected]>
Date:   Mon Apr 15 16:12:39 2024 +0200

    ENH: optmize post process loop

commit a66fc53
Author: MateusStano <[email protected]>
Date:   Mon Apr 15 15:18:37 2024 +0200

    ENH: add reset function

commit b9a97a4
Author: MateusStano <[email protected]>
Date:   Mon Apr 15 15:06:01 2024 +0200

    ENH: add warning for improper time_overshoot

commit 830ea15
Author: MateusStano <[email protected]>
Date:   Mon Apr 15 15:05:31 2024 +0200

    ENH: refactor retrieve arrays cached properties and controller sim post processing

commit e2a94c8
Author: MateusStano <[email protected]>
Date:   Tue Apr 9 18:03:08 2024 +0200

    TST: fix tests

commit e5c7533
Author: MateusStano <[email protected]>
Date:   Tue Apr 9 17:59:22 2024 +0200

    ENH: use mass_flow_rate instead of differentiate

commit 822a89e
Merge: e3e1a59 624cc15
Author: MateusStano <[email protected]>
Date:   Sun Apr 7 13:52:02 2024 +0200

    Merge branch 'develop' into mnt/modularize-rocket-draw

commit e3e1a59
Author: MateusStano <[email protected]>
Date:   Thu Apr 4 14:53:37 2024 +0200

    DEV: fix changelog order

commit 624cc15
Merge: 0a4d89b 61bf4d7
Author: Pedro Henrique Marinho Bressan <[email protected]>
Date:   Tue Apr 2 14:23:05 2024 -0300

    Merge pull request #565 from RocketPy-Team/doc/environment-docstring

    DOC: Improvements of Environment docstring phrasing.

commit 61bf4d7
Author: Pedro Bressan <[email protected]>
Date:   Mon Apr 1 15:00:10 2024 -0300

    MNT: add docs change to CHANGELOG.

commit 9c1a461
Author: Pedro Bressan <[email protected]>
Date:   Mon Apr 1 14:47:03 2024 -0300

    DOC: fix typing issues regarding Environment docs.

commit 4776208
Author: Pedro Henrique Marinho Bressan <[email protected]>
Date:   Fri Mar 29 08:47:18 2024 -0300

    DOC: Update Longitude value ranges.

    Co-authored-by: Gui-FernandesBR <[email protected]>

commit 32a28c1
Merge: 27dd73d 0a4d89b
Author: Pedro Henrique Marinho Bressan <[email protected]>
Date:   Thu Mar 28 18:26:46 2024 -0300

    Merge branch 'develop' into doc/environment-docstring

commit 27dd73d
Author: Pedro Bressan <[email protected]>
Date:   Thu Mar 28 18:24:23 2024 -0300

    DOC: standardize grammar on time zones.

commit 4b42c9e
Author: Pedro Bressan <[email protected]>
Date:   Thu Mar 28 18:20:01 2024 -0300

    DOC: clarify timezones and dates Environment docs.

commit 95b61ef
Author: Pedro Bressan <[email protected]>
Date:   Thu Mar 28 16:38:17 2024 -0300

    DOC: specify latitude and longitude defaults.

commit 6b84c03
Author: Pedro Bressan <[email protected]>
Date:   Mon Mar 25 19:53:37 2024 -0300

    DOC: improve wording of Environment init.

    Co-authored-by: Gui-FernandesBR <[email protected]>

commit 826efcc
Author: Pedro Bressan <[email protected]>
Date:   Sun Mar 24 16:47:14 2024 -0300

    DOC: specify datum as optional.

commit a2aa714
Author: Pedro Bressan <[email protected]>
Date:   Sun Mar 24 16:41:39 2024 -0300

    DOC: add examples and improvements to Environment gravity docstring.

commit 51bdd91
Author: MateusStano <[email protected]>
Date:   Sun Mar 24 15:14:45 2024 +0100

    MNT: changelog

commit 6805e32
Author: MateusStano <[email protected]>
Date:   Sun Mar 24 14:05:00 2024 +0100

    MNT: refactor rocket drawing plot methods

commit 3cc91e7
Merge: f637a9d 65b3315
Author: Pedro Henrique Marinho Bressan <[email protected]>
Date:   Thu Feb 29 20:06:09 2024 -0300

    Merge branch 'develop' into doc/environment-docstring

commit f637a9d
Author: Pedro Bressan <[email protected]>
Date:   Thu Feb 29 17:49:38 2024 -0300

    STY: run black for code linting.

commit 9198ac7
Author: Pedro Bressan <[email protected]>
Date:   Thu Feb 29 17:46:23 2024 -0300

    DOC: phrasing improvements of Environment docstring.

* MNT: fix component repr for sensors

* ENH: add _attatched_rockets to sensors

* ENH: add sensors saving methods

* MNT: simplify sensors repr

* ENH: use _save_data in accel and gyro

* ENH: improve accelerometer export

* ENH: imrpove gyroscope export

* ENH: add sensor initialization

* ENH: speed up measure call

* ENH: add final sensor cache

* ENH: add export sensor data

* BUG: wrong initialization order

* TST: test for new measured_data and exports

* ENH: abstract noise printings

* MNT: run isort

* ENH: add noise variance

* BUG: fix prints for noise variance

* TST: add variances

* Update rocketpy/rocket/rocket.py

Co-authored-by: Pedro Henrique Marinho Bressan <[email protected]>

* ENH: add pressure to .measure params

* ENH: add InertialSensors and ScalarSensors

* ENH: add Barometer class

* BUG: fix drawing for scalar sensors

* ENH: barometer prints

* DOC: change docs for scalar sensors

* ENH: add barometer export data

* BUG: fix scalars sensors prints

* TST: add barometers to tests

* DEV: update sensors testing

* MNT: remove .type attribute

* DOC: fix units of transformation_euler_anges

* DOC: add examples to transformation_euler_angles

* DOC: mention Euler parameters in docs

* TST: test_euler_to_quaternions

* TST: fix doc tests

* MNT: privatize components attributes and improve docs

* TST: add index to var names

* MNT: return temp drift directly

* ENH: improve export methods

* DOC: typos

* MNT: improve flight init

Co-authored-by: Gui-FernandesBR <[email protected]>

* Fix code style issues with Black

* TST: overall improvements on sensor testing

* ENH: change format of sensor_data dict

* MNT: improve flight init

Co-authored-by: Gui-FernandesBR <[email protected]>

* TST: increase rel tolerances

* TST: fix export sensor data test

* TST: fix doctests

* TST: fix doctests

* ENH: change units in prints

* ENH: add .round to Matrix and remove broken doctests

* TST: test transfromation euler angles

* TST: imrpove test_euler_to_quaternions

* DEV: update sensors_testing notebook

* MNT: minor fixes - typos and isort

* MNT: remove aft double underscore from __units

* DOC: remove .type

* MNT: remove .units underscores

* MNT: remove repetition from sensors prints

* ENH: normalize_quaternions in tools.py

* BUG: remove Matrix circuklar import in tools

* MNT: remove unused variable

Co-authored-by: Gui-FernandesBR <[email protected]>

* ENH: explicit for loop variables

* DOC: improve orientation docs

* ENH: x_position to x_offset

* TST: merge tests

* ENH: inherited export method

* TST: improve export data tests

* TST: Refactor sensor tests and export method

* TST: fix fixture names

* BUG: duplicate IntertialSensors

* TST: calisto_sensors to calisto_with_sensors

* MNT: isort

* MNT: remove type docs

* ENH: move export_sensor_measured_data to tools.py

* MNT: pylint fixes

* ENH: simplify sensors prints

* MNT: rename sensors classes

* MNT: sensor.py rename

* DOC: improve inertialsensor and scalar sensor doc

* MNT: sensors to sensor rename imports

* TST: format argument

* ENH: move generic_export_data back to Sensor class

* ENH: rename test files

* ENH: change from celsius to kelvin

* TST: fix celsius to kelvin convertion

* merge develop

* MNT: unecessary variable

* DEV: solve merge issues

* ENH: Adds GNSS Receiver sensor (#636)

* ENH: class GNSS

* ENH: gnss prints

* ENH: add params to measure call

* ENH: export data

* ENH: pass env in .measure

* DOC: gnss attribute docs

* MNT: units in prints

* MNT: fix merge errors

* TST: add gnss tests

* TST: fix time nodes tests

* DEV: add gnss to sensors testing notebook

* DEV: fix merge errors

* MNT: lint and isort

* MNT: black notebooks

* TST: fix test by inversion of rotation

* TST: lower rel tolerances and delete duplicated tests

* MNT: minor fixes

* ENH: export sensor data by sensor name

* MNT: use inverted_haversine in GNSS

* BUG: bearing unit in inverted_haversine

* MNT: pylint

* TST: add test for export with sensor name

* MNT: rename `GNSS` class to `GnssReceiver`

* MNT: fix lint

* MNT: rename gnss file

---------

Co-authored-by: Gui-FernandesBR <[email protected]>

* DEV: updates changelog

* MNT: fix lint

* DOC: improve sensors documentation

* DOC: rename sensors notebook

* MNT: Add warning for experimental development in Sensor classes

* MNT: rename euler-quaternion conversions

* MNT: minor adjustments before merging sensors

---------

Co-authored-by: MateusStano <[email protected]>
Co-authored-by: MateusStano <[email protected]>
Co-authored-by: Pedro Henrique Marinho Bressan <[email protected]>
  • Loading branch information
4 people authored Sep 12, 2024
2 parents 2685eba + 3c759f7 commit 3f2a2c5
Show file tree
Hide file tree
Showing 42 changed files with 4,373 additions and 88 deletions.
4 changes: 4 additions & 0 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -132,11 +132,14 @@
"github",
"Glauert",
"gmaps",
"Gnss",
"Gomes",
"Gonçalvez",
"grav",
"Guilherme",
"Haim",
"headlength",
"headwidth",
"hemis",
"hgtprs",
"hgtsfc",
Expand Down Expand Up @@ -245,6 +248,7 @@
"reversesort",
"reynolds",
"rightarrow",
"rmul",
"ROABs",
"rocketpy",
"rocketusage",
Expand Down
3 changes: 2 additions & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,8 @@ Attention: The newest changes should be on top -->

### Added

- DOC : Cavour Flight Example [#682](https://github.com/RocketPy-Team/RocketPy/pull/682)
- ENH: Adds Sensors classes [683](https://github.com/RocketPy-Team/RocketPy/pull/683)
- DOC: Cavour Flight Example [#682](https://github.com/RocketPy-Team/RocketPy/pull/682)
- DOC: Halcyon Flight Example [#681](https://github.com/RocketPy-Team/RocketPy/pull/681)
- ENH: Adds GenericMotor.load_from_eng_file() method [#676](https://github.com/RocketPy-Team/RocketPy/pull/676)
- ENH: Introducing local sensitivity analysis [#575](https://github.com/RocketPy-Team/RocketPy/pull/575)
Expand Down
899 changes: 899 additions & 0 deletions docs/notebooks/sensors.ipynb

Large diffs are not rendered by default.

11 changes: 11 additions & 0 deletions docs/reference/classes/sensors/abstract/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
Sensors Abstract Classes
========================

.. toctree::
:maxdepth: 1
:caption: Contents:

Sensor Class <sensor>
Inertial Sensor Class <inertial_sensor>
Scalar Sensor Class <scalar_sensor>

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

.. autoclass:: rocketpy.sensors.InertialSensor
:members:
5 changes: 5 additions & 0 deletions docs/reference/classes/sensors/abstract/scalar_sensor.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Scalar Sensor Class
-------------------

.. autoclass:: rocketpy.sensors.ScalarSensor
:members:
5 changes: 5 additions & 0 deletions docs/reference/classes/sensors/abstract/sensor.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Sensor Class
------------

.. autoclass:: rocketpy.sensors.Barometer
:members:
5 changes: 5 additions & 0 deletions docs/reference/classes/sensors/accelerometer.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Accelerometer Class
---------------

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

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

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

.. autoclass:: rocketpy.sensors.Gyroscope
:members:
12 changes: 12 additions & 0 deletions docs/reference/classes/sensors/index.rst
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
Sensor Classes
==============

.. toctree::
:maxdepth: 1
:caption: Contents:

Sensors Abstract Classes <abstract/index>
Accelerometer Class <accelerometer>
Barometer Class <barometer>
Gyroscope Class <gyroscope>
GNSS Receiver Class <gnss>
1 change: 1 addition & 0 deletions docs/user/index.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ RocketPy's User Guide
Compare Flights Class<compare_flights.rst>
Deployable Payload <deployable.rst>
Air Brakes Example <airbrakes.rst>
../notebooks/sensors.ipynb
../matlab/matlab.rst

.. toctree::
Expand Down
1 change: 1 addition & 0 deletions rocketpy/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@
TrapezoidalFins,
)
from .sensitivity import SensitivityModel
from .sensors import Accelerometer, Barometer, GnssReceiver, Gyroscope
from .simulation import Flight, MonteCarlo
from .stochastic import (
StochasticEllipticalFins,
Expand Down
54 changes: 52 additions & 2 deletions rocketpy/control/controller.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from inspect import signature

from ..prints.controller_prints import _ControllerPrints


Expand Down Expand Up @@ -52,6 +54,10 @@ def __init__(
the controller function can interact with. The objects are
listed in the same order as they are provided in the
`interactive_objects`.
7. `sensors` (list): A list of sensors that are attached to the
rocket. The most recent measurements of the sensors are provided
with the ``sensor.measurement`` attribute. The sensors are
listed in the same order as they are added to the rocket
This function will be called during the simulation at the specified
sampling rate. The function should evaluate and change the interactive
Expand All @@ -78,7 +84,7 @@ def __init__(
None
"""
self.interactive_objects = interactive_objects
self.controller_function = controller_function
self.controller_function = self.__init_controller_function(controller_function)
self.sampling_rate = sampling_rate
self.name = name
self.prints = _ControllerPrints(self)
Expand All @@ -88,7 +94,45 @@ def __init__(
else:
self.observed_variables = []

def __call__(self, time, state_vector, state_history):
def __init_controller_function(self, controller_function):
"""Checks number of arguments of the controller function and initializes
it with the correct number of arguments. This is a workaround to allow
the controller function to receive sensors without breaking changes"""
sig = signature(controller_function)
if len(sig.parameters) == 6:

# pylint: disable=unused-argument
def new_controller_function(
time,
sampling_rate,
state_vector,
state_history,
observed_variables,
interactive_objects,
sensors,
):
return controller_function(
time,
sampling_rate,
state_vector,
state_history,
observed_variables,
interactive_objects,
)

elif len(sig.parameters) == 7:
new_controller_function = controller_function

Check warning on line 124 in rocketpy/control/controller.py

View check run for this annotation

Codecov / codecov/patch

rocketpy/control/controller.py#L123-L124

Added lines #L123 - L124 were not covered by tests
else:
raise ValueError(

Check warning on line 126 in rocketpy/control/controller.py

View check run for this annotation

Codecov / codecov/patch

rocketpy/control/controller.py#L126

Added line #L126 was not covered by tests
"The controller function must have 6 or 7 arguments. "
"The arguments must be in the following order: "
"(time, sampling_rate, state_vector, state_history, "
"observed_variables, interactive_objects, sensors)."
"Sensors argument is optional."
)
return new_controller_function

def __call__(self, time, state_vector, state_history, sensors):
"""Call the controller function. This is used by the simulation class.
Parameters
Expand All @@ -104,6 +148,11 @@ def __call__(self, time, state_vector, state_history):
history is a list of every state vector of every step of the
simulation. The state history is a list of lists, where each
sublist is a state vector and is ordered from oldest to newest.
sensors : list
A list of sensors that are attached to the rocket. The most recent
measurements of the sensors are provided with the
``sensor.measurement`` attribute. The sensors are listed in the same
order as they are added to the rocket.
Returns
-------
Expand All @@ -116,6 +165,7 @@ def __call__(self, time, state_vector, state_history):
state_history,
self.observed_variables,
self.interactive_objects,
sensors,
)
if observed_variables is not None:
self.observed_variables.append(observed_variables)
Expand Down
2 changes: 1 addition & 1 deletion rocketpy/environment/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -532,7 +532,7 @@ def utm_to_geodesic( # pylint: disable=too-many-locals,too-many-statements
x, y, utm_zone, hemis, semi_major_axis=6378137.0, flattening=1 / 298.257223563
):
# NOTE: already documented in the Environment class.
# TODO: deprecated the static method from the environment class, use only this one.
# TODO: deprecate the static method from the environment class, use only this one.

if hemis == "N":
y = y + 10000000
Expand Down
126 changes: 114 additions & 12 deletions rocketpy/mathutils/vector_matrix.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from functools import cached_property
from itertools import product

from rocketpy.tools import euler321_to_quaternions, normalize_quaternions


class Vector:
"""Pure python basic R3 vector class designed for simple operations.
Expand Down Expand Up @@ -152,7 +154,10 @@ def __len__(self):
@cached_property
def unit_vector(self):
"""R3 vector with the same direction of self, but normalized."""
return self / abs(self)
try:
return self / abs(self)
except ZeroDivisionError:
return self

Check warning on line 160 in rocketpy/mathutils/vector_matrix.py

View check run for this annotation

Codecov / codecov/patch

rocketpy/mathutils/vector_matrix.py#L159-L160

Added lines #L159 - L160 were not covered by tests

@cached_property
def cross_matrix(self):
Expand Down Expand Up @@ -238,6 +243,30 @@ def __xor__(self, other):
]
)

def __and__(self, other):
"""Element wise multiplication between two R3 vectors. Also known as
Hadamard product.
Parameters
----------
other : Vector
R3 vector to be multiplied with self.
Returns
-------
Vector
R3 vector resulting from the element wise multiplication between
self and other.
Examples
--------
>>> v = Vector([1, 7, 3])
>>> u = Vector([2, 5, 6])
>>> (v & u)
Vector(2, 35, 18)
"""
return Vector([self.x * other[0], self.y * other[1], self.z * other[2]])

def __matmul__(self, other):
"""Dot product between two R3 vectors."""
return self.x * other.x + self.y * other.y + self.z * other.z
Expand Down Expand Up @@ -914,6 +943,47 @@ def dot(self, other):
"""
return self @ (other)

def round(self, decimals=0):
"""Round all the values matrix to a given number of decimals.
Parameters
----------
decimals : int, optional
Number of decimal places to round to. Defaults to 0.
Returns
-------
Matrix
The rounded matrix.
Examples
--------
>>> M = Matrix([[1.1234, 2.3456, 3.4567], [4.5678, 5.6789, 6.7890], [7.8901, 8.9012, 9.0123]])
>>> M.round(2)
Matrix([1.12, 2.35, 3.46],
[4.57, 5.68, 6.79],
[7.89, 8.9, 9.01])
"""
return Matrix(
[
[
round(self.xx, decimals),
round(self.xy, decimals),
round(self.xz, decimals),
],
[
round(self.yx, decimals),
round(self.yy, decimals),
round(self.yz, decimals),
],
[
round(self.zx, decimals),
round(self.zy, decimals),
round(self.zz, decimals),
],
]
)

def __str__(self):
return (
f"[{self.xx}, {self.xy}, {self.xz}]\n"
Expand Down Expand Up @@ -949,7 +1019,6 @@ def transformation(quaternion):
The quaternion representing the rotation from frame A to frame B.
Example: (cos(phi/2), 0, 0, sin(phi/2)) represents a rotation of
phi around the z-axis.
Note: the quaternion must be normalized.
Returns
-------
Expand All @@ -960,27 +1029,60 @@ def transformation(quaternion):
---------
https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles
"""
q_w, q_x, q_y, q_z = quaternion
# normalize quaternion
q_w, q_x, q_y, q_z = normalize_quaternions(quaternion)

# pre-compute common terms
q_x2 = q_x**2
q_y2 = q_y**2
q_z2 = q_z**2
q_wx = q_w * q_x
q_wy = q_w * q_y
q_wz = q_w * q_z
q_xy = q_x * q_y
q_xz = q_x * q_z
q_yz = q_y * q_z
return Matrix(
[
[
1 - 2 * (q_y**2 + q_z**2),
2 * (q_x * q_y - q_w * q_z),
2 * (q_x * q_z + q_w * q_y),
1 - 2 * (q_y2 + q_z2),
2 * (q_xy - q_wz),
2 * (q_xz + q_wy),
],
[
2 * (q_x * q_y + q_w * q_z),
1 - 2 * (q_x**2 + q_z**2),
2 * (q_y * q_z - q_w * q_x),
2 * (q_xy + q_wz),
1 - 2 * (q_x2 + q_z2),
2 * (q_yz - q_wx),
],
[
2 * (q_x * q_z - q_w * q_y),
2 * (q_y * q_z + q_w * q_x),
1 - 2 * (q_x**2 + q_y**2),
2 * (q_xz - q_wy),
2 * (q_yz + q_wx),
1 - 2 * (q_x2 + q_y2),
],
]
)

@staticmethod
def transformation_euler_angles(roll, pitch, yaw):
"""Returns the transformation Matrix from frame B to frame A, where B
is rotated by the Euler angles roll, pitch and yaw with respect to A.
Parameters
----------
roll : float
The roll angle in degrees.
pitch : float
The pitch angle in degrees.
yaw : float
The yaw angle in degrees.
Returns
-------
Matrix
The transformation matrix from frame B to frame A.
"""
return Matrix.transformation(euler321_to_quaternions(roll, pitch, yaw))


if __name__ == "__main__":
import doctest
Expand Down
Loading

0 comments on commit 3f2a2c5

Please sign in to comment.