Creo que lo máximo que podemos esperar hacer aquí en math.se es determinar cuál, de hecho, es el cuaternión correcto para la representación de ángulos de Euler. Si hay algún error en el código, tendrás que llevar esa pregunta a un stackexchange de programación.
Pero en cuanto a la parte matemática de esta tarea:
Interpreté $r = [pi/2, pi/4, pi/2]$ como "rotar por $\pi/2$ en el eje x, luego por $\pi/4$ en el eje $y$, luego por $\pi/2$ en el eje $z$."
Usando la teoría involucrada en la conversión de ángulo de eje a cuaterniones, se pueden convertir esos tres fácilmente como $\cos(\theta/2)+\sin(\theta/2)u$ donde $u$ es el vector unitario que apunta a lo largo del eje de rotación.
Usé la librería numpy-quaternion
en python para verificar que estos fueran correctos:
>>> x
quaternion(0.707106781186548, 0.707106781186547, 0, 0)
>>> y
quaternion(0.923879532511287, 0, 0.38268343236509, 0)
>>> z
quaternion(0.707106781186548, 0, 0, 0.707106781186547)
>>> q=z*y*x
>>> q*a*q.inverse()
quaternion(-4.44089209850063e-16, 3, 2.12132034355964, 0.707106781186548)
Dado que esa última parte (-4.44089209850063e-16, 3, 2.12132034355964, 0.707106781186548)
coincide con lo que reportaste, supongo que estoy en el camino correcto. (Realmente debería ser $(0, 3,3/\sqrt{2},\sqrt{2}/2)$)
Pero
>>> q
quaternion(0.653281482438188, 0.270598050073099, 0.653281482438188, 0.270598050073098)
no coincide con tu predicción de cómo debería ser el cuaternión. El ángulo allí en la posición w es una clara señal de que algo no está bien. Dado que estás trabajando con el cuaternión incorrecto, naturalmente no obtendrás de vuelta tu representación de Euler correcta al aplicar el código de conversión.
Te dejo a ti trabajar en el error con la forma en que estás encontrando el cuaternión, y también puedes verificar si este cuaternión que te estoy dando se convierte exitosamente de vuelta usando tu librería.
La librería tiene una implementación de as_euler_angles
y from_euler_angles
pero creo que usa la convención z-y-z, por lo que no nos ayudará si estás usando la convención x-y-z.
¿Cómo calcularías q sabiendo solo los vectores a y b?
¡Hay un par de formas de hacerlo! ¡Ninguna será con ángulos de Euler, eso seguro!
Me gustaría también enfatizar aquí que no hay un cuaternión único que rote $a$ a $b$. Después de encontrar un cuaternión que lo haga, puedes agregar una rotación alrededor del eje determinado por $b$, y obtienes otra solución.
Aquí hay una forma cercana a lo que estabas intentando, creo, que aprovecha el hecho de que la multiplicación de cuaterniones calcula los productos punto y cruz por ti:
- Normaliza $a$ y $b$.
- Representa $a$ y $b$ como cuaterniones con parte real cero.
- Calcula $ab=\alpha +\beta u$ donde $\alpha,\beta$ son reales y $u$ es un cuaternión de longitud unitaria con parte real cero.
- Se sabe que $\alpha=-\cos(\theta)$ y $\beta=\sin(\theta)$ donde $\theta$ es el ángulo entre $a$ y $b$, y $u$ es el normal unitario.
- Usa las identidades de medio ángulo para escribir $\cos(\theta/2)+\sin(\theta/2)u$
Una segunda forma, más en el programa de trabajar con cuaterniones, es anticipar que necesitas $\theta/2$, y observar que (¡después de normalizar $a$ y $b$!) el ángulo entre $a$ y $a+b$ es la mitad del ángulo entre $a$ y $b$. Explícitamente:
- Normaliza $a$ y $b$.
- Calcula $a+b$ y normalízalo. Esa es tu rotación de cuaternión.
Ilustraré el Método #2 ya que es más simple:
>>> q2 = (a.normalized()+b.normalized()).normalized()
>>> q2
quaternion(-6.49653805396711e-17, 0.58515612718089, 0.602903962777294, 0.542309061781284)
>>> q2*a*q2.inverse()
quaternion(-1.11022302462516e-16, 3, 2.12132034355964, 0.707106781186548)
Observa que este segundo cuaternión es sustancialmente diferente al primero que calculamos, con un eje y ángulo diferentes.
Epílogo
Quienquiera que haya escrito la documentación para numpy-quaternion
es mi tipo de persona:
Ayuda en la función as_euler_angles en el módulo quaternion:
as_euler_angles(q)
Abrir la caja de Pandora
Si alguien intenta hacerte usar ángulos de Euler, dile que no, y
aléjate, y ve y dile a tu mamá.
No querrás usar ángulos de Euler. Son terribles. Mantente alejado. Es
una cosa convertir de ángulos de Euler a cuaterniones; al menos vas en
la dirección correcta. ¡Pero ir en la dirección opuesta?! Simplemente no
es correcto.
[...]
NOTA: Antes de abrir un problema reportando algo "incorrecto" con esta
función, asegúrate de leer todo lo siguiente, *especialmente* la
última sección sobre abrir problemas o solicitudes de extracción.
[...]
Levanta
------
TodoElInfierno
...si intentas realmente usar ángulos de Euler, cuando podrías haber
estado usando cuaterniones como una persona sensata.
(END)
3 votos
Mientras es muy probable que haya un problema matemático sobre la conversión entre representaciones, la formulación como código Java pone un enfoque en la depuración de software. Si no era tu intención, por favor edita el cuerpo de la pregunta para proporcionar contexto del problema matemático con el que buscas ayuda.
0 votos
ntrs.nasa.gov/api/citations/19770024290/downloads/… ntrs.nasa.gov/api/citations/19770024290/downloads/…
1 votos
¿No es un problema que los cuaterniones no se hayan convertido en cuaterniones unitarios en cierto paso?
0 votos
No, los cuaterniones son siempre cuaterniones unitarios. También he leído este documento
0 votos
¿Qué representación se supone que es
r = [pi/2, pi/4, pi/2]
?0 votos
Ángulos de Euler en radianes
0 votos
@Jakub ok, pero ¿qué convención de ángulos de Euler es?
0 votos
@Jakub No importa, parece que tropecé con la convención correcta por mi cuenta.
0 votos
¿No es un problema relacionado con el hecho de que los ángulos de Euler no usan rotación sobre el eje $y$ (rotación sobre el eje $z$, luego sobre el eje $x$, luego sobre el eje $z$ nuevamente)?
0 votos
No lo creo. Yo uso el formato xyz