<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE article PUBLIC "-//NLM//DTD Journal Publishing DTD v2.3 20070202//EN" "journalpublishing.dtd">
<article xmlns:mml="http://www.w3.org/1998/Math/MathML" xmlns:xlink="http://www.w3.org/1999/xlink" xml:lang="en" article-type="review-article">
<front>
<journal-meta>
<journal-id journal-id-type="nlm-ta">Sensors</journal-id>
<journal-title>Sensors</journal-title>
<issn pub-type="epub">1424-8220</issn>
<publisher>
<publisher-name>Molecular Diversity Preservation International (MDPI)</publisher-name></publisher></journal-meta>
<article-meta>
<article-id pub-id-type="doi">10.3390/s110201489</article-id>
<article-id pub-id-type="publisher-id">sensors-11-01489</article-id>
<article-categories>
<subj-group>
<subject>Review</subject></subj-group></article-categories>
<title-group>
<article-title>Estimating Three-Dimensional Orientation of Human Body Parts by Inertial/Magnetic Sensing</article-title></title-group>
<contrib-group>
<contrib contrib-type="author">
<name><surname>Sabatini</surname><given-names>Angelo Maria</given-names></name></contrib>
<aff id="af1-sensors-11-01489">The BioRobotics Institute, Scuola Superiore Sant’Anna, Piazza Martiri della Libertà 33, 56124 Pisa, Italy; E-Mail: <email>sabatini@sssup.it</email>; Tel.: +39-050-883-415; Fax: +39-050-883-101</aff></contrib-group>
<pub-date pub-type="collection">
<year>2011</year></pub-date>
<pub-date pub-type="epub">
<day>26</day>
<month>1</month>
<year>2011</year></pub-date>
<volume>11</volume>
<issue>2</issue>
<fpage>1489</fpage>
<lpage>1525</lpage>
<history>
<date date-type="received">
<day>15</day>
<month>12</month>
<year>2010</year></date>
<date date-type="rev-recd">
<day>13</day>
<month>1</month>
<year>2011</year></date>
<date date-type="accepted">
<day>15</day>
<month>1</month>
<year>2011</year></date></history>
<permissions>
<copyright-statement>© 2011 by the authors; licensee MDPI, Basel, Switzerland.</copyright-statement>
<copyright-year>2011</copyright-year>
<license>
<p>This article is an open access article distributed under the terms and conditions of the Creative Commons Attribution license (http://creativecommons.org/licenses/by/3.0/).</p></license></permissions>
<abstract>
<p>User-worn sensing units composed of inertial and magnetic sensors are becoming increasingly popular in various domains, including biomedical engineering, robotics, virtual reality, where they can also be applied for real-time tracking of the orientation of human body parts in the three-dimensional (3D) space. Although they are a promising choice as wearable sensors under many respects, the inertial and magnetic sensors currently in use offer measuring performance that are critical in order to achieve and maintain accurate 3D-orientation estimates, anytime and anywhere. This paper reviews the main sensor fusion and filtering techniques proposed for accurate inertial/magnetic orientation tracking of human body parts; it also gives useful recipes for their actual implementation.</p></abstract>
<kwd-group>
<kwd>human body motion tracking</kwd>
<kwd>inertial/magnetic sensing</kwd>
<kwd>strap-down inertial navigation</kwd>
<kwd>sensor fusion</kwd>
<kwd>Kalman filtering</kwd>
<kwd>quaternion</kwd></kwd-group></article-meta></front>
<body>
<sec sec-type="intro">
<label>1.</label>
<title>Introduction</title>
<p>The problem of accurate tracking of the orientation (attitude) of rigid objects is important in several domains, among them navigation of man-made vehicles, e.g., air and spacecrafts, robotics and, of interest in this paper, ambulatory human movement analysis, which may include a range of interesting applications, from monitoring of activities of daily living (ADL) to virtual/augmented reality (VR/AR). Several technologies and approaches are available to produce motion tracking systems (trackers), which derive orientation estimates from electrical measurements of acoustic, inertial, magnetic, mechanical, optical and radio frequency sensors [<xref ref-type="bibr" rid="b1-sensors-11-01489">1</xref>]. One increasingly popular approach is based on using inertial and magnetic sensors.</p>
<p>Several factors explain the popularity of inertial/magnetic sensing. Most current sensing approaches for motion tracking need the availability of external sources, e.g., cameras for optical trackers, ultrasonic/electromagnetic transmitters for acoustic/electromagnetic trackers. Usually, the sources can operate only over relatively short distances, which makes the trackers highly susceptible to interference and line-of-sight occlusion (shadowing): hence, proper functioning of these trackers is only possible within carefully controlled experimental setups (motion analysis laboratories). This fact precludes, for instance, the quantitative assessment of the behaviour of a human subject in unrestrained conditions. Conversely, inertial sensors are completely self-contained (sourceless), since they measure physical quantities, such as linear acceleration and angular velocity, which are related to the motion of the objects where the sensors are fixed; moreover, although magnetic sensing is externally referenced, the ubiquitous presence of a magnetic field on earth makes the magnetic source available almost everywhere. Recent technological advances in the field of micro-electro-mechanical systems (MEMS) have made it possible to manufacture inertial sensors that are relatively low cost, highly miniaturized and with limited power consumption. Inertial/magnetic sensors can therefore be considered the most valuable opportunity to monitor the ADLs of a human subject outside specialized laboratories, and over possibly extended periods of time. However, the measuring accuracies of MEMS inertial sensors are still largely inferior to those of the sensors used, e.g., in inertial navigation systems (INSs) for aeronautical and military applications [<xref ref-type="bibr" rid="b2-sensors-11-01489">2</xref>]. Hence, it becomes of the utmost importance concentrating on the development of efficient filtering algorithms for applications of these sensors, together with modern solid-state magnetic sensors, in human body motion capture.</p>
<p>Accurate estimates of the three-dimensional (3D) orientation of a rigid body by inertial/magnetic sensing require that the complementary properties of gyros, accelerometers and magnetic sensors are purposefully exploited [<xref ref-type="bibr" rid="b3-sensors-11-01489">3</xref>]. The orientation can be computed by time-integrating, from known initial conditions, the signals from a triad of mutually orthogonal uni-axial gyros (tri-axial gyro), which is prone to errors that grow unbounded over time, due to low-frequency gyro bias drifts; on the other hand, gyros help achieving accurate orientation estimates for highly dynamic motions. A tri-axial accelerometer is capable of providing drift-free inclination estimates by sensing the gravity vector. It can be used alone or, when heading estimation is also needed, together with a tri-axial magnetic sensor, giving rise to a sensing unit that is referred to in the following as a gyro-free aiding sensor system. Serious limitations affect the operation of a gyro-free aiding sensor system. First, the difficulty of correctly interpreting the acceleration signals, when the component due to the gravity field (vertical reference) coexists with the component related to the motion of the object. Hence, the vertical reference is reliable only for static or slowly moving objects [<xref ref-type="bibr" rid="b4-sensors-11-01489">4</xref>]. Second, nearby ferromagnetic materials are critically disturbing sources when attempts are made to interpret the signals from a tri-axial magnetic sensor as the horizontal reference; this problem becomes especially acute within man-made indoor environments [<xref ref-type="bibr" rid="b5-sensors-11-01489">5</xref>,<xref ref-type="bibr" rid="b6-sensors-11-01489">6</xref>]. Sensor fusion techniques are needed in order that the gyro-free aiding sensor system allows bounding the gyro bias drift errors; in turn, the gyros can be used to smooth the orientation estimates provided by the gyro-free aiding sensor system. Ideally, the filtering algorithm would be also capable of estimating gyro biases, as well as biases in the sensors of the gyro-free aiding sensor system.</p>
<p>The main purpose of this paper is to review important methods for the design of these filtering algorithms. Section 2 surveys main sensing approaches proposed by researchers active in biomedical engineering, biomechanics and related fields. Section 3 provides the reader with background information about mathematical methods for representing the orientation; the kinematic equations of a rigid body and simple numerical methods for their solution are also briefly discussed. Section 4 reviews the main deterministic and stochastic algorithms for estimating the orientation, with particular emphasis on vector matching, linear Kalman Filters (KFs) and the their extended (EKF) version, suited for nonlinear models; KFs and EKFs are presented here as special cases of Bayesian filters. Section 5 discusses the modelling issues behind the implementation of a state-of-the-art EKF, and presents a worked-out example related to a head motion tracking trial. The paper concludes with Section 6.</p></sec>
<sec>
<label>2.</label>
<title>Sensing Approaches</title>
<p>A number of pioneering contributions in the 60–70s suggested reconstructing the field of motion of a rigid body, in terms of both position and orientation (pose), by sampling acceleration values in several suitably selected points of it. The rotation of a rigid body with one point fixed requires a minimum of three acceleration measurements; at least, three additional acceleration measurements are needed to resolve the motion of the fixed point in the 3D-space [<xref ref-type="bibr" rid="b7-sensors-11-01489">7</xref>]. Sensor systems composed of several accelerometers, suitably arranged in uni-axial, bi-axial, tri-axial clusters, were proposed in [<xref ref-type="bibr" rid="b8-sensors-11-01489">8</xref>], for applications mainly in the field of impact biomechanics. It was proven that, in the presence of small experimental errors, numerical drifts in the pose estimation make systems with six accelerometers inherently unstable; even systems with nine accelerometers exhibit critical performance degradation. The six-nine sensor configurations were analyzed in depth in [<xref ref-type="bibr" rid="b9-sensors-11-01489">9</xref>], to conclude that severe restrictions exist in the time duration over which motion tracking is feasible by accelerometry methods in routine biomechanical applications. The problem with these configurations is that the angular velocity has to be estimated by time-integrating noisy measured angular accelerations, which restricts the time horizon for accurate motion tracking. More redundancy is necessary to achieve stability and tolerance to positioning/alignment errors of the accelerometers, provided that suitable calibration procedures are also implemented. Since angular velocity is not determined by time-integration anymore, kinematically redundant systems with twelve accelerometers are reported to yield promising results [<xref ref-type="bibr" rid="b10-sensors-11-01489">10</xref>].</p>
<p>During the 80–90s, the use of accelerometers in biomechanics was promoted mainly in the clinical assessment of gait: under the simplifying assumption of a gait motion planar model, a minimal configuration set composed of two leg-mounted single-axis accelerometers with parallel sensitive axes would suffice to determine the angular acceleration of the leg. In the attempt to circumvent the problem of numerical integration drift, pairs of accelerometers on each segment were used to resolve the relative angle between two segments, namely the joint angle, without time-integration [<xref ref-type="bibr" rid="b11-sensors-11-01489">11</xref>]. These accelerometer-based angle sensors were discussed in [<xref ref-type="bibr" rid="b12-sensors-11-01489">12</xref>], where the most important error sources were analyzed in detail, namely not fulfilling the gait motion planar model and the rigid-body condition by external fixation of body-mounted sensors. The potential of accelerometers as sensors that are capable of measuring the inclination of human body parts in gait analysis has been emphasized in later research, e.g., [<xref ref-type="bibr" rid="b13-sensors-11-01489">13</xref>]. Very interesting is the work in [<xref ref-type="bibr" rid="b14-sensors-11-01489">14</xref>], where the authors used one tri-axial accelerometer to measure inclination during dynamic tasks without requiring additional sensors. A KF-based algorithm was designed to estimate the different acceleration components, namely gravity and inertial acceleration, plus the accelerometer bias, using a simple model of the human motion dynamics. Since the procedure of bias compensation in the KF-algorithm works only in the direction of gravity, the bias estimate in all measurement directions turns out to be reasonably accurate only when the accelerometer is rotated over large angles. In any case, the method was shown to outperform the method based on low-pass filtering the accelerometer signals [<xref ref-type="bibr" rid="b4-sensors-11-01489">4</xref>,<xref ref-type="bibr" rid="b15-sensors-11-01489">15</xref>], especially as the speed of motion increased.</p>
<p>Toward the end of the 90s and in the early years of this century, the emergence on the consumer market of miniaturized MEMS gyros, with good metrological specifications and low cost, opened a new way to think about the role of inertial sensing in human body motion tracking and analysis [<xref ref-type="bibr" rid="b15-sensors-11-01489">15</xref>,<xref ref-type="bibr" rid="b16-sensors-11-01489">16</xref>]. At the time when solid-state magnetic sensors also found their way on the consumer market [<xref ref-type="bibr" rid="b17-sensors-11-01489">17</xref>], miniaturized, fully integrated inertial/magnetic measurement units (IMMUs) became finally available for use in strap-down INSs. In a strap-down INS the signals produced by the inertial/magnetic sensors are resolved mathematically in a computer, prior to the calculation of navigational information [<xref ref-type="bibr" rid="b18-sensors-11-01489">18</xref>]. Using a computer to resolve the inertial/magnetic data reduces the mechanical complexity of an INS, as it is implemented in the classical applications of inertial navigation technology, <italic>i.e.</italic>, stable platform technique, thus decreasing the cost and size of the system and consequently increasing its reliability. The processing speeds of modern computers and microcomputers and their low-cost allow conceiving efficient implementations of wearable strap-down INSs for human body motion capture.</p>
<p>However, it is critical to achieve high accuracy in pose determination by strap-down INSs that incorporate low-cost inertial/magnetic sensors, since their stand-alone accuracy and run-to-run stability are poor. Different applications may involve different accuracy requirements relative to the duration of each observation run: in the absence of special precautions, the requirements of human motion tracking applications are shown to be violated when the duration of the observation run exceeds just several seconds [<xref ref-type="bibr" rid="b3-sensors-11-01489">3</xref>]. Nonetheless, during the late 90s inertial tracking with automatic drift correction proved to be a highly successful technique for challenging applications in VR/AR, offering low jitter, fast response, increased range, and greatly reduced problems due to interference and shadowing [<xref ref-type="bibr" rid="b19-sensors-11-01489">19</xref>]. InterSense Inc., Billerica, MA, USA pioneered the commercial development of trackers based on miniature MEMS inertial sensors. At the time being, few other companies are marketing IMMUs, among them: Xsens Technologies B.V. (Enschede, The Netherlands); and MicroStrain Inc. (Williston, VT, USA). Several research groups are now active in exploiting them for biomechanical applications, with concentration on the design of filtering algorithms, e.g., [<xref ref-type="bibr" rid="b20-sensors-11-01489">20</xref>–<xref ref-type="bibr" rid="b25-sensors-11-01489">25</xref>].</p>
<p>Besides being important <italic>per se</italic>, estimating the orientation is fundamental in the strap-down approach to position estimation: in fact, the orientation solution allows the gravity to be cancelled from the acceleration signals, in order that the inertial acceleration is double-integrated for position estimation (gravity compensation) [<xref ref-type="bibr" rid="b3-sensors-11-01489">3</xref>]. If the gravity compensation is not carried out properly, the orientation errors add to the positioning errors, to yield a devastating growth of positioning errors that are proportional to the cube of the system’s operation time [<xref ref-type="bibr" rid="b26-sensors-11-01489">26</xref>]. There appear to be different means to deal with these problems, e.g., using externally referenced aids, such as Global Positioning System (GPS), and carry out the integration process underlying the combined use of GPS and INS technologies using KF techniques, e.g., [<xref ref-type="bibr" rid="b27-sensors-11-01489">27</xref>,<xref ref-type="bibr" rid="b28-sensors-11-01489">28</xref>]. Another approach is to exploit idiosyncrasies of the human motion dynamics by designing algorithms that can keep the drift rate low [<xref ref-type="bibr" rid="b29-sensors-11-01489">29</xref>]. The problem of position determination is not addressed in this paper.</p></sec>
<sec>
<label>3.</label>
<title>Representation and Determination of Orientation: Mathematical Review</title>
<sec>
<label>3.1.</label>
<title>Representation of Orientation</title>
<p>For motion on or near the earth surface, at speeds far below orbital velocity, it is convenient to describe the orientation of a rigid body using two coordinate systems: the earth-fixed coordinate system, specified by the right-handed orthonormal basis E = {<bold>e</bold><sub>1</sub> <bold>e</bold><sub>2</sub> <bold>e</bold><sub>3</sub>}, whose coordinate axes are directed in the local north, east and down directions (NED)—for all practical purposes, an inertial coordinate system; the non-inertial coordinate system, aka body-fixed coordinate system, specified by the right-handed orthonormal basis 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:mi mathvariant="normal">B</mml:mi>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mi>   </mml:mi>
<mml:msubsup>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mi>   </mml:mi>
<mml:msubsup>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup></mml:mrow>
<mml:mo>}</mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula>, whose coordinate axes are conventionally named “out the nose”, “out the right side” and “out the belly” in the aeronautics jargon (<xref ref-type="fig" rid="f1-sensors-11-01489">Figure 1</xref>).</p>
<p>We recall that an orthonormal basis T = {<bold>i j k</bold>} is said to be right-handed if it satisfies:
<disp-formula id="FD1">
<label>(1)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">i</mml:mi>
<mml:mo>×</mml:mo>
<mml:mi mathvariant="bold">j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mo> </mml:mo>
<mml:mo> </mml:mo>
<mml:mo> </mml:mo>
<mml:mo> </mml:mo>
<mml:mi mathvariant="bold">j</mml:mi>
<mml:mo>×</mml:mo>
<mml:mi mathvariant="bold">k</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">i</mml:mi>
<mml:mo>,</mml:mo>
<mml:mo> </mml:mo>
<mml:mo> </mml:mo>
<mml:mo> </mml:mo>
<mml:mo> </mml:mo>
<mml:mi mathvariant="bold">k</mml:mi>
<mml:mo>×</mml:mo>
<mml:mi mathvariant="bold">i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">j</mml:mi>
<mml:mo> </mml:mo>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>where the symbol × denotes the standard vector cross product.</p>
<p>An arbitrary vector <bold>x</bold> in the 3D space can be written in the equivalent forms:
<disp-formula id="FD2">
<label>(2)</label>
<mml:math display="block">
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mi>x</mml:mi>
<mml:mn>1</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:msubsup>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mi>x</mml:mi>
<mml:mn>2</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mo> </mml:mo>
<mml:msubsup>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mi>x</mml:mi>
<mml:mn>3</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mi> </mml:mi>
<mml:msubsup>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:math></disp-formula></p>
<p>The vector <bold>x</bold> can therefore be represented in terms of the coordinates (or components) with respect to either basis:
<disp-formula id="FD3">
<label>(3)</label>
<mml:math display="block">
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi mathvariant="normal">E</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mi>   </mml:mi>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mi>   </mml:mi>
<mml:msub>
<mml:mi>x</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mi>T</mml:mi></mml:msup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mi>x</mml:mi>
<mml:mn>1</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mi>   </mml:mi>
<mml:msubsup>
<mml:mi>x</mml:mi>
<mml:mn>2</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mi>   </mml:mi>
<mml:msubsup>
<mml:mi>x</mml:mi>
<mml:mn>3</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mi>T</mml:mi></mml:msup>
<mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:math></disp-formula></p>
<p>The subscripts E, B indicate which basis is used for representing the vector <bold>x</bold>. The representations in <xref ref-type="disp-formula" rid="FD3">(3)</xref> are related to one another as follows:
<disp-formula id="FD4">
<label>(4)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi mathvariant="normal">E</mml:mi></mml:msub>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>The columns of the direction cosine matrix (DCM) 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi></mml:mrow></mml:math></inline-formula> are the representations of the <bold>e</bold><italic><sub>i</sub></italic>, <italic>i</italic> = 1,…,3 with respect to B, while its rows are the representations of the 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mi>i</mml:mi>
<mml:mo>′</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula>, <italic>i</italic> = 1,…,3 with respect to E. The DCM, also called orientation (attitude) matrix, and its transpose allow therefore moving vector representations from (to) the earth-fixed frame to (from) the body-fixed frame, respectively. The orientation matrix is a 3 × 3 orthogonal matrix with unit determinant, which belongs to the three-dimensional special orthogonal group SO(3) of rotation matrices. Although the orientation matrix is the fundamental representation of the orientation, the orthogonality requirement forces six constraints on its nine elements, namely the column (row) vectors have unit norm and are mutually orthogonal, yielding that the special orthogonal group SO(3) of rotation matrices has dimension three.</p>
<p>Lower-dimensional parameterizations of orientation can be derived based on the following considerations [<xref ref-type="bibr" rid="b30-sensors-11-01489">30</xref>]. As shown in <xref ref-type="fig" rid="f2-sensors-11-01489">Figure 2</xref>, a rotation about the <bold>e</bold><sub>3</sub>-axis through an angle <italic>θ</italic> is expressed as:
<disp-formula id="FD5">
<label>(5)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mo>=</mml:mo>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>θ</mml:mi>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:mtext>sin</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>θ</mml:mi>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mo>=</mml:mo>
<mml:mo>−</mml:mo>
<mml:mtext>sin</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>θ</mml:mi>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>θ</mml:mi>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p>The resulting rotation matrix is:
<disp-formula id="FD6">
<label>(6)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>where <italic>c<sub>θ</sub></italic> and <italic>s<sub>θ</sub></italic> are compact notation for cos<italic>θ</italic> and sin<italic>θ</italic>, respectively. By analogy with <xref ref-type="disp-formula" rid="FD6">(6)</xref>, the rotation matrices that describe rotations about the <bold>e</bold><sub>2</sub>-axis and the <bold>e</bold><sub>1</sub>-axis through an angle <italic>θ</italic> are:
<disp-formula id="FD7">
<label>(7)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:mo> </mml:mo>
<mml:mo> </mml:mo>
<mml:mo> </mml:mo>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>We note that:
<disp-formula id="FD8">
<label>(8)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>×</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>×</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">e</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p>For the vector cross product, an equivalent expression is:
<disp-formula id="FD9">
<label>(9)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">u</mml:mi>
<mml:mo>×</mml:mo>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">u</mml:mi>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>where [<bold>u</bold> ×] is the skew-symmetric matrix:
<disp-formula id="FD10">
<label>(10)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">u</mml:mi>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>u</mml:mi>
<mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>Be <bold>n</bold> any unit column vector, and be <bold>v</bold><sub>⊥</sub> the projection of a column vector <bold>v</bold> onto the plane perpendicular to <bold>n</bold> (<xref ref-type="fig" rid="f3-sensors-11-01489">Figure 3</xref>). By analogy with <xref ref-type="disp-formula" rid="FD8">(8)</xref> we can write:
<disp-formula id="FD11">
<label>(11)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>⊥</mml:mo></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>⊥</mml:mo></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">v</mml:mi></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p>For arbitrary vectors <bold>a</bold>, <bold>b</bold> and <bold>c</bold> the Grassman identity yields:
<disp-formula id="FD12">
<label>(12)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">a</mml:mi>
<mml:mo>×</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">b</mml:mi>
<mml:mo>×</mml:mo>
<mml:mi mathvariant="bold">c</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">a</mml:mi>
<mml:mo>⋅</mml:mo>
<mml:mi mathvariant="bold">c</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">b</mml:mi>
<mml:mo>−</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">a</mml:mi>
<mml:mo>⋅</mml:mo>
<mml:mi mathvariant="bold">b</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">c</mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>The symbol □ denotes the standard vector dot product. <xref ref-type="disp-formula" rid="FD12">Equation (12)</xref> allows deriving the general decomposition of <bold>v</bold> into components that are parallel (<bold>v</bold><sub>P</sub>) and perpendicular (<bold>v</bold><sub>⊥</sub>) to <bold>n</bold>:
<disp-formula id="FD13">
<label>(13)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>×</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>×</mml:mo>
<mml:mi mathvariant="bold">v</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>⋅</mml:mo>
<mml:mi mathvariant="bold">v</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>−</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>⋅</mml:mo>
<mml:mi mathvariant="bold">n</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mi> </mml:mi>
<mml:mo>→</mml:mo>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mi mathvariant="bold">nn</mml:mi>
<mml:mi>T</mml:mi></mml:msup>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:msup>
<mml:mo> </mml:mo>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mi mathvariant="normal">P</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>⊥</mml:mo></mml:msub>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>In conclusion:
<disp-formula id="FD14">
<label>(14)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mi mathvariant="normal">P</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>⊥</mml:mo></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mi mathvariant="normal">P</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>⊥</mml:mo></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>⊥</mml:mo></mml:msub>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>It follows that two equivalent expressions of the rotation matrix are written (Euler’s formula):
<disp-formula id="FD15">
<label>(15)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:msup>
<mml:mi mathvariant="bold">nn</mml:mi>
<mml:mi>T</mml:mi></mml:msup>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>θ</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>θ</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mrow>
<mml:mi> </mml:mi>
<mml:mn>2</mml:mn></mml:mrow></mml:msup>
<mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:math></disp-formula>where <bold>I</bold><italic><sub>n</sub></italic> denotes the <italic>n</italic> × <italic>n</italic> identity matrix.</p>
<p>Euler’s theorem states that the most general motion of a rigid body with one point fixed is a rotation by an angle <italic>θ</italic> (rotation angle) about some axis <bold>n</bold> (rotation axis), yielding another representation of the orientation in terms of the rotation vector:
<disp-formula id="FD16">
<label>(16)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">θ</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi>θ</mml:mi>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>All rotations can thus be mapped to points inside and on the surface of a sphere of radius <italic>π</italic> in rotation vector space (<italic>θ</italic> ∈]−<italic>π</italic>, <italic>π</italic>]). Since points at opposite ends of any diameter of the sphere represent the same orientation, the parameterization of orientation through the rotation vector is redundant, with four parameters and one constraint enforced on its norm. Moreover, no points of singularity exist in the rotation vector space.</p>
<p>The orientation of the body-fixed frame relative to the earth-fixed frame can also be described using the Euler angle formulation, namely in terms of three consecutive rotations through three body-referenced Euler angles [<xref ref-type="bibr" rid="b31-sensors-11-01489">31</xref>]. Although, in principle, twelve possible ways exist to define three independent body-referenced Euler angles, just a subset of them have received attention; we discuss here the 3-2-1 rotation sequence, which is the one commonly adopted in the aeronautics community. The orientation of the body-fixed frame (nose-wing-belly) relative to the earth-fixed frame (NED) is described by performing the three rotations as follows. Start with a body-fixed frame in the reference orientation, <italic>i.e.</italic>, one in which all of its body-fixed axes are aligned with the corresponding earth axes; first, the body is rotated about the belly axis through an angle <italic>ψ</italic> usually called heading angle, or yaw (<italic>ψ</italic> ∈ ]−<italic>π</italic>, <italic>π</italic>]); second, the object is rotated about the wing axis through an angle ϑ (elevation angle, or pitch attitude) (ϑ ∈]−<italic>π</italic>/2, <italic>π</italic>/2]); third, the object is rotated about the nose axis through an angle <italic>φ</italic> (bank angle, or roll attitude), so as to match the body-fixed frame (<italic>φ</italic> ∈]−<italic>π</italic>, <italic>π</italic>]). We can then write:
<disp-formula id="FD17">
<label>(17)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi mathvariant="normal">E</mml:mi></mml:msub>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>The rotation matrix as a function of the three Euler angles is given by:
<disp-formula id="FD18">
<label>(18)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>ψ</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>ϑ</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>φ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mi> </mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p>The gravity vector is therefore represented in the body-fixed coordinate system as follows:
<disp-formula id="FD19">
<label>(19)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">g</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ψ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mi>g</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mo>=</mml:mo>
<mml:mi>g</mml:mi>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mi> </mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p><xref ref-type="disp-formula" rid="FD19">Equation (19)</xref> shows that a body-fixed tri-axial accelerometer does not convey heading information.</p>
<p>The time rates of change of the Euler angles are related to the components of the angular velocity <bold>ω</bold><sub>B</sub> = [<italic>p q r</italic>]<italic><sup>T</sup></italic> resolved in the body-fixed frame by the following system of first-order nonlinear differential equations [<xref ref-type="bibr" rid="b31-sensors-11-01489">31</xref>]:
<disp-formula id="FD20">
<label>(20)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>φ</mml:mi></mml:mrow>
<mml:mi mathvariant="italic">dt</mml:mi></mml:mfrac></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>ϑ</mml:mi></mml:mrow>
<mml:mi mathvariant="italic">dt</mml:mi></mml:mfrac></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>ψ</mml:mi></mml:mrow>
<mml:mi mathvariant="italic">dt</mml:mi></mml:mfrac></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mi>φ</mml:mi></mml:msub></mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>φ</mml:mi></mml:msub></mml:mrow>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mi>ϑ</mml:mi></mml:msub></mml:mrow></mml:mfrac></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mi>p</mml:mi></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mi>q</mml:mi></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mi>r</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mi> </mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p><xref ref-type="disp-formula" rid="FD20">Equation (20)</xref> can be used to update the orientation of the rigid body in time given the angular velocity. As for all unconstrained representations of orientation, Euler angles suffer from singularities, commonly referred to as gimbal-lock: for instance, in the case of the 3-2-1 rotation sequence, if the pitch angle ϑ is ± <italic>π</italic>/2, the last two terms of the first and last rows in <xref ref-type="disp-formula" rid="FD20">(20)</xref> go to infinite and the Euler angle integration becomes indeterminate. Gimbal lock corresponds to loosing a degree of freedom in the rotation matrix <xref ref-type="disp-formula" rid="FD18">(18)</xref>; for instance, when ϑ is <italic>π</italic>/2, the rotation matrix becomes:
<disp-formula id="FD21">
<label>(21)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>ψ</mml:mi>
<mml:mo>,</mml:mo>
<mml:mfrac>
<mml:mi>π</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mo>,</mml:mo>
<mml:mi>φ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mrow>
<mml:mi>φ</mml:mi>
<mml:mo>−</mml:mo>
<mml:mi>ψ</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mrow>
<mml:mi>φ</mml:mi>
<mml:mo>−</mml:mo>
<mml:mi>ψ</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>c</mml:mi>
<mml:mrow>
<mml:mi>φ</mml:mi>
<mml:mo>−</mml:mo>
<mml:mi>ψ</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>s</mml:mi>
<mml:mrow>
<mml:mi>φ</mml:mi>
<mml:mo>−</mml:mo>
<mml:mi>ψ</mml:mi></mml:mrow></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mi> </mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p>The rotation depends on the difference <italic>φ</italic> –<italic>ψ</italic>; only one degree of freedom therefore exists instead of two. In other terms, changes of <italic>φ</italic> and <italic>ψ</italic> result in rotations about the same axis.</p>
<p>Finally, since matrix multiplication is not generally commutative, finite rotations in space do not commute, unless infinitesimal rotation angles δ<italic>ψ</italic>, δθ, δ<italic>φ</italic> are considered, in which case we have:
<disp-formula id="FD22">
<label>(22)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi>ψ</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>δ</mml:mi>
<mml:mi>ϑ</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>δ</mml:mi>
<mml:mi>φ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>≈</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi>ψ</mml:mi></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mi>δ</mml:mi>
<mml:mi>ϑ</mml:mi></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mi>δ</mml:mi>
<mml:mi>ψ</mml:mi></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi>φ</mml:mi></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi>ϑ</mml:mi></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mi>δ</mml:mi>
<mml:mi>φ</mml:mi></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mi> </mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p>In fact, the Euler’s formula <xref ref-type="disp-formula" rid="FD15">(15)</xref> can be approximated to first order as follows:
<disp-formula id="FD23">
<label>(23)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>δ</mml:mi>
<mml:mi mathvariant="bold">θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>≈</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>−</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi mathvariant="bold">θ</mml:mi>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:mi>O</mml:mi>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi mathvariant="bold">θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:msup></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>≈</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:msub>
<mml:mi>θ</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mi>δ</mml:mi>
<mml:msub>
<mml:mi>θ</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mi>δ</mml:mi>
<mml:msub>
<mml:mi>θ</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:msub>
<mml:mi>θ</mml:mi>
<mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:msub>
<mml:mi>θ</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mi>δ</mml:mi>
<mml:msub>
<mml:mi>θ</mml:mi>
<mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>1</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mi> </mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula>where <italic>δ</italic><bold>θ</bold> = <italic>δθ</italic><bold>n</bold> is the infinitesimal rotation vector, and its components δ<italic>θ</italic><sub>1</sub>, δ<italic>θ</italic><sub>2</sub>, δ<italic>θ</italic><sub>3</sub> are termed infinitesimal angles.</p>
<p>Finally, another mathematical representation of orientation can be constructed by rewriting the Euler’s formula <xref ref-type="disp-formula" rid="FD15">(15)</xref> as follows:
<disp-formula id="FD24">
<label>(24)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>2</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>3</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>2</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>3</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>2</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>3</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn>
<mml:mn>2</mml:mn></mml:msubsup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mi> </mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p>The rotation matrix <xref ref-type="disp-formula" rid="FD24">(24)</xref> is formulated as a homogeneous quadratic function of the quantities <italic>q<sub>i</sub></italic>, <italic>i</italic> = 1,…,4, called the Euler-Rodrigues symmetric parameters or quaternion [<xref ref-type="bibr" rid="b32-sensors-11-01489">32</xref>]:
<disp-formula id="FD25">
<label>(25)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:msup></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi mathvariant="bold">qq</mml:mi></mml:mrow>
<mml:mi>T</mml:mi></mml:msup>
<mml:mo>−</mml:mo>
<mml:mn>2</mml:mn>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>where:
<disp-formula id="FD26">
<label>(26)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mtext>sin</mml:mtext>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mi>θ</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mi>θ</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>It is commonplace to refer to <bold>q</bold> as the vector part and to <italic>q</italic><sub>4</sub> as the scalar part of the quaternion <bold>q̄</bold> = [<bold>q</bold><italic><sup>T</sup></italic> <italic>q</italic><sub>4</sub>]<italic><sup>T</sup></italic>. As implied by <xref ref-type="disp-formula" rid="FD26">(26)</xref>, the rotation quaternion satisfies the simple normalization constraint:
<disp-formula id="FD27">
<label>(27)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:msup>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>The following two basic operations are defined in the quaternion space:
<disp-formula id="FD28">
<label>(28)</label>
<mml:math display="block">
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mtext>addition</mml:mtext></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>⊕</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mo>′</mml:mo></mml:msup>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>′</mml:mo></mml:msup></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi></mml:mrow></mml:msup>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi></mml:mrow></mml:msup></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mtext>multiplication</mml:mtext></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>⊗</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mo>′</mml:mo></mml:msup>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub>
<mml:msup>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>′</mml:mo></mml:msup>
<mml:mo>+</mml:mo>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>×</mml:mo>
<mml:msup>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>′</mml:mo></mml:msup></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi></mml:mrow></mml:msup>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub>
<mml:mi> </mml:mi>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn>
<mml:mo>′</mml:mo></mml:msubsup>
<mml:mo>−</mml:mo>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>⋅</mml:mo>
<mml:msup>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>′</mml:mo></mml:msup></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi></mml:mrow></mml:msup></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula></p>
<p>In contrast with quaternion addition, quaternion multiplication is not generally commutative. Moreover, by analogy with complex numbers, we define the conjugate of a quaternion; the definitions of quaternion norm and inverse follow:
<disp-formula id="FD29">
<label>(29)</label>
<mml:math display="block">
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mtext>conjugate</mml:mtext></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mo>*</mml:mo></mml:msup>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mi>T</mml:mi></mml:msup>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mrow>
<mml:mi>T</mml:mi></mml:mrow></mml:msup>
<mml:mi> </mml:mi>
<mml:mo>→</mml:mo>
<mml:mi> </mml:mi>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mo>*</mml:mo></mml:msup>
<mml:mo>⊗</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mi mathvariant="bold">0</mml:mi>
<mml:mi>T</mml:mi></mml:msup>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:msup></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mi>T</mml:mi></mml:msup></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mtext>norm</mml:mtext></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mo>*</mml:mo></mml:msup>
<mml:mo>⊗</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow></mml:msqrt>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:msup>
<mml:mo>=</mml:mo>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mn>4</mml:mn></mml:munderover>
<mml:mrow>
<mml:msubsup>
<mml:mi>q</mml:mi>
<mml:mi>i</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mtext>inverse</mml:mtext></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi> </mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:mo> </mml:mo>
<mml:mtext>such that</mml:mtext>
<mml:mo> </mml:mo>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:mo>⊗</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mi mathvariant="bold">0</mml:mi>
<mml:mi>T</mml:mi></mml:msup>
<mml:mo> </mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mi>T</mml:mi></mml:msup>
<mml:mi> </mml:mi>
<mml:mo>→</mml:mo>
<mml:mi> </mml:mi>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi> </mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mo>*</mml:mo></mml:msup></mml:mrow>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:msup></mml:mrow></mml:mfrac></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula></p>
<p>The Euler-Rodrigues formulation predates the discovery of quaternions by Hamilton, who was not apparently interested in developing quaternion algebra as means of describing rotational transformations [<xref ref-type="bibr" rid="b31-sensors-11-01489">31</xref>]. Hamilton’s quaternions can be considered as 4-component extended complex numbers of the form:
<disp-formula id="FD30">
<label>(30)</label>
<mml:math display="block">
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">i</mml:mi>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">j</mml:mi>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">k</mml:mi>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub>
<mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>whose imaginary components <bold>i</bold>, <bold>j</bold>, <bold>k</bold> have the computation rules:
<disp-formula id="FD31">
<label>(31)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">i</mml:mi>
<mml:mo>⊗</mml:mo>
<mml:mi mathvariant="bold">i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">j</mml:mi>
<mml:mo>⊗</mml:mo>
<mml:mi mathvariant="bold">j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">k</mml:mi>
<mml:mo>⊗</mml:mo>
<mml:mi mathvariant="bold">k</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">i</mml:mi>
<mml:mo>⊗</mml:mo>
<mml:mi mathvariant="bold">j</mml:mi>
<mml:mo>⊗</mml:mo>
<mml:mi mathvariant="bold">k</mml:mi>
<mml:mo>=</mml:mo>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo>,</mml:mo>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">i</mml:mi>
<mml:mo>⊗</mml:mo>
<mml:mi mathvariant="bold">j</mml:mi>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">k</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">j</mml:mi>
<mml:mo>⊗</mml:mo>
<mml:mi mathvariant="bold">i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mo>−</mml:mo>
<mml:mi mathvariant="bold">k</mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>Alternatively, quaternions can be considered as vectors embedded in the four-dimensional Euclidean space R<sup>4</sup>. The set of quaternions with null vector parts can be identified with R the set of quaternions with null scalar part, aka vector quaternions, can be identified with vectors in the Euclidean space R<sup>3</sup>. At last, unit quaternions, namely quaternions with unit norm, lie on the three-dimensional sphere S<sup>3</sup> with unit radius in R<sup>4</sup>. Henceforth, the vector presentation is used in place of the representation as extended complex numbers.</p>
<p>The connection existing between unit quaternions and the problem of describing orientations starts with examining <xref ref-type="disp-formula" rid="FD24">(24</xref>–<xref ref-type="disp-formula" rid="FD26">26)</xref>. Given the vector quaternion <bold>p̄</bold> = [<bold>p</bold><italic><sup>T</sup></italic> 0]<italic><sup>T</sup></italic>, the vector quaternion:
<disp-formula id="FD32">
<label>(32)</label>
<mml:math display="block">
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">p</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mo>′</mml:mo></mml:msup>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi> </mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:mo>⊗</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">p</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>⊗</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow></mml:math></disp-formula>is shown to be <bold>p</bold> rotated about the <bold>n</bold>-axis through an angle <italic>θ</italic> [<xref ref-type="bibr" rid="b32-sensors-11-01489">32</xref>]. Any general three-dimensional rotation <italic>θ</italic> about an arbitrary unit vector <bold>n</bold> can be therefore described by a unit quaternion. The rule of composition of rotations is achieved by multiplying the corresponding quaternions. Let <bold>q̄</bold><sub>1</sub> and <bold>q̄</bold><sub>2</sub> be arbitrary unit quaternions. Rotation by <bold>q̄</bold><sub>1</sub> followed by rotation by <bold>q̄</bold><sub>2</sub> is shown equivalent to rotation by <bold>q̄</bold><sub>2</sub> ⊗ <bold>q̄</bold><sub>1</sub>
<disp-formula id="FD33">
<label>(33)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mn>2</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mn>1</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mo>↔</mml:mo>
<mml:mi> </mml:mi>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>⊗</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mn>1</mml:mn></mml:msub></mml:mrow></mml:math></disp-formula></p>
<p>The four-component unit quaternion has the lowest dimension of any globally non-singular orientation parameterization. Enforcing the unit norm constraint on a quaternion leaves it with the three degrees of freedom consistent with the SO(3) dimensionality. Moreover, the quaternion representation is redundant, as the rotation vector. The quaternion −<bold>q̄</bold> represents the same rotation as <bold>q̄</bold> a rotation through the angle <italic>θ</italic> about the <bold>n</bold>-axis can also be expressed as a rotation through an angle −<italic>θ</italic> about the <bold>n</bold>’-axis (<bold>n</bold>’ = −<bold>n</bold>).</p></sec>
<sec>
<label>3.2.</label>
<title>Kinematic Equations Describing the Motion of a Rigid Body</title>
<p>The kinematic equations that describe the motion of a rigid body capture the relations existing between the temporal derivative of the orientation representation and the angular velocity; we have already discussed the formulation of these equations in the case that the 3-2-1 rotation sequence of Euler’s angles are chosen for representing the orientation, see <xref ref-type="disp-formula" rid="FD20">(20)</xref>.</p>
<p>Suppose that the orientation changes with time: 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>δ</mml:mi>
<mml:mi>t</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula>, <italic>i.e.</italic>, the rotation matrix representing the orientation at time <italic>t</italic> + δ<italic>t</italic>, differs from 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:math></inline-formula>, the rotation matrix at time <italic>t</italic>, see <xref ref-type="disp-formula" rid="FD23">(23)</xref>:
<disp-formula id="FD34">
<label>(34)</label>
<mml:math display="block">
<mml:mrow>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>δ</mml:mi>
<mml:mi>t</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">Φ</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>δ</mml:mi>
<mml:mi>t</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mo>←</mml:mo>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">Φ</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>δ</mml:mi>
<mml:mi>t</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>−</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi mathvariant="bold">θ</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:mi>O</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi mathvariant="bold">θ</mml:mi></mml:mrow>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:msup></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>where <italic>δ</italic> <bold>θ</bold>(<italic>t</italic>) is the infinitesimal rotation vector. We can write:
<disp-formula id="FD35">
<label>(35)</label>
<mml:math display="block">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>+</mml:mo>
<mml:mi>δ</mml:mi>
<mml:mi>t</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi>t</mml:mi></mml:mrow></mml:mfrac>
<mml:mo>=</mml:mo>
<mml:mo>−</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi mathvariant="bold">θ</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi>t</mml:mi></mml:mrow></mml:mfrac>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>Taking the limit of <xref ref-type="disp-formula" rid="FD35">(35)</xref> as <italic>δ t</italic> tends to zero, one obtains a system of first-order linear differential equations, aka the Poisson’s kinematic equations:
<disp-formula id="FD36">
<label>(36)</label>
<mml:math display="block">
<mml:mrow>
<mml:mfrac>
<mml:mi>d</mml:mi>
<mml:mi mathvariant="italic">dt</mml:mi></mml:mfrac>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo>=</mml:mo>
<mml:mo>−</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula>where <bold>ω</bold><italic><sub>B</sub></italic> is the body-referenced angular velocity, defined as:
<disp-formula id="FD37">
<label>(37)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:munder>
<mml:mtext>lim</mml:mtext>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi>t</mml:mi>
<mml:mo>→</mml:mo>
<mml:mn>0</mml:mn></mml:mrow></mml:munder>
<mml:mfrac>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi mathvariant="bold">θ</mml:mi></mml:mrow>
<mml:mrow>
<mml:mi>δ</mml:mi>
<mml:mi>t</mml:mi></mml:mrow></mml:mfrac>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>The time dependence of the angular velocity and the rotation matrix is not made explicit in <xref ref-type="disp-formula" rid="FD36">(36)</xref>–<xref ref-type="disp-formula" rid="FD37">(37)</xref> to avoid unnecessary cluttering of the notation. Alternatively, the time evolution of a time-varying quaternion with angular velocity <bold>ω</bold><italic><sub>B</sub></italic> is given by the solution to the following system of first-order linear differential Equation [<xref ref-type="bibr" rid="b32-sensors-11-01489">32</xref>]:
<disp-formula id="FD38">
<label>(38)</label>
<mml:math display="block">
<mml:mrow>
<mml:mfrac>
<mml:mi>d</mml:mi>
<mml:mi mathvariant="italic">dt</mml:mi></mml:mfrac>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>⊗</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi>
<mml:mi>T</mml:mi></mml:msubsup>
<mml:mo> </mml:mo>
<mml:mn>0</mml:mn></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mi>T</mml:mi></mml:msup>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi>
<mml:mi>T</mml:mi></mml:msubsup></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mn>0</mml:mn></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">Ω</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>where <bold>Ω</bold>(<bold>ω</bold><sub>B</sub>) is a 4 × 4 skew symmetric matrix. If the angular velocity is time constant, then the closed-form solution to <xref ref-type="disp-formula" rid="FD38">(38)</xref> with given initial conditions is given by:
<disp-formula id="FD39">
<label>(39)</label>
<mml:math display="block">
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">Φ</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>t</mml:mi></mml:mrow>
<mml:mn>0</mml:mn></mml:msub>
<mml:mo>;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mn>0</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mtext>exp</mml:mtext>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mn>0</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi mathvariant="bold">Ω</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mn>0</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>.</mml:mo></mml:math></disp-formula></p>
<p>The matrix exponential can be written:
<disp-formula id="FD40">
<label>(40)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">Φ</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mn>0</mml:mn></mml:msub>
<mml:mo>,</mml:mo>
<mml:mi>t</mml:mi>
<mml:mo>;</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi>B</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mn>0</mml:mn></mml:msub></mml:mrow>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>4</mml:mn></mml:msub>
<mml:mo> </mml:mo>
<mml:mo>+</mml:mo>
<mml:mo> </mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:mtext>sin</mml:mtext>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi>B</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mn>0</mml:mn></mml:msub></mml:mrow>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow></mml:mrow>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi>B</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>t</mml:mi>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mn>0</mml:mn></mml:msub></mml:mrow>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:mfrac>
<mml:mi mathvariant="bold">Ω</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>It is worth noting that all three-dimensional representations of orientation are invariably associated to non-linear kinematic equations; on the other hand, higher-dimensional representations of orientation, such as the orientation matrix and the quaternion, present linear kinematic equations, as shown in <xref ref-type="disp-formula" rid="FD36">(36</xref>–<xref ref-type="disp-formula" rid="FD38">38)</xref>.</p>
<p>The gimbal-lock singularity and the presence of computationally taxing trigonometric functions in the numerical integration of the system <xref ref-type="disp-formula" rid="FD20">(20)</xref> are critical elements against the choice of the Euler angles. Mathematically, <xref ref-type="disp-formula" rid="FD36">(36)</xref> preserves the orthogonality of the orientation matrix, although errors associated with its numerical integration can cause some degradation in the orthogonality of the matrix, which forces to adopt suitable methods to recover it [<xref ref-type="bibr" rid="b33-sensors-11-01489">33</xref>]. Errors associated with numerical integration of the kinematic equations for orientation have been analyzed and characterized for both the rotation matrix and the quaternion parameterizations, and the superiority of the latter is widely recognized [<xref ref-type="bibr" rid="b33-sensors-11-01489">33</xref>,<xref ref-type="bibr" rid="b34-sensors-11-01489">34</xref>]. In addition to that, another relevant advantage of the quaternion formulation is vastly increased computational speed: trigonometric functions are not to be computed, with further savings that are provided by the reduced number of floating operations involved in numerically integrating <xref ref-type="disp-formula" rid="FD38">(38)</xref> as compared with <xref ref-type="disp-formula" rid="FD36">(36)</xref> [<xref ref-type="bibr" rid="b31-sensors-11-01489">31</xref>].</p>
<p>The claim that the physical interpretation of the quaternion is much less intuitive than that associated with Euler angles does not imply that the quaternion cannot find ample diffusion even in the biomechanical community. A systematic development of the kinematics equations is possible in terms, equivalently, of direction cosines, the rotation vector, Euler angles, the quaternion, and well-established relationships link all these descriptors to one another: at any stage of the processing and visualization tasks, one can adopt the descriptor that is more suited to the application specifics. Henceforth, we direct our attention exclusively to the quaternion-based formulation of the kinematic equations of a rigid body.</p></sec></sec>
<sec>
<label>4.</label>
<title>Orientation Estimation Algorithms</title>
<p>Estimating the orientation from body-fixed sensor measurements has a quite long history, in particular in applications of spacecraft guidance and control. Over the years, two main approaches have emerged: the deterministic (least-squares) approach and the stochastic (Kalman filtering) approach. The least-squares approach was originally introduced in 1965, in the so-called Wahba’s problem [<xref ref-type="bibr" rid="b35-sensors-11-01489">35</xref>], which is a constrained least-squares optimization problem for finding the rotation matrix from vector measurements taken at a single time (single-frame method). The Kalman filtering approach, first proposed in 1961 for applications of spacecraft guidance and control [<xref ref-type="bibr" rid="b36-sensors-11-01489">36</xref>], soon after the publication of the seminal paper by Kalman in 1960 [<xref ref-type="bibr" rid="b37-sensors-11-01489">37</xref>], is intended to yield minimum-variance sequential estimates of orientation and, in principle, of other parameters than orientation, such as sensor biases, using information about motion dynamics. Unless suitable generalizations are provided, deterministic approaches are unable to incorporate such information [<xref ref-type="bibr" rid="b38-sensors-11-01489">38</xref>,<xref ref-type="bibr" rid="b39-sensors-11-01489">39</xref>].</p>
<p>Estimating the orientation of human body parts from body-fixed inertial/magnetic sensor measurements is a relatively novel application. It does not come as a surprise that the same distinction as above is made between deterministic and stochastic approaches, as we will see shortly after.</p>
<sec>
<label>4.1.</label>
<title>Deterministic Single-Frame Approach</title>
<p>Deterministic single-frame estimation algorithms can be proposed in connection with the operation of gyro-free aiding sensor systems. Four variants of the same approach are surveyed here: TRIAD (TRi-axial Attitude Determination), QUEST (QUaternion ESTimator), FQA (Factored Quaternion Algorithm) and Gauss-Newton (GN) optimization. They can be used to solve Wahba’s problem without the need for an <italic>a priori</italic> estimate. They all are based on the concept of vector matching, which requires, in principle, that measurements of constant reference vectors (e.g., gravity and earth magnetic field) are performed. In their original formulation, they are unable to provide sequential estimates of a time-varying orientation and of other parameters than the orientation, such as sensor biases. In the presence of uncompensated sensor biases, the estimated orientation can be therefore grossly inaccurate.</p>
<p>Suppose that two nonparallel reference unit vectors <bold>v</bold><sub>1</sub>, <bold>v</bold><sub>2</sub> are available, e.g., in the direction of the gravity field and the earth magnetic field, and resolved in the earth-fixed frame. The corresponding observation vectors <bold>w</bold><sub>1</sub>, <bold>w</bold><sub>2</sub> are measured in the body-fixed frame and normalized in amplitude to one. The TRIAD algorithm attempts to solve Wahba’s problem by finding an orthogonal matrix <bold>A</bold> such that the pair (<bold>w</bold><sub>1</sub>, <bold>w</bold><sub>2</sub>) is optimally related to the pair (<bold>v</bold><sub>1</sub>, <bold>v</bold><sub>2</sub>), namely <bold>Av</bold><italic><sub>i</sub></italic> = <bold>w</bold><italic><sub>i</sub></italic>, <italic>i</italic> = 1, 2, which gives rise to an over-determined system of algebraic equations [<xref ref-type="bibr" rid="b40-sensors-11-01489">40</xref>].</p>
<p>First, two triads of orthonormal reference and observation vectors are constructed:
<disp-formula id="FD41">
<label>(41)</label>
<mml:math display="block">
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>;</mml:mo>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>×</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>×</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">|</mml:mo></mml:mrow></mml:mfrac>
<mml:mo>;</mml:mo>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>×</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold">s</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>;</mml:mo>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">s</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">s</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>×</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">s</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>×</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mn>2</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">|</mml:mo></mml:mrow></mml:mfrac>
<mml:mo>;</mml:mo>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">s</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">s</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo>×</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">s</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula></p>
<p>Second, the two orthogonal matrices <bold>M</bold><sub>ref</sub> and <bold>M</bold><sub>obs</sub> are formed, and the optimal estimate of the orthogonal matrix <bold>A</bold> is then computed as follows:
<disp-formula id="FD42">
<label>(42)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">M</mml:mi>
<mml:mtext>ref</mml:mtext></mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">r</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">M</mml:mi>
<mml:mtext>obs</mml:mtext></mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">s</mml:mi>
<mml:mn>1</mml:mn></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">s</mml:mi>
<mml:mn>2</mml:mn></mml:msub>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">s</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow>
<mml:mi> </mml:mi>
<mml:mo>→</mml:mo>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">A</mml:mi>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">M</mml:mi>
<mml:mtext>obs</mml:mtext></mml:msub>
<mml:msubsup>
<mml:mi mathvariant="bold">M</mml:mi>
<mml:mtext>ref</mml:mtext>
<mml:mi>T</mml:mi></mml:msubsup>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>The main disadvantage of the TRIAD algorithm is that it is sensitive to the order at which the algorithm receives the two vector pairs—the pair (<bold>v</bold><sub>1</sub>, <bold>w</bold><sub>1</sub>) is received first in <xref ref-type="disp-formula" rid="FD41">(41)</xref>. In fact, part of the information conveyed by the second vector pair is discarded: the cross products that are needed to compute <bold>r</bold><sub>2</sub> and <bold>s</bold><sub>2</sub> eliminate any contribution of <bold>v</bold><sub>2</sub> and <bold>w</bold><sub>2</sub> relative to the vertical axis. Since the accuracy of the orientation estimate is more influenced by the vector pair that is processed first, the best choice would be to process first the observation vector of greater accuracy. Another disadvantage of the TRIAD algorithm is that it accommodates only two observation vectors.</p>
<p>The basic QUEST delivers the optimal quaternion that minimizes the loss function:
<disp-formula id="FD43">
<label>(43)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi>L</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi mathvariant="bold">A</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:munderover>
<mml:mo>∑</mml:mo>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>=</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>n</mml:mi></mml:munderover>
<mml:mrow>
<mml:msub>
<mml:mi>a</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">Av</mml:mi>
<mml:mi>i</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:msup></mml:mrow>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>The loss function <xref ref-type="disp-formula" rid="FD44">(44)</xref> can be transformed into a quadratic gain function of the unit quaternion:
<disp-formula id="FD44">
<label>(44)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi>G</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">A</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mi>T</mml:mi></mml:msup>
<mml:mi mathvariant="bold">K</mml:mi>
<mml:mi> </mml:mi>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow></mml:math></disp-formula>where <bold>K</bold> is a 4 × 4 matrix constructed from the reference vectors <bold>v</bold><italic><sub>i</sub></italic>, measurement vectors <bold>w</bold><italic><sub>i</sub></italic>, and weighting coefficients <italic>a<sub>i</sub></italic>. The optimal unit quaternion is proven to be the eigenvector of the <bold>K</bold> matrix corresponding to its largest eigenvalue [<xref ref-type="bibr" rid="b40-sensors-11-01489">40</xref>].</p>
<p>In contrast with the TRIAD algorithm, the QUEST is capable of accommodating more than two observation vectors; moreover, it is optimal with sensors with different accuracies by properly selecting the weighting coefficients <italic>a<sub>i</sub></italic>. Although the quaternion produced by the QUEST is unit-norm and globally non-singular, a method is needed for avoiding the singularity that arises when the angle of rotation is <italic>π</italic>. In fact, the QUEST uses a three-dimensional parameterization, namely the Gibbs vector, in its derivation:
<disp-formula id="FD45">
<label>(45)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">a</mml:mi>
<mml:mi>g</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mrow>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mn>4</mml:mn></mml:msub></mml:mrow></mml:mfrac>
<mml:mo>=</mml:mo>
<mml:mi mathvariant="bold">n</mml:mi>
<mml:mi> </mml:mi>
<mml:mtext>tan</mml:mtext>
<mml:mfrac>
<mml:mi>θ</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow></mml:math></disp-formula></p>
<p>The singularity problem is eliminated in the QUEST by employing the method of sequential rotations, at the expense of computational cost [<xref ref-type="bibr" rid="b40-sensors-11-01489">40</xref>].</p>
<p>The FQA is specifically created in the attempt to overcome the limitation of both the TRIAD algorithm and the QUEST that orientation errors arise from errors in just one of the sensor data [<xref ref-type="bibr" rid="b41-sensors-11-01489">41</xref>]. Suppose that the two reference vectors are the gravity field, <bold>g</bold>, normalized in amplitude to one (vertical reference); and the earth's magnetic field, or more precisely, the local magnetic field, <bold>h</bold>, normalized in amplitude to one (horizontal reference). Let <bold>g</bold><sub>m</sub> and <bold>h</bold><sub>m</sub> denote the corresponding measurement vectors, normalized in amplitude to one. In the FQA, acceleration data are used in computing the pitch and roll angles, while local magnetic field data are used only in yaw angle computations. This decoupling eliminates the influence of magnetic variations on calculations that determine pitch and roll angles.</p>
<p>Upon examination of <xref ref-type="disp-formula" rid="FD19">(19)</xref>, the value of the sine of the pitch angle can be expressed as:
<disp-formula id="FD46">
<label>(46)</label>
<mml:math display="block">
<mml:mrow>
<mml:mtext>sin</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>ϑ</mml:mi>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>g</mml:mi>
<mml:mi mathvariant="italic">mx</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:mo>→</mml:mo>
<mml:mi> </mml:mi>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>ϑ</mml:mi>
<mml:mo>=</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mtext>sin</mml:mtext>
<mml:mn>2</mml:mn></mml:msup>
<mml:mo> </mml:mo>
<mml:mi>ϑ</mml:mi></mml:mrow></mml:msqrt>
<mml:mo>,</mml:mo>
<mml:mi> </mml:mi>
<mml:mi>ϑ</mml:mi>
<mml:mo>∈</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">]</mml:mo>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mi>π</mml:mi>
<mml:mo>/</mml:mo>
<mml:mn>2</mml:mn>
<mml:mo>,</mml:mo>
<mml:mo> </mml:mo>
<mml:mi>π</mml:mi>
<mml:mo>/</mml:mo>
<mml:mn>2</mml:mn></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>From trigonometric half-angle formulas, half-angle values are given by:
<disp-formula id="FD47">
<label>(47)</label>
<mml:math display="block">
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mtext>sin</mml:mtext>
<mml:mfrac>
<mml:mi>ϑ</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mo>=</mml:mo>
<mml:mtext>sign</mml:mtext>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mtext>sin</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>ϑ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:msqrt>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>−</mml:mo>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>ϑ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>/</mml:mo>
<mml:mn>2</mml:mn></mml:mrow></mml:msqrt></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mfrac>
<mml:mi>ϑ</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mo>=</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>+</mml:mo>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>ϑ</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>/</mml:mo>
<mml:mn>2</mml:mn></mml:mrow></mml:msqrt>
<mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>yielding the following expression of the pitch quaternion:
<disp-formula id="FD48">
<label>(48)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mi>p</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo> </mml:mo>
<mml:mtext>sin</mml:mtext>
<mml:mfrac>
<mml:mi>ϑ</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mo> </mml:mo>
<mml:mn>0</mml:mn>
<mml:mo> </mml:mo>
<mml:mtext>cos</mml:mtext>
<mml:mfrac>
<mml:mi>ϑ</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mi>T</mml:mi></mml:msup></mml:mrow></mml:math></disp-formula></p>
<p>The values of the sine and cosine of the roll angle can be expressed as:
<disp-formula id="FD49">
<label>(49)</label>
<mml:math display="block">
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mtext>sin</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>φ</mml:mi>
<mml:mo>=</mml:mo>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>g</mml:mi>
<mml:mi mathvariant="italic">my</mml:mi></mml:msub>
<mml:mo>/</mml:mo>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>ϑ</mml:mi></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>φ</mml:mi>
<mml:mo>=</mml:mo>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>g</mml:mi>
<mml:mi mathvariant="italic">mz</mml:mi></mml:msub>
<mml:mo>/</mml:mo>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>ϑ</mml:mi>
<mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula></p>
<p>Exploiting the half-angle formulas, the roll quaternion is given by:
<disp-formula id="FD50">
<label>(50)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mi>r</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtext>sin</mml:mtext>
<mml:mfrac>
<mml:mi>φ</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mo> </mml:mo>
<mml:mn>0</mml:mn>
<mml:mo> </mml:mo>
<mml:mn>0</mml:mn>
<mml:mo> </mml:mo>
<mml:mtext>cos</mml:mtext>
<mml:mfrac>
<mml:mi>φ</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mi>T</mml:mi></mml:msup></mml:mrow></mml:math></disp-formula></p>
<p>The values of the sine and cosine of the yaw angle can be determined by matching the magnetic field reference vector in the horizontal plane [<italic>h<sub>x</sub></italic> <italic>h<sub>y</sub></italic>]<italic><sup>T</sup></italic>, normalized in amplitude to one, and the measured magnetic vector [<italic>m<sub>x</sub></italic> <italic>m<sub>y</sub></italic>]<italic><sup>T</sup></italic>, projected from the body-fixed frame to the horizontal plane via the pitch and roll quaternions, and normalized in amplitude to one:
<disp-formula id="FD51">
<label>(51)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext>cos</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>ψ</mml:mi></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext>sin</mml:mtext>
<mml:mo> </mml:mo>
<mml:mi>ψ</mml:mi></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>m</mml:mi>
<mml:mi>x</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>m</mml:mi>
<mml:mi>y</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi>m</mml:mi>
<mml:mi>y</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>m</mml:mi>
<mml:mi>x</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>h</mml:mi>
<mml:mi>x</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi>h</mml:mi>
<mml:mi>y</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mo>.</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p>Exploiting the half-angle formulas, the yaw quaternion is:
<disp-formula id="FD52">
<label>(52)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mi>y</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mn>0</mml:mn>
<mml:mo> </mml:mo>
<mml:mn>0</mml:mn>
<mml:mo> </mml:mo>
<mml:mtext>sin</mml:mtext>
<mml:mfrac>
<mml:mi>ψ</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mo> </mml:mo>
<mml:mtext>cos</mml:mtext>
<mml:mfrac>
<mml:mi>ψ</mml:mi>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mi>T</mml:mi></mml:msup></mml:mrow></mml:math></disp-formula></p>
<p>The rule of composition <xref ref-type="disp-formula" rid="FD33">(33)</xref> is applied to <xref ref-type="disp-formula" rid="FD48">(48)</xref>, <xref ref-type="disp-formula" rid="FD50">(50)</xref> and <xref ref-type="disp-formula" rid="FD52">(52)</xref> to yield the quaternion estimate representing the orientation of the rigid body:
<disp-formula id="FD53">
<label>(53)</label>
<mml:math display="block">
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mi>r</mml:mi></mml:msub>
<mml:mo>⊗</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mi>p</mml:mi></mml:msub>
<mml:mo>⊗</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mi>y</mml:mi></mml:msub>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>Since the FQA uses three angles to derive the quaternion estimate, it suffers from a singularity, which occurs when the pitch angle is ± π/2. In order to circumvent this singularity, a method similar to the one proposed in the QUEST algorithm is adopted in the numerical implementation of the FQA. In essence, the FQA is very similar to the tilt compensation procedure customarily used in a strap-down magnetic compass to derive heading [<xref ref-type="bibr" rid="b17-sensors-11-01489">17</xref>], <xref ref-type="fig" rid="f4-sensors-11-01489">Figure 4</xref>.</p>
<p>The last method reviewed in this Section is the GN optimizer [<xref ref-type="bibr" rid="b42-sensors-11-01489">42</xref>]. First, construct the error vector as follows:
<disp-formula id="FD54">
<label>(54)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi>ɛ</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">g</mml:mi>
<mml:mi>m</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:mi>A</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">g</mml:mi></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mi>ρ</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">h</mml:mi>
<mml:mi>m</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:mi>A</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">h</mml:mi></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula>where <italic>ρ</italic> is a suitably chosen weighting factor. Then, the optimal quaternion is computed by minimization of the square of the error vector:
<disp-formula id="FD55">
<label>(55)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mtext>opt</mml:mtext></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:munder>
<mml:mtext>arg min</mml:mtext>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:munder>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mi>ɛ</mml:mi>
<mml:msup>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mrow>
<mml:mi> </mml:mi>
<mml:mi>T</mml:mi></mml:mrow></mml:msup>
<mml:mi>ɛ</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow>
<mml:mo>}</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p>The conventional GN method algorithm provides an iterative solution to this problem:
<list list-type="order">
<list-item>
<p>Give an initial guess, <bold>q̄</bold><sub>0</sub>;</p></list-item>
<list-item>
<p>Compute the correction:
<disp-formula id="FD56">
<label>(56)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi mathvariant="normal">Δ</mml:mi>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mo>∂</mml:mo>
<mml:mi> </mml:mi>
<mml:mi>ɛ</mml:mi></mml:mrow>
<mml:mrow>
<mml:mo>∂</mml:mo>
<mml:mi> </mml:mi>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow></mml:mfrac></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mi>T</mml:mi></mml:msup>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mo>∂</mml:mo>
<mml:mi> </mml:mi>
<mml:mi>ɛ</mml:mi></mml:mrow>
<mml:mrow>
<mml:mo>∂</mml:mo>
<mml:mi> </mml:mi>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow></mml:mfrac></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msup>
<mml:msup>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mo>∂</mml:mo>
<mml:mi> </mml:mi>
<mml:mi>ɛ</mml:mi></mml:mrow>
<mml:mrow>
<mml:mo>∂</mml:mo>
<mml:mi> </mml:mi>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow></mml:mfrac></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mi>T</mml:mi></mml:msup>
<mml:mi>ɛ</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>;</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item>
<list-item>
<p>Compute the updated quaternion:
<disp-formula id="FD57">
<label>(57)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:mo>Δ</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>;</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item>
<list-item>
<p>Normalize the updated quaternion:
<disp-formula id="FD58">
<label>(58)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>+</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">|</mml:mo></mml:mrow></mml:mfrac>
<mml:mo>;</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item>
<list-item>
<p>Return to step (2), and repeat until convergence using the stopping criterion:
<disp-formula id="FD59">
<label>(59)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">|</mml:mo>
<mml:mrow>
<mml:mo>Δ</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mo stretchy="false">|</mml:mo></mml:mrow>
<mml:mo>&lt;</mml:mo>
<mml:mtext>TOL</mml:mtext>
<mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item></list>where TOL measures how small the residual of the final solution is to be considered acceptable.</p>
<p>The main merit of a GN optimizer is recognized in its robust estimation capability, nonetheless the intensive calculations required in step (2) and the need for iteratively evaluations until convergence may diminish its importance for real-time applications. It is reported that four-five iterations are requested for typical values of the sensor measurement noise, when the initialization errors are large. Fortunately, during tracking, when errors are much smaller, GN iteration typically converges to sufficient accuracy in only one-two steps. Clever algorithms are reported in the literature in order to reduce the computational burden of GN optimizers [<xref ref-type="bibr" rid="b25-sensors-11-01489">25</xref>,<xref ref-type="bibr" rid="b42-sensors-11-01489">42</xref>].</p>
<p>For an approach based on single-frame deterministic algorithms to work properly in human motion tracking, the acceleration and magnetic measurement vectors are to be determined by the gravity field and by the reference magnetic field, respectively. However, this assumption can cause serious errors in the orientation solution if any body accelerations and magnetic variations of affect the sensor signals: in principle, only slow motions occurring in magnetically clean environments would be allowed. The widespread practice of low-pass filtering acceleration signals in order to reduce the effect of dynamic motions leads to latency in the estimates produced by the algorithm, with the additional problem of how to optimally select the cut-off frequency of the filter. Alternatively, acceleration measurements would be screened before their use in the algorithm by computing the absolute value of the difference between their norm and the known value of gravity; if the computed value exceeds a preset threshold value, the measurement reliability is considered low. As for the impact of magnetic variations on the reliability of magnetic measurements, a similar approach can be considered by comparing the norm of the sensed magnetic field with the norm of the reference magnetic vector. A more detailed explanation of these vector selection techniques is deferred to Section 5.4, after that, in the next Section, stochastic estimation algorithms are presented and discussed.</p></sec>
<sec>
<label>4.2.</label>
<title>Stochastic Estimation Algorithms</title>
<p>Stochastic estimation algorithms use a model for predicting aspects of the time behaviour of a system (dynamic model) and a model of the sensor measurements (measurement model), in order to produce the most accurate estimate possible of the system state. KF algorithms lend themselves perfectly to this task [<xref ref-type="bibr" rid="b37-sensors-11-01489">37</xref>]. There appears to be wide consensus that, e.g., in the VR/AR community the KF is recognized “perhaps <italic>the</italic> perfect tool for elegantly combining multisensory fusion, filtering, and motion prediction in a single fast and accurate framework” [<xref ref-type="bibr" rid="b43-sensors-11-01489">43</xref>].</p>
<p>For the sake of generality, our discussion starts here with considering the Bayesian approach to dynamic state estimation [<xref ref-type="bibr" rid="b44-sensors-11-01489">44</xref>]; KFs represent a special class of algorithms for recursive Bayesian state estimation. The Bayesian approach is based on propagating the probability density function (PDF) of the system state in a recursive manner through the application of the Bayes’ rule. The state dynamics is modelled as a Markov process:
<disp-formula id="FD60">
<label>(60)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo stretchy="false">|</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>:</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mi>p</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>|</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>where x<sub>1:<italic>k</italic>−1</sub> = [<bold>x</bold><sub>1</sub> <bold>x</bold><sub>2</sub> … <bold>x</bold><sub><italic>k</italic>−1</sub>] is the collection of the states traversed by the system up to time <italic>k</italic>−1, included. The state at time <italic>t<sub>k</sub></italic> is conditioned only on the previous state and it is independent of the past. This allows for a state representation according to the following discrete-time stochastic model:
<disp-formula id="FD61">
<label>(61)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>where <italic>f</italic> is a (linear or non-linear), generally time-variant function mapping the previous state to the current state, and <bold>w</bold><sub><italic>k</italic>−1</sub> represents the process noise. Process noise accounts for any mismodelling effects or disturbances in the dynamic model. Here the index <italic>k</italic> is associated to a continuous-time instant <italic>t<sub>k</sub></italic>, and the sampling interval <italic>T</italic><sub><italic>k</italic>−1</sub> = <italic>t<sub>k</sub></italic> – <italic>t</italic><sub><italic>k</italic>−1</sub> may be time-dependent, <italic>i.e.</italic>, function of <italic>k</italic>. Henceforth, we will assume that the sampling interval <italic>T<sub>s</sub></italic> is constant.</p>
<p>The system state <bold>x</bold><italic><sub>k</sub></italic> is related to the measurements by the measurement model:
<disp-formula id="FD62">
<label>(62)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">z</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>h</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>,</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>where <bold>z</bold><italic><sub>k</sub></italic> is the measured state of the process at time <italic>t<sub>k</sub></italic>, <italic>h</italic> is a generally nonlinear time-variant function mapping of the state of the system to the measured state <bold>z</bold><italic><sub>k</sub></italic>, and <bold>v</bold><italic><sub>k</sub></italic> represents the measurement noise. The random processes <bold>w</bold><sub><italic>k</italic>−1</sub> and <bold>v</bold><italic><sub>k</sub></italic> are assumed to be white, with known PDFs, and mutually independent. The initial state <bold>x</bold><sub>0</sub> is assumed to have a known PDF <italic>p</italic>(<bold>x</bold><sub>0</sub>) and also to be independent of <bold>w</bold><sub><italic>k</italic>−1</sub> and <bold>v</bold><italic><sub>k</sub></italic>.</p>
<p>The goal of filtering can be stated as finding estimates of the states given <bold>z</bold><sub>1:<italic>k</italic></sub>. This requires the calculation of the posterior PDF <italic>p</italic>(<bold>x</bold><sub><italic>k</italic></sub>|<bold>z</bold><sub>1:<italic>k</italic></sub>). Suppose that the required posterior PDF <italic>p</italic>(<bold>x</bold><sub><italic>k</italic>−1</sub>|<bold>z</bold><sub>1:<italic>k</italic>−1</sub>) at time <italic>t</italic><sub><italic>k</italic>−1</sub> is available. The prediction stage involves the dynamic model <xref ref-type="disp-formula" rid="FD61">(61)</xref> to obtain the prior PDF of the state at time <italic>t<sub>k</sub></italic>:
<disp-formula id="FD63">
<label>(63)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>|</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">z</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>:</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>∫</mml:mo>
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo stretchy="false">|</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:mi>p</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo stretchy="false">|</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">z</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>:</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mrow>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi mathvariant="bold">x</mml:mi></mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p>
<p>The transitional PDF <italic>p</italic>(<bold>x</bold><italic><sub>k</sub></italic>|<bold>x</bold><sub><italic>k</italic>−1</sub>) is defined by the dynamic model <xref ref-type="disp-formula" rid="FD62">(62)</xref> and the known statistics of the process noise <bold>w</bold><sub><italic>k</italic>−1</sub>.</p>
<p>The update stage, at time <italic>t<sub>k</sub></italic> when a new measurement becomes available, is based on the Bayes’ rule:
<disp-formula id="FD64">
<label>(64)</label>
<mml:math display="block">
<mml:mrow>
<mml:mi>p</mml:mi>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo stretchy="false">|</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">z</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>:</mml:mo>
<mml:mi>k</mml:mi></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>∝</mml:mo>
<mml:mi>p</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">z</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo stretchy="false">|</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo> </mml:mo>
<mml:mi>p</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo stretchy="false">|</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">z</mml:mi>
<mml:mrow>
<mml:mn>1</mml:mn>
<mml:mo>:</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>where the likelihood function <italic>p</italic>(<bold>z</bold><italic><sub>k</sub></italic>|<bold>x</bold><italic><sub>k</sub></italic>) is defined by the measurement model <xref ref-type="disp-formula" rid="FD62">(62)</xref> and the known statistics of the measurement noise <bold>v</bold><italic><sub>k</sub></italic>.</p>
<p>The <xref ref-type="disp-formula" rid="FD63">Equations (63)</xref>–<xref ref-type="disp-formula" rid="FD64">(64)</xref> give a recursive way to propagate the posterior density. Bayesian filtering can thus be seen as a two-stage process, a prediction stage of the new state using <xref ref-type="disp-formula" rid="FD63">(63)</xref>, and an update stage where the prediction is modified by the new measurement using <xref ref-type="disp-formula" rid="FD64">(64)</xref>. The knowledge of the posterior PDF <italic>p</italic>(<bold>x</bold><italic><sub>k</sub></italic>|<bold>z</bold><sub>1:<italic>k</italic></sub>) allows estimating the state, and obtaining measures of the accuracy of these estimates. The Bayesian solution cannot be determined analytically, expect that in a restrictive set of cases, including the KF.</p>
<p>The KF assumes that the posterior density at every time step is multivariate Gaussian, and hence it can be completely characterized by the mean vector and the covariance matrix. If the PDF <italic>p</italic>(<bold>x</bold><sub><italic>k</italic>−1</sub>|<bold>z</bold><sub>1:<italic>k</italic>−1</sub>) is Gaussian, the PDF <italic>p</italic>(<bold>x</bold><italic><sub>k</sub></italic>|<bold>z</bold><sub>1:<italic>k</italic></sub>) is proven to be Gaussian provided that:
<list list-type="bullet">
<list-item>
<p><bold>w</bold><sub><italic>k</italic>−1</sub> and <bold>v</bold><italic><sub>k</sub></italic> are drawn from Gaussian PDFs with known parameters;</p></list-item>
<list-item>
<p><italic>f</italic><sub><italic>k</italic>−1</sub>(<bold>x</bold><sub><italic>k</italic>−1</sub>, <bold>w</bold><sub><italic>k</italic>−1</sub>) is a known <italic>linear</italic> function of <bold>x</bold><sub><italic>k</italic>−1</sub> and <bold>w</bold><sub><italic>k</italic>−1</sub>;</p></list-item>
<list-item>
<p><italic>h<sub>k</sub></italic>(<bold>x</bold><italic><sub>k</sub></italic>, <bold>v</bold><italic><sub>k</sub></italic>) is a known <italic>linear</italic> function of <bold>x</bold><italic><sub>k</sub></italic> and <bold>v</bold><italic><sub>k</sub></italic>.</p></list-item></list></p>
<p>In other words <xref ref-type="disp-formula" rid="FD61">(61)</xref>–<xref ref-type="disp-formula" rid="FD62">(62)</xref> can be rewritten as:
<disp-formula id="FD65">
<label>(65)</label>
<mml:math display="block">
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">F</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold">z</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">H</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>,</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>where <bold>F</bold><sub><italic>k</italic>−1</sub> (of dimension <italic>n</italic><sub>x</sub> × <italic>n</italic><sub>x</sub>) and <bold>H</bold><italic><sub>k</sub></italic> (of dimension <italic>n</italic><sub>z</sub> × <italic>n</italic><sub>z</sub>) are known matrices. The additive noises <bold>w</bold><sub><italic>k</italic>−1</sub> and <bold>v</bold><italic><sub>k</sub></italic> are mutually independent zero-mean white Gaussian, with known covariance matrices <bold>Q</bold><sub><italic>k</italic>−1</sub> and <bold>R</bold><italic><sub>k</sub></italic>, respectively. Note that the system and measurement matrices <bold>F</bold><sub><italic>k</italic>−1</sub> and <bold>H</bold><italic><sub>k</sub></italic>, as well as the covariance matrices <bold>Q</bold><sub><italic>k</italic>−1</sub> and <bold>R</bold><italic><sub>k</sub></italic>, are allowed to be time-variant. For the reader’s convenience, the KF equations are reported in <xref ref-type="app" rid="app1">Appendix A</xref>.</p>
<p>The Extended Kalman Filter (EKF) is derived for nonlinear systems with additive noise:
<disp-formula id="FD66">
<label>(66)</label>
<mml:math display="block">
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold">z</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>h</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>.</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula></p>
<p>The additive noises <bold>w</bold><sub><italic>k</italic>−1</sub> and <bold>v</bold><italic><sub>k</sub></italic> are mutually independent, zero-mean white Gaussian with known covariance matrices <bold>Q</bold><sub><italic>k</italic>−1</sub> and <bold>R</bold><italic><sub>k</sub></italic>, respectively. The EKF is based on the assumption that local descriptions of the nonlinear functions <italic>f</italic><sub><italic>k</italic>−1</sub>(<bold>x</bold><sub><italic>k</italic>−1</sub>) and <italic>h<sub>k</sub></italic>(<bold>x</bold><italic><sub>k</sub></italic>) can be obtained by approximating them using only the first term in the Taylor series expansion. The posterior PDF <italic>p</italic>(<bold>x</bold><italic><sub>k</sub></italic>|<bold>z</bold><sub>1:<italic>k</italic></sub>) is therefore approximated by a Gaussian density. The local linearization requires the computation of the Jacobian matrices of the dynamic model, the measurement model or both with current predicted states, see <xref ref-type="app" rid="app1">Appendix A</xref>.</p>
<p>The EKF and its many variants are referred to as analytic approximations because the Jacobian matrices <bold>F</bold><sub><italic>k</italic>−1</sub> and <bold>H</bold><italic><sub>k</sub></italic> have to be computed analytically. Moreover, it is worthy noting that the EKF always approximates the posterior PDF <italic>p</italic>(<bold>x</bold><italic><sub>k</sub></italic>|<bold>z</bold><sub>1:<italic>k</italic></sub>) as a multivariate Gaussian. If the nonlinearity in models is severe, the non-Gaussian nature of the posterior PDF <italic>p</italic>(<bold>x</bold><italic><sub>k</sub></italic>|<bold>z</bold><sub>1:<italic>k</italic></sub>) can be pronounced, e.g., it can be multimodal, heavily-tailed or skewed: the approximation to first-order is grossly inaccurate and the performance of the EKF can therefore be seriously degraded. In general, besides the computational costs incurred in the calculations of the Jacobian matrices, other disadvantages of the linearization procedure implemented in an EKF concern the sensitivity to initial conditions, biases in the estimation errors, critical problems of convergence and filter stability, especially when the sampling interval is too small.</p>
<p>The Unscented Kalman Filter (UKF) is developed with the aim to overcome these limitations [<xref ref-type="bibr" rid="b45-sensors-11-01489">45</xref>]. The UKF hinges on the assumption that it is easier to approximate a Gaussian distribution than it is to approximate an arbitrary nonlinear function. Instead of linearizing using Jacobian matrices, the UKF adopts a deterministic sampling approach to capture the estimates of the mean vector and the covariance matrix with a minimal set of sample points; this “capture” is accurate to the second-order Taylor series expansion for any nonlinearity. The UKF can be used with non-differentiable functions, it does not require the derivation of Jacobian matrices (derivative-free), and is valid to higher-order expansions than the standard EKF. Some work concerning applications for aircraft guidance and control shows the superiority of UKF over EKF, particularly in the presence of large initialization errors [<xref ref-type="bibr" rid="b46-sensors-11-01489">46</xref>]. However, this is not usually the case with human body motion tracking applications. This is because, mostly, the filter operation starts with the human body being typically at rest within magnetically clean regions, and well-calibrated inertial/magnetic sensors, see Section 5. Hence, a gyro-free aiding sensor system can feed the EKF with accurate data for initialization at first contact. Moreover, there appears to be wide consensus that, in human body motion capture applications, although the EKF and the UKF may have roughly the same accuracy, the computational overhead of the UKF, the simplicity of the calculations of the Jacobian matrices, and the quasi-Gaussian nature of the posterior PDF <italic>p</italic>(<bold>x</bold><italic><sub>k</sub></italic>|<bold>z</bold><sub>1:<italic>k</italic></sub>) contribute to make the EKF a preferred choice, even in the most demanding scenarios [<xref ref-type="bibr" rid="b47-sensors-11-01489">47</xref>,<xref ref-type="bibr" rid="b48-sensors-11-01489">48</xref>]. In order to keep the length of this paper within reasonable limits, UKF and more advanced Bayesian filters, namely particle filters [<xref ref-type="bibr" rid="b48-sensors-11-01489">48</xref>,<xref ref-type="bibr" rid="b49-sensors-11-01489">49</xref>], are not further addressed here.</p></sec></sec>
<sec sec-type="methods">
<label>5.</label>
<title>Designing a Quaternion-Based EKF for Orientation Determination</title>
<p>In applying Kalman filtering to the problem of inertial orientation tracking there is considerable freedom in dynamic and measurement modelling [<xref ref-type="bibr" rid="b50-sensors-11-01489">50</xref>]. In this Section the discussion concerns how EKFs can be designed when the quaternion is chosen to represent the orientation. The main difficulty of using quaternion-based state vector components is in the application of the filter equations. This difficulty is due to the lack of independence of the four components of a quaternion, which are related by the constraint that the quaternion must have unit norm in order to represent a valid orientation. Constraints imposed on the estimated state variables cannot be preserved by EKFs in their standard development [<xref ref-type="bibr" rid="b51-sensors-11-01489">51</xref>].</p>
<sec>
<label>5.1.</label>
<title>Dynamic Modelling</title>
<p>The most principled way to preserve the unit-norm property of the estimated quaternion is to create an algorithm where the error between the true and estimated quaternions is itself a quaternion and is multiplied (in the sense of quaternion multiplication) with the <italic>a priori</italic> quaternion estimate to yield the <italic>a posteriori</italic> estimate [<xref ref-type="bibr" rid="b51-sensors-11-01489">51</xref>]. This kind of EKF is called multiplicative EKF (MEKF), which differs from the classic additive EKF (AEKF), which employs quaternion subtraction in place of quaternion multiplication [<xref ref-type="bibr" rid="b52-sensors-11-01489">52</xref>]. An MEKF parameterizes the global orientation with a non-singular unit quaternion, while any unconstrained three-dimensional representation is used to represent the orientation errors [<xref ref-type="bibr" rid="b53-sensors-11-01489">53</xref>]. The dynamic model in an MEKF describes therefore the kinematic equations of a rigid body in terms of the relationships existing between the three-dimensional orientation error and the angular velocity [<xref ref-type="bibr" rid="b46-sensors-11-01489">46</xref>]. Strong similarities exist between the MEKF approach and the so-called indirect-state formulation of the Kalman process. In analogy with an MEKF, the indirect-state EKF includes a three-dimensional orientation error in the state vector [<xref ref-type="bibr" rid="b54-sensors-11-01489">54</xref>]. The potential advantages of an indirect-state filter are that the state dimension is smaller as compared with a direct-state filter, with subsequent computational savings [<xref ref-type="bibr" rid="b50-sensors-11-01489">50</xref>].</p>
<p>In spite that MEKFs are theoretically correct in treating the normalization constraint, most reported implementations regard the application of AEKFs. AEKFs relax the quaternion unit-norm constraint and treat the four components of the quaternion as independent parameters. A method to preserve the quaternion unit-norm property is to derive a sort of quaternion measurement model from the non-linear equation that expresses the unit-norm property (pseudo-measurement model) [<xref ref-type="bibr" rid="b47-sensors-11-01489">47</xref>]. Another popular means is to normalize the <italic>a posteriori</italic> estimate after the measurement update stage (“brute-force” approach). Even though it is neither elegant nor optimal, the “brute-force” approach is often the preferred choice and is proven to work well [<xref ref-type="bibr" rid="b52-sensors-11-01489">52</xref>]. The exemplary EKF developed in the following is direct-state, additive and enforces the unit-norm constraint by the “brute-force” approach.</p>
<p>The dynamic equations for describing the orientation of the parts to be tracked would cause severe difficulties in the filter modelling [<xref ref-type="bibr" rid="b55-sensors-11-01489">55</xref>], and especially in human body motion capture applications, where the inputs, <italic>i.e.</italic>, muscle forces and torques, are unknown inputs [<xref ref-type="bibr" rid="b14-sensors-11-01489">14</xref>,<xref ref-type="bibr" rid="b42-sensors-11-01489">42</xref>]. The use of gyros as the primary means to estimate orientation allows circumventing these problems. Since the angular velocity of human body parts is obtained from the gyro data, the kinematic equations of a rigid body can be used to obtain the orientation state (model replacement). In other words, it is highly convenient to treat gyro data as external inputs to the filter rather than as measurements, and consequently gyro measurement noise and bias enter the filter as process noise rather than as measurement noise [<xref ref-type="bibr" rid="b22-sensors-11-01489">22</xref>,<xref ref-type="bibr" rid="b56-sensors-11-01489">56</xref>]. Another advantage of this choice is the reduction in the dimension of the state vector, which may lead to minimal-order, computationally efficient filter implementations.</p>
<p>An additional important feature of stochastic estimation algorithms like the EKFs is that gyro drift bias can be estimated by state vector augmentation techniques [<xref ref-type="bibr" rid="b57-sensors-11-01489">57</xref>]. Oftentimes, this feature is exploited, especially for applications of air and spacecraft attitude estimation, so as to compensate the gyros before performing the numerical integration of kinematics equations [<xref ref-type="bibr" rid="b36-sensors-11-01489">36</xref>,<xref ref-type="bibr" rid="b46-sensors-11-01489">46</xref>,<xref ref-type="bibr" rid="b56-sensors-11-01489">56</xref>]. This is very important in the case that the only aiding comes from occasional orientation fixes. Drift biases of the gyro-free aiding sensor system may be also estimated in the same way [<xref ref-type="bibr" rid="b14-sensors-11-01489">14</xref>,<xref ref-type="bibr" rid="b22-sensors-11-01489">22</xref>]. In general, however, these other biases cannot be estimated simultaneously with the orientation and gyro drift bias due to possible problems of system observability [<xref ref-type="bibr" rid="b58-sensors-11-01489">58</xref>].</p>
<p>Most studies in VR/AR fields employ head motion trackers that directly provide orientation measurements. In these cases, quaternions can be used with an EKF to estimate the angular velocity, which is needed to predict the future head orientation. Sometimes, angular velocity is measured with inertial sensors; the state vector can therefore be augmented with additional components, <italic>i.e.</italic>, the angular acceleration [<xref ref-type="bibr" rid="b48-sensors-11-01489">48</xref>]. Different motion models are implemented in the filtering algorithm, in order to improve the ability of the EKF to predict the head orientation for latency compensation [<xref ref-type="bibr" rid="b54-sensors-11-01489">54</xref>,<xref ref-type="bibr" rid="b59-sensors-11-01489">59</xref>]. For instance, the Constant Velocity (CV) model assumes a simple first-order Gauss-Markov (GM) model for each angular velocity component [<xref ref-type="bibr" rid="b60-sensors-11-01489">60</xref>]:
<disp-formula id="FD67">
<label>(67)</label>
<mml:math display="block">
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:mi>d</mml:mi>
<mml:mi>ω</mml:mi></mml:mrow>
<mml:mi mathvariant="italic">dt</mml:mi></mml:mfrac>
<mml:mo>=</mml:mo>
<mml:mo>−</mml:mo>
<mml:mfrac>
<mml:mn>1</mml:mn>
<mml:mi>τ</mml:mi></mml:mfrac>
<mml:mi>ω</mml:mi>
<mml:mo>+</mml:mo>
<mml:msqrt>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mn>2</mml:mn>
<mml:mi>σ</mml:mi></mml:mrow>
<mml:mn>2</mml:mn></mml:msup></mml:mrow>
<mml:mi>τ</mml:mi></mml:mfrac></mml:mrow></mml:msqrt>
<mml:mi>w</mml:mi>
<mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>where <italic>w</italic> is a Gaussian white noise, with null mean and unit variance, <italic>τ</italic> is the decorrelation time constant of the GM model and <italic>σ</italic><sup>2</sup> is a variance factor. The GM model reflects underlying assumptions about the nature of human movements, namely, (a) the change of viewing direction is infrequent; (b) the angular velocity and acceleration are nonzero only during the infrequent changes in orientation. The decorrelation time constant and the variance factor are tuned in order that the spectral properties of the signal generated by the model match those of the angular velocities for paradigmatic motions [<xref ref-type="bibr" rid="b42-sensors-11-01489">42</xref>]. More sophisticated models are also investigated, which opens the way to an interesting avenue of research concerning the development of multiple models of human (head) motion, and multiple model adaptive estimation techniques (MMAE) [<xref ref-type="bibr" rid="b61-sensors-11-01489">61</xref>].</p>
<p>In this paper, the application specifics concern orientation measurement devices that use angular velocity to estimate orientation using an EKF. At the sampling intervals that are common for these devices, say between 100–500 Hz, the angular velocity can be considered constant in the time interval between successive measurements, leading to the numerical integration of kinematic equations via <xref ref-type="disp-formula" rid="FD39">(39)</xref>–<xref ref-type="disp-formula" rid="FD40">(40)</xref>; the addition of some process noise may further help improving filter stability.</p></sec>
<sec>
<label>5.2.</label>
<title>Sensor Modelling</title>
<p>In a fully integrated IMMU, the gyro, the accelerometer and the magnetometer are each tri-axial, with mutually orthogonal sensitivity axes. Their output in response to the body angular velocity <bold>ω</bold><sub>body</sub>, acceleration (gravity <bold>g</bold> and body acceleration <bold>a</bold><sub>body</sub>), and local magnetic field (earth’s magnetic field <bold>h</bold><sub>earth</sub> and some local magnetic effect modelled as a time-invariant magnetic vector <bold>h</bold><sub>ext</sub>) are:
<disp-formula id="FD68">
<label>(68)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>g</mml:mi></mml:msup>
<mml:mi mathvariant="bold">K</mml:mi>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mtext>body</mml:mtext></mml:msub>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>g</mml:mi></mml:msup>
<mml:mi mathvariant="bold">b</mml:mi>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>g</mml:mi></mml:msup>
<mml:mi mathvariant="bold">v</mml:mi></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">a</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>a</mml:mi></mml:msup>
<mml:mi mathvariant="bold">K</mml:mi>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mi mathvariant="bold">g</mml:mi>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">a</mml:mi>
<mml:mtext>body</mml:mtext></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>a</mml:mi></mml:msup>
<mml:mi mathvariant="bold">b</mml:mi>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>a</mml:mi></mml:msup>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mtext> </mml:mtext></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">h</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>h</mml:mi></mml:msup>
<mml:mi mathvariant="bold">K</mml:mi>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">h</mml:mi>
<mml:mtext>earth</mml:mtext></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">h</mml:mi>
<mml:mtext>ext</mml:mtext></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>h</mml:mi></mml:msup>
<mml:mi mathvariant="bold">b</mml:mi>
<mml:mo>+</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>h</mml:mi></mml:msup>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:math></disp-formula>where <italic><sup>g</sup></italic><bold>K</bold>, <italic><sup>a</sup></italic><bold>K</bold> and <italic><sup>m</sup></italic><bold>K</bold> are the matrices of the scale factors (ideally, they are equal to <bold>I</bold><sub>3</sub>); <italic><sup>g</sup></italic><bold>b</bold>, <italic><sup>a</sup></italic><bold>b</bold> and <italic><sup>h</sup></italic><bold>b</bold> are the bias vectors (ideally, they are null); <italic><sup>g</sup></italic><bold>v</bold>, <italic><sup>a</sup></italic><bold>v</bold> and <italic><sup>h</sup></italic><bold>v</bold> are assumed uncorrelated white Gaussian measurement noise, with null mean and covariance matrix 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:msub>
<mml:mo>Σ</mml:mo>
<mml:mi>g</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mi>σ</mml:mi>
<mml:mi>g</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula>, 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:msub>
<mml:mo>Σ</mml:mo>
<mml:mi>a</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mi>σ</mml:mi>
<mml:mi>a</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula> and 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:msub>
<mml:mo>Σ</mml:mo>
<mml:mi>h</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mi>σ</mml:mi>
<mml:mi>h</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula>. <xref ref-type="disp-formula" rid="FD68">Equation (68)</xref> is a simplified model that does not account for additional error sources, such as cross-axis sensitivity, gyro <italic>g</italic>-sensitivity, nonlinearity, hysteresis and misalignment [<xref ref-type="bibr" rid="b62-sensors-11-01489">62</xref>]. It is worthy noting that a further simplification is made in the gyro model by omitting the earth’s angular velocity of 15°/hour, since state-of-the-art MEMS gyros are unable to sense this component. Their bias stability is indeed in the order of 1°/s—the bias stability is usually specified as a 1σ value, and it describes how the bias may change over a specified period of time, typically around 100 s, in fixed conditions (usually including constant temperature) [<xref ref-type="bibr" rid="b26-sensors-11-01489">26</xref>].</p>
<p>To proceed in the discussion of the sensor model <xref ref-type="disp-formula" rid="FD68">(68)</xref>, remind that an accelerometer measures the projection along its sensitive axis of the specific force <italic>f</italic> it is submitted. The specific force additively combines the linear acceleration component <italic>a</italic>, due to body motion, and the gravitational acceleration component, –<italic>g</italic>, both projected along the sensitive axis of the accelerometer, <xref ref-type="fig" rid="f4-sensors-11-01489">Figure 5</xref>. In common parlance, the high-frequency component, aka the AC component, is related to the dynamic motion the subject is performing, e.g., walking, hand weaving, head shaking, and so forth, while the low-frequency component of the acceleration signal, aka the zero-frequency (DC) component, is related to the influence of gravity, and it can be exploited to identify static postures [<xref ref-type="bibr" rid="b63-sensors-11-01489">63</xref>].</p>
<p>The bias and scale factor of inertial and magnetic sensors are functions of environmental conditions, in particular ambient temperature; this is especially true for gyros [<xref ref-type="bibr" rid="b64-sensors-11-01489">64</xref>]. Temperature effects on accelerometers are of relatively lower quantitative relevance, and they are usually negligible on magnetic sensors across the thermal variations that they may encounter in practice. Moreover, scale factor drifts of inertial and magnetic sensors usually affect the accuracy of the measurement process to a much lesser extent than the bias drifts of these sensors. The influence of temperature on the gyro bias drift is particularly significant after that power is applied to gyros, as a result of device self-heating. Provided that gyros are allowed warm-up and thermal stabilization for few minutes, then their biases tend to change quite slowly with time. In practice, gyro bias errors can be calibrated and compensated effectively by so-called “zero attitude updates”, which require keeping the gyros from rotating. It is dependent on the nature of the specific application whether occasional rests can be assumed for the human body part to be monitored and tracked [<xref ref-type="bibr" rid="b65-sensors-11-01489">65</xref>]. As for the scale factor calibration, procedures suited for in-field use are available [<xref ref-type="bibr" rid="b62-sensors-11-01489">62</xref>,<xref ref-type="bibr" rid="b66-sensors-11-01489">66</xref>]. The scale factor and bias errors of accelerometers can be calibrated and compensated by so-called “zero-velocity updates”, which require keeping the accelerometers from moving, although they are difficult to implement and may require specific manoeuvres to work properly [<xref ref-type="bibr" rid="b67-sensors-11-01489">67</xref>]. In analogy with accelerometers, the scale factor and electronic bias errors of magnetic sensors can be calibrated and compensated effectively by in-field procedures [<xref ref-type="bibr" rid="b68-sensors-11-01489">68</xref>]. In the case of experimental sessions lasting few minutes, it is quite safe to assume that the scale factor and bias errors of inertial and magnetic sensors are null, provided that the sensors are carefully calibrated before starting as explained above.</p>
<p>The problem of magnetic variations due to ferromagnetic materials in the vicinity of a magnetic sensor raises additional modelling considerations. <xref ref-type="disp-formula" rid="FD68">Equation (68)</xref> shows that the reference magnetic vector is not necessarily the earth’s magnetic field <bold>h</bold><sub>earth</sub>. The presence of any constant field vector <bold>h</bold><sub>ext</sub> superimposed on <bold>h</bold><sub>earth</sub> does not preclude the possibility of constructing the horizontal reference needed for orientation estimation, provided that <bold>h</bold><sub>ext</sub> is accurately known. This is in contrast with the need to perform ambulatory measurements, without prior knowledge of existence and location of disturbances. Moreover, we have to consider dynamic effects that are related to either ferromagnetic objects moving in the vicinity of the sensor or to movements of the body-fixed sensor relative to static ferromagnetic objects. Because of these dynamic effects, <bold>h</bold><sub>ext</sub> turns out to be time-variant and unknown. A strategy to tackle this problem is to assume that a time-variant bias error <italic><sup>h</sup></italic><bold>b</bold> is present in the magnetic sensor output. In the dynamic model the kinematics equations are therefore augmented with additional equations yielding the model of the behaviour in time of <bold>h</bold><sub>ext</sub> by “absorbing” it into a mathematical model of the magnetic drift bias, e.g., random-walk or first-order Gauss-Markov models (state augmentation). In other terms, the horizontal reference is built and maintained by the EKF itself (auto-calibration) [<xref ref-type="bibr" rid="b21-sensors-11-01489">21</xref>,<xref ref-type="bibr" rid="b22-sensors-11-01489">22</xref>].</p></sec>
<sec>
<label>5.3.</label>
<title>Measurement Equations</title>
<p>The role of aiding sensors is played by accelerometers, taken alone or in combination with magnetic sensors. Sometimes, and depending on the requirements of a specific application, the complexity of the measurement hardware setup, and the sophistication of the filtering algorithms as well, can be reduced to some extent. Simplifying assumptions are quite common in applications to gait analysis [<xref ref-type="bibr" rid="b65-sensors-11-01489">65</xref>]. For instance, in the case that motion outside the sagittal plane is assumed not to take place, accelerometers can be used without magnetic sensors, and, since the acceleration sensitivity axes can be embedded in the sagittal plane, simpler bi-axial configurations may suffice. Analogously, uni-axial gyros are enough to capture angular velocities when rotations are approximately about a single axis, oriented in the medio-lateral direction (orthogonal to the sagittal plane).</p>
<p>If motion occurs in the 3D space, heading estimation requires a horizontal reference, for which construction an IMMU is necessary. Few possibilities exist as for the choice of the measurement model. Since we prefer to take the measured angular velocity as an input to the filter, we have to decide how to handle acceleration and magnetic measurements. They can be fused together directly using any deterministic attitude estimation algorithm, e.g., TRIAD, QUEST, FQA, GN optimizer. An advantage of single-frame deterministic algorithms that deliver the quaternion at their output is that the measurement equations are linear; with the exception of the GN optimizer, see <xref ref-type="disp-formula" rid="FD57">(57)</xref>–<xref ref-type="disp-formula" rid="FD58">(58)</xref> in this regard, the unit-norm property of the measured quaternion is also preserved. The FQA is a potentially good choice, because of the decoupling of magnetic and acceleration data in estimating heading and inclination. A difficulty with this approach is in constructing the expression of the measurement noise covariance, a problem apparently dismissed in [<xref ref-type="bibr" rid="b41-sensors-11-01489">41</xref>]. Analytical expressions of the covariance matrix for the TRIAD algorithm and QUEST are derived in [<xref ref-type="bibr" rid="b40-sensors-11-01489">40</xref>]: it is proven that the noise in the quaternion measurements presents quaternion-dependent covariance matrices. The dependence on the quaternion is not a problem <italic>per se</italic>, since the predicted state can be used in place of the true unknown state. An element of complication is that the noisy reference magnetic vector estimated by the EKF must be used in the process of vector matching.</p>
<p>Alternatively, each reference vector component is given a specific measurement equation, which helps moving its representation from the earth-fixed to the body-fixed frame via either <xref ref-type="disp-formula" rid="FD24">(24)</xref> or the rule of composition <xref ref-type="disp-formula" rid="FD33">(33)</xref>:
<disp-formula id="FD69">
<label>(69)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">a</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">h</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mi>k</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mi mathvariant="bold">0</mml:mi></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mi mathvariant="bold">0</mml:mi></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mi>k</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mi mathvariant="bold">g</mml:mi></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mi mathvariant="bold">h</mml:mi></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>a</mml:mi></mml:msup>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:msub>
<mml:mrow/>
<mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>h</mml:mi></mml:msup>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:msub>
<mml:mrow/>
<mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula>as done, e.g., in [<xref ref-type="bibr" rid="b22-sensors-11-01489">22</xref>,<xref ref-type="bibr" rid="b24-sensors-11-01489">24</xref>]. The measurement equations are nonlinear, which forces to compute their Jacobian matrices when carrying out the linearization process; however, the computations are neither algebraically difficult nor computationally demanding. The derivation of the measurement noise covariance matrix is not difficult as well, since it can be expressed directly in terms of the statistics of the measurement noise affecting each sensor.</p></sec>
<sec>
<label>5.4.</label>
<title>Vector Selection</title>
<p>Another important issue in the EKF design deals with its behaviour when anomalous measurements are received. It takes relatively long for an EKF to recover from false measurements when they are given the opportunity to contribute to the estimate of the state vector [<xref ref-type="bibr" rid="b57-sensors-11-01489">57</xref>]. The best approach to deal with this problem would consist of preventing the filter from processing data whose reliability is suspected to be low [<xref ref-type="bibr" rid="b22-sensors-11-01489">22</xref>,<xref ref-type="bibr" rid="b24-sensors-11-01489">24</xref>].</p>
<p>As for the acceleration, in order to answer the question whether the body-fixed measured acceleration vector is suitable for measuring gravity, we would compare its norm with the known value of gravity; better yet, we may decide to work directly with the norm of the difference between the measured acceleration vector, resolved in the earth-fixed frame, and the gravity. If the deviation exceeds some properly chosen threshold value, a sensor glitch, or a contamination due to body motion would be suspected. Different actions can be taken: the measured vector is discarded, and the filter update is only based on magnetic measurements, unless they too are considered unreliable. This is equivalent to temporarily set the acceleration measurement noise variance to some large value, which can be considered, to all practical purposes, infinite:
<disp-formula id="FD70">
<label>(70)</label>
<mml:math display="block">
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>R</mml:mi></mml:msup>
<mml:msubsup>
<mml:mi>σ</mml:mi>
<mml:mi>a</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mi>σ</mml:mi>
<mml:mi>a</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">a</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mo>−</mml:mo></mml:mrow></mml:msubsup></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">g</mml:mi></mml:mrow>
<mml:mo>|</mml:mo></mml:mrow>
<mml:mo>&lt;</mml:mo>
<mml:msub>
<mml:mi>ɛ</mml:mi>
<mml:mi>a</mml:mi></mml:msub></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>∞</mml:mo>
<mml:mo>,</mml:mo></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mtext>otherwise</mml:mtext>
<mml:mo>,</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:math></disp-formula>where <italic>ɛ<sub>a</sub></italic> is a suitably chosen threshold. An alternative approach consists of defining a suitable law for relating the increase of the acceleration measurement noise variance to the actual deviation of the measured acceleration vector from the gravity. According to our experience, the norm-based adaptive algorithm <xref ref-type="disp-formula" rid="FD70">(70)</xref> works adequately in most practical conditions. Note that the quaternion predicted by the filter at time <italic>t</italic><sub><italic>k</italic>−1</sub> is used in <xref ref-type="disp-formula" rid="FD70">(70)</xref>, in place of the unknown true quaternion at the time instant <italic>t<sub>k</sub></italic>.</p>
<p>A similar approach can be pursued as for the magnetic measurements. In this case we have to work with the difference between the measured magnetic vector, resolved in the earth-fixed frame, and the local magnetic reference vector. Sometimes, computing the dip angle is suggested to help improving the process; the dip angle is the angle between the magnetic field and the horizontal plane, which would be constant for given latitude and longitude. Unfortunately, the dip angle varies very erratically, especially within indoor environments, and we find its use somewhat critical. An effective norm-based adaptive algorithm applied to the magnetic sensor measurement noise variance is as follows:
<disp-formula id="FD71">
<label>(71)</label>
<mml:math display="block">
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>R</mml:mi></mml:msup>
<mml:msubsup>
<mml:mi>σ</mml:mi>
<mml:mi>h</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msubsup>
<mml:mi>σ</mml:mi>
<mml:mi>h</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mo>,</mml:mo></mml:mrow>
<mml:mtd/>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">h</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mrow/>
<mml:mi>B</mml:mi>
<mml:mi>E</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mo>−</mml:mo></mml:msubsup></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">h</mml:mi>
<mml:mtext>earth</mml:mtext></mml:msub>
<mml:mo>−</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>h</mml:mi></mml:msup>
<mml:mi mathvariant="bold">b</mml:mi>
<mml:msubsup>
<mml:mrow/>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mo>−</mml:mo></mml:msubsup></mml:mrow>
<mml:mo>|</mml:mo></mml:mrow>
<mml:mo>&lt;</mml:mo>
<mml:msub>
<mml:mi>ɛ</mml:mi>
<mml:mi>h</mml:mi></mml:msub></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>∞</mml:mo>
<mml:mo>,</mml:mo></mml:mrow>
<mml:mtd/>
<mml:mtext>otherwise</mml:mtext>
<mml:mo>,</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:math></disp-formula>where <italic>ɛ<sub>h</sub></italic> is a suitably chosen threshold. The problem with this approach is that we must assume that the local magnetic reference vector is known, which is not the case unless the magnetic bias auto-calibration feature is implemented in the EKF. Note that the magnetic bias predicted by the filter at time <italic>t</italic><sub><italic>k</italic>−1</sub> is used in <xref ref-type="disp-formula" rid="FD71">(71)</xref>, in place of its unknown true value at time <italic>t<sub>k</sub></italic>.</p>
<p>A final comment concerns the applications in gait analysis, in the particularly important case that the IMMU is placed on the lower limbs, e.g., on the foot instep [<xref ref-type="bibr" rid="b65-sensors-11-01489">65</xref>]. Rather than fusing them in an EKF, accelerometer data are used just to align the IMMU when the foot is at rest (stance phase of the gait cycle), followed by gyro integration during the swing phase of the gait cycle. During the swing phase the acceleration signals are indeed dominated by the inertial component, which means that the condition implied by <xref ref-type="disp-formula" rid="FD70">(70)</xref> is almost never fulfilled. The stride-by-stride gyro integration reset allows mitigating the random-walk errors associated with the integration of gyro wideband measurement noise. To perform stance detection, we need a variant of the norm-based adaptive algorithm <xref ref-type="disp-formula" rid="FD70">(70)</xref>, or possibly a similar algorithm applied to gyro data:
<disp-formula id="FD72">
<label>(72)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">a</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mrow/>
<mml:mi mathvariant="normal">E</mml:mi>
<mml:mi mathvariant="normal">B</mml:mi></mml:msubsup>
<mml:mi mathvariant="bold">C</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi>i</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mrow>
<mml:mi> </mml:mi>
<mml:mo>−</mml:mo></mml:mrow></mml:msubsup></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mi mathvariant="bold">g</mml:mi></mml:mrow>
<mml:mo>|</mml:mo></mml:mrow>
<mml:mo>&lt;</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mi>ɛ</mml:mi></mml:mrow>
<mml:mi>a</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:mo>∪</mml:mo>
<mml:mo> </mml:mo>
<mml:mi> </mml:mi>
<mml:mrow>
<mml:mo>|</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow>
<mml:mo>|</mml:mo></mml:mrow>
<mml:mo>&lt;</mml:mo>
<mml:msub>
<mml:mi>ɛ</mml:mi>
<mml:mi>g</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:mtext>for</mml:mtext>
<mml:mi> </mml:mi>
<mml:mi>i</mml:mi>
<mml:mo>∈</mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mi>K</mml:mi>
<mml:mo>,</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mo>,</mml:mo></mml:mrow></mml:math></disp-formula>where <italic>ɛ<sub>g</sub></italic> is a suitably chosen threshold, and <italic>KT<sub>s</sub></italic> is the given amount of time to detect when the foot is at rest.</p></sec>
<sec>
<label>5.5.</label>
<title>Filter Parameter Tuning</title>
<p>The parameters to be tuned in an EKF concern the statistical properties assumed for the process noise and the measurement noise. Since they are modelled as Gaussian noise, we need to specify the possibly time-variant covariance matrices <bold>R</bold><italic><sub>k</sub></italic> and <bold>Q</bold><italic><sub>k</sub></italic> [<xref ref-type="bibr" rid="b57-sensors-11-01489">57</xref>,<xref ref-type="bibr" rid="b69-sensors-11-01489">69</xref>].</p>
<p>The measurement noise covariance matrix <bold>R</bold><italic><sub>k</sub></italic> is usually built from an isotropic model of sensor behaviour: the sensing elements that form each triad are characterized by the same measurement noise variance, hence <bold>R</bold><italic><sub>k</sub></italic> is proportional to a identity matrix, or it presents a block-diagonal structure. The measurement noise variances are estimated by taking samples from the sensors at a stationary location. The estimated measurement noise variances can be slightly increased over the on-bench calibration values, to help the EKF stability. In this way, for instance, tremulous motions that an accelerometer can be subject to or minute magnetic variations that can be observed for even very small sensor displacements can be accounted for as noise components in the filter. The EKF is generally quite robust to mismodelling errors in the measurement noise covariance matrix.</p>
<p>Once the structure of the process noise covariance matrix <bold>Q</bold><italic><sub>k</sub></italic> is determined, it can be convenient to use scaling parameters that are applied to specific blocks of <bold>Q</bold><italic><sub>k</sub></italic>. The values of the scaling parameters can be determined using a non-linear optimization routine for values that optimize the filter behaviour in given operating conditions [<xref ref-type="bibr" rid="b59-sensors-11-01489">59</xref>]. Some considerations in parameter tuning must be directed to the belief attached to the validity of the process model. In assessing the model validity, for instance, we have to consider the many gyro error sources besides bias that are not modelled using <xref ref-type="disp-formula" rid="FD68">(68)</xref>, and the assumption that the angular velocity is constant in the time interval between consecutives updates by the EKF. In particular, the latter assumption can be criticized either for high dynamic motions, low sampling frequencies or both. In any case, it is known that increasing the value of the scaling parameters tends to make the filter response more prompt, at the expense of some degradation in the accuracy of the state vector estimates when the system’s behaviour is more benign. The filter response can also be adjusted by on-line adaptation of <bold>Q</bold><italic><sub>k</sub></italic>. This can be done according to different means, e.g., by detecting statistically significant changes in the innovation produced by the filter—fading memory algorithm, [<xref ref-type="bibr" rid="b70-sensors-11-01489">70</xref>]. We do not introduce any <bold>Q</bold>-adaptation in the exemplary EKF presented in this paper. In general, it would be said that the EKF is less robust to mismodelling errors in <bold>Q</bold><italic><sub>k</sub></italic> than in <bold>R</bold><italic><sub>k</sub></italic>.</p>
<p>A study concerning the EKF performance assessment can be performed on experimental or synthetic motion data. With the former approach a series of experiments is performed, where monitored subjects are asked to perform paradigmatic motions. The main problem is that the true motion signals are unknown, because of the noise present in the measurement data. It is possible to smooth the data to some extent and use them as a reference signal, but the risk is to introduce false signal features, while removing true ones. With the latter approach, the main problem is whether the synthetic signals really capture the exact characteristics of the paradigmatic motions or not. If not, it is difficult to predict filter performance when applied to real-life tasks. As neither of these approaches is perfect, both analyses are usually performed and attempts are made to relate them to each other.</p>
<p>Mostly, in order to construct a dataset according to the approach based on experimental motion data, the motion is recorded using a gold standard optical tracker. The truth-reference unit quaternion <bold>q̄</bold><sub>true</sub> can be built from the 3D-position coordinates of a minimum of three markers, using, e.g., the Horn algorithm [<xref ref-type="bibr" rid="b71-sensors-11-01489">71</xref>]. Quaternion smoothing can be performed by using norm-preserving orientation filters [<xref ref-type="bibr" rid="b72-sensors-11-01489">72</xref>] or by independently filtering the quaternion components with any standard low-pass filter, followed by “brute force” normalization [<xref ref-type="bibr" rid="b22-sensors-11-01489">22</xref>]. In order to implement a simulation environment for Monte Carlo simulation studies, standard conversion formulas can be applied to construct the orientation vector from the unit quaternion [<xref ref-type="bibr" rid="b30-sensors-11-01489">30</xref>]. The orientation vector and its time derivative are then used to synthesize the angular velocity vector that generates the specified orientation [<xref ref-type="bibr" rid="b73-sensors-11-01489">73</xref>]. The sensed gravity and magnetic field are computed from resolving gravity and magnetic field into the body frame using <xref ref-type="disp-formula" rid="FD32">(32)</xref>; additive white Gaussian noises with null mean and assigned variance are added to simulate the sensor measurements during the motion. Any given disturbance, e.g., body acceleration and magnetic variation can also be added into the simulated sensor signals before resolving them in the body-fixed frame.</p></sec>
<sec>
<label>5.6.</label>
<title>Filter Performance Assessment</title>
<p>The performance metrics can be based on computing 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:mo>Δ</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mtext>true</mml:mtext>
<mml:mrow>
<mml:mi> </mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msubsup>
<mml:mo>⊗</mml:mo>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow></mml:math></inline-formula>, where <bold>q̄</bold><sub>true</sub> and <bold>q̄</bold> are the true and the estimated quaternions, respectively. The quaternion Δ<bold>q̄</bold> represents therefore the rotation that brings the estimated body frame onto the true body frame. The orientation error Δ<italic>θ</italic> is obtained from the scalar component of Δ<bold>q̄</bold> according to the equation Δ<italic>θ</italic> = 2 arccos (Δ<italic>q</italic><sub>4</sub>). The performance metrics are expressed in terms of the root-mean-square-value of the orientation error (RMSE<italic><sub>θ</sub></italic>), averaged over the number of either the Monte Carlo simulation runs or the experimental trials available. Alternatively, a set of estimated and reference Euler angles can be computed from <bold>q̄</bold><sub>true</sub> and <bold>q̄</bold> using standard conversion formulas, and the filter performance can be summarized by presenting the RMSEs of the Euler angles, again averaged over the number of either the Monte Carlo simulation runs or the experimental trials available. An obvious advantage of working with synthetic motion signals is that the errors incurred in estimating the state vector components can be compared with the bounds that are predicted by the error covariance matrix produced by the EKF. This is a useful feature to assess the filter convergence and to diagnose a number of potential problems arising in its numerical implementation. Of course, this possibility is precluded when working with experimental motion signals.</p></sec>
<sec>
<label>5.7.</label>
<title>Exemplary Direct-State EKF</title>
<p>The dynamic model equation is as follows:
<disp-formula id="FD73">
<label>(73)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>h</mml:mi></mml:msup>
<mml:msub>
<mml:mi mathvariant="bold">b</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mtext>exp</mml:mtext>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:mi mathvariant="bold">Ω</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ω</mml:mi>
<mml:mi>B</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi>t</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mi>s</mml:mi></mml:msub></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mi mathvariant="bold">0</mml:mi></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mi mathvariant="bold">0</mml:mi></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mi> </mml:mi>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>h</mml:mi></mml:msup>
<mml:msub>
<mml:mi mathvariant="bold">b</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>q</mml:mi></mml:msup>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>h</mml:mi></mml:msup>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mi> </mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p>The dynamic model is linear and time-variant. Implicit in the formulation <xref ref-type="disp-formula" rid="FD73">(73)</xref> is that the gyro biases are negligible. The auto-calibration feature implemented in the filter is limited to handling the problem of magnetic variations, by modelling the magnetic bias as a random-walk process driven by the zero-mean white Gaussian noise vector <italic><sup>h</sup></italic><bold>w</bold><italic><sub>k</sub></italic>.</p>
<p>The validity of the model part that describes the time-evolution of the unit quaternion depends on the assumption that the angular velocity is constant in the time interval [<italic>t</italic><sub><italic>k</italic>−1</sub> <italic>t<sub>k</sub></italic>]. The process noise component is:
<disp-formula id="FD74">
<label>(74)</label>
<mml:math display="block">
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>q</mml:mi></mml:msup>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>−</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mi>s</mml:mi></mml:msub></mml:mrow>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mo> </mml:mo>
<mml:mi mathvariant="bold">Ξ</mml:mi>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mover accent="true">
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mo>¯</mml:mo></mml:mover></mml:mrow>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>g</mml:mi></mml:msup>
<mml:mo> </mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:mo>−</mml:mo>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mi>s</mml:mi></mml:msub></mml:mrow>
<mml:mn>2</mml:mn></mml:mfrac>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mrow>
<mml:mo stretchy="false">[</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>×</mml:mo></mml:mrow>
<mml:mo stretchy="false">]</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi>q</mml:mi>
<mml:mrow>
<mml:mn>4</mml:mn>
<mml:mi> </mml:mi>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:msub>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:msubsup>
<mml:mi mathvariant="bold">q</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>T</mml:mi></mml:msubsup></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mi> </mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula><italic><sup>q</sup></italic><bold>w</bold><sub><italic>k</italic>−1</sub> describes how the gyro noise enters the state model through a quaternion-dependent linear transformation. The process noise component <italic><sup>h</sup></italic><bold>w</bold><sub><italic>k</italic>−1</sub> is assumed to have covariance matrix 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>b</mml:mi></mml:msup>
<mml:mo>Σ</mml:mo>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mi>s</mml:mi></mml:msub>
<mml:mi> </mml:mi>
<mml:msubsup>
<mml:mi>σ</mml:mi>
<mml:mi>b</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub></mml:mrow></mml:math></inline-formula>. The variance term 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:msubsup>
<mml:mi>σ</mml:mi>
<mml:mi>b</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup></mml:mrow></mml:math></inline-formula> reflects the <italic>a priori</italic> belief about the severity of the magnetic variations in the given environment.</p>
<p>Because of the assumption that <italic><sup>q</sup></italic><bold>w</bold><sub><italic>k</italic>−1</sub> and <italic><sup>h</sup></italic><bold>w</bold><sub><italic>k</italic>−1</sub> are uncorrelated, the process noise covariance matrix <bold>Q</bold><italic><sub>k</sub></italic> has the following block-diagonal structure:
<disp-formula id="FD75">
<label>(75)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">Q</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:mfrac>
<mml:mrow>
<mml:msub>
<mml:mi>T</mml:mi>
<mml:mi>s</mml:mi></mml:msub></mml:mrow>
<mml:mn>2</mml:mn></mml:mfrac></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mn>2</mml:mn></mml:msup>
<mml:msub>
<mml:mi mathvariant="bold">Ξ</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:msup>
<mml:mrow/>
<mml:mi>g</mml:mi></mml:msup>
<mml:mo>Σ</mml:mo>
<mml:msubsup>
<mml:mi mathvariant="bold">Ξ</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>T</mml:mi></mml:msubsup></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mi mathvariant="italic">0</mml:mi></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mi mathvariant="italic">0</mml:mi></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>b</mml:mi></mml:msup>
<mml:mo>Σ</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mi> </mml:mi>
<mml:mo>.</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula></p>
<p><xref ref-type="disp-formula" rid="FD69">Equation (69)</xref> describes the measurement model. The measurement noise covariance matrix is:
<disp-formula id="FD76">
<label>(76)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:mrow>
<mml:mo>[</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>a</mml:mi></mml:msup>
<mml:msub>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:mtd>
<mml:mtd>
<mml:mi mathvariant="bold">0</mml:mi></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mi mathvariant="bold">0</mml:mi></mml:mtd>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>h</mml:mi></mml:msup>
<mml:msub>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow>
<mml:mo>]</mml:mo>
<mml:mi> </mml:mi>
<mml:mo>,</mml:mo></mml:mrow></mml:mrow></mml:math></disp-formula>with:
<disp-formula id="FD77">
<label>(77)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>a</mml:mi></mml:msup>
<mml:msub>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>R</mml:mi></mml:msup>
<mml:msubsup>
<mml:mi>σ</mml:mi>
<mml:mi>a</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mi> </mml:mi></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msup>
<mml:mrow/>
<mml:mi>h</mml:mi></mml:msup>
<mml:msub>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msup>
<mml:mrow/>
<mml:mi>R</mml:mi></mml:msup>
<mml:msubsup>
<mml:mi>σ</mml:mi>
<mml:mi>h</mml:mi>
<mml:mn>2</mml:mn></mml:msubsup>
<mml:mi> </mml:mi>
<mml:msub>
<mml:mi mathvariant="bold">I</mml:mi>
<mml:mn>3</mml:mn></mml:msub>
<mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:math></disp-formula>where the variance terms are determined using <xref ref-type="disp-formula" rid="FD70">(70)</xref>–<xref ref-type="disp-formula" rid="FD71">(71)</xref> (<bold>R</bold>-adaptation). Useless to say, when both variance terms are set to some extremely large values, <italic>i.e.</italic>, no aiding comes to the filter, the kinematic equations are integrated based only on the gyro data.</p>
<p>The block diagram of the filter is sketched in <xref ref-type="fig" rid="f6-sensors-11-01489">Figure 6</xref>. The block “project ahead” computes the <italic>a priori</italic> state estimate and error covariance matrix, using <xref ref-type="disp-formula" rid="FDA2">(A2)</xref>–<xref ref-type="disp-formula" rid="FDA3">(A3)</xref>. The estimation of the rotation matrix is carried within this block; this estimate is also used to compute the Jacobian matrix of the measurement <xref ref-type="disp-formula" rid="FD69">Equation (69)</xref>, using <xref ref-type="disp-formula" rid="FDA10">(A10)</xref>, and the Kalman Gain, using <xref ref-type="disp-formula" rid="FDA5">(A5)</xref>–<xref ref-type="disp-formula" rid="FDA6">(A6)</xref>. The block “update” computes the <italic>a posteriori</italic> state estimate and error covariance matrix, using <xref ref-type="disp-formula" rid="FDA7">(A7)</xref>–<xref ref-type="disp-formula" rid="FDA8">(A8)</xref>. Remind the need for normalizing the updated quaternion at this level, in preparation for the next “project ahead” step. The measurement validation tests implement <xref ref-type="disp-formula" rid="FD70">(70)</xref>–<xref ref-type="disp-formula" rid="FD71">(71)</xref>, which is followed by the <bold>R</bold>-adaptation step, via <xref ref-type="disp-formula" rid="FD76">(76)</xref>–<xref ref-type="disp-formula" rid="FD77">(77)</xref>. The iterative nature of the filter allows exploiting the statistics available at any time step to start the computations at the next time-step, when a new set of measurements from the sensors become available.</p></sec>
<sec>
<label>5.8.</label>
<title>Head Motion Tracking Trial</title>
<p>The dataset for the experiment described in this Section was obtained by collecting inertial/magnetic sensor data from the MTx orientation tracker by Xsens Technologies B.V., Enschede, The Netherlands. These data were delivered through the USB interface to a host computer at a rate of 100 Hz together with the unit quaternion time functions estimated by the native Xsens EKF that runs in its default setting. The device was placed on top of a 10 cm × 10 cm plate that was screwed on a cyclist helmet, and fastened using double-side adhesive tape. The plate orientation was recorded using a six-camera Vicon optical tracker with a sampling rate of 100 Hz. A trigger signal was generated by the host computer and enabled time-synchronization of MTx and Vicon data streams. The system measured the position of four reflective markers (diameter: 25 mm), placed at the corners of the plate.</p>
<p>The MTx sensors were calibrated before starting the experimental session and their scale factor and bias errors were therefore zeroed for all practical purposes. The initial orientation of the sensor frame relative to the reference frame was found by asking the subject to stand still for few seconds at the beginning of the trial. The calibration quaternion needed to estimate the reference magnetic vector was built during the still time. The subject was then asked to freely move and turn his helmet-capped head during the trial, while standing on the spot. The head motion trial lasted slightly more than half a minute. The Euler angles time functions delivered by the Vicon system were considered the truth reference for the purpose of error estimation.</p>
<p>The EKF was implemented in Matlab for off-line data processing on a MacBook Air computer. Using the virtualization technology from Parallels Desktop 4.0 for Mac, the cycle time for a single iteration turned out to be about 2.0 ms, without any particular programming effort made to optimize the computational efficiency of the filter. The optimally tuned parameter setting for the EKF is reported in <xref ref-type="table" rid="t1-sensors-11-01489">Table 1</xref>.</p>
<p>The error statistics are reported in <xref ref-type="table" rid="t2-sensors-11-01489">Table 2</xref>.</p>
<p>The first and last column report the errors incurred by the EKF and the Xsens EKF, respectively. The columns 3 to 5 give the errors incurred when the gyro is aided by: accelerometer only (column 3); magnetic sensor only (column 4); no sensors (column 5). Suppose that <xref ref-type="disp-formula" rid="FD71">(71)</xref> is implemented with <italic>ɛ<sub>h</sub></italic> = 0 The measurements from the magnetic sensor cannot be incorporated in the measurement update stage of the EKF; the same occurs when <italic>ɛ<sub>a</sub></italic> = 0, as for the accelerometer, in <xref ref-type="disp-formula" rid="FD70">(70)</xref>. When both thresholds are zero, the gyro-free aiding sensor system is inhibited, and the orientation solution is obtained entirely from gyro measurement data. It is apparent that the accelerometer and the magnetic sensor are helpful in inclination and heading stabilization, respectively. Without aiding sensors, random-walk integration of gyro wideband measurement noise yields seriously degraded performance. These results clearly indicate the importance of sensor fusion in improving the accuracy of orientation estimates by inertial/magnetic sensing.</p>
<p>Finally, <xref ref-type="fig" rid="f7-sensors-11-01489">Figures 7</xref>–<xref ref-type="fig" rid="f9-sensors-11-01489">9</xref> show the time functions of the Euler angles as they are measured from the Vicon system; superimposed on them the time functions of the estimation errors incurred by the EKF.</p></sec></sec>
<sec>
<label>6.</label>
<title>Concluding Remarks</title>
<p>A comprehensive review of the endless literature on the problem of orientation determination is virtually impossible and necessarily incomplete, especially if one wishes to encompass all possible applications. We hope this article is interesting to experts and novice alike; the reported information would be sufficient to the readers, in order to cook their formulation of a state-of-the-art algorithm for 3D-orientation estimation using inertial/magnetic sensing in applications of human body motion tracking and analysis.</p></sec></body>
<back>
<ack>
<p>This work has been supported by funds from the Italian Ministry of Education and Research. The head motion tracking experiment has been performed within the framework of the EC project CLONS, coordinated by Silvestro Micera. Special appreciation is due to the valuable assistance provided by Jacopo Carpaneto, Vincenzo Genovese and Andrea Mannini throughout the experiment.</p></ack>
<ref-list>
<title>References</title>
<ref id="b1-sensors-11-01489"><label>1.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Welch</surname><given-names>G.F.</given-names></name><name><surname>Foxlin</surname><given-names>E.</given-names></name></person-group><article-title>Motion tracking: no silver bullet, but a respectable arsenal</article-title><source>IEEE Comput. Graph. Appl</source><year>2002</year><volume>22</volume><fpage>24</fpage><lpage>38</lpage></citation></ref>
<ref id="b2-sensors-11-01489"><label>2.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Barbour</surname><given-names>N.</given-names></name><name><surname>Schmidt</surname><given-names>G.</given-names></name></person-group><article-title>Inertial sensor technology trends</article-title><source>IEEE Sensors J</source><year>2001</year><volume>1</volume><fpage>332</fpage><lpage>339</lpage><pub-id pub-id-type="doi">10.1109/7361.983473</pub-id></citation></ref>
<ref id="b3-sensors-11-01489"><label>3.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Foxlin</surname><given-names>E.</given-names></name></person-group><article-title>Motion tracking requirements and technologies</article-title><source>Handbook of Virtual Environments: Design, Implementation, and Applications</source><person-group person-group-type="editor"><name><surname>Stanney</surname><given-names>K.M.</given-names></name></person-group><publisher-name>Lawrence Erlbaum Associates</publisher-name><publisher-loc>Mahwah, NJ, USA</publisher-loc><year>2002</year><fpage>163</fpage><lpage>210</lpage></citation></ref>
<ref id="b4-sensors-11-01489"><label>4.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Veltink</surname><given-names>P.H.</given-names></name><name><surname>Bussmann</surname><given-names>H.B.J.</given-names></name><name><surname>de Vries</surname><given-names>W.H.K.</given-names></name><name><surname>Martens</surname><given-names>W.L.J.</given-names></name><name><surname>Van Lummel</surname><given-names>R.C.</given-names></name></person-group><article-title>Detection of static and dynamic activities using uniaxial accelerometers</article-title><source>IEEE Trans. Rehabil. Eng</source><year>1996</year><volume>4</volume><fpage>375</fpage><lpage>385</lpage><pub-id pub-id-type="doi">10.1109/86.547939</pub-id><pub-id pub-id-type="pmid">8973963</pub-id></citation></ref>
<ref id="b5-sensors-11-01489"><label>5.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Bachmann</surname><given-names>E.R.</given-names></name><name><surname>Xiaoping</surname><given-names>Y.</given-names></name><name><surname>Peterson</surname><given-names>C.W.</given-names></name></person-group><article-title>An investigation of the effects of magnetic variations on inertial/magnetic orientation sensors</article-title><conf-name>Proceedings of IEEE International Conference on Robotics and Automation (ICRA’04)</conf-name><conf-loc>New Orleans, LA, USA</conf-loc><conf-date>April 26–May 1, 2004</conf-date><fpage>1115</fpage><lpage>1122</lpage></citation></ref>
<ref id="b6-sensors-11-01489"><label>6.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>de Vries</surname><given-names>W.H.K.</given-names></name><name><surname>Veeger</surname><given-names>H.E.J.</given-names></name><name><surname>Baten</surname><given-names>C.T.M.</given-names></name><name><surname>van der Helm</surname><given-names>F.C.T.</given-names></name></person-group><article-title>Magnetic distortion in motion labs, implications for validating inertial magnetic sensors</article-title><source>Gait Posture</source><year>2009</year><volume>29</volume><fpage>535</fpage><lpage>541</lpage><pub-id pub-id-type="doi">10.1016/j.gaitpost.2008.12.004</pub-id><pub-id pub-id-type="pmid">19150239</pub-id></citation></ref>
<ref id="b7-sensors-11-01489"><label>7.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Morris</surname><given-names>J.R.W.</given-names></name></person-group><article-title>Accelerometry—A technique for the measurement of human body movements</article-title><source>J. Biomech</source><year>1973</year><volume>6</volume><fpage>729</fpage><lpage>736</lpage><pub-id pub-id-type="doi">10.1016/0021-9290(73)90029-8</pub-id><pub-id pub-id-type="pmid">4757490</pub-id></citation></ref>
<ref id="b8-sensors-11-01489"><label>8.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Padgaonkar</surname><given-names>A.J.</given-names></name><name><surname>Krieger</surname><given-names>K.W.</given-names></name><name><surname>King</surname><given-names>A.I.</given-names></name></person-group><article-title>Measurement of angular acceleration of a rigid body using linear accelerometers</article-title><source>J. Appl. Mech</source><year>1975</year><volume>42</volume><fpage>552</fpage><lpage>556</lpage><pub-id pub-id-type="doi">10.1115/1.3423640</pub-id></citation></ref>
<ref id="b9-sensors-11-01489"><label>9.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Giansanti</surname><given-names>D.</given-names></name><name><surname>Macellari</surname><given-names>V.</given-names></name><name><surname>Maccioni</surname><given-names>G.</given-names></name><name><surname>Cappozzo</surname><given-names>A.</given-names></name></person-group><article-title>Is it feasible to reconstruct body segment 3-D position and orientation using accelerometric data?</article-title><source>IEEE Trans. Biomed. Eng</source><year>2003</year><volume>50</volume><fpage>476</fpage><lpage>483</lpage><pub-id pub-id-type="doi">10.1109/TBME.2003.809490</pub-id><pub-id pub-id-type="pmid">12723059</pub-id></citation></ref>
<ref id="b10-sensors-11-01489"><label>10.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Parsa</surname><given-names>K.</given-names></name><name><surname>Lasky</surname><given-names>T.A.</given-names></name><name><surname>Ravani</surname><given-names>B.</given-names></name></person-group><article-title>Design and mechatronic implementation of an accelerometer-based, kinematically redundant inertial measurement unit</article-title><conf-name>Proceedings of IEEE/ASME International Conference on Advanced Intelligent Mechatronics</conf-name><conf-loc>Monterey, CA, USA</conf-loc><conf-date>24–28 July 2005</conf-date><fpage>644</fpage><lpage>651</lpage></citation></ref>
<ref id="b11-sensors-11-01489"><label>11.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Willemsen</surname><given-names>A.T.M.</given-names></name><name><surname>van Alsté</surname><given-names>J.A.</given-names></name><name><surname>Boom</surname><given-names>H.B.K.</given-names></name></person-group><article-title>Real-time gait assessment utilizing a new way of accelerometry</article-title><source>J. Biomech</source><year>1990</year><volume>23</volume><fpage>859</fpage><lpage>863</lpage><pub-id pub-id-type="doi">10.1016/0021-9290(90)90033-Y</pub-id><pub-id pub-id-type="pmid">2384497</pub-id></citation></ref>
<ref id="b12-sensors-11-01489"><label>12.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Willemsen</surname><given-names>A.T.M.</given-names></name><name><surname>Frigo</surname><given-names>C.</given-names></name><name><surname>Boom</surname><given-names>H.B.K.</given-names></name></person-group><article-title>Lower extremity angle measurement with accelerometers-error and sensitivity analysis</article-title><source>IEEE Trans. Biomed. Eng</source><year>1991</year><volume>38</volume><fpage>1186</fpage><lpage>1193</lpage><pub-id pub-id-type="doi">10.1109/10.137284</pub-id><pub-id pub-id-type="pmid">1774080</pub-id></citation></ref>
<ref id="b13-sensors-11-01489"><label>13.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Bussmann</surname><given-names>J.</given-names></name><name><surname>Damen</surname><given-names>L.</given-names></name><name><surname>Stam</surname><given-names>H.</given-names></name></person-group><article-title>Analysis and decomposition of signals obtained by thigh-fixed uni-axial accelerometry during normal walking</article-title><source>Med. Biol. Eng. Comput</source><year>2000</year><volume>38</volume><fpage>632</fpage><lpage>638</lpage><pub-id pub-id-type="doi">10.1007/BF02344868</pub-id><pub-id pub-id-type="pmid">11217880</pub-id></citation></ref>
<ref id="b14-sensors-11-01489"><label>14.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Luinge</surname><given-names>H.J.</given-names></name><name><surname>Veltink</surname><given-names>P.H.</given-names></name></person-group><article-title>Inclination measurement of human movement using a 3-D accelerometer with autocalibration</article-title><source>IEEE Trans. Neural Syst. Rehabil. Eng</source><year>2004</year><volume>12</volume><fpage>112</fpage><lpage>121</lpage><pub-id pub-id-type="doi">10.1109/TNSRE.2003.822759</pub-id><pub-id pub-id-type="pmid">15068194</pub-id></citation></ref>
<ref id="b15-sensors-11-01489"><label>15.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Williamson</surname><given-names>R.</given-names></name><name><surname>Andrews</surname><given-names>B.</given-names></name></person-group><article-title>Detecting absolute human knee angle and angular velocity using accelerometers and rate gyroscopes</article-title><source>Med. Biol. Eng. Comput</source><year>2001</year><volume>39</volume><fpage>294</fpage><lpage>302</lpage><pub-id pub-id-type="doi">10.1007/BF02345283</pub-id><pub-id pub-id-type="pmid">11465883</pub-id></citation></ref>
<ref id="b16-sensors-11-01489"><label>16.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Mayagoitia</surname><given-names>R.E.</given-names></name><name><surname>Nene</surname><given-names>A.V.</given-names></name><name><surname>Veltink</surname><given-names>P.H.</given-names></name></person-group><article-title>Accelerometer and rate gyroscope measurement of kinematics: An inexpensive alternative to optical motion analysis systems</article-title><source>J. Biomech</source><year>2002</year><volume>35</volume><fpage>537</fpage><lpage>542</lpage><pub-id pub-id-type="doi">10.1016/S0021-9290(01)00231-7</pub-id><pub-id pub-id-type="pmid">11934425</pub-id></citation></ref>
<ref id="b17-sensors-11-01489"><label>17.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Caruso</surname><given-names>M.J.</given-names></name></person-group><article-title>Applications of magnetic sensors for low cost compass systems</article-title><conf-name>IEEE Position Location and Navigation Symposium (PLANS’00)</conf-name><conf-loc>San Diego, CA, USA</conf-loc><year>2000</year><fpage>177</fpage><lpage>184</lpage></citation></ref>
<ref id="b18-sensors-11-01489"><label>18.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Weston</surname><given-names>J.L.</given-names></name><name><surname>Titterton</surname><given-names>D.H.</given-names></name></person-group><article-title>Modern inertial navigation technology and its application</article-title><source>Electron. Commun. Eng. J</source><year>2000</year><volume>12</volume><fpage>49</fpage><lpage>64</lpage><pub-id pub-id-type="doi">10.1049/ecej:20000202</pub-id></citation></ref>
<ref id="b19-sensors-11-01489"><label>19.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Foxlin</surname><given-names>E.</given-names></name><name><surname>Harrington</surname><given-names>M.</given-names></name><name><surname>Altshuler</surname><given-names>Y.</given-names></name></person-group><article-title>Miniature 6-DOF inertial system for tracking HMDs</article-title><conf-name>Proceedings of AeroSense 98 Conference on Helmet and Head-Mounted Displays III</conf-name><publisher-loc>Orlando, FL, USA</publisher-loc><year>1998</year><fpage>214</fpage><lpage>228</lpage></citation></ref>
<ref id="b20-sensors-11-01489"><label>20.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Gallagher</surname><given-names>A.</given-names></name><name><surname>Matsuoka</surname><given-names>Y.</given-names></name><name><surname>Wei-Tech</surname><given-names>A.</given-names></name></person-group><article-title>An efficient real-time human posture tracking algorithm using low-cost inertial and magnetic sensors</article-title><conf-name>Proceedings of IEEE/RSJ International Conferenec on Intelligent Robots and Systems (IROS 2004)</conf-name><conf-loc>Sendai, Japan</conf-loc><conf-date>28 September–2 October 2004</conf-date><fpage>2967</fpage><lpage>2972</lpage></citation></ref>
<ref id="b21-sensors-11-01489"><label>21.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Roetenberg</surname><given-names>D.</given-names></name><name><surname>Luinge</surname><given-names>H.J.</given-names></name><name><surname>Baten</surname><given-names>C.T.M.</given-names></name><name><surname>Veltink</surname><given-names>P.H.</given-names></name></person-group><article-title>Compensation of magnetic disturbances improves inertial and magnetic sensing of human body segment orientation</article-title><source>IEEE Trans. Neural Syst. Rehabil. Eng</source><year>2005</year><volume>13</volume><fpage>395</fpage><lpage>405</lpage><pub-id pub-id-type="doi">10.1109/TNSRE.2005.847353</pub-id><pub-id pub-id-type="pmid">16200762</pub-id></citation></ref>
<ref id="b22-sensors-11-01489"><label>22.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sabatini</surname><given-names>A.M.</given-names></name></person-group><article-title>Quaternion-based extended Kalman filter for determining orientation by inertial and magnetic sensing</article-title><source>IEEE Trans. Biomed. Eng</source><year>2006</year><volume>53</volume><fpage>1346</fpage><lpage>1356</lpage><pub-id pub-id-type="doi">10.1109/TBME.2006.875664</pub-id><pub-id pub-id-type="pmid">16830938</pub-id></citation></ref>
<ref id="b23-sensors-11-01489"><label>23.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Yun</surname><given-names>X.</given-names></name><name><surname>Bachmann</surname><given-names>E.R.</given-names></name></person-group><article-title>Design, implementation, and experimental results of a quaternion-based Kalman filter for human body motion tracking</article-title><source>IEEE Trans. Robot</source><year>2006</year><volume>22</volume><fpage>1216</fpage><lpage>1227</lpage><pub-id pub-id-type="doi">10.1109/TRO.2006.886270</pub-id></citation></ref>
<ref id="b24-sensors-11-01489"><label>24.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Harada</surname><given-names>T.</given-names></name><name><surname>Mori</surname><given-names>T.</given-names></name><name><surname>Sato</surname><given-names>T.</given-names></name></person-group><article-title>Development of a tiny orientation estimation device to operate under motion and magnetic disturbance</article-title><source>Int. J. Rob. Res</source><year>2007</year><volume>26</volume><fpage>547</fpage><lpage>559</lpage><pub-id pub-id-type="doi">10.1177/0278364907079272</pub-id></citation></ref>
<ref id="b25-sensors-11-01489"><label>25.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Lee</surname><given-names>J.K.</given-names></name><name><surname>Park</surname><given-names>E.J.</given-names></name></person-group><article-title>A fast quaternion-based orientation optimizer via virtual rotation for human motion tracking</article-title><source>IEEE Trans. Biomed. Eng</source><year>2009</year><volume>56</volume><fpage>1574</fpage><lpage>1582</lpage><pub-id pub-id-type="doi">10.1109/TBME.2008.2001285</pub-id><pub-id pub-id-type="pmid">19473934</pub-id></citation></ref>
<ref id="b26-sensors-11-01489"><label>26.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Woodman</surname><given-names>O.J.</given-names></name></person-group><source>An Introduction to Inertial Navigation</source><comment>UCAM-CL-TR-696;</comment><publisher-name>Computer Laboratory, University of Cambridge</publisher-name><publisher-loc>Cambridge, UK</publisher-loc><year>2007</year></citation></ref>
<ref id="b27-sensors-11-01489"><label>27.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Jirawimut</surname><given-names>R.</given-names></name><name><surname>Ptasinski</surname><given-names>P.</given-names></name><name><surname>Garaj</surname><given-names>V.</given-names></name><name><surname>Cecelja</surname><given-names>F.</given-names></name><name><surname>Balachandran</surname><given-names>W.</given-names></name></person-group><article-title>A method for dead reckoning parameter correction in pedestrian navigation systems</article-title><source>IEEE Trans. Instrum. Meas</source><year>2003</year><volume>52</volume><fpage>209</fpage><lpage>215</lpage><pub-id pub-id-type="doi">10.1109/TIM.2002.807986</pub-id></citation></ref>
<ref id="b28-sensors-11-01489"><label>28.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Tan</surname><given-names>H.</given-names></name><name><surname>Wilson</surname><given-names>A.M.</given-names></name><name><surname>Lowe</surname><given-names>J.</given-names></name></person-group><article-title>Measurement of stride parameters using a wearable GPS and inertial measurement unit</article-title><source>J. Biomech</source><year>2008</year><volume>41</volume><fpage>1398</fpage><lpage>1406</lpage><pub-id pub-id-type="doi">10.1016/j.jbiomech.2008.02.021</pub-id><pub-id pub-id-type="pmid">18423472</pub-id></citation></ref>
<ref id="b29-sensors-11-01489"><label>29.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sabatini</surname><given-names>A.M.</given-names></name></person-group><article-title>Quaternion-based strap-down integration method for applications of inertial sensing to gait analysis</article-title><source>Med. Biol. Eng. Comput</source><year>2005</year><volume>43</volume><fpage>94</fpage><lpage>101</lpage><pub-id pub-id-type="doi">10.1007/BF02345128</pub-id><pub-id pub-id-type="pmid">15742725</pub-id></citation></ref>
<ref id="b30-sensors-11-01489"><label>30.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Shuster</surname><given-names>M.D.</given-names></name></person-group><article-title>A survey of attitude representations</article-title><source>J. Astronaut. Sci</source><year>1993</year><volume>41</volume><fpage>439</fpage><lpage>517</lpage></citation></ref>
<ref id="b31-sensors-11-01489"><label>31.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Phillips</surname><given-names>W.F.</given-names></name><name><surname>Hailey</surname><given-names>C.E.</given-names></name><name><surname>Gebert</surname><given-names>G.A.</given-names></name></person-group><article-title>A review of attitude kinematics for aircraft flight simulation</article-title><conf-name>AIAA 2000-4302 Modeling and Simulation Technologies Conference</conf-name><conf-loc>Denver, CO, USA</conf-loc><year>2000</year><fpage>1</fpage><lpage>20</lpage></citation></ref>
<ref id="b32-sensors-11-01489"><label>32.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Chou</surname><given-names>J.C.K.</given-names></name></person-group><article-title>Quaternion kinematics and dynamic differential equations</article-title><source>IEEE Trans. Robot. Autom</source><year>1992</year><volume>8</volume><fpage>53</fpage><lpage>64</lpage><pub-id pub-id-type="doi">10.1109/70.127239</pub-id></citation></ref>
<ref id="b33-sensors-11-01489"><label>33.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Lovren</surname><given-names>N.</given-names></name><name><surname>Pieper</surname><given-names>J.K.</given-names></name></person-group><article-title>Error analysis of direction cosines and quaternion parameters techniques for aircraft attitude determination</article-title><source>IEEE Trans. Aerosp. Electron. Syst</source><year>1998</year><volume>34</volume><fpage>983</fpage><lpage>989</lpage></citation></ref>
<ref id="b34-sensors-11-01489"><label>34.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Gebre-Egziabher</surname><given-names>D.</given-names></name><name><surname>Hayward</surname><given-names>R.C.</given-names></name><name><surname>Powell</surname><given-names>J.D.</given-names></name></person-group><article-title>Design of multi-sensor attitude determination systems</article-title><source>IEEE Trans. Aerosp. Electron. Syst</source><year>2004</year><volume>40</volume><fpage>627</fpage><lpage>648</lpage><pub-id pub-id-type="doi">10.1109/TAES.2004.1310010</pub-id></citation></ref>
<ref id="b35-sensors-11-01489"><label>35.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Wahba</surname><given-names>G.</given-names></name></person-group><article-title>A least-square estimate of spacecraft attitude</article-title><source>SIAM Rev</source><year>1965</year><volume>7</volume><fpage>409</fpage></citation></ref>
<ref id="b36-sensors-11-01489"><label>36.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Lefferts</surname><given-names>E.J.</given-names></name><name><surname>Markley</surname><given-names>F.L.</given-names></name><name><surname>Shuster</surname><given-names>M.D.</given-names></name></person-group><article-title>Kalman filtering for spacecraft attitude estimation</article-title><source>J. Guid</source><year>1982</year><volume>5</volume><fpage>417</fpage><lpage>429</lpage><pub-id pub-id-type="doi">10.2514/3.56190</pub-id></citation></ref>
<ref id="b37-sensors-11-01489"><label>37.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Kalman</surname><given-names>R.E.</given-names></name></person-group><article-title>A new approach to linear filtering and prediction problems</article-title><source>ASME Trans. Series D J. Basic Eng</source><year>1960</year><volume>82</volume><fpage>35</fpage><lpage>45</lpage><pub-id pub-id-type="doi">10.1115/1.3662552</pub-id></citation></ref>
<ref id="b38-sensors-11-01489"><label>38.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Markley</surname><given-names>F.L.</given-names></name></person-group><article-title>Attitude determination and parameter estimation using vector observations: Theory</article-title><source>J. Astronaut. Sci</source><year>1989</year><volume>37</volume><fpage>41</fpage><lpage>58</lpage></citation></ref>
<ref id="b39-sensors-11-01489"><label>39.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Psiaki</surname><given-names>M.L.</given-names></name></person-group><article-title>Attitude-determination filtering via extended quaternion estimation</article-title><source>J. Guid. Contr. Dynamics</source><year>2000</year><volume>23</volume><fpage>206</fpage><lpage>214</lpage><pub-id pub-id-type="doi">10.2514/2.4540</pub-id></citation></ref>
<ref id="b40-sensors-11-01489"><label>40.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Shuster</surname><given-names>M.D.</given-names></name><name><surname>Oh</surname><given-names>S.</given-names></name></person-group><article-title>Three-axis attitude determination from vector observations</article-title><source>J. Guid. Contr</source><year>1981</year><volume>4</volume><fpage>70</fpage><lpage>77</lpage><pub-id pub-id-type="doi">10.2514/3.19717</pub-id></citation></ref>
<ref id="b41-sensors-11-01489"><label>41.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Yun</surname><given-names>X.</given-names></name><name><surname>Bachmann</surname><given-names>E.R.</given-names></name><name><surname>McGhee</surname><given-names>R.B.</given-names></name></person-group><article-title>A simplified quaternion-based algorithm for orientation estimation from earth gravity and magnetic field measurements</article-title><source>IEEE Trans. Instrum. Meas</source><year>2008</year><volume>57</volume><fpage>638</fpage><lpage>650</lpage><pub-id pub-id-type="doi">10.1109/TIM.2007.911646</pub-id></citation></ref>
<ref id="b42-sensors-11-01489"><label>42.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Marins</surname><given-names>J.L.</given-names></name><name><surname>Xiaoping</surname><given-names>Y.</given-names></name><name><surname>Bachmann</surname><given-names>E.R.</given-names></name><name><surname>McGhee</surname><given-names>R.B.</given-names></name><name><surname>Zyda</surname><given-names>M.J.</given-names></name></person-group><article-title>An extended Kalman filter for quaternion-based orientation estimation using MARG sensors</article-title><conf-name>Proceedings of IEEE/RSJ Internat. Conference on Intelligent Robots and Systems (IROS 2001)</conf-name><conf-loc>Maui, HI, USA</conf-loc><conf-date>October 29–November 3, 2001</conf-date><fpage>2003</fpage><lpage>2011</lpage></citation></ref>
<ref id="b43-sensors-11-01489"><label>43.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Welch</surname><given-names>G.F.</given-names></name></person-group><article-title>The use of the Kalman filter for human motion tracking in virtual reality</article-title><source>Presence</source><year>2009</year><volume>18</volume><fpage>72</fpage><lpage>91</lpage><pub-id pub-id-type="doi">10.1162/pres.18.1.72</pub-id></citation></ref>
<ref id="b44-sensors-11-01489"><label>44.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Arulampalam</surname><given-names>S.</given-names></name><name><surname>Maskell</surname><given-names>S.</given-names></name><name><surname>Gordon</surname><given-names>N.</given-names></name><name><surname>Clapp</surname><given-names>T.</given-names></name></person-group><article-title>A tutorial on particle filters for online nonlinear/non-Gaussian Bayesian tracking</article-title><source>IEEE Trans. Signal Process</source><year>2002</year><volume>50</volume><fpage>174</fpage><lpage>188</lpage><pub-id pub-id-type="doi">10.1109/78.978374</pub-id></citation></ref>
<ref id="b45-sensors-11-01489"><label>45.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Julier</surname><given-names>S.J.</given-names></name><name><surname>Uhlmann</surname><given-names>J.K.</given-names></name></person-group><article-title>Unscented filtering and nonlinear estimation</article-title><source>Proc. IEEE</source><year>2004</year><volume>92</volume><fpage>401</fpage><lpage>422</lpage><pub-id pub-id-type="doi">10.1109/JPROC.2003.823141</pub-id></citation></ref>
<ref id="b46-sensors-11-01489"><label>46.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Crassidis</surname><given-names>J.L.</given-names></name><name><surname>Markley</surname><given-names>F.L.</given-names></name></person-group><article-title>Unscented filtering for spacecraft attitude estimation</article-title><source>J. Guid. Contr. Dyn</source><year>2003</year><volume>26</volume><fpage>536</fpage><lpage>542</lpage><pub-id pub-id-type="doi">10.2514/2.5102</pub-id></citation></ref>
<ref id="b47-sensors-11-01489"><label>47.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>LaViola</surname><given-names>J.J.</given-names><suffix>Jr.</suffix></name></person-group><article-title>A comparison of unscented and extended Kalman filtering for estimating quaternion motion</article-title><conf-name>Proceedings of American Control Conference</conf-name><conf-loc>Providence, RI, USA</conf-loc><conf-date>4–6 June 2003</conf-date><fpage>2435</fpage><lpage>2440</lpage></citation></ref>
<ref id="b48-sensors-11-01489"><label>48.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>van Rhijn</surname><given-names>A.</given-names></name><name><surname>van Liere</surname><given-names>R.</given-names></name><name><surname>Mulder</surname><given-names>J.D.</given-names></name></person-group><article-title>An analysis of orientation prediction and filtering methods for VR/AR</article-title><conf-name>Proceedings of IEEE Conferenec on Virtual Reality</conf-name><conf-loc>Bonn, Germany</conf-loc><conf-date>12−16 March 2005</conf-date><fpage>67</fpage><lpage>74</lpage></citation></ref>
<ref id="b49-sensors-11-01489"><label>49.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Carmi</surname><given-names>A.</given-names></name><name><surname>Oshman</surname><given-names>Y.</given-names></name></person-group><article-title>Adaptive particle filtering for spacecraft attitude estimation from vector observations</article-title><source>J. Guid. Contr. Dyn</source><year>2009</year><volume>32</volume><fpage>232</fpage><lpage>241</lpage><pub-id pub-id-type="doi">10.2514/1.35878</pub-id></citation></ref>
<ref id="b50-sensors-11-01489"><label>50.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Foxlin</surname><given-names>E.</given-names></name></person-group><article-title>Inertial head-tracker sensor fusion by a complementary separate-bias Kalman filter</article-title><conf-name>Proceedings of IEEE Virtual Reality Annual International Symposium</conf-name><conf-loc>Santa Clara, CA, USA</conf-loc><conf-date>30 March–3 April 1996</conf-date><fpage>185</fpage><lpage>194</lpage></citation></ref>
<ref id="b51-sensors-11-01489"><label>51.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Markley</surname><given-names>F.L.</given-names></name></person-group><article-title>Attitude error representations for Kalman filtering</article-title><source>J. Guid. Contr. Dyn</source><year>2003</year><volume>26</volume><fpage>311</fpage><lpage>317</lpage><pub-id pub-id-type="doi">10.2514/2.5048</pub-id></citation></ref>
<ref id="b52-sensors-11-01489"><label>52.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Bar-Itzhack</surname><given-names>I.Y.</given-names></name><name><surname>Oshman</surname><given-names>Y.</given-names></name></person-group><article-title>Attitude determination from vector observations: Quaternion estimation</article-title><source>IEEE Trans. Aerosp. Electron. Syst</source><year>1985</year><volume>21</volume><fpage>128</fpage><lpage>136</lpage><pub-id pub-id-type="doi">10.1109/TAES.1985.310546</pub-id></citation></ref>
<ref id="b53-sensors-11-01489"><label>53.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Schaub</surname><given-names>H.</given-names></name><name><surname>Junkins</surname><given-names>J.L.</given-names></name></person-group><article-title>Stereographic orientation parameters for attitude dynamics: A generalization of the Rodrigues parameters</article-title><source>J. Astronaut. Sci</source><year>1996</year><volume>44</volume><fpage>1</fpage><lpage>19</lpage></citation></ref>
<ref id="b54-sensors-11-01489"><label>54.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Himberg</surname><given-names>H.</given-names></name><name><surname>Motai</surname><given-names>Y.</given-names></name></person-group><article-title>Head orientation prediction: delta quaternions versus quaternions</article-title><source>IEEE Trans. Syst. Man Cybern. B Cybern</source><year>2009</year><volume>39</volume><fpage>1382</fpage><lpage>1392</lpage><pub-id pub-id-type="doi">10.1109/TSMCB.2009.2016571</pub-id><pub-id pub-id-type="pmid">19493852</pub-id></citation></ref>
<ref id="b55-sensors-11-01489"><label>55.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Gebre-Egziabher</surname><given-names>D.</given-names></name><name><surname>Elkaim</surname><given-names>G.H.</given-names></name><name><surname>Powell</surname><given-names>J.D.</given-names></name><name><surname>Parkinson</surname><given-names>B.W.</given-names></name></person-group><article-title>A gyro-free quaternion-based attitude determination system suitable for implementation using low cost sensors</article-title><conf-name>IEEE Position Location and Navigation Symposium (PLANS’00)</conf-name><year>2000</year><fpage>185</fpage><lpage>192</lpage></citation></ref>
<ref id="b56-sensors-11-01489"><label>56.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Choukroun</surname><given-names>D.</given-names></name><name><surname>Bar-Itzhack</surname><given-names>I.Y.</given-names></name><name><surname>Oshman</surname><given-names>Y.</given-names></name></person-group><article-title>Novel quaternion Kalman filter</article-title><source>IEEE Trans. Aerosp. Electron. Syst</source><year>2006</year><volume>41</volume><fpage>174</fpage><lpage>190</lpage></citation></ref>
<ref id="b57-sensors-11-01489"><label>57.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Maybeck</surname><given-names>P.S.</given-names></name></person-group><source>Stochastic Models, Estimation and Control</source><publisher-name>Academic Press</publisher-name><publisher-loc>New York, NY, USA</publisher-loc><year>1982</year></citation></ref>
<ref id="b58-sensors-11-01489"><label>58.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Mirzaei</surname><given-names>F.M.</given-names></name><name><surname>Roumeliotis</surname><given-names>S.I.</given-names></name></person-group><article-title>A Kalman-filter-based algorithm for IMU-camera calibration: Observability analysis and performance evaluation</article-title><source>IEEE Trans. Robot</source><year>2008</year><volume>24</volume><fpage>1143</fpage><lpage>1156</lpage><pub-id pub-id-type="doi">10.1109/TRO.2008.2004486</pub-id></citation></ref>
<ref id="b59-sensors-11-01489"><label>59.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Azuma</surname><given-names>R.</given-names></name><name><surname>Bishop</surname><given-names>G.</given-names></name></person-group><article-title>Improving static and dynamic registration in a see-through HMD</article-title><conf-name>Proceedings of SIGGRAPH</conf-name><conf-loc>Orlando, FL, USA</conf-loc><conf-date>24–29 July 1994</conf-date><fpage>197</fpage><lpage>204</lpage></citation></ref>
<ref id="b60-sensors-11-01489"><label>60.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Liang</surname><given-names>J.</given-names></name><name><surname>Shaw</surname><given-names>C.</given-names></name><name><surname>Green</surname><given-names>M.</given-names></name></person-group><article-title>On temporal-spatial realism in the virtual environment</article-title><conf-name>Proceedings of Symposium on User Interface Software and Technology</conf-name><conf-loc>Hilton Head, SC, USA</conf-loc><year>1991</year><fpage>19</fpage><lpage>25</lpage></citation></ref>
<ref id="b61-sensors-11-01489"><label>61.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Kieger</surname><given-names>D.W.</given-names></name><name><surname>Maybeck</surname><given-names>P.S.</given-names></name></person-group><article-title>Reducing lag in virtual displays using multiple model adaptive estimation</article-title><source>IEEE Trans. Aerosp. Electron. Syst</source><year>1998</year><volume>34</volume><fpage>1237</fpage><lpage>1248</lpage><pub-id pub-id-type="doi">10.1109/7.722711</pub-id></citation></ref>
<ref id="b62-sensors-11-01489"><label>62.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Ferraris</surname><given-names>F.</given-names></name><name><surname>Grimaldi</surname><given-names>U.</given-names></name><name><surname>Parvis</surname><given-names>M.</given-names></name></person-group><article-title>Procedure for effortless in-field calibration of three-axis rate gyros and accelerometers</article-title><source>Sens. Mater</source><year>1995</year><volume>7</volume><fpage>311</fpage><lpage>330</lpage></citation></ref>
<ref id="b63-sensors-11-01489"><label>63.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Mannini</surname><given-names>A.</given-names></name><name><surname>Sabatini</surname><given-names>A.M.</given-names></name></person-group><article-title>Machine learning methods for classifying human physical activity from on-body accelerometers</article-title><source>Sensors</source><year>2010</year><volume>10</volume><fpage>1154</fpage><lpage>1175</lpage><pub-id pub-id-type="doi">10.3390/s100201154</pub-id><pub-id pub-id-type="pmid">22205862</pub-id></citation></ref>
<ref id="b64-sensors-11-01489"><label>64.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Abbott</surname><given-names>E.</given-names></name><name><surname>Powell</surname><given-names>D.</given-names></name></person-group><article-title>Land-vehicle navigation using GPS</article-title><source>Proc. IEEE</source><year>1999</year><volume>87</volume><fpage>145</fpage><lpage>162</lpage><pub-id pub-id-type="doi">10.1109/5.736347</pub-id></citation></ref>
<ref id="b65-sensors-11-01489"><label>65.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Sabatini</surname><given-names>A.M.</given-names></name><name><surname>Martelloni</surname><given-names>C.</given-names></name><name><surname>Scapellato</surname><given-names>S.</given-names></name><name><surname>Cavallo</surname><given-names>F.</given-names></name></person-group><article-title>Assessment of walking features from foot inertial sensing</article-title><source>IEEE Trans. Biomed. Eng</source><year>2005</year><volume>52</volume><fpage>486</fpage><lpage>494</lpage><pub-id pub-id-type="doi">10.1109/TBME.2004.840727</pub-id><pub-id pub-id-type="pmid">15759579</pub-id></citation></ref>
<ref id="b66-sensors-11-01489"><label>66.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Scapellato</surname><given-names>S.</given-names></name><name><surname>Cavallo</surname><given-names>F.</given-names></name><name><surname>Martelloni</surname><given-names>C.</given-names></name><name><surname>Sabatini</surname><given-names>A.M.</given-names></name></person-group><article-title>In-use calibration of body-mounted gyroscopes for applications in gait analysis</article-title><source>Sens. Actuat. A: Phys</source><year>2005</year><fpage>418</fpage><lpage>422</lpage></citation></ref>
<ref id="b67-sensors-11-01489"><label>67.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Lötters</surname><given-names>J.C.</given-names></name><name><surname>Schipper</surname><given-names>J.</given-names></name><name><surname>Veltink</surname><given-names>P.H.</given-names></name><name><surname>Olthuis</surname><given-names>W.</given-names></name><name><surname>Bergveld</surname><given-names>P.</given-names></name></person-group><article-title>Procedure for in-use calibration of triaxial accelerometers in medical applications</article-title><source>Sens. Actuat. A: Phys</source><year>1998</year><volume>68</volume><fpage>221</fpage><lpage>228</lpage><pub-id pub-id-type="doi">10.1016/S0924-4247(98)00049-1</pub-id></citation></ref>
<ref id="b68-sensors-11-01489"><label>68.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Gebre-Egziabher</surname><given-names>D.</given-names></name><name><surname>Elkaim</surname><given-names>G.H.</given-names></name><name><surname>Powell</surname><given-names>J.D.</given-names></name><name><surname>Parkinson</surname><given-names>B.W.</given-names></name></person-group><article-title>A non-linear, two-step estimation algorithm for calibrating solid-state strapdown magnetometers</article-title><conf-name>8th International Conference on Navigation Systems</conf-name><conf-loc>St. Petersburg, Russia</conf-loc><year>2001</year></citation></ref>
<ref id="b69-sensors-11-01489"><label>69.</label><citation citation-type="book"><person-group person-group-type="author"><name><surname>Brown</surname><given-names>R.G.</given-names></name><name><surname>Hwang</surname><given-names>P.Y.C.</given-names></name></person-group><source>Introduction to Random Signals and Applied Kalman Filtering</source><publisher-name>John Wiley &amp; Sons</publisher-name><publisher-loc>New York, NY, USA</publisher-loc><year>1997</year></citation></ref>
<ref id="b70-sensors-11-01489"><label>70.</label><citation citation-type="confproc"><person-group person-group-type="author"><name><surname>Himberg</surname><given-names>H.</given-names></name><name><surname>Motai</surname><given-names>Y.</given-names></name><name><surname>Barrios</surname><given-names>C.</given-names></name></person-group><article-title>R-adaptive Kalman filtering approach to estimate head orientation for driving simulator</article-title><conf-name>Proceedings of IEEE/ISTC International Conference on Intelligent Transportation Systems</conf-name><conf-loc>Toronto, ON, Canada</conf-loc><conf-date>17–20 September 2006</conf-date><fpage>851</fpage><lpage>857</lpage></citation></ref>
<ref id="b71-sensors-11-01489"><label>71.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Horn</surname><given-names>B.K.P.</given-names></name></person-group><article-title>Closed form solution of absolute orientation using unit quaternions</article-title><source>J. Opt. Soc. Am. A</source><year>1987</year><volume>4</volume><fpage>629</fpage><lpage>642</lpage></citation></ref>
<ref id="b72-sensors-11-01489"><label>72.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Lee</surname><given-names>J.</given-names></name><name><surname>Shin</surname><given-names>S.Y.</given-names></name></person-group><article-title>General construction of time-domain filters for orientation data</article-title><source>IEEE Trans. Vis. Comput. Graph</source><year>2002</year><volume>8</volume><fpage>119</fpage><lpage>128</lpage><pub-id pub-id-type="doi">10.1109/2945.998665</pub-id></citation></ref>
<ref id="b73-sensors-11-01489"><label>73.</label><citation citation-type="journal"><person-group person-group-type="author"><name><surname>Bortz</surname><given-names>J.E.</given-names></name></person-group><article-title>A new mathematical formulation for strapdown inertial navigation</article-title><source>IEEE Trans. Aerosp. Electron. Syst</source><year>1971</year><volume>7</volume><fpage>61</fpage><lpage>66</lpage><pub-id pub-id-type="doi">10.1109/TAES.1971.310252</pub-id></citation></ref></ref-list>
<app-group>
<app id="app1">
<title>Appendix</title>
<p>In this <xref ref-type="app" rid="app1">Appendix</xref> we report in short the equatons of both the KF and the EKF. For an excellent treatment of these topics, consult [<xref ref-type="bibr" rid="b57-sensors-11-01489">57</xref>].</p>
<sec>
<label>1.</label>
<title>KF Equations</title>
<p>Dynamic and measurement models:
<disp-formula id="FDA1">
<label>(A1)</label>
<mml:math display="block">
<mml:mtable columnalign="left">
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">F</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:msub>
<mml:mi mathvariant="bold">z</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">H</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>;</mml:mo></mml:mtd></mml:mtr></mml:mtable></mml:math></disp-formula>
<list list-type="order">
<list-item>
<p>Compute the <italic>a priori</italic> state estimate:
<disp-formula id="FDA2">
<label>(A2)</label>
<mml:math display="block">
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo></mml:msubsup>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">F</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:msubsup>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mo>+</mml:mo></mml:msubsup>
<mml:mo>;</mml:mo></mml:mrow></mml:math></disp-formula>the superscript—in 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula> stands for “the <italic>a priori</italic> estimate at time <italic>t<sub>k</sub></italic>, before the current measurement <bold>z</bold><italic><sub>k</sub></italic> is used in computing the <italic>a posteriori</italic> estimate”; the superscript + in 
<inline-formula>
<mml:math>
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mo>+</mml:mo></mml:msubsup></mml:mrow></mml:math></inline-formula> stands for “the <italic>a posteriori</italic> estimate at time <italic>t<sub>k</sub></italic>, which is computed based on the evidence in the current measurement <bold>z</bold><italic><sub>k</sub></italic>”.</p></list-item>
<list-item>
<p>Compute the a priori error covariance matrix:
<disp-formula id="FDA3">
<label>(A3)</label>
<mml:math display="block">
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">P</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo></mml:msubsup>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">F</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:msub>
<mml:mi mathvariant="bold">P</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:msubsup>
<mml:mi mathvariant="bold">F</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mi>T</mml:mi></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">Q</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>;</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item>
<list-item>
<p>Compute the innovation and its covariance matrix:
<disp-formula id="FDA4">
<label>(A4)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">ν</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">z</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">H</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo></mml:msubsup></mml:mrow>
<mml:mo stretchy="false">)</mml:mo></mml:mrow>
<mml:mo>;</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item>
<list-item>
<p>Compute the covariance matrix of the innovation:
<disp-formula id="FDA5">
<label>(A5)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">S</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">H</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:msubsup>
<mml:mi mathvariant="bold">P</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo></mml:msubsup>
<mml:msubsup>
<mml:mi mathvariant="bold">H</mml:mi>
<mml:mi>k</mml:mi>
<mml:mi>T</mml:mi></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">R</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>;</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item>
<list-item>
<p>Compute the Kalman gain:
<disp-formula id="FDA6">
<label>(A6)</label>
<mml:math display="block">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">K</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mi mathvariant="bold">P</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo></mml:msubsup>
<mml:msubsup>
<mml:mi mathvariant="bold">H</mml:mi>
<mml:mi>k</mml:mi>
<mml:mi>T</mml:mi></mml:msubsup>
<mml:msubsup>
<mml:mi mathvariant="bold">S</mml:mi>
<mml:mi>k</mml:mi>
<mml:mrow>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msubsup>
<mml:mo>;</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item>
<list-item>
<p>Compute the <italic>a posteriori</italic> state estimate:
<disp-formula id="FDA7">
<label>(A7)</label>
<mml:math display="block">
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>+</mml:mo></mml:msubsup>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo></mml:msubsup>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">K</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:msub>
<mml:mi mathvariant="bold">ν</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>;</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item>
<list-item>
<p>Compute the <italic>a posteriori</italic> error covariance matrix:
<disp-formula id="FDA8">
<label>(A8)</label>
<mml:math display="block">
<mml:mrow>
<mml:msubsup>
<mml:mi mathvariant="bold">P</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>+</mml:mo></mml:msubsup>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mi mathvariant="bold">P</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo></mml:msubsup>
<mml:mo>−</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">K</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:msub>
<mml:mi mathvariant="bold">H</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:msubsup>
<mml:mi mathvariant="bold">P</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo></mml:msubsup>
<mml:mo>.</mml:mo></mml:mrow></mml:math></disp-formula></p></list-item></list></p></sec>
<sec>
<label>2.</label>
<title>EKF Equations</title>
<p>When the dynamic model, the measurement model or both are nonlinear the EKF comes to our rescue:
<disp-formula id="FDA9">
<label>(A9)</label>
<mml:math display="block">
<mml:mrow>
<mml:mtable columnalign="left">
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>f</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">w</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr columnalign="left">
<mml:mtd columnalign="left">
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">z</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mi>h</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo>(</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi></mml:msub></mml:mrow>
<mml:mo>)</mml:mo></mml:mrow>
<mml:mo>+</mml:mo>
<mml:msub>
<mml:mi mathvariant="bold">v</mml:mi>
<mml:mi>k</mml:mi></mml:msub>
<mml:mo>.</mml:mo></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:math></disp-formula></p>
<p>The EKF equations differ from the <xref ref-type="disp-formula" rid="FDA1">Equations (A1)</xref>–<xref ref-type="disp-formula" rid="FDA8">(A8)</xref> only in the specifications of the matrices <bold>F</bold><sub><italic>k</italic>−1</sub> and <bold>H</bold><italic><sub>k</sub></italic>:
<disp-formula id="FDA10">
<label>(A10)</label>
<mml:math display="block">
<mml:mrow>
<mml:mrow>
<mml:mo>{</mml:mo>
<mml:mrow>
<mml:mtable>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">F</mml:mi>
<mml:mrow>
<mml:mi mathvariant="italic">ijk</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mrow>
<mml:mfrac>
<mml:mo>∂</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mo>∂</mml:mo>
<mml:mi>x</mml:mi></mml:mrow>
<mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mfrac>
<mml:msub>
<mml:mi>f</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow>
<mml:mo>|</mml:mo></mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mrow>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo>
<mml:mn>1</mml:mn></mml:mrow>
<mml:mo>+</mml:mo></mml:msubsup></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr>
<mml:mtr>
<mml:mtd>
<mml:mrow>
<mml:msub>
<mml:mi mathvariant="bold">H</mml:mi>
<mml:mi mathvariant="italic">ijk</mml:mi></mml:msub>
<mml:mo>=</mml:mo>
<mml:msub>
<mml:mrow>
<mml:mrow>
<mml:mfrac>
<mml:mo>∂</mml:mo>
<mml:mrow>
<mml:msub>
<mml:mrow>
<mml:mo>∂</mml:mo>
<mml:mi>x</mml:mi></mml:mrow>
<mml:mi>j</mml:mi></mml:msub></mml:mrow></mml:mfrac>
<mml:msub>
<mml:mi>h</mml:mi>
<mml:mi>i</mml:mi></mml:msub>
<mml:mo> </mml:mo>
<mml:mrow>
<mml:mo stretchy="false">(</mml:mo>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mo stretchy="false">)</mml:mo></mml:mrow></mml:mrow>
<mml:mo>|</mml:mo></mml:mrow>
<mml:mrow>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mo>=</mml:mo>
<mml:msubsup>
<mml:mi mathvariant="bold">x</mml:mi>
<mml:mi>k</mml:mi>
<mml:mo>−</mml:mo></mml:msubsup>
<mml:mo>.</mml:mo></mml:mrow></mml:msub></mml:mrow></mml:mtd></mml:mtr></mml:mtable></mml:mrow></mml:mrow></mml:mrow></mml:math></disp-formula></p></sec></app></app-group>
<sec sec-type="display-objects">
<title>Figures and Tables</title>
<fig id="f1-sensors-11-01489" position="float">
<label>Figure 1.</label>
<caption>
<p>Earth-fixed frame and body-fixed frame on a toy aircraft.</p></caption>
<graphic xlink:href="sensors-11-01489f1.gif"/></fig>
<fig id="f2-sensors-11-01489" position="float">
<label>Figure 2.</label>
<caption>
<p>Rotation about the <bold>e</bold><sub>3</sub>-axis through an angle <italic>θ</italic> (positive counter-clockwise).</p></caption>
<graphic xlink:href="sensors-11-01489f2.gif"/></fig>
<fig id="f3-sensors-11-01489" position="float">
<label>Figure 3.</label>
<caption>
<p>The vector <bold>v</bold> is rotated about the axis <bold>n</bold> (Euler axis) through an angle of rotation <italic>θ</italic>. Note that the rotated vector <bold>R</bold> (<bold>n</bold>, <italic>θ</italic>)<bold>v</bold> shares the parallel component with <bold>v</bold>.</p></caption>
<graphic xlink:href="sensors-11-01489f3.gif"/></fig>
<fig id="f4-sensors-11-01489" position="float">
<label>Figure 4.</label>
<caption>
<p>Inclination of the strap-down magnetic compass relative to the horizontal plane as defined by gravity direction.</p></caption>
<graphic xlink:href="sensors-11-01489f4.gif"/></fig>
<fig id="f5-sensors-11-01489" position="float">
<label>Figure 5.</label>
<caption>
<p>A single-axis accelerometer measures the projection (in the direction of the sensitive axis) of the specific force <bold>f</bold> resulting from the sum of the inertial acceleration <bold>a</bold> and the equivalent gravity acceleration −<bold>g</bold>.</p></caption>
<graphic xlink:href="sensors-11-01489f5.gif"/></fig>
<fig id="f6-sensors-11-01489" position="float">
<label>Figure 6.</label>
<caption>
<p>EKF structure.</p></caption>
<graphic xlink:href="sensors-11-01489f6.gif"/></fig>
<fig id="f7-sensors-11-01489" position="float">
<label>Figure 7.</label>
<caption>
<p>Roll angle time functions, truth reference and estimation error by the EKF.</p></caption>
<graphic xlink:href="sensors-11-01489f7.gif"/></fig>
<fig id="f8-sensors-11-01489" position="float">
<label>Figure 8.</label>
<caption>
<p>Pitch angle time functions, truth reference and estimation error by the EKF.</p></caption>
<graphic xlink:href="sensors-11-01489f8.gif"/></fig>
<fig id="f9-sensors-11-01489" position="float">
<label>Figure 9.</label>
<caption>
<p>Yaw angle time functions, truth reference and estimation error by the EKF.</p></caption>
<graphic xlink:href="sensors-11-01489f9.gif"/></fig>
<table-wrap id="t1-sensors-11-01489" position="float">
<label>Table 1.</label>
<caption>
<p>Optimally tuned parameter setting for the EKF. The raw magnetic data from the MTx are expressed in arbitrary units (a.u.), since they are normalized to earth field strength by the manufacturer.</p></caption>
<table frame="box" rules="all">
<tbody valign="top">
<tr>
<td align="left" valign="bottom"><bold>Process noise statistics</bold></td>
<td align="right" valign="bottom"/></tr>
<tr>
<td align="left" valign="bottom">Gyro standard deviation <italic><sup>g</sup>σ</italic>, °/s</td>
<td align="right" valign="bottom">0.4</td></tr>
<tr>
<td align="left" valign="bottom">Magnetic bias standard deviation <italic><sup>b</sup>σ</italic>, a.u. (× 10<sup>−3</sup>)</td>
<td align="right" valign="bottom">0.1</td></tr>
<tr>
<td align="left" valign="bottom"><bold>Measurement noise statistics</bold></td>
<td align="right" valign="bottom"/></tr>
<tr>
<td align="left" valign="bottom">Accelerometer standard deviation <italic><sup>a</sup>σ</italic>, m<italic>g</italic></td>
<td align="right" valign="bottom">10.0</td></tr>
<tr>
<td align="left" valign="bottom">Magnetic sensor standard deviation <italic><sup>h</sup>σ</italic>, a.u. (× 10<sup>−3</sup>)</td>
<td align="right" valign="bottom">1.0</td></tr>
<tr>
<td align="left" valign="bottom"><bold>Thresholds for R-adaptation</bold></td>
<td align="right" valign="bottom"/></tr>
<tr>
<td align="left" valign="bottom">Acceleration measurements: <italic>ɛ</italic><sub><italic>a</italic></sub>, m<italic>g</italic></td>
<td align="right" valign="bottom">40.0</td></tr>
<tr>
<td align="left" valign="bottom">Magnetic sensor measurements: <italic>ɛ</italic><sub><italic>h</italic></sub>, a.u. (× 10<sup>−3</sup>)</td>
<td align="right" valign="bottom">50.0</td></tr></tbody></table></table-wrap>
<table-wrap id="t2-sensors-11-01489" position="float">
<label>Table 2.</label>
<caption>
<p>Performance assessment.</p></caption>
<table frame="hsides" rules="groups">
<thead>
<tr>
<th align="left" valign="middle">RMSE</th>
<th align="center" valign="middle">EKF</th>
<th align="center" valign="middle"><italic>ɛ<sub>h</sub></italic> = 0</th>
<th align="center" valign="middle"><italic>ɛ<sub>a</sub></italic> = 0</th>
<th align="center" valign="middle"><italic>ɛ<sub>a</sub></italic> = <italic>ɛ</italic><sub><italic>h</italic></sub> = 0</th>
<th align="center" valign="middle">Xsens EKF</th></tr></thead>
<tbody>
<tr>
<td align="left" valign="top">Roll angle, °</td>
<td align="center" valign="top">0.72</td>
<td align="center" valign="top">0.89</td>
<td align="center" valign="top">3.13</td>
<td align="center" valign="top">0.97</td>
<td align="center" valign="top">0.94</td></tr>
<tr>
<td align="left" valign="top">Pitch angle, °</td>
<td align="center" valign="top">0.83</td>
<td align="center" valign="top">0.88</td>
<td align="center" valign="top">1.20</td>
<td align="center" valign="top">4.91</td>
<td align="center" valign="top">0.76</td></tr>
<tr>
<td align="left" valign="top">Yaw angle, °</td>
<td align="center" valign="top">1.23</td>
<td align="center" valign="top">3.88</td>
<td align="center" valign="top">4.30</td>
<td align="center" valign="top">3.76</td>
<td align="center" valign="top">1.30</td></tr>
<tr>
<td align="left" valign="top">Orientation angle, °</td>
<td align="center" valign="top">1.62</td>
<td align="center" valign="top">3.96</td>
<td align="center" valign="top">5.26</td>
<td align="center" valign="top">6.19</td>
<td align="center" valign="top">1.72</td></tr></tbody></table></table-wrap></sec></back></article>
