diff --git a/ahrs/common/dcm.py b/ahrs/common/dcm.py index 10f566e..414cb38 100644 --- a/ahrs/common/dcm.py +++ b/ahrs/common/dcm.py @@ -58,10 +58,11 @@ rotation matrix in :math:`SO(3)`. `Direction cosines `_ are -cosines of angles between a vector and a base coordinate frame [WikipediaDCM]_. -In this case, the direction cosines describe the differences between orthogonal -vectors :math:`\\mathbf{r}_i` and the base frame. The matrix containing these -differences is commonly named the **Direction Cosine Matrix**. +cosines of angles between a vector and a base coordinate frame +:cite:p:`Wiki_DirectionCosine`. In this case, the direction cosines describe +the differences between orthogonal vectors :math:`\\mathbf{r}_i` and the base +frame. The matrix containing these differences is commonly named the +**Direction Cosine Matrix**. These matrices are used for two main purposes: @@ -72,32 +73,12 @@ Because of the latter, the DCM is also known as the **rotation matrix**. DCMs are, therefore, the most common representation of rotations -[WikipediaRotMat]_, especially in real applications of spacecraft tracking and -location. +:cite:p:`Wolfram_RotationMatrix`, especially in real applications of spacecraft +tracking and location. Throughout this package they will be used to represent the attitudes with respect to the global frame. -References ----------- -.. [WikipediaDCM] Wikipedia: Direction Cosine. - (https://en.wikipedia.org/wiki/Direction_cosine) -.. [WikipediaRotMat] Wikipedia: Rotation Matrix - (https://mathworld.wolfram.com/RotationMatrix.html) -.. [Ma] Yi Ma, Stefano Soatto, Jana Kosecka, and S. Shankar Sastry. An - Invitation to 3-D Vision: From Images to Geometric Models. Springer - Verlag. 2003. - (https://www.eecis.udel.edu/~cer/arv/readings/old_mkss.pdf) -.. [Huyhn] Huynh, D.Q. Metrics for 3D Rotations: Comparison and Analysis. J - Math Imaging Vis 35, 155–164 (2009). -.. [Curtis] Howard D Curtis. Orbital Mechanics for Engineering Students (Third - Edition) Butterworth-Heinemann. 2014. -.. [Kuipers] Kuipers, Jack B. Quaternions and Rotation Sequences: A Primer with - Applications to Orbits, Aerospace and Virtual Reality. Princeton; - Oxford: Princeton University Press, 1999. -.. [Diebel] Diebel, James. Representing Attitude; Euler Angles, Unit - Quaternions, and Rotation. Stanford University. 20 October 2006. - """ from typing import Tuple @@ -1039,14 +1020,14 @@ def to_quaternion(self, method: str='shepperd', **kw) -> np.ndarray: There are five methods available to obtain a quaternion from a Direction Cosine Matrix: - * ``'shepperd'`` as described in [Chiaverini]_. - * ``'hughes'`` as described in [Hughes]_. - * ``'itzhack'`` as described in [Bar-Itzhack]_ using version ``3`` by + * ``'chiaverini'`` as described in :cite:p:`Chiaverini1999`. + * ``'hughes'`` as described in :cite:p:`hughes1986spacecraft17`. + * ``'itzhack'`` as described in :cite:p:`BarItzhack2000` using version ``3`` by default. Possible options are integers ``1``, ``2`` or ``3``. - * ``'sarabandi'`` as described in [Sarabandi]_ with a threshold equal + * ``'sarabandi'`` as described in :cite:p:`sarabandi2019` with a threshold equal to ``0.0`` by default. Possible threshold values are floats between ``-3.0`` and ``3.0``. - * ``'shepperd'`` as described in [Shepperd]_. + * ``'shepperd'`` as described in :cite:p:`shepperd1978`. Parameters ---------- diff --git a/ahrs/common/orientation.py b/ahrs/common/orientation.py index f4b6d99..2a41ae0 100644 --- a/ahrs/common/orientation.py +++ b/ahrs/common/orientation.py @@ -104,7 +104,6 @@ def q_random(size: int = 1) -> np.ndarray: return q[0] return q - def q_norm(q: np.ndarray) -> np.ndarray: """ Normalize quaternion [WQ1]_ :math:`\\mathbf{q}_u`, also known as a versor @@ -1085,7 +1084,7 @@ def slerp(q0: np.ndarray, q1: np.ndarray, t_array: np.ndarray, threshold: float arc of a great circle passing through any two existing quaternion endpoints lying on the unit radius hypersphere. - Based on the method detailed in [Wiki_SLERP]_ + Based on the method detailed in :cite:p:`Wiki_SLERP`. Parameters ---------- @@ -1106,10 +1105,6 @@ def slerp(q0: np.ndarray, q1: np.ndarray, t_array: np.ndarray, threshold: float q : numpy.ndarray New quaternion representing the interpolated rotation. - References - ---------- - .. [Wiki_SLERP] https://en.wikipedia.org/wiki/Slerp - """ qdot = q0@q1 # Ensure SLERP takes the shortest path @@ -1132,7 +1127,7 @@ def slerp(q0: np.ndarray, q1: np.ndarray, t_array: np.ndarray, threshold: float def chiaverini(dcm: np.ndarray) -> np.ndarray: """ Quaternion from a Direction Cosine Matrix with Chiaverini's algebraic - method [Chiaverini]_. + method :cite:p:`Chiaverini1999`. Defining the unit quaternion as: @@ -1218,7 +1213,8 @@ def chiaverini(dcm: np.ndarray) -> np.ndarray: def hughes(C: np.ndarray) -> np.ndarray: """ - Quaternion from a Direction Cosine Matrix with Hughes' method [Hughes]_. + Quaternion from a Direction Cosine Matrix with trigonometric Hughes' method + :cite:p:`hughes1986spacecraft17`. Defining the quaternion (reluctantly called "Euler Parameters" in Hughes' book) as: @@ -1320,7 +1316,7 @@ def hughes(C: np.ndarray) -> np.ndarray: def sarabandi(dcm: np.ndarray, eta: float = 0.0) -> np.ndarray: """ Quaternion from a Direction Cosine Matrix using Sarabandi's method - [Sarabandi]_. + :cite:p:`sarabandi2019`. A rotation matrix :math:`\\mathbf{R}` can be expressed as: @@ -1521,7 +1517,7 @@ def sarabandi(dcm: np.ndarray, eta: float = 0.0) -> np.ndarray: def itzhack(dcm: np.ndarray, version: int = 3) -> np.ndarray: """ Quaternion from a Direction Cosine Matrix with Bar-Itzhack's method - [Bar-Itzhack]_. + :cite:p:`BarItzhack2000`. This method to compute the quaternion from a Direction Cosine Matrix (DCM) is based on the eigenvalue decomposition of the matrix :math:`\\mathbf{K}`, @@ -1775,13 +1771,14 @@ def itzhack(dcm: np.ndarray, version: int = 3) -> np.ndarray: q = eigvec[:, np.where(np.isclose(eigval, 1.0))[0]].flatten().real else: q = eigvec[:, eigval.argmax()] - q = np.roll(q, 1) # Original implementation uses [qx, qy, qz, qw] + q = np.roll(q, 1) # Re-arrange quaternion to [qw, qx, qy, qz] q[0] *= -1 # Original implementation computes inverse rotation return q / np.linalg.norm(q) def shepperd(dcm: np.ndarray) -> np.ndarray: """ - Quaternion from a Direction Cosine Matrix with Shepperd's method [Shepperd]_. + Quaternion from a Direction Cosine Matrix with Shepperd's method + :cite:p:`Shepperd1978`. Since it was proposed in 1978, the Shepperd method has been widely used in the aerospace industry. diff --git a/ahrs/common/quaternion.py b/ahrs/common/quaternion.py index b52f2e7..5cd12a0 100644 --- a/ahrs/common/quaternion.py +++ b/ahrs/common/quaternion.py @@ -3,9 +3,11 @@ Quaternion ========== -Quaternions were initially defined by `William Hamilton `_ -in 1843 to describe a `Cayley-Dickson construction `_ -in four dimensions. +Quaternions were initially defined by `William Hamilton +`_ in 1843 to describe a +`Cayley-Dickson construction +`_ in four +dimensions. Since then, many interpretations have appeared for different applications. The most common definition of a quaternion :math:`\\mathbf{q}` is as an ordered @@ -16,7 +18,8 @@ where :math:`w`, :math:`x`, :math:`y` and :math:`z` are real numbers, and :math:`i`, :math:`j` and :math:`k` are three imaginary unit numbers defined so -that [Sola]_ [Kuipers]_ [WikiQuaternion]_ : +that :cite:p:`sola2017quaternion` :cite:p:`kuipers1999` +:cite:p:`Wiki_Quaternion`: .. math:: i^2 = j^2 = k^2 = ijk = -1 @@ -54,8 +57,9 @@ followed by the scalar part, increasing the confusion among readers. Here, the definition above will be used throughout the package. -Let's say, for example, we want to use the quaternion :math:`\\mathbf{q}=\\begin{pmatrix}0.7071 & 0 & 0.7071 & 0\\end{pmatrix}` -with this class: +Let's say, for example, we want to use the quaternion +:math:`\\mathbf{q}=\\begin{pmatrix}0.7071 & 0 & 0.7071 & 0\\end{pmatrix}` with +this class: .. code:: python @@ -88,11 +92,12 @@ .. math:: \\mathbf{a}' = \\mathbf{qa} -Back in the XVIII century `Leonhard Euler `_ -showed that any **rotation around the origin** can be described by a -three-dimensional axis and a rotation magnitude. -`Euler's Rotation Theorem `_ -is the basis for most three-dimensional rotations out there. +Back in the XVIII century `Leonhard Euler +`_ showed that any **rotation +around the origin** can be described by a three-dimensional axis and a rotation +magnitude. `Euler's Rotation Theorem +`_ is the basis for +most three-dimensional rotations out there. Later, in 1840, `Olinde Rodrigues `_ came up with a formula using Euler's principle in vector form: @@ -176,7 +181,7 @@ * When :math:`\\theta=180` (half-circle), then :math:`q_w=0`, making :math:`\\mathbf{q}` a **pure quaternion**. * The negative values of a versor, :math:`\\begin{pmatrix}-q_w & -q_x & -q_y & -q_z\\end{pmatrix}` - represent the *same rotation* [Grosskatthoefer]_. + represent the *same rotation* :cite:p:`grosskatthoefer2012`. .. code:: python @@ -194,13 +199,14 @@ True To summarize, unit quaternions can also be defined using Euler's rotation -theorem [#]_ in the form [Kuipers]_: +theorem [#]_ in the form :cite:p:`kuipers1999`: .. math:: \\mathbf{q} = \\begin{bmatrix}\\cos\\theta \\\\ \\mathbf{v}\\sin\\theta\\end{bmatrix} -And they have similar algebraic characteristics as normal vectors [Sola]_ [Eberly]_. -For example, given two quaternions :math:`\\mathbf{p}` and :math:`\\mathbf{q}`: +And they have similar algebraic characteristics as normal vectors +:cite:p:`sola2017quaternion` :cite:p:`eberly2002`. For example, given two +quaternions :math:`\\mathbf{p}` and :math:`\\mathbf{q}`: .. math:: \\mathbf{p} \\pm \\mathbf{q} = \\begin{bmatrix}p_w\\pm q_w \\\\ \\mathbf{p}_v \\pm \\mathbf{q}_v \\end{bmatrix} @@ -218,9 +224,10 @@ >>> p-q Quaternion([ 0.62597531, -0.1299716 , 0.69342116, 0.33230917]) -The **quaternion product** uses the `Hamilton product `_ -to perform their multiplication [#]_, which can be represented in vector form, -as a known scalar-vector form, or even as a matrix multiplication: +The **quaternion product** uses the `Hamilton product +`_ to perform their +multiplication [#]_, which can be represented in vector form, as a known +scalar-vector form, or even as a matrix multiplication: .. math:: \\begin{array}{rl} @@ -296,47 +303,6 @@ quaternion product, but here is not used in order to avoid any confusions with the `outer product `_. -References ----------- -.. [Bar-Itzhack] Y. Bar-Itzhack. New method for Extracting the Quaternion from - a Rotation Matrix. Journal of Guidance, Control, and Dynamics, - 23(6):1085–1087, 2000. (https://arc.aiaa.org/doi/abs/10.2514/2.4654) -.. [Chiaverini] S. Chiaverini & B. Siciliano. The Unit Quaternion: A Useful - Tool for Inverse Kinematics of Robot Manipulators. Systems Analysis - Modelling Simulation. May 1999. - (https://www.researchgate.net/publication/262391661) -.. [Dantam] Dantam, N. (2014) Quaternion Computation. Institute for Robotics - and Intelligent Machines. Georgia Tech. (http://www.neil.dantam.name/note/dantam-quaternion.pdf) -.. [Eberly] Eberly, D. (2010) Quaternion Algebra and Calculus. Geometric Tools. - https://www.geometrictools.com/Documentation/Quaternions.pdf -.. [Grosskatthoefer] K. Grosskatthoefer. Introduction into quaternions from - spacecraft attitude representation. TU Berlin. 2012. - (http://www.tu-berlin.de/fileadmin/fg169/miscellaneous/Quaternions.pdf) -.. [Hughes] P. Hughes. Spacecraft Attitude Dynamics. 1986. p. 18 -.. [Kuffner] James J. Kuffner. Effective Sampling and Distance Metrics for 3D - Rigid Body Path Planning. Proc. 2004 IEEE International Conference on - Robotics and Automation. 2004. -.. [Kuipers] Kuipers, Jack. Quaternions and Rotation Sequences. Princenton - University Press. 1999. -.. [Markley2007] F. Landis Markley. Averaging Quaternions. Journal of Guidance, - Control, and Dynamics. Vol 30, Num 4. 2007 - (https://arc.aiaa.org/doi/abs/10.2514/1.28949) -.. [Sarabandi] Sarabandi, S. et al. (2018) Accurate Computation of Quaternions - from Rotation Matrices. - (http://www.iri.upc.edu/files/scidoc/2068-Accurate-Computation-of-Quaternions-from-Rotation-Matrices.pdf) -.. [Sarkka] Särkkä, S. (2007) Notes on Quaternions (https://users.aalto.fi/~ssarkka/pub/quat.pdf) -.. [Shepperd] S.W. Shepperd. "Quaternion from rotation matrix." Journal of - Guidance and Control, Vol. 1, No. 3, pp. 223-224, 1978. - (https://arc.aiaa.org/doi/10.2514/3.55767b) -.. [Shoemake] K. Shoemake. Uniform random rotations. Graphics Gems III, pages - 124-132. Academic, New York, 1992. -.. [Sola] Solà, Joan. Quaternion kinematics for the error-state Kalman Filter. - October 12, 2017. (http://www.iri.upc.edu/people/jsola/JoanSola/objectes/notes/kinematics.pdf) -.. [WikiConversions] https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles -.. [WikiQuaternion] https://en.wikipedia.org/wiki/Quaternion -.. [Wiki_SLERP] https://en.wikipedia.org/wiki/Slerp -.. [MarioGC1] https://mariogc.com/post/angular-velocity-quaternions/ - """ import numpy as np @@ -368,7 +334,7 @@ def slerp(q0: np.ndarray, q1: np.ndarray, t_array: np.ndarray, threshold: float It returns as many rotations between ``q0`` and ``q1`` as elements in ``t_array``. - Based on the method detailed in [Wiki_SLERP]_. + Based on the method detailed in :cite:p:`Wiki_SLERP`. Parameters ---------- @@ -412,8 +378,8 @@ def random_attitudes(n: int = 1, representation: str = 'quaternion') -> np.ndarr Generate random attitudes To generate a random quaternion a mapping in SO(3) is first created and - then transformed as explained originally by [Shoemake]_ and summarized in - [Kuffner]_. + then transformed as explained originally by :cite:p:`shoemake1992` and + summarized in :cite:p:`kuffner2004`. First, three uniform random values are sampled from the interval [0, 1]: @@ -1139,7 +1105,7 @@ def __mul__(self, q: np.ndarray) -> np.ndarray: Given two unit quaternions :math:`\\mathbf{p}=(p_w, p_x, p_y, p_z)` and :math:`\\mathbf{q} = (q_w, q_x, q_y, q_z)`, their product is obtained - [Dantam]_ [MWQW]_ as: + :cite:p:`dantam2014` [MWQW]_ as: .. math:: @@ -1183,7 +1149,7 @@ def __matmul__(self, q: np.ndarray) -> np.ndarray: Given two unit quaternions :math:`\\mathbf{p}=(p_w, p_x, p_y, p_z)` and :math:`\\mathbf{q} = (q_w, q_x, q_y, q_z)`, their product is obtained - [Dantam]_ [MWQW]_ as: + :cite:p:`dantam2014` [MWQW]_ as: .. math:: \\mathbf{pq} = @@ -1395,7 +1361,7 @@ def product(self, q: np.ndarray) -> np.ndarray: Given two unit quaternions :math:`\\mathbf{p}=(p_w, \\mathbf{p}_v)` and :math:`\\mathbf{q} = (q_w, \\mathbf{q}_v)`, their product is defined - [Sola]_ [Dantam]_ as: + :cite:p:`sola2017quaternion` :cite:p:`dantam2014` as: .. math:: \\begin{eqnarray} @@ -1492,7 +1458,7 @@ def mult_L(self) -> np.ndarray: Matrix form of a left-sided quaternion multiplication Q. Matrix representation of quaternion product with a left sided - quaternion [Sarkka]_: + quaternion :cite:p:`särkkä2007`: .. math:: \\mathbf{qp} = \\mathbf{L}(\\mathbf{q})\\mathbf{p} = @@ -1521,7 +1487,7 @@ def mult_R(self) -> np.ndarray: Matrix form of a right-sided quaternion multiplication Q. Matrix representation of quaternion product with a right sided - quaternion [Sarkka]_: + quaternion :cite:p:`särkkä2007`: .. math:: \\mathbf{qp} = \\mathbf{R}(\\mathbf{p})\\mathbf{q} = @@ -1648,8 +1614,9 @@ def to_angles(self) -> np.ndarray: """ Return corresponding Euler angles of quaternion. - Given a unit quaternion :math:`\\mathbf{q} = \\begin{pmatrix}q_w & q_x & q_y & q_z\\end{pmatrix}`, - its corresponding Euler angles [WikiConversions]_ are: + Given a unit quaternion + :math:`\\mathbf{q} = \\begin{pmatrix}q_w & q_x & q_y & q_z\\end{pmatrix}`, + its corresponding Euler angles :cite:p:`Wiki_Conversions` are: .. math:: \\begin{bmatrix} @@ -1682,7 +1649,7 @@ def to_DCM(self) -> np.ndarray: where :math:`\\mathbf{q}_v = \\begin{bmatrix}q_x & q_y & q_z\\end{bmatrix}` is the vector part, and :math:`q_w` is the scalar part. - The resulting matrix :math:`\\mathbf{R}` [WikiConversions]_ has the + The resulting matrix :math:`\\mathbf{R}` :cite:p:`Wiki_Conversions` has the form: .. math:: @@ -1739,11 +1706,14 @@ def from_DCM(self, dcm: np.ndarray, method: str = 'shepperd', **kw) -> np.ndarra There are five methods available to obtain a quaternion from a Direction Cosine Matrix: - * ``'chiaverini'`` as described in [Chiaverini]_ - * ``'hughes'`` as described in [Hughes]_ - * ``'itzhack'`` as described in [Bar-Itzhack]_ - * ``'sarabandi'`` as described in [Sarabandi]_ - * ``'shepperd'`` as described in [Shepperd]_ + * ``'chiaverini'`` as described in :cite:p:`Chiaverini1999`. + * ``'hughes'`` as described in :cite:p:`hughes1986spacecraft17`. + * ``'itzhack'`` as described in :cite:p:`BarItzhack2000` using version ``3`` by + default. Possible options are integers ``1``, ``2`` or ``3``. + * ``'sarabandi'`` as described in :cite:p:`sarabandi2019` with a threshold equal + to ``0.0`` by default. Possible threshold values are floats between + ``-3.0`` and ``3.0``. + * ``'shepperd'`` as described in :cite:p:`shepperd1978`. Parameters ---------- @@ -1941,8 +1911,15 @@ def random(self) -> np.ndarray: Generate a random quaternion A mapping in SO(3) is first created and then transformed as explained - originally by [Shoemake]_. It calls the function :func:`random_attitudes` - with ``n=1``. + originally by :cite:p:`shoemake1992`. It calls the function + :func:`random_attitudes` with ``n=1``. + + .. warning:: + + The generated random quaternion is returned as a NumPy array, + but **it is not set in the object**. To create a :class:`Quaternion` + object with random values, we can indicate this when creating the + object. See examples below. Returns ------- @@ -1952,8 +1929,12 @@ def random(self) -> np.ndarray: Examples -------- >>> q = Quaternion() + >>> q + Quaternion([1., 0., 0., 0.]) >>> q.random() - array([ 0.18257419, -0.36514837, 0.54772256, -0.73029674]) + array([-0.13952338, 0.96330741, -0.18034361, -0.14159178]) + >>> q + Quaternion([1., 0., 0., 0.]) It can be called when the Quaternion object is created: @@ -2613,14 +2594,14 @@ def from_DCM(self, DCM: np.ndarray, method: str='shepperd', inplace: bool = True There are five methods available to obtain a quaternion from a Direction Cosine Matrix: - * ``'chiaverini'`` as described in [Chiaverini]_. - * ``'hughes'`` as described in [Hughes]_. - * ``'itzhack'`` as described in [Bar-Itzhack]_ using version ``3`` by + * ``'chiaverini'`` as described in :cite:p:`Chiaverini1999`. + * ``'hughes'`` as described in :cite:p:`hughes1986spacecraft17`. + * ``'itzhack'`` as described in :cite:p:`BarItzhack2000` using version ``3`` by default. Possible options are integers ``1``, ``2`` or ``3``. - * ``'sarabandi'`` as described in [Sarabandi]_ with a threshold equal + * ``'sarabandi'`` as described in :cite:p:`sarabandi2019` with a threshold equal to ``0.0`` by default. Possible threshold values are floats between ``-3.0`` and ``3.0``. - * ``'shepperd'`` as described in [Shepperd]_. + * ``'shepperd'`` as described in :cite:p:`shepperd1978`. Parameters ---------- @@ -2690,7 +2671,7 @@ def to_angles(self) -> np.ndarray: Return corresponding roll-pitch-yaw angles of quaternion. Having a unit quaternion :math:`\\mathbf{q} = \\begin{pmatrix}q_w & q_x & q_y & q_z\\end{pmatrix}`, - its corresponding roll-pitch-yaw angles [WikiConversions]_ are: + its corresponding roll-pitch-yaw angles :cite:p:`Wiki_Conversions` are: .. math:: \\begin{bmatrix} @@ -2741,7 +2722,7 @@ def to_DCM(self) -> np.ndarray: is the vector part, :math:`q_w` is the scalar part, and :math:`\\|\\mathbf{q}\\|=1`. The `rotation matrix `_ - :math:`\\mathbf{R}` [WikiConversions]_ built from :math:`\\mathbf{q}` + :math:`\\mathbf{R}` :cite:p:`Wiki_Conversions` built from :math:`\\mathbf{q}` has the form: .. math:: @@ -2799,7 +2780,7 @@ def to_DCM(self) -> np.ndarray: def average(self, span: Tuple[int, int] = None, weights: np.ndarray = None) -> np.ndarray: """ - Average quaternion using Markley's method [Markley2007]_ + Average quaternion using Markley's method :cite:`markley2007`. It has to be clear that we intend to average **attitudes** rather than quaternions. It just happens that we represent these attitudes with @@ -3033,7 +3014,7 @@ def angular_velocities(self, dt: float) -> np.ndarray: \\end{array} where :math:`\\Delta t` is the time step between consecutive - quaternions [MarioGC1]_. + quaternions :cite:p:`garcia2022`. Parameters ---------- diff --git a/ahrs/filters/angular.py b/ahrs/filters/angular.py index 636b478..cd9aab9 100644 --- a/ahrs/filters/angular.py +++ b/ahrs/filters/angular.py @@ -7,12 +7,12 @@ updated via integration of angular rate measurements of a gyroscope. The easiest way to do so is by integrating the differential -equation for a local rotation rate [Sola]_. +equation for a local rotation rate :cite:p:`sola2017quaternion`. In a kinematic system, the angular velocity :math:`\\boldsymbol\\omega` of a rigid body at any instantaneous time is described with respect to a fixed frame coinciding instantaneously with its body frame. Thus, this angular -velocity is *in terms of* the body frame [Jia]_. +velocity is *in terms of* the body frame :cite:p:`jia2024`. Accumulating rotation over time in quaternion form is done by integrating the differential equation of :math:`\\mathbf{q}` with a defined rotation rate. @@ -28,7 +28,8 @@ In the simplest practical case, the angular rates are measured by `gyroscopes `_, reading instantaneous angular -velocities, :math:`\\boldsymbol\\omega(t_n)=\\begin{bmatrix}\\omega_x&\\omega_y&\\omega_z\\end{bmatrix}^T`, +velocities, :math:`\\boldsymbol\\omega(t_n) +=\\begin{bmatrix}\\omega_x&\\omega_y&\\omega_z\\end{bmatrix}^T`, in *rad/s*, at discrete times :math:`t_n = n\\Delta t` in the local sensor frame. @@ -44,7 +45,8 @@ An orientation (attitude) is described with a quaternion :math:`\\mathbf{q} (t)` at a time :math:`t`, and with :math:`\\mathbf{q} (t+\\Delta t)` at a time :math:`t+\\Delta t`. This is after a rotation change :math:`\\Delta\\mathbf{q}` -during :math:`\\Delta t` seconds is performed on the local frame [Jia]_. +during :math:`\\Delta t` seconds is performed on the local frame +:cite:p:`jia2024`. This rotation change about the instantaneous axis :math:`\\mathbf{u}=\\frac{\\boldsymbol\\omega}{\\|\\boldsymbol\\omega\\|}` @@ -147,7 +149,7 @@ We recognize the power-series expansion of `Euler's formula `_, which helps to map the quaternion :math:`\\mathbf{q}` from a rotation vector -:math:`\\mathbf{v}`. This **exponential map** [Sola]_ is formerly defined as: +:math:`\\mathbf{v}`. This **exponential map** :cite:p:`sola2017quaternion` is formerly defined as: .. math:: \\mathbf{q} = e^\\mathbf{v} = @@ -252,9 +254,9 @@ \\mathbf{q}_{t+1} \\gets \\frac{\\mathbf{q}_{t+1}}{\\|\\mathbf{q}_{t+1}\\|} Numerical Integration based on Runge-Kutta methods can be employed to increase -the accuracy, and are shown to be more effective. See [Sola]_ and [Zhao]_ for a -comparison of the different methods, their accuracy, and their computational -load. +the accuracy, and are shown to be more effective. See :cite:p:`sola2017quaternion` +and :cite:p:`zhao2013` for a comparison of the different methods, their +accuracy, and their computational load. Footnotes --------- @@ -273,18 +275,6 @@ \\mathbf{q}^{i\\geq 4} &=& \\frac{1}{2^i}\\mathbf{q}\\boldsymbol\\omega^i + \\cdots \\end{array} -References ----------- - -.. [Jia] Yan-Bin Jia. Quaternions. 2018. - (http://web.cs.iastate.edu/~cs577/handouts/quaternion.pdf) -.. [Sola] Solà, Joan. Quaternion kinematics for the error-state Kalman Filter. - October 12, 2017. - (http://www.iri.upc.edu/people/jsola/JoanSola/objectes/notes/kinematics.pdf) -.. [Zhao] F. Zhao and B.G.M. van Wachem. A novel Quaternion integration - approach for describing the behaviour of non-spherical particles. - (https://link.springer.com/content/pdf/10.1007/s00707-013-0914-2.pdf) - """ import numpy as np diff --git a/ahrs/filters/aqua.py b/ahrs/filters/aqua.py index 48daa93..661382d 100644 --- a/ahrs/filters/aqua.py +++ b/ahrs/filters/aqua.py @@ -3,9 +3,10 @@ Algebraic Quaternion Algorithm ============================== -Roberto Valenti's Algebraic Quaterion Algorithm (AQUA) [Valenti2015]_ estimates -a quaternion with the algebraic solution of a system from inertial/magnetic -observations, solving `Wahba's Problem `_. +Roberto Valenti's Algebraic Quaterion Algorithm (AQUA) :cite:p:`valenti2015` +estimates a quaternion with the algebraic solution of a system from +inertial+magnetic observations, solving `Wahba's Problem +`_. AQUA computes the "tilt" quaternion and the "heading" quaternion separately in two sub-parts. This avoids the impact of the magnetic disturbances on the roll @@ -15,7 +16,7 @@ together with accelerometer and magnetic field readings. The correction part of the filter is based on the independently estimated quaternions and works for both IMU (Inertial Measurement Unit) and MARG (Magnetic, Angular Rate, and -Gravity) sensors [Valenti2016]_. +Gravity) sensors :cite:p:`valenti2016`. Quaternion as Orientation ------------------------- @@ -383,10 +384,10 @@ ^L_G\\mathbf{q} = \\, ^L_G\\mathbf{q}_\\omega \\, \\Delta\\mathbf{q}_\\mathrm{acc} \\, \\Delta\\mathbf{q}_\\mathrm{mag} \\end{equation} -The delta quaternions are computed and filtered independently by the high-frequency -noise. This correction is divided in two steps: correction of roll and pitch of -the predicted quaternion, and then the correction of the yaw angle if readings -of the magnetic field are provided. +The delta quaternions are computed and filtered independently by the +high-frequency noise. This correction is divided in two steps: correction of +roll and pitch of the predicted quaternion, and then the correction of the yaw +angle if readings of the magnetic field are provided. Accelerometer-Based Correction ------------------------------ @@ -557,18 +558,6 @@ --------- .. [#] Any vector :math:`\\mathbf{x}` is a **unit vector** if :math:`\\|\\mathbf{x}\\|=1`. -References ----------- -.. [Valenti2015] Valenti, R.G.; Dryanovski, I.; Xiao, J. Keeping a Good - Attitude: A Quaternion-Based Orientation Filter for IMUs and MARGs. Sensors - 2015, 15, 19302-19330. - (https://res.mdpi.com/sensors/sensors-15-19302/article_deploy/sensors-15-19302.pdf) -.. [Valenti2016] R. G. Valenti, I. Dryanovski and J. Xiao, "A Linear Kalman - Filter for MARG Orientation Estimation Using the Algebraic Quaternion - Algorithm," in IEEE Transactions on Instrumentation and Measurement, vol. - 65, no. 2, pp. 467-481, 2016. - (https://ieeexplore.ieee.org/document/7345567) - """ import numpy as np diff --git a/ahrs/filters/davenport.py b/ahrs/filters/davenport.py index c3171b3..62c6aff 100644 --- a/ahrs/filters/davenport.py +++ b/ahrs/filters/davenport.py @@ -19,14 +19,14 @@ nonnegative weights for each observation. This famous formulation is known as `Wahba's problem `_. -A first elegant solution was proposed by [Davenport1968]_ that solves this in -terms of quaternions, yielding a unique optimal solution. The corresponding -**gain function** is defined as: +A first elegant solution was proposed by :cite:p:`davenport1968` that solves +this in terms of quaternions, yielding a unique optimal solution. The +corresponding **objective function** is defined as: .. math:: g(\\mathbf{A}) = 1 - L(\\mathbf{A}) = \\sum_{i=1}^Nw_i\\mathbf{U}^T\\mathbf{AV} -The gain function is at maximum when the loss function :math:`L(\\mathbf{A})` +The objective function is at maximum when the loss function :math:`L(\\mathbf{A})` is at minimum. The goal is, then, to find the optimal attitude matrix :math:`\\mathbf{A}`, which *maximizes* :math:`g(\\mathbf{A})`. We first notice that: @@ -37,13 +37,15 @@ =& \\mathrm{tr}(\\mathbf{AB}^T) \\end{array} -where :math:`\\mathrm{tr}` denotes the `trace `_ -of a matrix, and :math:`\\mathbf{B}` is the *attitude profile matrix*: +where :math:`\\mathrm{tr}` denotes the `trace +`_ of a matrix, and +:math:`\\mathbf{B}` is the *attitude profile matrix*: .. math:: \\mathbf{B} = \\sum_{i=1}^Nw_i\\mathbf{UV} -Now, we must parametrize the attitude matrix in terms of a quaternion :math:`\\mathbf{q}`: +Now, we must parametrize the attitude matrix in terms of a quaternion +:math:`\\mathbf{q}` :cite:p:`lerner1978` : .. math:: \\mathbf{A}(\\mathbf{q}) = (q_w^2-\\mathbf{q}_v\\cdot\\mathbf{q}_v)\\mathbf{I}_3+2\\mathbf{q}_v\\mathbf{q}_v^T-2q_w\\lfloor\\mathbf{q}\\rfloor_\\times @@ -54,7 +56,7 @@ :math:`\\mathbf{x}`. See the `quaternion page <../quaternion.html>`_ for further details about this representation mapping. -The gain function, in terms of quaternion, becomes: +The objective function, in terms of quaternion, becomes: .. math:: g(\\mathbf{q}) = (q_w^2-\\mathbf{q}_v\\cdot\\mathbf{q}_v)\\mathrm{tr}\\mathbf{B}^T + 2\\mathrm{tr}\\big(\\mathbf{q}_v\\mathbf{q}_v^T\\mathbf{B}^T\\big) + 2q_w\\mathrm{tr}(\\lfloor\\mathbf{q}\\rfloor_\\times\\mathbf{B}^T) @@ -95,14 +97,6 @@ step of computing the eigenvalues and eigenvectors to find the optimal quaternion. -References ----------- -.. [Davenport1968] Paul B. Davenport. A Vector Approach to the Algebra of Rotations - with Applications. NASA Technical Note D-4696. August 1968. - (https://ntrs.nasa.gov/archive/nasa/casi.ntrs.nasa.gov/19680021122.pdf) -.. [Lerner2] Lerner, G. M. "Three-Axis Attitude Determination" in Spacecraft - Attitude Determination and Control, edited by J.R. Wertz. 1978. p. 426-428. - """ import numpy as np diff --git a/ahrs/filters/ekf.py b/ahrs/filters/ekf.py index c8328f2..8bcb1e1 100644 --- a/ahrs/filters/ekf.py +++ b/ahrs/filters/ekf.py @@ -9,11 +9,11 @@ The **state** is the physical state, which can be described by dynamic variables. The **noise** in the measurements means that there is a certain -degree of uncertainty in them [Hartikainen2011]_. +degree of uncertainty in them :cite:p:`hartikainen2011`. A `dynamical system `_ is a system whose state evolves over time, so differential equations are normally -used to model them [Labbe2015]_. There is also noise in the dynamics of the +used to model them :cite:p:`labbe2015`. There is also noise in the dynamics of the system, **process noise**, which means we cannot be entirely deterministic, but we can get indirect noisy measurements. @@ -23,7 +23,7 @@ The instantaneous state of the system is represented with a vector updated through discrete time increments to generate the next state. The simplest of -the state space models are linear models [Hartikainen2011]_, which can be +the state space models are linear models :cite:p:`hartikainen2011`, which can be expressed with equations of the following form: .. math:: @@ -66,7 +66,8 @@ A common way to obtain :math:`\\mathbf{F}` uses the `matrix exponential `_, which can be expanded -with a `Taylor series `_ [Sola]_: +with a `Taylor series `_ +:cite:p:`sola2017quaternion` : .. math:: \\mathbf{F} = e^{\\mathbf{A}\\Delta t} = \\mathbf{I} + \\mathbf{A}\\Delta t + \\frac{(\\mathbf{A}\\Delta t)^2}{2!} + \\frac{(\\mathbf{A}\\Delta t)^3}{3!} + \\cdots = \\sum_{k=0}^\\infty\\frac{(\\mathbf{A}\\Delta t)^k}{k!} @@ -77,7 +78,7 @@ Kalman Filter ------------- -The solution proposed by [Kalman1960]_ models a system with a set of +The solution proposed by :cite:p:`kalman1960` models a system with a set of :math:`n^{th}`-order differential equations, converts them into an equivalent set of first-order differential equations, and puts them into the matrix form :math:`\\dot{\\mathbf{x}}=\\mathbf{Ax}`. Once in this form several techniques @@ -149,7 +150,7 @@ The EKF handles nonlinearity by forming a Gaussian approximation to the joint distribution of state :math:`\\mathbf{x}` and measurements :math:`\\mathbf{z}` using `Taylor series `_ based -transformations [Hartikainen2011]_. +transformations :cite:p:`hartikainen2011`. Likewise, the EKF is split into two steps: @@ -211,7 +212,7 @@ Gyroscope data are treated as external inputs to the filter rather than as measurements, and their measurement noises enter the filter as *process noise* -rather than as measurement noise [Sabatini2011]_. +rather than as measurement noise :cite:p:`sabatini2011`. For this model, the quaternion :math:`\\mathbf{q}` will be the **state vector**, and the angular velocity :math:`\\boldsymbol\\omega`, in *rad/s*, will be the @@ -254,7 +255,7 @@ Using the `Euler-Rodrigues rotation formula `_ -to redefine the quaternion [Sabatini2011]_ we find: +to redefine the quaternion :cite:p:`sabatini2011` we find: .. math:: \\hat{\\mathbf{q}}_t = @@ -316,10 +317,10 @@ The angular rates :math:`\\boldsymbol\\omega` are measured by the gyroscopes in the local *sensor frame*. Hence, this term describes the evolution of the -orientation with respect to the local frame [Sola]_. +orientation with respect to the local frame :cite:p:`sola2017quaternion`. Using the definition of :math:`\\dot{\\mathbf{q}}`, the predicted state, -:math:`\\hat{\\mathbf{q}}_t` is written as [Wertz]_: +:math:`\\hat{\\mathbf{q}}_t` is written as :cite:p:`spence1978`: .. math:: \\begin{array}{rcl} @@ -488,9 +489,10 @@ The assumption that the noise variances of the gyroscope axes are all equal (:math:`\\sigma_{wx}=\\sigma_{wy}=\\sigma_{wz}`) is almost never true in reality. It is possible to infer the individual variances through a careful - modeling and calibration process [Lam2003]_. If these three different - values are at hand, it is then recommended to compute the Process Noise - Covariance with :math:`\\mathbf{W}_t\\boldsymbol\\Sigma_\\boldsymbol\\omega\\mathbf{W}_t^T`. + modeling and calibration process :cite:p:`lam2003`. If these three + different values are at hand, it is then recommended to compute the Process + Noise Covariance with + :math:`\\mathbf{W}_t\\boldsymbol\\Sigma_\\boldsymbol\\omega\\mathbf{W}_t^T`. Finally, the prediction step of this model would propagate the covariance matrix like: @@ -718,7 +720,7 @@ The measurement noise covariance matrix, :math:`\\mathbf{R}\\in\\mathbb{R}^{6\\times 6}`, is expressed directly in terms of the statistics of the measurement noise -affecting each sensor [Sabatini2011]_. The sensor noises are considered as +affecting each sensor :cite:p:`sabatini2011`. The sensor noises are considered as uncorrelated and isotropic, which creates a diagonal matrix: .. math:: @@ -757,7 +759,7 @@ \\mathbf{q}_t \\leftarrow \\frac{1}{\\|\\mathbf{q}_t\\|}\\mathbf{q}_t Even though it is neither elegant nor optimal, this "brute-force" approach to -compute the final quaternion is proven to work generally well [Sabatini2011]_. +compute the final quaternion is proven to work generally well :cite:p:`sabatini2011`. Initial values -------------- @@ -784,7 +786,7 @@ where :math:`\\mathbf{a}_0` and :math:`\\mathbf{m}_0` are the accelerometer and magnetometer measurements. Each column of this rotation matrix should be -normalized. Then, we get the initial quaternion with [Chiaverini]_: +normalized. Then, we get the initial quaternion with :cite:p:`Chiaverini1999`: .. math:: \\mathbf{q}_0 = @@ -861,24 +863,6 @@ above sea level to estimate this magnitude. For the purpose of analysis a common value of *9.81* is given. -References ----------- -.. [Kalman1960] Rudolf Kalman. A New Approach to Linear Filtering and Prediction - Problems. 1960. -.. [Hartikainen2011] J. Hartikainen, A. Solin and S. Särkkä. Optimal Filtering with - Kalman Filters and Smoothers. 2011 -.. [Sabatini2011] Sabatini, A.M. Kalman-Filter-Based Orientation Determination - Using Inertial/Magnetic Sensors: Observability Analysis and Performance - Evaluation. Sensors 2011, 11, 9182-9206. - (https://www.mdpi.com/1424-8220/11/10/9182) -.. [Labbe2015] Roger R. Labbe Jr. Kalman and Bayesian Filters in Python. - (https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python) -.. [Lam2003] Lam, Quang & Stamatakos, Nick & Woodruff, Craig & Ashton, Sandy. - Gyro Modeling and Estimation of Its Random Noise Sources. AAIA 2003. - DOI: 10.2514/6.2003-5562. - (https://www.researchgate.net/publication/268554081) - - """ import numpy as np diff --git a/ahrs/filters/famc.py b/ahrs/filters/famc.py index 0f15dd9..fc399ec 100644 --- a/ahrs/filters/famc.py +++ b/ahrs/filters/famc.py @@ -15,7 +15,8 @@ The matrix operations in these solutions are the main focus of attention in this method. The operations are analytically simplified, where the accuracy is maintained, while the time consumption is reduced, yielding the **Fast -Accelerometer-Magnetometer Combination (FAMC)**, whose main contributions are: +Accelerometer-Magnetometer Combination (FAMC)** :cite:p:`liu2018`, whose main +contributions are: - Analytic eigenvalue results are given for the dynamic magnetometer reference vector. @@ -112,7 +113,8 @@ corresponding to an eigenvalue equal to 1, disorienting the system and rendering this estimator useless on polar regions. -Finally, we must compute the eigenvector of the eigenvalule 1. We start defining: +Finally, we must compute the eigenvector of the eigenvalule 1. We start +defining: .. math:: \\mathbf{S} = \\mathbf{K} - \\mathbf{I} @@ -151,13 +153,6 @@ .. math:: \\mathbf{q} = \\frac{1}{\\sqrt{a^2+b^2+c^2+1}}\\begin{pmatrix}-1 & a & b & c\\end{pmatrix} -References ----------- -.. [Liu] Zhuohua Liu, Wei Liu, Xiangyang Gong, and Jin Wu, "Simplified Attitude - Determination Algorithm Using Accelerometer and Magnetometer with Extremely - Low Execution Time," Journal of Sensors, vol. 2018, Article ID 8787236, 11 - pages, 2018. https://doi.org/10.1155/2018/8787236. - """ import numpy as np diff --git a/ahrs/filters/fkf.py b/ahrs/filters/fkf.py index ff946d3..6fa9c44 100644 --- a/ahrs/filters/fkf.py +++ b/ahrs/filters/fkf.py @@ -3,12 +3,8 @@ Fast Kalman Filter ================== -References ----------- -.. [Guo] Siwen Guo, Jin Wu, Zuocai Wang, and Jide Qian, "Novel MARG-Sensor - Orientation Estimation Algorithm Using Fast Kalman Filter." Journal of - Sensors, vol. 2017, Article ID 8542153, 12 pages. - https://doi.org/10.1155/2017/8542153 and https://github.com/zarathustr/FKF +Quaternion-based Fast Kalman Filter algorithm for orientation estimation +:cite:p:`guo2017`. """ diff --git a/ahrs/filters/flae.py b/ahrs/filters/flae.py index 5c4870a..2a731b8 100644 --- a/ahrs/filters/flae.py +++ b/ahrs/filters/flae.py @@ -4,7 +4,7 @@ ============================== The Fast Linear Attitude Estimator (FLAE) obtains the attitude quaternion with -an eigenvalue-based solution as proposed by [Wu]_. +an eigenvalue-based solution as proposed by :cite:p:`wu2018`. A symbolic solution to the corresponding characteristic polynomial is also derived for a higher computation speed. @@ -322,14 +322,6 @@ the Newton iteration can be also used to achieve a similar performance to that of QUEST. -References ----------- -.. [Wu] Jin Wu, Zebo Zhou, Bin Gao, Rui Li, Yuhua Cheng, et al. Fast Linear - Quaternion Attitude Estimator Using Vector Observations. IEEE Transactions - on Automation Science and Engineering, Institute of Electrical and - Electronics Engineers, 2018. - (https://hal.inria.fr/hal-01513263) - """ import numpy as np diff --git a/ahrs/filters/fourati.py b/ahrs/filters/fourati.py index d4a2af6..233dce8 100644 --- a/ahrs/filters/fourati.py +++ b/ahrs/filters/fourati.py @@ -3,9 +3,10 @@ Fourati's nonlinear attitude estimation ======================================= -Attitude estimation algorithm as proposed by [Fourati]_, whose approach -combines a quaternion-based nonlinear filter with the Levenberg Marquardt -Algorithm (LMA.) +Attitude estimation algorithm as proposed in :cite:p:`fourati2011`, whose +approach combines a quaternion-based nonlinear filter with the +`Levenberg-Marquardt Algorithm (LMA.) +`_. The estimation algorithm has a complementary structure that exploits measurements from an accelerometer, a magnetometer and a gyroscope, combined in @@ -92,7 +93,8 @@ so that they operate with a *Hamilton product*. To achieve an optimal attitude estimation, a nonlinear system is developed, -whose **output** is the stack of the accelerometer and magnetometer measurements: +whose **output** is the stack of the accelerometer and magnetometer +measurements: .. math:: \\mathbf{y} = \\begin{bmatrix}f_x & f_y & f_z & h_x & h_y & h_z\\end{bmatrix}^T @@ -210,15 +212,6 @@ :math:`\\Delta_t`, which is actually the inverse of the sampling frequency :math:`f=\\frac{1}{\\Delta_t}`. -References ----------- -.. [Fourati] Hassen Fourati, Noureddine Manamanni, Lissan Afilal, Yves - Handrich. A Nonlinear Filtering Approach for the Attitude and Dynamic Body - Acceleration Estimation Based on Inertial and Magnetic Sensors: Bio-Logging - Application. IEEE Sensors Journal, Institute of Electrical and Electronics - Engineers, 2011, 11 (1), pp. 233-244. 10.1109/JSEN.2010.2053353. - (https://hal.archives-ouvertes.fr/hal-00624142/file/Papier_IEEE_Sensors_Journal.pdf) - """ from typing import Union diff --git a/ahrs/filters/fqa.py b/ahrs/filters/fqa.py index 33f8a2e..14c39ae 100644 --- a/ahrs/filters/fqa.py +++ b/ahrs/filters/fqa.py @@ -5,7 +5,7 @@ The factored quaternion algorithm (FQA) produces a quaternion output to represent the orientation, restricting the use of magnetic data to the -determination of the rotation about the vertical axis. +determination of the rotation about the vertical axis :cite:p:`yun2008`. The FQA and the `TRIAD <../triad.html>`_ algorithm produce an equivalent solution to the same problem, with the difference that the former produces a @@ -223,12 +223,6 @@ .. [#] The local geomagnetic field can be obtained with the World Magnetic Model. See the `WMM documentation <../WMM.html>`_ page for further details. -References ----------- -.. [Yun] Xiaoping Yun et al. (2008) A Simplified Quaternion-Based Algorithm for - Orientation Estimation From Earth Gravity and Magnetic Field Measurements. - https://ieeexplore.ieee.org/document/4419916 - """ import numpy as np diff --git a/ahrs/filters/madgwick.py b/ahrs/filters/madgwick.py index c55b943..f6bb623 100644 --- a/ahrs/filters/madgwick.py +++ b/ahrs/filters/madgwick.py @@ -9,7 +9,7 @@ This is an orientation filter applicable to IMUs consisting of tri-axial gyroscopes and accelerometers, and MARG arrays, which also include tri-axial -magnetometers, proposed by Sebastian Madgwick [Madgwick]_. +magnetometers, proposed by Sebastian Madgwick :cite:p:`madgwick2010`. The filter employs a quaternion representation of orientation to describe the nature of orientations in three-dimensions and is not subject to the @@ -368,12 +368,6 @@ phenomenon known as `Geomagnetic secular variation `_, but such shift can be omited for practical purposes. -References ----------- -.. [Madgwick] Sebastian Madgwick. An efficient orientation filter for inertial - and inertial/magnetic sensor arrays. April 30, 2010. - http://www.x-io.co.uk/open-source-imu-and-ahrs-algorithms/ - """ import numpy as np diff --git a/ahrs/filters/mahony.py b/ahrs/filters/mahony.py index a03db38..970e154 100644 --- a/ahrs/filters/mahony.py +++ b/ahrs/filters/mahony.py @@ -3,19 +3,21 @@ Mahony Orientation Filter ========================= -This estimator proposed by Robert Mahony et al. [Mahony2008]_ is formulated as -a deterministic kinematic observer on the Special Orthogonal group SO(3) driven -by an instantaneous attitude and angular velocity measurements. +This estimator proposed by Robert Mahony et al. :cite:p:`mahony2008` is formulated +as a deterministic kinematic observer on the Special Orthogonal group SO(3) +driven by an instantaneous attitude and angular velocity measurements +:cite:p:`hamel2006`. By exploiting the geometry of the special orthogonal group a related observer, the *passive complementary filter*, is derived that decouples the gyro -measurements from the reconstructed attitude in the observer inputs. +measurements from the reconstructed attitude in the observer inputs +:cite:p:`mahony2005`. Direct and passive filters are extended to estimate gyro bias on-line. This -leads to an observer on SO(3), termed the **Explicit Complementary Filter**, -that requires only accelerometer and gyro outputs, suitable for hardware -implementation, and providing good estimates as well as online gyro bias -computation. +leads to an observer on SO(3), termed the **Explicit Complementary Filter** +:cite:p:`euston2008`, that requires only accelerometer and gyro outputs, +suitable for hardware implementation, and providing good estimates as well as +online gyro bias computation. Sensor Models ------------- @@ -242,28 +244,6 @@ .. math:: \\mathbf{q}_t = \\mathbf{q}_{t-1} + \\dot{\\hat{\\mathbf{q}}}_t\\Delta t -References ----------- -.. [Mahony2008] Robert Mahony, Tarek Hamel, and Jean-Michel Pflimlin. Nonlinear - Complementary Filters on the Special Orthogonal Group. IEEE Transactions - on Automatic Control, Institute of Electrical and Electronics Engineers, - 2008, 53 (5), pp.1203-1217. - (https://hal.archives-ouvertes.fr/hal-00488376/document) -.. [Mahony2005] Robert Mahony, Tarek Hamel, and Jean-Michel Pflimlin. - Complementary filter design on the special orthogonal group SO(3). - Proceedings of the 44th IEEE Conference on Decision and Control, and the - European Control Conference 2005. Seville, Spain. December 12-15, 2005. - (https://folk.ntnu.no/skoge/prost/proceedings/cdc-ecc05/pdffiles/papers/1889.pdf) -.. [Euston] Mark Euston, Paul W. Coote, Robert E. Mahony, Jonghyuk Kim, and - Tarek Hamel. A complementary filter for attitude estimation of a fixed-wing - UAV. IEEE/RSJ International Conference on Intelligent Robots and Systems, - 340-345. 2008. - (http://users.cecs.anu.edu.au/~Jonghyuk.Kim/pdf/2008_Euston_iros_v1.04.pdf) -.. [Hamel] Tarek Hamel and Robert Mahony. Attitude estimation on SO(3) based on - direct inertial measurements. IEEE International Conference on Robotics and - Automation. ICRA 2006. pp. 2170-2175 - (http://users.cecs.anu.edu.au/~Robert.Mahony/Mahony_Robert/2006_MahHamPfl-C68.pdf) - """ import numpy as np diff --git a/ahrs/filters/oleq.py b/ahrs/filters/oleq.py index 2d24379..d5487bb 100644 --- a/ahrs/filters/oleq.py +++ b/ahrs/filters/oleq.py @@ -23,7 +23,8 @@ L(\\mathbf{C}) = \\sum_{i=1}^n a_i \\|\\mathbf{D}_i^b - \\mathbf{CD}_i^r \\|^2 being :math:`a_i` the weight of the *i*-th sensor output. The goal of **OLEQ** -is to find this optimal attitude, but in the form of a quaternion [Zhou2018]_. +is to find this optimal attitude, but in the form of a quaternion +:cite:p:`zhou2018`. First, notice that the attitude matrix is related to quaternion :math:`\\mathbf{q}=\\begin{bmatrix}q_w & q_x & q_y & q_z\\end{bmatrix}^T` via: @@ -138,14 +139,6 @@ This equals the least-square of the set of pre-computed single rotated quaternions. -References ----------- -.. [Zhou2018] Zhou, Z.; Wu, J.; Wang, J.; Fourati, H. Optimal, Recursive and - Sub-Optimal Linear Solutions to Attitude Determination from Vector - Observations for GNSS/Accelerometer/Magnetometer Orientation Measurement. - Remote Sens. 2018, 10, 377. - (https://www.mdpi.com/2072-4292/10/3/377) - """ import numpy as np diff --git a/ahrs/filters/quest.py b/ahrs/filters/quest.py index 7e15eb5..e6ef82c 100644 --- a/ahrs/filters/quest.py +++ b/ahrs/filters/quest.py @@ -3,7 +3,8 @@ QUEST ===== -QUaternion ESTimator as described by Shuster in [Shuster1981]_ and [Shuster1978]_. +QUaternion ESTimator as described by Shuster in :cite:p:`shuster1981` and +:cite:p:`shuster1978`. We start to define the goal of finding an orthogonal matrix :math:`\\mathbf{A}` that minimizes the loss function: @@ -188,15 +189,6 @@ only if the angle of rotation is equal to :math:`\\pi`, even if :math:`\\mathbf{X}` does not vanish along. -References ----------- -.. [Shuster1981] Shuster, M.D. and Oh, S.D. "Three-Axis Attitude Determination - from Vector Observations," Journal of Guidance and Control, Vol.4, No.1, - Jan.-Feb. 1981, pp. 70-77. -.. [Shuster1978] Shuster, Malcom D. Approximate Algorithms for Fast Optimal - Attitude Computation, AIAA Guidance and Control Conference. August 1978. - (http://www.malcolmdshuster.com/Pub_1978b_C_PaloAlto_scan.pdf) - """ from typing import Union diff --git a/ahrs/filters/roleq.py b/ahrs/filters/roleq.py index c662d0c..8eae052 100644 --- a/ahrs/filters/roleq.py +++ b/ahrs/filters/roleq.py @@ -4,7 +4,7 @@ ================================================ This is a modified `OLEQ <./oleq.html>`_, where a recursive estimation of the -attitude is made with the measured angular velocity [Zhou2018]_. This +attitude is made with the measured angular velocity :cite:p:`zhou2018`. This estimation is set as the initial value for the OLEQ estimation, simplyfing the rotational operations. @@ -70,14 +70,6 @@ magnetometers) have to be provided, along with the an initial quaternion, :math:`\\mathbf{q}_0` from which the attitude will be built upon. -References ----------- -.. [Zhou2018] Zhou, Z.; Wu, J.; Wang, J.; Fourati, H. Optimal, Recursive and - Sub-Optimal Linear Solutions to Attitude Determination from Vector - Observations for GNSS/Accelerometer/Magnetometer Orientation Measurement. - Remote Sens. 2018, 10, 377. - (https://www.mdpi.com/2072-4292/10/3/377) - """ import numpy as np diff --git a/ahrs/filters/saam.py b/ahrs/filters/saam.py index cf8c04e..e680aed 100644 --- a/ahrs/filters/saam.py +++ b/ahrs/filters/saam.py @@ -3,8 +3,8 @@ Super-fast Attitude from Accelerometer and Magnetometer ======================================================= -This novel estimator proposed by [Wu]_, offers an extremely simplified -computation of `Davenport's <../davenport.html>`_ solution to +This novel estimator proposed by :cite:p:`wu2018-2`, offers an extremely +simplified computation of `Davenport's <../davenport.html>`_ solution to `Wahba's problem `_, where the full solution is reduced to a couple of floating point operations, without losing much accuracy, and sparing computational time. @@ -104,15 +104,6 @@ making it very suitable for low-cost and simple processors. Its accuracy is comparable to that of QUEST and FQA, but it is one order of magnitude faster. -References ----------- -.. [Wu] Jin Wu, Zebo Zhou, Hassen Fourati, Yuhua Cheng. A Super Fast Attitude - Determination Algorithm for Consumer-Level Accelerometer and Magnetometer. - IEEE Transactions on Con-sumer Electronics, Institute of Electrical and - Electronics Engineers, 2018, 64 (3), pp. 375. 381.10.1109/tce.2018.2859625. - hal-01922922 - (https://hal.inria.fr/hal-01922922/document) - """ import numpy as np diff --git a/ahrs/filters/tilt.py b/ahrs/filters/tilt.py index 6e5eebb..b0e903d 100644 --- a/ahrs/filters/tilt.py +++ b/ahrs/filters/tilt.py @@ -8,13 +8,13 @@ The simplest way to estimate the attitude from the gravitational acceleration is using 3D `geometric quadrants `_. -Although some methods use ``arctan`` to estimate the angles [ST-AN4509]_ [AD-AN1057]_, -it is preferred to use ``arctan2`` to explore all quadrants searching the tilt -angles. +Although some methods use ``arctan`` to estimate the angles :cite:p:`stm4509` +:cite:p:`fisher2010` it is preferred to use ``arctan2`` to explore all +quadrants searching the tilt angles. First, we normalize the gravity vector, so that it has magnitude equal to 1. -Then, we get the angles to the main axes with `arctan2 `_ -[FS-AN3461]_ [Trimpe]_: +Then, we get the angles to the main axes with `arctan2 +`_ :cite:p:`pedley2013` :cite:p:`trimpe2012`: .. math:: \\begin{array}{ll} @@ -68,7 +68,7 @@ :math:`\\|\\mathbf{m}\\|=1`. The yaw angle :math:`\\psi` is the tilt-compensated heading angle relative to -magnetic North, computed as [FS-AN4248]_: +magnetic North, computed as :cite:p:`ozyagcilar2015`: .. math:: \\begin{array}{ll} @@ -91,28 +91,6 @@ Setting the property ``as_angles`` to ``True`` will avoid this last conversion returning the attitude as angles. -References ----------- -.. [Trimpe] Sebastian Trimpe and Raffaello D'Andrea. The Balancing cube. A - dynamic sculpture as test bed for distributed estimation and control. IEEE - Control Systems Magazine. December 2012. - (http://trimpe.is.tuebingen.mpg.de/publications/trimpe-CSM12.pdf) -.. [FS-AN3461] Mark Pedley. Tilt Sensing Using a Three-Axis Accelerometer. - Freescale Semiconductor Application Note. Document Number: AN3461. 2013. - (https://www.nxp.com/files-static/sensors/doc/app_note/AN3461.pdf) -.. [FS-AN4248] Talat Ozyagcilar. Implementing a Tilt-Compensated eCompass using - Accelerometer and Magnetometer sensors. Freescale Semoconductor Application - Note. Document Number: AN4248. 2015. - (https://www.nxp.com/files-static/sensors/doc/app_note/AN4248.pdf) -.. [AD-AN1057] Christopher J. Fisher. Using an Accelerometer for Inclination - Sensing. Analog Devices. Application Note. AN-1057. - (https://www.analog.com/media/en/technical-documentation/application-notes/AN-1057.pdf) -.. [ST-AN4509] Tilt measurement using a low-g 3-axis accelerometer. - STMicroelectronics. Application note AN4509. 2014. - (https://www.st.com/resource/en/application_note/dm00119046.pdf) -.. [WikiConversions] Wikipedia: Conversion between quaternions and Euler angles. - (https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles) - """ import numpy as np @@ -298,7 +276,7 @@ def estimate(self, acc: np.ndarray, mag: np.ndarray = None, representation: str The orientation of the roll and pitch angles is estimated using the measurements of the accelerometers, and finally converted to a - quaternion representation according to [WikiConversions]_ + quaternion representation according to :cite:p:`Wiki_Conversions`. Parameters ---------- diff --git a/ahrs/filters/triad.py b/ahrs/filters/triad.py index 5cc1541..078ce22 100644 --- a/ahrs/filters/triad.py +++ b/ahrs/filters/triad.py @@ -3,10 +3,10 @@ TRIAD ===== -The Tri-Axial Attitude Determination (`TRIAD `_) -was first described in [Black]_ to algebraically estimate an attitude -represented as a Direction Cosine Matrix from two orthogonal vector -observations. +The Tri-Axial Attitude Determination (`TRIAD +`_) was first described by Harold +Black in :cite:p:`black1964` to algebraically estimate an attitude represented +as a Direction Cosine Matrix from two orthogonal vector observations. Given two non-parallel reference *unit vectors* :math:`\\mathbf{v}_1` and :math:`\\mathbf{v}_2` and their corresponding *unit vectors* :math:`\\mathbf{w}_1` @@ -29,10 +29,10 @@ \\end{array} The TRIAD method, initially developed to estimate the attitude of spacecrafts -[Shuster2007]_, uses the position of the sun (using a `star tracker +:cite:p:`shuster2007`, uses the position of the sun (using a `star tracker `_) and the magnetic field of Earth -as references [Hall]_ [Makley]_. These are represented as vectors to build an -appropriate *reference* frame :math:`\\mathbf{M}_r`: +as references :cite:p:`hall2000` :cite:p:`markley2014`. These are represented +as vectors to build an appropriate *reference* frame :math:`\\mathbf{M}_r`: .. math:: \\mathbf{M}_r = \\begin{bmatrix} \\mathbf{q}_r & \\mathbf{r}_r & \\mathbf{s}_r \\end{bmatrix} @@ -75,7 +75,7 @@ It is only required that :math:`\\mathbf{M}_r` has an inverse, but that is already ensured, since :math:`\\mathbf{q}_r`, :math:`\\mathbf{r}_r`, -and :math:`\\mathbf{s}_r` are linearly independent [Lerner1]_. +and :math:`\\mathbf{s}_r` are linearly independent :cite:p:`lerner1978`. Strapdown INS ------------- @@ -224,21 +224,6 @@ .. [#] This package's author resides in Munich, and examples of geographical locations will take it as a reference. -References ----------- -.. [Black] Black, Harold. "A Passive System for Determining the Attitude of a - Satellite," AIAA Journal, Vol. 2, July 1964, pp. 1350–1351. -.. [Lerner1] Lerner, G. M. "Three-Axis Attitude Determination" in Spacecraft - Attitude Determination and Control, edited by J.R. Wertz. 1978. p. 420-426. -.. [Hall] Chris Hall. Spacecraft Attitude Dynamics and Control. Chapter 4: - Attitude Determination. 2003. - (http://www.dept.aoe.vt.edu/~cdhall/courses/aoe4140/attde.pdf) -.. [Makley] F.L. Makley et al. Fundamentals of Spacecraft Attitude - Determination and Control. 2014. Pages 184-186. -.. [Shuster2007] Shuster, Malcolm D. The optimization of TRIAD. The Journal of - the Astronautical Sciences, Vol. 55, No 2, April – June 2007, pp. 245–257. - (http://www.malcolmdshuster.com/Pub_2007f_J_OptTRIAD_AAS.pdf) - """ import numpy as np @@ -414,7 +399,7 @@ def estimate(self, w1: np.ndarray, w2: np.ndarray, representation: str = 'rotmat """ Attitude Estimation. - The equation numbers in the code refer to [Lerner1]_. + The equation numbers in the code refer to :cite:p:`lerner1978`. Parameters ---------- diff --git a/ahrs/utils/wgs84.py b/ahrs/utils/wgs84.py index 4fd141c..861538f 100644 --- a/ahrs/utils/wgs84.py +++ b/ahrs/utils/wgs84.py @@ -1,9 +1,9 @@ """ -The World Geodetic System 1984 (WGS 84) [WGS84]_ describes the best geodetic -reference system for the Earth available for the practical applications of -mapping, charting, geopositioning, and navigation, using data, techniques and -technology available through 2013 by the United States of America's National -Geospatial-Intelligence Agency (NGA.) +The World Geodetic System 1984 (WGS 84) :cite:p:`wgs84-2014` describes the best +geodetic reference system for the Earth available for the practical +applications of mapping, charting, geopositioning, and navigation, using data, +techniques and technology available through 2013 by the United States of +America's National Geospatial-Intelligence Agency (NGA.) The WGS 84 Coordinate System is a Conventional Terrestrial Reference System (`CTRS `_), diff --git a/ahrs/utils/wmm.py b/ahrs/utils/wmm.py index f3aa3aa..685dd9b 100644 --- a/ahrs/utils/wmm.py +++ b/ahrs/utils/wmm.py @@ -1,12 +1,12 @@ """ -The main utility of the World Magnetic Model (WMM) [WMM]_ is to provide -magnetic declination for any desired location on the globe. +The main utility of the World Magnetic Model (WMM) :cite:p:`chulliat2020` is to +provide magnetic declination for any desired location on the globe. In addition to the magnetic declination, the WMM also provides the complete geometry of the field from 1 km below the World Geodetic System (WGS 84) -[WGS84]_ ellipsoid surface to approximately 850 km above it. The magnetic field -extends deep into the Earth and far out into space, but the WMM is not valid at -these extremes. +:cite:p:`wgs84-2014` ellipsoid surface to approximately 850 km above it. The +magnetic field extends deep into the Earth and far out into space, but the WMM +is not valid at these extremes. Earth's magnetic field is viewed as a magnetic dipole produced by a sphere of uniform magnetization. The "south" of the dipole lies on the northern @@ -45,12 +45,12 @@ *Gaussian coefficients* of degree :math:`n` and order :math:`m`; :math:`r`, :math:`\\theta`, and :math:`\\phi` are the geocentric radius, coelevation and longitude in spherical polar coordinates; and :math:`P_n^m(\\theta)` are the -associated Legendre functions [Heiskanen]_. +associated Legendre functions :cite:p`hofmann2006`. The time-dependent Gauss coefficients are estimated empirically from a -least-squares fit using satellite magnetic measurements [Langel]_. These -coefficients are provided by the NCEI Geomagnetic Modeling Team and British -Geological Survey in a file with extension COF [WMM2020]_. +least-squares fit using satellite magnetic measurements :cite:p:`langel1998`. +These coefficients are provided by the NCEI Geomagnetic Modeling Team and +British Geological Survey in a file with extension COF :cite:p:`chulliat2020`. With degree :math:`n=1` only dipoles are considered. For :math:`n=2` the quadrupoles, :math:`n=3` the octuploles, and so on. The method of this WMM @@ -168,9 +168,9 @@ released the latest model on December 10th, 2019. This script is based on the originally conceived one by Christopher Weiss -(cmweiss@gmail.com) [Weiss]_, who adapted it from the geomagc software and -World Magnetic Model of the NOAA Satellite and Information Service, National -Geophysical Data Center [Chulliat]_. +(cmweiss@gmail.com) :cite:p:`weiss2016`, who adapted it from the geomagc +software and World Magnetic Model of the NOAA Satellite and Information +Service, National Geophysical Data Center :cite:p:`chulliat2020`. License ------- @@ -182,30 +182,6 @@ incorporated and stating that such material is not subject to copyright protection. -References ----------- -.. [Chulliat] Chulliat, A., W. Brown, P. Alken, C. Beggan, M. Nair, G. Cox, A. - Woods, S. Macmillan, B. Meyer and M. Paniccia, The US/UK World Magnetic - Model for 2020-2025: Technical Report, National Centers for Environmental - Information, NOAA, doi:10.25923/ytk1-yx35, 2020. - (https://www.ngdc.noaa.gov/geomag/WMM/data/WMM2020/WMM2020_Report.pdf) -.. [Heiskanen] W. A. Heiskanen and H. Moritz. Physical Geodesy. TU Graz. 1993. -.. [Langel] R. A. Langel and W. J. Hinze. The Magnetic Field of Earth's - Lithosphere: The Satellite Perspective. Cambridge University Press. 1998. -.. [Weiss] Christopher Weiss' GeoMag repository (https://github.com/cmweiss/geomag) -.. [Wertz] James R. Wertz. Spacecraft Attitude Determination and Control. - Kluwer Academics. 1978. -.. [WGS84] World Geodetic System 1984. Its Definition and Relationships with - Local Geodetic Systems. National Geospatial-Intelligence Agency (NGA) - Standarization Document. 2014. - ftp://ftp.nga.mil/pub2/gandg/website/wgs84/NGA.STND.0036_1.0.0_WGS84.pdf -.. [WMM] The World Magnetic Model (https://www.ncei.noaa.gov/products/world-magnetic-model) -.. [WMM-TR] Chulliat, A. et al. (2020). The US/UK World Magnetic Model for - 2020-2025 : Technical Report. https://doi.org/10.25923/ytk1-yx35 -.. [WMM2020] WMM2020 Model values: NCEI Geomagnetic Modeling Team and British - Geological Survey. 2019. World Magnetic Model 2020. NOAA National Centers - for Environmental Information. doi: 10.25921/11v3-da71, 2020. - """ # PSL @@ -562,8 +538,8 @@ def reset_date(self, date: Union[datetime.date, int, float]) -> None: def denormalize_coefficients(self, latitude: float) -> None: """ Recursively estimate associated Legendre polynomials and derivatives - done in a recursive way as described by Michael Plett in [Wertz]_ for - an efficient computation. + done in a recursive way as described by Michael Plett in + :cite:p:`plett1978` for an efficient computation. Given the Gaussian coefficients, it is possible to estimate the magnetic field at any latitude on Earth for a certain date. diff --git a/docs/source/refs.bib b/docs/source/refs.bib index e50c6b3..72267fd 100644 --- a/docs/source/refs.bib +++ b/docs/source/refs.bib @@ -1,10 +1,743 @@ @article{BarItzhack2000, - title={New method for Extracting the Quaternion from a Rotation Matrix}, - author={Itzhack Yoav Bar-Itzhack}, - journal={Journal of Guidance, Control, and Dynamics}, - volume={23}, - number={6}, - pages={1085--1087}, - year={2000}, - publisher={American Institute of Aeronautics and Astronautics} + author = {Itzhack Yoav Bar-Itzhack}, + title = {New method for Extracting the Quaternion from a Rotation Matrix}, + journal = {Journal of Guidance, Control, and Dynamics}, + volume = {23}, + number = {6}, + pages = {1085--1087}, + year = {2000}, + publisher = {American Institute of Aeronautics and Astronautics}, + doi = {10.2514/2.4654} +} + +@article{black1964, + author = {Black, Harold D.}, + title = {A passive system for determining the attitude of a satellite}, + journal = {AIAA Journal}, + volume = {2}, + number = {7}, + pages = {1350-1351}, + year = {1964}, + doi = {10.2514/3.2555} +} + +@article{Chiaverini1999, + author = {Chiaverini, Stefano and Siciliano, Bruno}, + year = {1999}, + month = {05}, + pages = {45-60}, + title = {The Unit Quaternion: A Useful Tool for Inverse Kinematics of Robot Manipulators}, + volume = {35}, + journal = {Systems Analysis Modelling Simulation} +} + +@techreport{chulliat2020, + author = {Chulliat, A. and Brown, W. and Alken, P. and Beggan, C. and Nair, M. and Cox, G. and Woods, A. and Macmillan, S. and Meyer, B. and M. Paniccia}, + title = {The US/UK World Magnetic Model for 2020-2025 : Technical Report}, + institution = {National Centers for Environmental Information, NOAA}, + year = {2020}, + doi = {10.25923/ytk1-yx35}, + url = {https://repository.library.noaa.gov/view/noaa/24390/noaa_24390_DS1.pdf}, + address = {United States; Great Britain}, + annote = {Public Domain}, + type = {PDF-29.84 MB}, +} + +@book{curtis2014, + author = {Curtis, Howard D.}, + title = {Orbital Mechanics for Engineering Students}, + year = {2014}, + edition = {3}, + publisher = {Elsevier Ltd}, + isbn = {978-0-08-097747-8}, + doi = {10.1016/C2011-0-69685-1} +} + +@techreport{dantam2014, + author = {Dantam, Neil}, + title = {Quaternion Computation}, + institution = {Institute for Robotics and Intelligent Machines. Georgia Institute of Technology}, + year = {2002}, + url = {http://www.neil.dantam.name/note/dantam-quaternion.pdf} +} + +@techreport{davenport1968, + title = {A Vector Approach to the Algebra of Rotations with Applications}, + author = {Davenport, Paul B.}, + series = {NASA technical note}, + institution = {Goddard Space Flight Center}, + url = {https://ntrs.nasa.gov/citations/19680021122}, + year = {1968}, + month = {08}, + publisher = {National Aeronautics and Space Administration} +} + +@techreport{diebel2006, + author = {Diebel, James}, + year = {2006}, + month = {10}, + title = {Representing Attitude: Euler Angles, Unit Quaternions, and Rotation Vectors}, + institute = {Stanford University}, + url = {https://www.astro.rug.nl/software/kapteyn-beta/_downloads/attitude.pdf} +} + +@techreport{eberly2002, + title = {Quaternion Algebra and Calculus}, + author = {Eberly, David H.}, + institution = {Magic Software, Inc.}, + year = {2002}, + url = {https://www.sci.utah.edu/~jmk/papers/Quaternions.pdf} +} + +@InProceedings{euston2008, + author = {Euston, Mark and Coote, Paul and Mahony, Robert and Kim, Jonghyuk and Hamel, Tarek}, + booktitle = {2008 IEEE/RSJ International Conference on Intelligent Robots and Systems}, + title = {A complementary filter for attitude estimation of a fixed-wing UAV}, + year = {2008}, + pages = {340-345}, + keywords = {Low pass filters;Acceleration;Atmospheric modeling;Unmanned aerial vehicles;Vehicles;Global positioning system;Airplanes}, + doi = {10.1109/IROS.2008.4650766} +} + +@techreport{fisher2010, + author = {Fisher, Christopher J.}, + title = {Using an Accelerometer for Inclination Sensing}, + institution = {Analog Devices, Inc}, + year = {2010}, + month = {}, + number = {AN-1057}, + note = {}, + url = {https://www.analog.com/en/resources/app-notes/an-1057.html}, + address = {}, + annote = {}, + type = {}, +} + +@article{fourati2011, + author = {Fourati, Hassen and Manamanni, Noureddine and Afilal, Lissan and Handrich, Yves}, + title = {A Nonlinear Filtering Approach for the Attitude and Dynamic Body Acceleration Estimation Based on Inertial and Magnetic Sensors: Bio-Logging Application}, + year = {2011}, + volume = {09}, + number = {15}, + pages = {233-244}, + keywords = {Estimation;Nonlinear filters;Magnetometers;Gyroscopes;Accelerometers;Magnetic separation;Quaternions;Attitude;bio-logging;complementary nonlinear filter;dynamic body acceleration (DBA);inertial measurement unit (MTi-G);MEMS inertial/magnetic sensors}, + journal = {IEEE Sensors Journal}, + doi = {10.1109/JSEN.2010.2053353}, + url = {https://hal.science/hal-00624142} +} + +@misc{garcia2022, + author = {Garcia, Mario}, + title = {Angular Velocity from Quaternions}, + howpublished = {\url{https://mariogc.com/post/angular-velocity-quaternions/}}, + year = {2022}, + note = {Accessed: 2024-09-27} +} + +@techreport{grosskatthoefer2012, + title = {Introduction into quaternions for spacecraft attitude representation}, + author = {Großekatthöfer, Karsten}, + institution = {Department of Astronautics and Aeronautics. Technical University of Berlin}, + year = {2012}, + month = {05}, + day = {31}, + url = {https://argos.vu/wp-content/uploads/2017/01/Quaternions-1.pdf} +} + +@article{guo2017, + author = {Guo, Siwen and Wu, Jin and Wang, Zuocai and Qian, Jide}, + title = {Novel MARG-Sensor Orientation Estimation Algorithm Using Fast Kalman Filter}, + journal = {Journal of Sensors}, + volume = {2017}, + number = {1}, + doi = {10.1155/2017/8542153}, + url = {https://onlinelibrary.wiley.com/doi/abs/10.1155/2017/8542153}, + abstract = {Orientation estimation from magnetic, angular rate, and gravity (MARG) sensor array is a key problem in mechatronic-related applications. This paper proposes a new method in which a quaternion-based Kalman filter scheme is designed. The quaternion kinematic equation is employed as the process model. With our previous contributions, we establish the measurement model of attitude quaternion from accelerometer and magnetometer, which is later proved to be the fastest (computationally) one among representative attitude determination algorithms of such sensor combination. Variance analysis is later given enabling the optimal updating of the proposed filter. The algorithm is implemented on real-world hardware where experiments are carried out to reveal the advantages of the proposed method with respect to conventional ones. The proposed approach is also validated on an unmanned aerial vehicle during a real flight. Results show that the proposed one is faster than any other Kalman-based ones and even faster than some complementary ones while the attitude estimation accuracy is maintained.}, + year = {2017} +} + +@book{hall2000, + author = {Hall, Christopher D.}, + title = {Spacecraft Attitude Dynamics and Control}, + editor = {}, + publisher = {}, + year = {2000}, + month = {01}, + day = {16}, + isbn = {978-0-7506-7038-4}, +} + +@InProceedings{hamel2006, + author = {Hamel, Tarek and Mahony, Robert}, + booktitle = {Proceedings 2006 IEEE International Conference on Robotics and Automation, 2006. ICRA 2006.}, + title = {Attitude estimation on SO(3) based on direct inertial measurements}, + year = {2006}, + pages = {2170-2175}, + keywords = {Filters;Unmanned aerial vehicles;Costs;Magnetic field measurement;Velocity measurement;Attitude control;Magnetic separation;Angular velocity;Filtering;Measurement units}, + doi = {10.1109/ROBOT.2006.1642025} +} + +@techreport{hartikainen2011, + author = {Hartikainen, Jouni and Solin, Arno and Särkkä, Simo}, + title = {Optimal filtering with Kalman filters and smoothers}, + subtitle = {A manual for the Matlab toolbox EKF/UKF}, + institution = {Department of Biomedical Engineering and Computational Science. Aalto University School of Science}, + year = {2011}, + month = {09}, +} + +@book{hofmann2006, + author = {Hofmann-Wellenhof, Bernhard and Moritz, Helmut}, + title = {Physical Geodesy}, + edition = {2}, + publisher = {Springer Vienna}, + isbn = {978-3-211-33544-4}, + year = {2006}, + month = {10}, + day = {10}, + doi = {10.1007/978-3-211-33545-1} +} + +@inbook{hughes1986spacecraft17, + author = {Hughes, P.C.}, + title = {Spacecraft Attitude Dynamics}, + isbn = {9780471818427}, + lccn = {lc85006556}, + pages = {17--18}, + year = {1986}, + publisher = {J. Wiley} +} + +@article{huynh2009, + title = {Metrics for 3D rotations: Comparison and analysis}, + author = {Huynh, Du Q}, + journal = {Journal of Mathematical Imaging and Vision}, + volume = {35}, + pages = {155--164}, + year = {2009}, + publisher = {Springer} +} + +@techreport{jia2024, + author = {Jia, Yan-Bin}, + institution = {Department of Computer Science. Iowa State University}, + title = {Quaternions}, + year = {2024}, + month = {09}, + day = {24}, + url = {https://faculty.sites.iastate.edu/jia/files/inline-files/quaternion.pdf} +} + +@article{kalman1960, + author = {Kálmán, Rudolf Emil}, + title = {A New Approach to Linear Filtering and Prediction Problems}, + journal = {Journal of Basic Engineering}, + volume = {82}, + number = {1}, + pages = {35-45}, + year = {1960}, + month = {03}, + issn = {0021-9223}, + doi = {10.1115/1.3662552}, + eprint = {https://www.unitedthc.com/DSP/Kalman1960.pdf} +} + +@InProceedings{kuffner2004, + author = {Kuffner, J.J.}, + booktitle = {IEEE International Conference on Robotics and Automation, 2004. Proceedings. ICRA '04. 2004}, + title = {Effective sampling and distance metrics for 3D rigid body path planning}, + year = {2004}, + volume = {4}, + number = {}, + pages = {3993-3998 Vol.4}, + publisher = {IEEE}, + keywords = {Sampling methods;Path planning;Interpolation;Quaternions;Kinematics;Orbital robotics;Satellites;Proteins;Topology;Geophysics computing}, + doi = {10.1109/ROBOT.2004.1308895} +} + +@InProceedings{kuipers1999, + author = {Kuipers, Jack B.}, + title = {Quaternions and Rotation Sequences}, + booktitle = {Geometry, Integrability and Quantization}, + year = {1999}, + month = {09}, + editor = {Mladenov, Ivaïlo M. and Naber, Gregory L.}, + publisher = {Coral Press}, + address = {Sofia}, + pages = {127--143}, + doi = {10.7546/giq-1-2000-127-143}, + url = {https://api.semanticscholar.org/CorpusID:116093978} +} + +@misc{labbe2015, + author = {Labbe Jr, Roger R.}, + title = {Kalman and Bayesian Filters in Python}, + howpublished = {\url{https://github.com/rlabbe/Kalman-and-Bayesian-Filters-in-Python}}, + year = {2015}, + month = {05}, + day = {23}, + note = {Accessed: 2024-09-27} +} + +@InProceedings{lam2003, + author = {Lam, Quang and Stamatakos, Nick and Woodruff, Craig and Ashton, Sandy}, + title = {Gyro Modeling and Estimation of Its Random Noise Sources}, + booktitle = {AIAA Guidance, Navigation, and Control Conference and Exhibit}, + month = {08}, + volume = {5562}, + isbn = {978-1-62410-090-1}, + doi = {10.2514/6.2003-5562}, + year = {2003}, + url = {https://arc.aiaa.org/doi/abs/10.2514/6.2003-5562}, + eprint = {https://arc.aiaa.org/doi/pdf/10.2514/6.2003-5562} +} + +@book{langel1998, + author = {Langel, R. A. and Hinze, W. J.}, + title = {The Magnetic Field of the Earth’s Lithosphere: The Satellite Perspective}, + publisher = {Cambridge University Press}, + place = {Cambridge}, + year = {1998}, + month = {12}, + isbn = {9780511629549}, + doi = {10.1017/CBO9780511629549} +} + +@inbook{lerner1978, + author = {Lerner, Gerald M.}, + title = {Three-Axis Attitude Determination}, + booktitle = {Spacecraft Attitude Determination and Control}, + chapter = {12}, + editor = {Wertz, James, R.}, + pages = {420--428}, + isbn = {90-277-0959-9}, + publisher = {Kluwer Academic Publishers}, + year = {1978} +} + +@article{liu2018, + author = {Liu, Zhuohua and Liu, Wei and Gong, Xiangyang and Wu, Jin}, + title = {Simplified Attitude Determination Algorithm Using Accelerometer and Magnetometer with Extremely Low Execution Time}, + journal = {Journal of Sensors}, + volume = {2018}, + number = {1}, + doi = {10.1155/2018/8787236}, + url = {https://onlinelibrary.wiley.com/doi/abs/10.1155/2018/8787236}, + abstract = {Accelerometer-magnetometer attitude determination is a common and vital medium processing technique in industrial robotics and consumer electronics. In this paper, we report a novel analytic attitude solution to the accelerometer-magnetometer combination in the sense of Wahba’s problem. The Davenport matrix is analytically given and its eigenvalues are computed. Through derivations, the eigenvalues are simplified to very short expressions. Then, the corresponding eigenvectors are given accordingly via matrix row operations. The system is highly optimized based on the factorization and simplification of the obtained row-echelon form, which makes it computationally fast in practice. In this way, it is named as the fast accelerometer-magnetometer combination (FAMC). Experiments on the correctness and advantages of the proposed solution are conducted. The results show that compared with conventional solutions, the proposed analytic solution is not only correct and accurate, but to our knowledge, the most time efficient as well.}, + year = {2018} +} + +@book{ma2003, + author = {Ma, Yi and Soatto, Stefano and Košecká, Jana and Sastry, S. Shankar}, + title = {An Invitation to 3-D Vision: From Images to Geometric Models}, + series = {Interdisciplinary Applied Mathematics}, + year = {2003}, + month = {11}, + edition = {1}, + publisher = {Springer New York, NY}, + isbn = {978-0-387-00893-6}, + doi = {10.1007/978-0-387-21779-6} +} + +@techreport{madgwick2010, + author = {Madgwick, Sebastian O. H.}, + title = {An efficient orientation filter for inertial and inertial/magnetic sensor arrays}, + institution = {University of Bristol}, + year = {2010}, + month = {04}, + day = {30}, + url = {https://x-io.co.uk/downloads/madgwick_internal_report.pdf} +} + +@InProceedings{mahony2005, + author = {Mahony, R. and Hamel, T. and Pflimlin, J.-M.}, + booktitle = {Proceedings of the 44th IEEE Conference on Decision and Control}, + title = {Complementary filter design on the special orthogonal group SO(3)}, + year = {2005}, + pages = {1477-1484}, + keywords = {Passive filters;Quaternions;Unmanned aerial vehicles;Attitude control;Costs;Measurement units;Remotely operated vehicles;Mobile robots;Sensor systems;Noise robustness}, + doi = {10.1109/CDC.2005.1582367}, + url = {https://folk.ntnu.no/skoge/prost/proceedings/cdc-ecc05/pdffiles/papers/1889.pdf} +} + +@article{mahony2008, + author = {Mahony, Robert and Hamel, Tarek and Pflimlin, Jean-Michel}, + journal = {IEEE Transactions on Automatic Control}, + title = {Nonlinear Complementary Filters on the Special Orthogonal Group}, + year = {2008}, + volume = {53}, + number = {5}, + pages = {1203-1218}, + keywords = {Passive filters;Costs;Measurement units;Noise level;Time varying systems;Additive noise;Filtering;Kinematics;Position measurement;Angular velocity;Attitude estimates;complementary filter;nonlinear observer;special orthogonal group}, + doi = {10.1109/TAC.2008.923738}, + url = {https://ieeexplore.ieee.org/document/4608934} +} + +@article{markley2007, + author = {Markley, Landis and Cheng, Yang and Crassidis, John and Oshman, Yaakov}, + title = {Averaging Quaternions}, + year = {2007}, + month = {07}, + pages = {1193-1196}, + volume = {30}, + journal = {Journal of Guidance, Control, and Dynamics}, + doi = {10.2514/1.28949} +} + +@book{markley2014, + author = {Markley, F. Landis and Crassidis, John L.}, + title = {Fundamentals of Spacecraft Attitude Determination and Control}, + series = {Space Technology Library}, + year = {2014}, + month = {06}, + edition = {1}, + publisher = {Springer New York, NY}, + isbn = {978-1-4939-0801-1}, + doi = {10.1007/978-1-4939-0802-8} +} + +@techreport{ozyagcilar2015, + author = {Ozyagcilar, Talat}, + title = {Implementing a Tilt-Compensated eCompass using Accelerometer and Magnetometer Sensors}, + institution = {Freescale Semiconductor, Inc}, + year = {2015}, + month = {11}, + number = {AN4248}, + note = {Rev 4.0}, + url = {https://www.nxp.com/docs/en/application-note/AN4248.pdf}, + address = {}, + annote = {}, + type = {}, +} + +@techreport{ozyagcilar2015-2, + author = {Ozyagcilar, Talat}, + title = {Accuracy of Angle Estimation in eCompass and 3D Pointer Applications}, + institution = {Freescale Semiconductor, Inc}, + year = {2015}, + month = {11}, + number = {AN4249}, + note = {Rev 1.0}, + url = {https://www.nxp.com/docs/en/application-note/AN4249.pdf}, + address = {}, + annote = {}, + type = {}, +} + +@techreport{pedley2013, + author = {Pedley, Mark}, + title = {Tilt Sensing Using a Three-Axis Accelerometer}, + institution = {Freescale Semiconductor, Inc}, + year = {2013}, + month = {}, + number = {AN3461}, + note = {Rev 6}, + url = {https://www.nxp.com/docs/en/application-note/AN3461.pdf}, + address = {}, + annote = {}, + type = {}, +} + +@inbook{plett1978, + author = {Plett, Michael}, + title = {Magnetic Field Models}, + booktitle = {Spacecraft Attitude Determination and Control}, + chapter = {Appendix H}, + editor = {Wertz, James, R.}, + pages = {779--786}, + isbn = {90-277-0959-9}, + publisher = {Kluwer Academic Publishers}, + year = {1978} +} + +@article{sabatini2011, + author = {Sabatini, Angelo Maria}, + title = {Kalman-Filter-Based Orientation Determination Using Inertial/Magnetic Sensors: Observability Analysis and Performance Evaluation}, + journal = {Sensors}, + volume = {11}, + number = {10}, + pages = {9182--9206}, + doi = {10.3390/s111009182}, + url = {https://www.mdpi.com/1424-8220/11/10/9182}, + PubMedID = {22163689}, + issn = {1424-8220}, + abstract = {In this paper we present a quaternion-based Extended Kalman Filter (EKF) for estimating the three-dimensional orientation of a rigid body. The EKF exploits the measurements from an Inertial Measurement Unit (IMU) that is integrated with a tri-axial magnetic sensor. Magnetic disturbances and gyro bias errors are modeled and compensated by including them in the filter state vector. We employ the observability rank criterion based on Lie derivatives to verify the conditions under which the nonlinear system that describes the process of motion tracking by the IMU is observable, namely it may provide sufficient information for performing the estimation task with bounded estimation errors. The observability conditions are that the magnetic field, perturbed by first-order Gauss-Markov magnetic variations, and the gravity vector are not collinear and that the IMU is subject to some angular motions. Computer simulations and experimental testing are presented to evaluate the algorithm performance, including when the observability conditions are critical.}, + year = {2011}, +} + +@InProceedings{sarabandi2019, + author = {Sarabandi, Soheil and Thomas, Federico}, + title = {Accurate Computation of Quaternions from Rotation Matrices}, + booktitle = {Advances in Robot Kinematics 2018}, + year = {2019}, + month = {06}, + day = {23}, + publisher = {Springer International Publishing}, + address = {Cham}, + pages = {39--46}, + abstract = {The main non-singular alternative to {\$}{\$}3{\backslash}times 3{\$}{\$}proper orthogonal matrices, for representing rotations in {\$}{\$}{\{}{\backslash}mathbb R{\}}^3{\$}{\$}, is quaternions. Thus, it is important to have reliable methods to pass from one representation to the other. While passing from a quaternion to the corresponding rotation matrix is given by Euler-Rodrigues formula, the other way round can be performed in many different ways. Although all of them are algebraically equivalent, their numerical behavior can be quite different. In 1978, Shepperd proposed a method for computing the quaternion corresponding to a rotation matrix which is considered the most reliable method to date. Shepperd's method, thanks to a voting scheme between four possible solutions, always works far from formulation singularities. In this paper, we propose a new method which outperforms Shepperd's method without increasing the computational cost.}, + isbn = {978-3-319-93188-3}, + editor = {Lenarcic, Jadran and Parenti-Castelli, Vincenzo}, + doi = {10.1007/978-3-319-93188-3_5} +} + +@techreport{särkkä2007, + title = {Notes on Quaternions}, + author = {Särkkä, Simo}, + institution = {Department of Electrical Engineering and Automation (EEA), Aalto University}, + year = {2007}, + url = {https://users.aalto.fi/~ssarkka/pub/quat.pdf} +} + +@misc{sola2017quaternion, + title = {Quaternion kinematics for the error-state Kalman filter}, + author = {Solà, Joan}, + year = {2017}, + eprint = {1711.02508}, + doi = {10.48550/arXiv.1711.02508}, + url = {https://arxiv.org/abs/1711.02508}, +} + +@inbook{spence1978, + author = {Spence Jr, C. B. and Markley, F. Landis}, + title = {Attitude Propagation}, + booktitle = {Spacecraft Attitude Determination and Control}, + chapter = {17}, + editor = {Wertz, James, R.}, + pages = {559--566}, + isbn = {90-277-0959-9}, + publisher = {Kluwer Academic Publishers}, + year = {1978} +} + +@article{shepperd1978, + author = {Shepperd, Stanley W.}, + title = {Quaternion from Rotation Matrix}, + journal = {Journal of Guidance and Control}, + volume = {1}, + number = {3}, + pages = {223-224}, + year = {1978}, + doi = {10.2514/3.55767b} +} + +@incollection{shoemake1992, + author = {Shoemake, Ken}, + title = {III.6 - Uniform Random Rotations}, + booktitle = {Graphics Gems III (IBM Version)}, + publisher = {Morgan Kaufmann}, + pages = {124-132}, + year = {1992}, + isbn = {978-0-12-409673-8}, + doi = {10.1016/B978-0-08-050755-2.50036-1}, + editor = {Kirk, David}, + abstract = {A planar rotation can be represented in several ways—for example, as an angle between 0 and 2π or as a unit complex number x + iy = cos θ + i sin θ. Planar rotations combine by summing their angles modulo 2π ; so one way to generate a uniform planar rotation is to generate a uniform angle. This chapter describes a uniformly distributed spatial rotation as one not having a uniformly distributed angle. For a unit quaternion, the ω component is the cosine of half the angle of rotation. When the angle is uniformly distributed between 0 and 2π, the average magnitude of ω will be 2/π 0.6366, which exceeds the correct value for a uniform rotation by a factor of 3/2. It is easy to generate random unit quaternions and, hence, rotations with the correct distribution. Pairs of independent variables with Gaussian distribution can easily be generated using the polar or Box–Muller method, which transforms a point uniformly distributed within the unit disk. The Gaussian generation can be folded into the unit quaternion generation to give an efficient algorithm.} +} + +@InProceedings{shuster1978, + author = {Shuster, Malcolm D.}, + title = {Approximate algorithms for fast optimal attitude computation}, + booktitle = {AIAA Guidance and Control Conference}, + address = {Palo Alto, California}, + year = {1978}, + month = {08}, + doi = {10.2514/6.1978-1249}, + URL = {https://arc.aiaa.org/doi/abs/10.2514/6.1978-1249}, + eprint = {https://www.malcolmdshuster.com/Pub_1978b_C_PaloAlto_scan.pdf} +} + +@article{shuster1981, + author = {Shuster, Malcolm. D. and Oh, S. D.}, + title = {Three-axis Attitude Determination from Vector Observations}, + journal = {Journal of Guidance and Control}, + volume = {4}, + number = {1}, + pages = {70--77}, + year = {1981}, + doi = {10.2514/3.19717}, + url = {https://malcolmdshuster.com/Pub_1981a_J_TRIAD-QUEST_scan.pdf} +} + +@article{shuster2007, + author = {Shuster, Malcolm D.}, + year = {2007}, + month = {04-06}, + pages = {245--257}, + title = {The optimization of TRIAD}, + volume = {55}, + number = {2}, + journal = {The Journal of the Astronautical Sciences}, + doi = {10.1007/BF03256523}, + eprint = {https://www.malcolmdshuster.com/Pub_2007f_J_OptTRIAD_AAS.pdf}, +} + +@techreport{stm4509, + author = {STMicroElectronics}, + title = {Tilt measurement using a low-g 3-axis accelerometer}, + institution = {STMicroelectronics}, + year = {2014}, + month = {06}, + day = {10}, + number = {AN4509}, + note = {Rev 1.0}, + url = {https://www.st.com/resource/en/application_note/dm00119046.pdf}, + address = {}, + annote = {}, + type = {}, +} + +@article{trimpe2012, + author = {Trimpe, Sebastian and D’Andrea, Raffaello}, + journal = {IEEE Control Systems Magazine}, + title = {The Balancing Cube: A Dynamic Sculpture As Test Bed for Distributed Estimation and Control}, + year = {2012}, + volume = {32}, + number = {6}, + pages = {48-75}, + keywords = {Modular designs;Sensors;Mathematical model;Accelerometers;Computational modeling;Noise measurement;State estimation}, + doi = {10.1109/MCS.2012.2214135} +} + +@article{valenti2015, + author = {Valenti, Roberto G. and Dryanovski, Ivan and Xiao, Jizhong}, + title = {Keeping a Good Attitude: A Quaternion-Based Orientation Filter for IMUs and MARGs}, + journal = {Sensors}, + year = {2015}, + volume = {15}, + number = {8}, + pages = {19302--19330}, + doi = {10.3390/s150819302}, + ISSN = {1424-8220}, + abstract = {Orientation estimation using low cost sensors is an important task for Micro Aerial Vehicles (MAVs) in order to obtain a good feedback for the attitude controller. The challenges come from the low accuracy and noisy data of the MicroElectroMechanical System (MEMS) technology, which is the basis of modern, miniaturized inertial sensors. In this article, we describe a novel approach to obtain an estimation of the orientation in quaternion form from the observations of gravity and magnetic field. Our approach provides a quaternion estimation as the algebraic solution of a system from inertial/magnetic observations. We separate the problems of finding the “tilt” quaternion and the heading quaternion in two sub-parts of our system. This procedure is the key for avoiding the impact of the magnetic disturbances on the roll and pitch components of the orientation when the sensor is surrounded by unwanted magnetic flux. We demonstrate the validity of our method first analytically and then empirically using simulated data. We propose a novel complementary filter for MAVs that fuses together gyroscope data with accelerometer and magnetic field readings. The correction part of the filter is based on the method described above and works for both IMU (Inertial Measurement Unit) and MARG (Magnetic, Angular Rate, and Gravity) sensors. We evaluate the effectiveness of the filter and show that it significantly outperforms other common methods, using publicly available datasets with ground-truth data recorded during a real flight experiment of a micro quadrotor helicopter.}, + PubMedID = {26258778}, + url = {https://www.mdpi.com/1424-8220/15/8/19302}, +} + +@article{valenti2016, + author = {Valenti, Roberto G. and Dryanovski, Ivan and Xiao, Jizhong}, + journal = {IEEE Transactions on Instrumentation and Measurement}, + title = {A Linear Kalman Filter for MARG Orientation Estimation Using the Algebraic Quaternion Algorithm}, + year = {2016}, + volume = {65}, + number = {2}, + pages = {467--481}, + keywords = {Quaternions;Kalman filters;Magnetometers;Estimation;Acceleration;Magnetic sensors;Inertial sensors;Kalman filtering;magnetic sensors;orientation estimation;quaternions.;Inertial sensors;Kalman filtering;magnetic sensors;orientation estimation;quaternions}, + doi = {10.1109/TIM.2015.2498998} +} + +@misc{weiss2016, + author = {Weisstein, Christopher}, + title = {geomag}, + year = {2016}, + month = {01}, + day = {15}, + howpublished = {\url{https://github.com/cmweiss/geomag}}, + note = {Accessed: 2024-09-27} +} + +@techreport{wgs84-2014, + author = {World Geodetic System 1984}, + title = {Department of Defense World Geodetic System 1984: Its Definition and Relationships with Local Geodetic Systems}, + institution = {National Center for Geospatial Intelligence Standards (NCGIS), National Geospatial-Intelligence Agency (NGA)}, + number = {NGA.STND.0036_1.0.0_WGS84}, + note = {Version 1.0.0}, + year = {2014}, + month = {07}, + day = {08}, +} + +@misc{Wiki_SLERP, + author = {Wikipedia}, + title = {SLERP}, + howpublished = {\url{https://en.wikipedia.org/wiki/Slerp}}, + note = {Accessed: 2020-06-12} +} + +@misc{Wiki_Conversions, + author = {Wikipedia}, + title = {Conversion between quaternions and Euler angles}, + howpublished = {\url{https://en.wikipedia.org/wiki/Conversion_between_quaternions_and_Euler_angles}}, + note = {Accessed: 2024-09-27} +} + +@misc{Wiki_DirectionCosine, + author = {Wikipedia}, + title = {Direction Cosine}, + howpublished = {\url{https://en.wikipedia.org/wiki/Direction_cosine}}, + note = {Accessed: 2024-09-27} +} + +@misc{Wiki_Quaternion, + author = {Wikipedia}, + title = {Quaternion}, + howpublished = {\url{https://en.wikipedia.org/wiki/Quaternion}}, + note = {Accessed: 2024-09-27} +} + +@misc{Wolfram_RotationMatrix, + author = {Weisstein, Eric W.}, + title = {Rotation Matrix}, + institution = {MathWorld--A Wolfram Web Resource}, + howpublished = {\url{https://mathworld.wolfram.com/RotationMatrix.htmle}}, + note = {Accessed: 2024-09-27} +} + +@article{wu2018, + author = {Wu, Jin and Zhou, Zebo and Gao, Bin and Li, Rui and Cheng, Yuhua and Fourati, Hassen}, + title = {Fast Linear Quaternion Attitude Estimator Using Vector Observations}, + journal = {IEEE Transactions on Automation Science and Engineering}, + year = {2018}, + volume = {15}, + number = {1}, + pages = {307-319}, + keywords = {Quaternions;Robustness;Eigenvalues and eigenfunctions;Mathematical model;Sensors;Matrix decomposition;Position measurement;Attitude determination;attitude quaternion;eigenvalue problem;pseudoinverse matrix;vector observations;wahba’s problem}, + doi = {10.1109/TASE.2017.2699221} +} + +@article{wu2018-2, + author = {Wu, Jin and Zhou, Zebo and Fourati, Hassen and Cheng, Yuhua}, + title = {A Super Fast Attitude Determination Algorithm for Consumer-Level Accelerometer and Magnetometer}, + journal = {IEEE Transactions on Consumer Electronics}, + year = {2018}, + month = {07}, + volume = {64}, + number = {3}, + doi = {10.1109/TCE.2018.2859625} +} + +@article{yun2008, + author = {Yun, Xiaoping and Bachmann, Eric R. and McGhee, Robert B.}, + journal = {IEEE Transactions on Instrumentation and Measurement}, + title = {A Simplified Quaternion-Based Algorithm for Orientation Estimation From Earth Gravity and Magnetic Field Measurements}, + year = {2008}, + volume = {57}, + number = {3}, + pages = {638-650}, + keywords = {Earth;Gravity;Magnetic field measurement;Quaternions;Magnetic sensors;Accelerometers;Magnetometers;Coordinate measuring machines;Computational efficiency;Azimuth;Accelerometers;inertial sensors;magnetic sensors;motion measurement;orientation estimation;quaternions;Accelerometers;inertial sensors;magnetic sensors;motion measurement;orientation estimation;quaternions}, + doi = {10.1109/TIM.2007.911646} +} + +@article{zhao2013, + author = {Zhao, Facheng and Wachem, Berend}, + year = {2013}, + month = {07}, + pages = {3091--3109}, + title = {A novel Quaternion integration approach for describing the behaviour of non-spherical particles}, + volume = {224}, + journal = {Acta Mechanica}, + doi = {10.1007/s00707-013-0914-2} +} + +@article{zhou2018, + author = {Zhou, Zebo and Wu, Jin and Wang, Jinling and Fourati, Hassen}, + title = {Optimal, Recursive and Sub-Optimal Linear Solutions to Attitude Determination from Vector Observations for GNSS/Accelerometer/Magnetometer Orientation Measurement}, + journal = {Remote Sensing}, + volume = {10}, + year = {2018}, + number = {3}, + article-number = {377}, + url = {https://www.mdpi.com/2072-4292/10/3/377}, + issn = {2072-4292}, + abstract = {The integration of the Accelerometer and Magnetometer (AM) provides continuous, stable and accurate attitude information for land-vehicle navigation without magnetic distortion and external acceleration. However, magnetic disturbance and linear acceleration strongly degrade the overall system performance. As an important complement, the Global Navigation Satellite System (GNSS) produces the heading estimates, thus it can potentially benefit the AM system. Such a GNSS/AM system for attitude estimation is mathematically converted to a multi-observation vector pairs matching problem in this paper. The optimal and sub-optimal attitude determination and their time-varying recursive variants are all comprehensively investigated and discussed. The developed methods are named as the Optimal Linear Estimator of Quaternion (OLEQ), Suboptimal-OLEQ (SOLEQ) and Recursive-OLEQ (ROLEQ) for different application scenarios. The theory is established based on our previous contributions, and the multi-vector matrix multiplications are decomposed with the eigenvalue factorization. Some analytical results are proven and given, which provides the reader with a brand new viewpoint of the attitude determination and its evolution. With the derivations of the two-vector case, the n-vector case is then naturally formed. Simulations are carried out showing the advantages of the accuracy, robustness and time consumption of the proposed OLEQs, compared with representative methods. The algorithms are then implemented using the C++ programming language on the designed hardware with a GNSS module, three-axis accelerometer and three-axis magnetometer, giving an effective validation of them in real-world applications. The designed schemes have proven their fast speed and good accuracy in these verification scenarios.}, + doi = {10.3390/rs10030377} }