# Micro contrôleurs AVR/Travail pratique/Utilisation d'un Accéléromètre MPU6050

La majeure partie de ce chapitre n'existerait pas sans la publication de Shane Colton du MIT (voir bibliographie en fin de chapitre).
Nous avons reclassé récemment (Janv.2020) ce TP en niveau 16 à cause de la présence des mathématiques sur les rotations. Vous pouvez cependant vous tourner vers le TP sur le 9250 qui reste beaucoup plus simple d'accès et qui fonctionne partiellement avec le MPU6050 si l'on enlève tous ce qui a rapport au magnétomètre.
Ce projet vise à comprendre et utiliser un capteur moderne d'accélération couplé à un gyroscope, deux capteurs aujourd'hui facilement trouvés ensemble dans un même composant à coût modeste (1 €-2 €).
Nous allons mettre en œuvre ce composant avec un Arduino, et le coupler à un programme Processing chargé de réaliser une visualisation 2D ou 3D de l'attitude de l'accéléromètre.
Certaines sections de ce travail pratique (sur les matrices de rotations) sont très théoriques. Elles ne sont utiles que si vous voulez comprendre le fondement des formules. Depuis la rédaction de ces exercices, nous avons réalisé un projet de robotique mobile en équilibre sur deux roues utilisant le même accéléromètre que ce TP (voir chapitre suivant) mais ne nécessite pas une connaissance approfondie des rotations 3D. Les rotations 2D, plus intuitives, permettent déjà de résoudre ce problème d'équilibre.
Nous réalisons aussi un projet de plate forme support d'une caméra comprenant deux servomoteurs. Nous y avons mis un accéléromètre et avons demandé à des étudiants de stabiliser la plate forme. Ils ont pu stabiliser le tangage avec l'accéléromètre. Reste à stabiliser le lacet, ce qui ne peut être fait avec un accéléromètre mais avec le gyroscope ; c'est le genre de détail qu'une bonne connaissance des rotations 3D permet de comprendre (les résultats détaillés seront publiés dans un futur proche).

## Introduction aux capteurs IMU

