Esto es de mucha de la aplicación de una pregunta de matemáticas. Estoy teniendo problemas con los ángulos de Euler en el contexto de aplicaciones de smartphone. He estado trabajando con Android, pero me imagino que el mismo problema se plantea en cualquier sistema operativo que uno usa.
En el contexto de que es en 3D de los sensores, el sistema operativo Android está configurado para calcular una matriz de rotación $\mathbf{R}$, el cual es definido por
$$ \mathbf{R}=\left[ \begin{array} [c]{ccc}% E_{x} & E_{y} & E_{z}\\ N_{x} & N_{y} & N_{z}\\ G_{x} & G_{y} & G_{z}% \end{array} \right] $$
donde $x$, $y$ y $z$ son ejes de relación con el smartphone,
y donde
$$ \begin{align*} \mathbf{E} & = \left( E_{x},E_{y},E_{z}\right) =\text{a unit vector which points East}\\ \mathbf{N} & = \left( N_{x},N_{y},N_{z}\right) =\text{a unit vector which points North}\\ \mathbf{G} & = \left( G_{x},G_{y},G_{z}\right) = \begin{array} [c]{l}% \text{a unit vector which points away from}\\ \text{the centre of the earth (Gravity vector)} \end{array} \text{ .} \end{align*} $$
Una vez $\mathbf{R}$ ha sido calculado, el sistema operativo Android calculará para usted los ángulos de Euler $\phi$, $\theta$ y $\psi$ donde
$$ \begin{array} [c]{lll}% \text{azimuth} & =\phi & =\text{rotation about }\mathbf{G}\\ \text{pitch} & =\theta & =\text{rotation about }\mathbf{E}\\ \text{roll} & =\psi & =\text{rotation about }\mathbf{N} \end{array} \text{ .} $$
La relación entre el $\mathbf{R}$ y $(\phi$, $\theta$, $\psi)$ está dada por
$$ \mathbf{R}=\left[ \begin{array} [c]{ccc}% \cos\phi\cos\psi-\sin\phi\sin\psi\sin\theta & \sin\phi\cos\theta & \cos \phi\sin\psi+\sin\phi\cos\psi\sin\theta\\ -\sin\phi\cos\psi-\cos\phi\sin\psi\sin\theta & \cos\phi\cos\theta & -\sin \phi\sin\psi+\cos\phi\cos\psi\sin\theta\\ -\sin\psi\cos\theta & -\sin\theta & \cos\psi\cos\theta \end{array} \right] \text{ .} $$
El azimut $\phi$ es particularmente importante en el resultado, porque la $\phi=0$ corresponde a la dirección del norte. Sin embargo, hay un problema bien conocido con estos ángulos de Euler, la cual es conocida como Gimbal lock. Al $\theta=\pm\frac{\pi}{2}$ el sistema de coordenadas es denerate en el sentido de que la combinación de $\phi\pm\psi$ está definido, pero las cantidades individuales $\phi$ $\psi$ no están definidos.
En el contexto de aplicaciones de smartphone, esto significa que la determinación de la dirección del norte es difícil cuando el dispositivo no está en posición horizontal sobre una mesa. Cuanto más se acerque el dispositivo llega a ser vertical, la menos fiable para coordinar el sistema. En stackoverflow.com algunas personas recomiendan la conmutación de ejes al $\theta$ se mueve lejos de la $0$ a fin de evitar Gimbal lock, pero me parece que la solución que presenta otros problemas, tales como saltos en $\phi$, $\theta$ y $\psi$ cuando el sistema de coordenadas está conectado.
Así que mi pregunta es, en lugar de $\phi$, $\theta$ y $\psi$ como se definió anteriormente, existe una mejor manera de definir un angular del sistema de coordenadas para que expresan la orientación de un smartfone en relación a los vectores $\mathbf{E}$, $\mathbf{N}$ y $\mathbf{G}$? En particular, existe un sistema de coordenadas que es mejor para definir la dirección del norte, que funcionará si el dispositivo está en posición vertical o en posición horizontal sobre una mesa.
Aclaración Cualquiera que sea la mejor metodología es, en consecuencia, debe haber algún tipo de ángulo acimutal que puede ser explícitamente calcula a partir de la matriz de rotación $R$, lo que representa el ángulo a través del cual el dispositivo debe ser girado de manera que es apuntando hacia el norte.