Quiero implementar la Inversa Rodrigues Rotación de la Fórmula (también conocido como Registro de mapa de SO(3) a so(3)), en doble precisión (código de MATLAB está muy bien para el ejemplo), preferiblemente como un 3-vector de parámetros con el vector de dirección de la unidad de ajuste de escala de la magnitud de la rotación.
En la analítica de la forma es (de Wikipedia):
$\theta = \arccos\left( \frac{\mathrm{trace}(R) - 1}{2} \right)$
y, a continuación, utilizarlo para encontrar la normalizado eje:
$\omega = \frac{1}{2 \sin(\theta)} \begin{bmatrix} R(3,2)-R(2,3) \\ R(1,3)-R(3,1) \\ R(2,1)-R(1,2) \end{bmatrix}$
que luego puede ser utilizado para encontrar la escala del eje de rotación $\rho = \theta \omega$
Por supuesto, $\sin(\theta)$ hará que el denominador acercarse a cero, que es indefinido. La rotación de vectores $\rho$ a cero rotación es $\rho = \begin{bmatrix}0 & 0 & 0\end{bmatrix}^T$. Además, también será indefinido en $n\pi$, aunque podemos asignar la rotación a ser la señal deseada ($\pm\pi$)
El ingenuo aplicación es en caso de que() instrucciones de punto flotante de cerca de los valores de $n\pi$ rotaciones, pero no hay duda de que es una forma mejor que algunos sucia hacks en torno a las singularidades... ¿verdad?
EDITAR:
En las rotaciones de cerca de cero, empíricamente, las siguientes obras:
if (trace(R) > (3 - small_number))
inverse_sinc = 1 + (1.0 / 6.0) * theta_2 + ...
(7.0 / 360.0) * theta_4 +
(31.0 / 15120.0) * theta_6;
rho = 0.5 * inverse_sinc * r;
end
donde $\theta$ (y los poderes de los mismos), y $\mathbf{r} = \begin{bmatrix} R(3,2)-R(2,3) \\ R(1,3)-R(3,1) \\ R(2,1)-R(1,2) \end{bmatrix}$ son pre-calculados, y inverse_sinc (es decir, x/sen(x))se calcula a partir de la serie de Taylor. Este es exacta al mejor de 10^-11 en cada eje cuando la unidad probada a través de un rango de valores (0, eps, 10^-12 a través de 10^-3 y valores negativos para cada uno a través de los tres ejes).
Una buena solución para $\theta = \pi$ todavía se me escapa...