Hay dos operaciones típicas que se realizan con las rotaciones.
- Transforma un punto: $p_a = R_{a,b} \cdot p_b$ .
- Concatenando dos rotaciones: $R_{a,c} = R_{a,b} \cdot R_{b,c}$
En pocas palabras, la operación 1. es más barata para las matrices de rotación, mientras que la operación 2. es más barata para los cuaterniones unitarios. Por ejemplo, la concatenación de matrices de rotación requiere 27 multiplicaciones, pero sólo 16 para los cuaterniones.
Sin embargo, esto es no la historia completa. Si sólo nos ahorramos un poco de cálculo, ¿para qué molestarse en aprender sobre los cuaterniones y sus fórmulas menos intuitivas?
Supongamos que representamos nuestras rotaciones como matrices de 3x3 $R$ . Con el fin de $R$ para ser una matriz de rotación, tiene que ser ortogonal, es decir $R\cdot R^\top=I$ (y debería sostener que $det(R)=1$ ). Sin embargo, si realizamos una operación de concatenación utilizando aritmética numérica, la matriz 3x3 resultante no es necesariamente ortogonal debido a la precisión numérica, por ejemplo, a errores de redondeo. Este error puede ser pequeño, pero si realizamos un gran número de operaciones de este tipo, el error se acumulará. Un enfoque sería detectar si una matriz no es ortogonal, $R\cdot R^\top\neq I$ y luego reortogonalizar la matriz. Sin embargo, esta operación suele ser cara/compleja, ya que implica una descomposición SVD o un algoritmo similar.
Si se representa una rotación como cuaternión, hay una condición más sencilla: El cuaternión tiene que ser de longitud unitaria. Así, podemos comprobar simplemente si $|q_r^2 + q_x^2 + q_y^2 + q_z^2 - 1|> \epsilon$ y en su caso renormalizar el vector 4 $q$ . Tenga en cuenta que hay incluso formas de realizar esto renormalización sin calcular la raíz cuadrada .
En términos informáticos: Los cuaterniones unitarios tienen un invariante de tipo que las matrices de rotación; las violaciones son más baratas de detectar y el invariante es más barato de aplicar.
Además, cabe mencionar que pasar de un cuaternión unitario a una matriz de rotación 3d es relativamente barato y sencillo . (Ir en sentido contrario es más difícil de conseguir para todos los casos de esquina .) Por lo tanto, puede ser una buena estrategia representar las rotaciones 3d como cuaterniones por defecto. En caso de que necesitemos transformar un gran número de puntos mediante una rotación específica, podemos convertir el cuaternión correspondiente en una matriz de rotación y ahorrarnos algunos cálculos.
Los cuaterniones tienen otras ventajas:
- Menos almacenamiento: 4 números frente a 9.
- La interpolación entre dos rotaciones es más barata de calcular para los cuaterniones (por ejemplo, utilizando SLERP) que para las matrices, en las que necesitamos extraer la representación del vector de rotación (ángulo del eje x).
Tenga en cuenta que hay un error común cuando se utilizan cuaterniones: Hay una relación de uno a dos entre la rotación (matrices) en 3d y el cuaternión unitario. Para una matriz de rotación $R$ existen dos cuaterniones unitarios $(q_r, \pm \mathbf{v})$ , donde $q_r$ es la parte real y $\mathbf{v}$ la parte imaginaria/vectorial del cuaternión. Por lo tanto, es un poco más difícil comprobar si dos cuaterniones representan la misma rotación; no basta con comprobar la identidad de los componentes.
2 votos
¿Bloqueo del cardán? Referencia
3 votos
No veo cómo el bloqueo del cardán es relevante. No existe este fenómeno cuando se utilizan rotadores 3x3 como representación primaria de la rotación 3D. El bloqueo del cardán es un problema con la representación altamente sobrecomprimida que utiliza 3 ángulos de Euler que representan una secuencia de 3 ángulos de rotación de un solo eje (2D) (balanceo, cabeceo, guiñada). Los ángulos no tienen nada que ver con mi pregunta.