IMU : Inertial Measurement Unit se traduit en français par Centrale à Inertie.
La référence du capteur que nous allons utiliser est GY-521 ; il est architecturé autour d'un MPU 6050 qui est composé de deux capteurs et d'un processeur :
* un capteur accéléromètre 3 axes (x,y et z) qui mesure une accélération ;
* un capteur gyroscope 3 axes qui mesure une vitesse angulaire ;
* un « Digital Motion Processor » (DMP) pouvant stocker et restituer des données.
La terminologie anglo-saxonne associée à ce genre de capteur est 6 DOF (Degree of Freedom). On devrait traduire par 6 degrés de liberté mais il est préférable de traduire par 6 axes (3 pour l'accéléromètre et 3 pour le gyroscope). Le meilleur de ce qui se fait actuellement pour les capteurs bon marché ( < 50 € ) comporte 9 axes. En général c’est un magnétomètre qui est ajouté pour essayer de repérer le Nord magnétique. Ces 9 axes sont en général suffisants pour réaliser, en combinant les mesures de ces trois capteurs, une centrale à inertie de coût modeste.
Mais ces trois capteurs ont des défauts rendant leur utilisation délicate.
Nous allons nous contenter de six axes dans la suite du présent projet dont l'objectif peut se résumer dans la figure ci-dessus : réaliser à l'aide d'un traitement des données des capteurs une visualisation avec Processing permettant de mettre en évidence les propriétés des capteurs accélérations et gyroscopes.

### La notion d'attitude

L'attitude en robotique (et en astronautique) désigne la direction des axes de la pièce mobile du robot ; généralement caractérisée par trois angles (roulis, tangage et cap ou lacet).
Ce mot « attitude » ne doit pas être confondu avec « altitude » (ils n'ont en commun qu'une orthographe voisine) !
La notion d'attitude est très liée aux rotations en trois dimensions. Nous allons donc commencer par examiner ces rotations d'un point de vue mathématique.

## Introduction : mathématiques des rotations

Il est difficile d'éviter le formalisme des matrices lorsqu'on aborde le sujet des rotations. Le chapitre Les Matrices d'un autre projet peut permettre d'aborder ce sujet. Ne le lisez pas de façon exhaustive, contentez-vous des concepts d'addition et de multiplication de matrices ainsi que de la notion de déterminant.
Les rotations en trois dimensions sont suffisamment complexes pour que nous leur accordions un peu de temps (voir aussi les articles Matrice de Rotation et Angles d'Euler dans wikipédia).
Cette partie mathématique sera agrémentée de code SCILAB pour essayer de découvrir quelques propriétés des rotations 3D.
Soient les matrices :
$R_{\mathbf {x} }(\phi )={\begin{pmatrix}1&0&0\\0&\cos \phi &-\sin \phi \\0&\sin \phi &\cos \phi \end{pmatrix}},\qquad R_{\mathbf {y} }(\theta )={\begin{pmatrix}\cos \theta &0&\sin \theta \\0&1&0\\-\sin \theta &0&\cos \theta \end{pmatrix}},\qquad R_{\mathbf {z} }(\psi )={\begin{pmatrix}\cos \psi &-\sin \psi &0\\\sin \psi &\cos \psi &0\\0&0&1\end{pmatrix}}.$
Elles nous permettent de définir les angles associés aux rotations autour des axes x,y et z.
Voici un code SCILAB permettant de définir ces trois matrices pour des valeurs particulières d'angle :

### Euler 123

La notation 123 signifie que l’on fait d’abord la rotation 3 (autour de l'axe z) puis la rotation 2 (autour de l'axe y) pour finir par la rotation 1 (autour de l'axe x). La matrice de rotation associée est donc :
$R=R_{x}(\phi )\cdot R_{y}(\theta )\cdot R_{z}(\psi )$
Cette matrice vaut donc :
$R={\begin{pmatrix}\cos \theta \cdot \cos \psi &\cos \theta \cdot \sin \psi &-\sin \theta \\\cos \psi \sin \theta \sin \phi -\cos \phi \sin \psi &\cos \phi \cos \psi +\sin \theta \sin \phi \sin \psi &\cos \theta \sin \phi \\\cos \phi \cos \psi \sin \theta +\sin \phi \sin \psi &\cos \phi \sin \theta \sin \psi -\cos \psi \sin \phi &\cos \theta \cos \phi \end{pmatrix}}$
Toute rotation en dimension 3 est équivalente à un produit des trois rotations que l’on vient de définir. Cela signifie que trois paramètres suffisent pour définir une rotation (les trois Angles d'Euler).
Le code SCILAB permettant de réaliser le calcul de la matrice d'Euler 123 est :
Une rotation en dimension 3 peut aussi être définie par un axe de rotation et un angle (soit à priori 4 paramètres). Les quatre paramètres sont naturellement les trois composantes du vecteur qui définit l'axe et l'angle de rotation. Il est en fait possible d'économiser un paramètre en définissant l'axe à partir du centre d'une sphère ainsi que la longitude et latitude du point de rencontre de l'axe avec la sphère. Une autre manière d'économiser une donnée est de définir l'axe de rotation par un vecteur unitaire pour lequel trois coordonnées suffisent. Bref seulement 3 paramètres suffisent à définir une rotation.
Cette matrice R aura un vecteur argument à sa droite sur laquelle elle agira et comme "rotz" est à droite c'est elle agira en premier. Notre qualification 123 respecte donc l'ordre d'apparition des matrices dans le produit : rotx puis roty puis rotz (mais qui veut dire d'abord l'application de rotz) ! Pour éviter toute ambiguïté Il serait mieux d'appliquer les notations de Phil Kim (voir bibliographie) qui serait dans ce cas z->y->x (ou x<-y<-z) qui exprime bien le fait que l'on commence par la rotation autour de l'axe z pour terminer par celle autour de l'axe x. Les flèches expriment très intuitivement l'ordre d'application des matrices rotations.

### Angle de rotation

Nous venons de dire que toute rotation est équivalente à un angle de rotation autour d'un axe de rotation. Cependant, une façon naturelle de définir une matrice de rotation de manière pratique est simplement par les coordonnées de chacun des axes. En clair vous disposez d'un repère (${\overrightarrow {i}},{\overrightarrow {j}},{\overrightarrow {k}}$) et vous cherchez la matrice qui vous permet d'obtenir ce repère après rotation (${\overrightarrow {i'}},{\overrightarrow {j'}},{\overrightarrow {k'}}$). Cette matrice est définie par les coordonnées de chacun des vecteurs (${\overrightarrow {i'}},{\overrightarrow {j'}},{\overrightarrow {k'}}$) dans (${\overrightarrow {i}},{\overrightarrow {j}},{\overrightarrow {k}}$), soit 9 paramètres. La matrice contenant ces 9 paramètres est appelée DCM : Direction Cosine Matrix). La données de ces paramètres ne vous permettra pas de vous faire une idée intuitive de la rotation correspondante. En général, il faut donc savoir comment passer des 9 paramètres aux 3 Angles d'Euler ou (pour les quaternions) qui vous décriront de manière plus intuitive la rotation. Cherchons une description axe de rotation plus angle.
Commençons dans cette section par rechercher l'angle de rotation en question ; nous le noterons $\theta _{global}$ pour éviter toute confusion avec $\theta$ de la section précédente.
La trace d'une matrice est la somme de ses éléments sur sa diagonale. Elle est toujours liée à l'angle de rotation.
Le calcul de l'angle $\theta _{global}$ associé à une rotation est tout simple. Il se fait à l'aide de la formule :
$\operatorname {Tr} (R)=1+2\cos(\theta _{global})$
Le code SCILAB permettant le calcul d'angle est donc :

### Calcul de l'axe de rotation
#### Utilisation de SCILAB

L'axe de rotation est plus difficile à calculer si l'on ne dispose pas d'une puissance de calcul suffisante. Sur notre PC ce n’est pas un problème : il faut chercher le vecteur invariant par cette rotation. Techniquement cela revient à chercher le seul et unique vecteur propre associé à la valeur propre +1. Plutôt que d’en faire la théorie, nous préférons donner le code de SCILAB qui permet facilement ce genre de calcul :
affiche :
La dernière colonne de X, celle en face du 1 comme valeur propre est l'axe de rotation. L'axe est donc défini par le vecteur ${\overrightarrow {u}}{\begin{pmatrix}{-0.2219452}\\0.8283109\\0.5144330\end{pmatrix}}$.
Il existe une autre méthode avec SCILAB :
qui donne
qui permet de retrouver le même axe : ${\overrightarrow {u}}{\begin{pmatrix}{-0.2219452}\\0.8283109\\0.5144330\end{pmatrix}}$.
Pour la suite on supposera que notre calcul a été fait avec la première méthode et donc que l’on a calculé X, et que, si l’on a besoin de l'axe, il suffit de l'extraire de X.

#### Sans SCILAB

Les microcontrôleurs de type AVR (et même bien d'autres sont incapables de faire tourner SCILAB (ou OCTAVE/MATLAB). Il nous faut donc plutôt une formule pour trouver l'axe de rotation. Cette formule nécessite déjà le calcul de l'angle de rotation. La formule que nous avons donné précédemment peut être utilisée sur n'importe quel processeur, y compris sur un AVR.
Commençons par le calcul de l'angle de rotation :
$\operatorname {Tr} (R)=1+2\cos(\theta _{global})$
donne :
${\operatorname {Tr} (R)-1 \over 2}=\cos(\theta _{global})$
et finalement :
$\theta _{global}=\arccos({{\operatorname {Tr} (R)-1} \over 2})$
On peut démontrer que l'axe est caractérisé par le vecteur u :
${\overrightarrow {u}}{\begin{pmatrix}{R_{32}-R_{23} \over \sin(\theta _{global})}\\{R_{13}-R_{31} \over \sin(\theta _{global})}\\{R_{21}-R_{12} \over \sin(\theta _{global})}\end{pmatrix}}$
où $R_{32}$ désigne l'élément de la matrice de rotation de la 3ème ligne et de la deuxième colonne.

### Matrice de rotation à partir d'un axe et d'un angle

Nous cherchons maintenant à résoudre le problème inverse : nous connaissons l'axe de rotation et l'angle associé, comment trouver la matrice de rotation associée ?
On peut calculer la matrice R de rotation autour d'un axe dirigé par un vecteur unitaire ${\overrightarrow {u}}{\begin{pmatrix}{u_{x}}\\u_{y}\\u_{z}\end{pmatrix}}$ (donc avec $u_{x}^{2}+u_{y}^{2}+u_{z}^{2}=1$) et d'un angle $\theta _{global}$. La formule est :
    $R={\begin{pmatrix}u_{x}^{2}(1-c)+c&u_{x}u_{y}(1-c)-u_{z}s&u_{x}u_{z}(1-c)+u_{y}s\\[3pt]u_{x}u_{y}(1-c)+u_{z}s&u_{y}^{2}(1-c)+c&u_{y}u_{z}(1-c)-u_{x}s\\[3pt]u_{x}u_{z}(1-c)-u_{y}s&u_{y}u_{z}(1-c)+u_{x}s&u_{z}^{2}(1-c)+c\end{pmatrix}}$
où
    $c=\cos(\theta _{global}),\qquad s=\sin(\theta _{global})$
Si l'espace en 3 dimensions est orienté de façon conventionnelle, cette rotation se fera dans le sens inverse aux aiguilles d'une montre pour un observateur placé de telle sorte que le vecteur directeur ${\overrightarrow {u}}$ pointe dans sa direction (règle de la main droite).
Exemple en SCILAB
redonne exactement la même matrice que R pour les deux techniques de construction de R2 et R3.

### Rotations du vecteur accélération de pesanteur

Tout accéléromètre est sensible au vecteur accélération de pesanteur. Cela en fait un très bon candidat pour mesurer l'attitude d'un solide pourvu que celui-ci ne soit pas soumis à une autre accélération (que l'accélération de pesanteur). Ceci est rarement le cas pour un robot mais l'accélération sera faible par rapport au vecteur d'accélération de pesanteur au moins tant qu’il n'y a pas de chocs.
Le vecteur accélération possède comme tout vecteur trois composantes :
${\overrightarrow {g}}{\begin{pmatrix}{g_{x}}\\g_{y}\\g_{z}\end{pmatrix}}$
S'il est exprimé dans un repère avec z vertical et vers le haut, et s'il est normalisé, ce vecteur devient :
${\overrightarrow {g}}{\begin{pmatrix}{0}\\0\\-1\end{pmatrix}}$
Après une rotation Euler 123, ce vecteur est transformé en
${\overrightarrow {g}}'=R_{x}(\phi )\cdot R_{y}(\theta )\cdot R_{z}(\psi )\cdot {\overrightarrow {g}}=R_{x}(\phi )\cdot R_{y}(\theta )\cdot R_{z}(\psi )\cdot {\begin{pmatrix}{0}\\0\\-1\end{pmatrix}}$
soit, tout calcul fait,
${\overrightarrow {g}}'={\begin{pmatrix}{\sin \theta }\\-\cos \theta \sin \phi \\-\cos \theta \cos \phi \end{pmatrix}}$
Cette formule montre qu’à partir d'une mesure de g dans le repère qui a tourné, il est possible de trouver $\theta$ et $\phi$ mais pas $\psi$ !!!
* En effet $g_{x}=\sin(\theta )$ permet de trouver $\theta$
* Puis ${g_{y} \over g_{z}}=\tan(\phi )$ permet de trouver $\phi$
$\psi$
Rappelons que ce que l’on cherche à faire est de retrouver les axes x, y et z à partir des seules connaissances des composantes gx, gy et gz du vecteur ${\vec {g}}$ (sachant que ${\vec {g}}$ est vertical). Mais regardez la figure attentivement pour vous convaincre de l'impossibilité d'une solution générale à ce problème.

#### Autre manière de calculer les angles

Cette propriété d'invariance de g par une rotation autour de l'axe vertical permet de trouver une autre relation pour le calcul de $\theta$ et de $\phi$. Il s'agit d'un calcul trouvé dans la note d'application AN4248 de Freescale Semiconcuctor intitulée Implementing a Tilt-Compensated eCompass using Accelerometer and Magnetometer Sensors.
Repartons de
${\overrightarrow {g}}'=R_{x}(\phi )\cdot R_{y}(\theta )\cdot R_{z}(\psi )\cdot {\overrightarrow {g}}=R_{x}(\phi )\cdot R_{y}(\theta )\cdot R_{z}(\psi )\cdot {\begin{pmatrix}{0}\\0\\-1\end{pmatrix}}$
Cette formule peut se simplifier en (pas d'effet de la matrice de rotation suivant l'axe z sur g) :
${\overrightarrow {g}}'=R_{x}(\phi )\cdot R_{y}(\theta )\cdot {\overrightarrow {g}}=R_{x}(\phi )\cdot R_{y}(\theta )\cdot {\begin{pmatrix}{0}\\0\\-1\end{pmatrix}}$
puis en faisant passer la rotation inverse dans le terme de gauche (avec changement de signe de l'angle pour inverser la matrice)
$R_{x}(-\phi )\cdot {\overrightarrow {g}}'=R_{y}(\theta )\cdot {\overrightarrow {g}}=R_{y}(\theta )\cdot {\begin{pmatrix}{0}\\0\\-1\end{pmatrix}}$
pour finalement donner avec la même opération que précédemment pour la rotation autour de l'axe y
$R_{y}(-\theta )\cdot R_{x}(-\phi )\cdot {\overrightarrow {g}}'={\overrightarrow {g}}={\begin{pmatrix}{0}\\0\\-1\end{pmatrix}}$
En remplaçant par les matrices correspondantes cela donne donc
$R_{\mathbf {x} }(-\phi )={\begin{pmatrix}1&0&0\\0&\cos \phi &\sin \phi \\0&-\sin \phi &\cos \phi \end{pmatrix}},\qquad R_{\mathbf {y} }(-\theta )={\begin{pmatrix}\cos \theta &0&-\sin \theta \\0&1&0\\\sin \theta &0&\cos \theta \end{pmatrix}}.$
d'où
${\begin{pmatrix}1&0&0\\0&\cos \phi &\sin \phi \\0&-\sin \phi &\cos \phi \end{pmatrix}}\cdot {\begin{pmatrix}\cos \theta &0&-\sin \theta \\0&1&0\\\sin \theta &0&\cos \theta \end{pmatrix}}\cdot {\overrightarrow {g}}'={\begin{pmatrix}1&0&0\\0&\cos \phi &\sin \phi \\0&-\sin \phi &\cos \phi \end{pmatrix}}\cdot {\begin{pmatrix}\cos \theta &0&-\sin \theta \\0&1&0\\\sin \theta &0&\cos \theta \end{pmatrix}}\cdot {\begin{pmatrix}{g'_{x}}\\g'_{y}\\g'_{z}\end{pmatrix}}={\overrightarrow {g}}={\begin{pmatrix}{0}\\0\\-1\end{pmatrix}}$
En effectuant le produit matriciel on trouve :
${\begin{pmatrix}\cos \theta &\sin \theta \cdot \sin \phi &\sin \theta \cdot \cos \phi \\0&\cos \phi &-\sin \phi \\-\sin \theta &\cos \theta \cdot \sin \phi &\cos \theta \cdot \cos \phi \end{pmatrix}}\cdot {\begin{pmatrix}{g'_{x}}\\g'_{y}\\g'_{z}\end{pmatrix}}={\overrightarrow {g}}={\begin{pmatrix}{0}\\0\\-1\end{pmatrix}}$
Les deux composantes de g à 0 en commençant par gy donnent
$g'_{y}\cdot \cos \phi -g'_{z}\cdot \sin \phi =0$
soit
$\tan \phi ={g'_{y} \over g'_{z}}$ ce qui permet de trouver $\phi$.
De même la composante suivant x donne :
$g'_{x}\cdot \cos \theta +g'_{y}\cdot \sin \theta \cdot \sin \phi +g'_{z}\cdot \sin \theta \cdot \cos \phi =0$
soit enfin
$\tan \theta ={-g'_{x} \over {g'_{y}\cdot \sin \phi +g'_{z}\cdot \cos \phi }}$
Vous avez ainsi deux relations qui vous permettent de calculer les angles en utilisant seulement la primitive atan2.
On retiendra donc :
* Première méthode :
** $g_{x}=\sin(\theta )$ permet de trouver $\theta$
** ${g_{y} \over g_{z}}=\tan(\phi )$ permet de trouver $\phi$
* Deuxième méthode qui a notre préférence :
** d'abord l'angle de roulis : $\tan \phi ={g_{y} \over g_{z}}$ ce qui permet de trouver $\phi$
** puis à l'aide de ce résultat l'angle de tangage : $\tan \theta ={-g_{x} \over {g_{y}\cdot \sin \phi +g_{z}\cdot \cos \phi }}$

#### Axe de rotation du vecteur g

Le script suivant :
nécessite l’utilisation de CrossProd.sci qui doit contenir :
* La réalisation de ce programme nous montre que l'on ne retrouve absolument pas l'axe correctement. Ce code est donc laissé seulement pour information, pour découvrir les chemins tortueux employés par l'esprit de l'auteur.
Cette erreur a permis de tirer la propriété suivante :

#### Passage en revue du travail de Kimberly Tuck (2007)

Nous avons eu l’occasion de commenter le travail Gyroscopes and Accelerometers on a Chip sur Internet et nous désirons expliquer les problèmes rencontrés ici.
Les raisonnements 3D nécessitent une bonne concentration. Nous avons nous-même commis des erreurs plusieurs fois (voir section précédente).
La note d'application AN3461 : Tilt Sensing Using Linear Accelerometers by: Kimberly Tuck (2007) est passée partiellement en revue maintenant.
Cette note comporte un point central : sa "Figure 8" qui nous a posé de sérieux problèmes. Il nous a été impossible de bien comprendre exactement sa partie dessin. Nous ne pouvons pas la publier ici (pour des raisons de copyright) ; nous avons donc refait une figure qui nous semble bien plus explicative que l'original, mais qui, du coup, est plus complexe : c’est la figure associée à cette section (ci-contre).
Les formules qui y apparaissent sont les mêmes que les formules originales (celles qui nous serviront pour l'exercice 4) mais nous nous sommes attachés à faire apparaître les triangles rectangles desquels on peut les déduire facilement si l’on se rappelle qu'une tangente est le rapport du côté opposé sur le côté adjacent.
De son côté, le texte de cette AN3461, nous définit les angles comme :
* $\phi$ est défini comme l'angle entre l'axe Y et le plan horizontal
* $\rho$ est défini comme l'angle entre l'axe X et le plan horizontal
* $\theta$ est défini comme l'angle entre l'axe Z et le vecteur accélération
Or sur la figure que nous proposons, seule la définition de $\theta$ saute immédiatement aux yeux. Pour les deux autres c’est un peu plus caché et cela demande un raisonnement géométrique : il vous faut remarquer que les angles cherchés ont leur côté perpendiculaires aux angles dessinés. Ils sont donc soit égaux soit supplémentaire. Le dessin faisant apparaître des angles plus petit que 90°, ils sont forcément égaux.
Par exemple, pour $\phi$, $A_{y}$ est perpendiculaire au côté du fond (l'angle droit est dessiné en rouge) et par définition le plan horizontal est perpendiculaire au vecteur accélération de pesanteur (gros vecteur vertical). Ainsi l'angle $\phi$ de la figure est aussi l'angle entre l'axe Y et le plan horizontal. CQFD.
* Apartir de maintenant les Angles d'Euler sont notés avec des indices 123 pour éviter toute confusion avec les angles calculés par Kimberly Tuck.
$\tan \phi ={A_{y} \over {\sqrt {(A_{x}^{2}+A_{z}^{2})}}}$
$\tan \rho ={A_{x} \over {\sqrt {(A_{y}^{2}+A_{z}^{2})}}}$
$\tan \theta ={{\sqrt {(A_{x}^{2}+A_{y}^{2})}} \over A_{z}}$
L'utilisation de SCILAB nous a permis cependant de trouver une relation entre les deux. En effet le code :
donne :
Ce qui est surprenant est la valeur de "erreury" qui est nulle :
$\theta$
$\rho$
Si vous remplacez dans $\tan \rho ={g_{x} \over {\sqrt {(g_{y}^{2}+g_{z}^{2})}}}$ les composantes de g par leur valeurs après Euler 123, soit donc : ${\overrightarrow {g}}'={\begin{pmatrix}{\sin \theta _{123}}\\-\cos \theta _{123}\sin \phi _{123}\\-\cos \theta _{123}\cos \phi _{123}\end{pmatrix}}$ vous retrouvez $\tan \theta _{123}$.
$-\pi$
$\pi$
$-\pi \over 2$
$\pi \over 2$
Est-il donc possible d’utiliser les angles calculés avec les formules de Kimerly Tuck pour trouver l'angle d'Euler manquant ? Nous avons déjà répondu par la négative à cette question mais nous pensons qu’il est utile de creuser la question : qu'est-ce qui fait que les calculs de Kimberly sont insensibles aux rotations autour d'un axe vertical ? Pour comprendre ce qui se passe on se pose la question suivante :
Nous vous donnons les trois angles de Kimberly , pouvez-vous amener la position du parallélépipède conformément à ces angles ?
* les rotations par rapport aux axes fixes ne sont pas commutatives donc problème ci-dessus n'aurait pas de solution puisqu'il ne nous donne pas l'ordre des rotations
* les rotations par rapport aux axes fixes sont quand même calculées par produit matriciel !!!
Prenez donc les lignes ci-dessous avec toutes les réserves qui s'imposent :
$\phi$
$\rho$
$\theta$
Malgré cette remarque qui sera retirée dès que les problèmes évoqués seront résolus, nous formulons la propriété suivante :
* $\tan \theta _{123}={g_{x} \over {\sqrt {(g_{y}^{2}+g_{z}^{2})}}}$
* $\tan \phi _{123}={g_{y} \over g_{z}}$
Le problème de la deuxième formule est son instabilité numérique. Une solution est examinée dans la nouvelle note d'application AN3461.

#### Passage en revue du travail de Mark Pedley (2013)

La note d'application AN3461 a été fortement remaniée : AN3461 : Tilt Sensing Using Linear Accelerometers by: Mark Pedley (2013). Seuls quelques points sont examinés maintenant.
* Les calculs correspondants à l'équation $\tan \phi _{123}={g_{y} \over g_{z}}$ sont instables quand gy et gz sont tous deux voisins de 0, c'est-à-dire que l'axe x se retrouve vertical (ou presque à cause du bruit des accéléromètres)
* L'équation $\tan \theta _{123}={g_{x} \over {\sqrt {(g_{y}^{2}+g_{z}^{2})}}}$ est toujours stable dans le champ de gravitation
Le problème de l'instabilité de calcul est résolu dans la note d'application AN3461 et nous renvoyons le lecteur intéressé à sa lecture. Nous nous contentons de donner le résultat final :
* $\tan \theta _{123}={g_{x} \over {\sqrt {(g_{y}^{2}+g_{z}^{2})}}}$
* $\tan \phi _{123}={g_{y} \over {sign(g_{z}){\sqrt {(g_{z}^{2}+\mu g_{x}^{2})}}}}$
La présence de $\mu$ introduit une erreur mais stabilise les calculs. Une valeur entre 0.01 et 0.1 donne une bonne plage d'utilisation.
Mark Pedley introduit dans une autre section le calcul d'angle entre deux lectures de l'accéléromètre. Nous rappelons au lecteur qui lirait cette section que l'angle qui y est calculé n’est pas forcément l'angle de rotation 3D. Mark Pedley ne prétend rien sur ces angles et n'utilise pas ses formules sur des données d'accéléromètres. Pour nous, il serait plus sage de faire disparaître cette section de cette note d'application pour lever toute ambiguïté.