¿Cómo puedo derivar una matriz de rotación?

Imagínese conectar los puntos pretransformados [math] \ vec a_1, \ ldots, \ vec a_n [/ math] a una estructura rígida que gira libremente sobre el origen a través de la matriz de rotación [math] \ mathbf M [/ math], y unir un resorte desde cada [math] \ mathbf M \ vec a_i [/ ​​math] al punto postransformado correspondiente [math] \ vec b_i [/ ​​math]. Entonces el par en la estructura es
[matemática] \ vec \ tau = \ sum_i \ mathbf M \ vec a_i \ times (\ vec b_i – \ mathbf M \ vec a_i) = \ sum_i \ mathbf M \ vec a_i \ times \ vec b_i [/ ​​math].
Dada suficiente amortiguación, la estructura girará con velocidad angular proporcional al par:
[matemáticas] \ tfrac {d} {dt} \ mathbf M \ vec x = \ vec \ tau \ times \ mathbf M \ vec x [/ math]
[math] = \ sum_i (\ mathbf M \ vec a_i \ times \ vec b_i) \ times \ mathbf M \ vec x [/ math]
[math] = \ sum_i \ mathbf M \ vec a_i (\ vec b_i \ cdot \ mathbf M \ vec x) – \ vec b_i (\ mathbf M \ vec a_i \ cdot \ mathbf M \ vec x) [/ math]
[math] = \ sum_i \ mathbf M \ vec a_i \ vec b_i ^ \ intercal \ mathbf M \ vec x – \ vec b_i \ vec a_i ^ \ intercal \ vec x [/ math],
[matemáticas] \ tfrac {d} {dt} \ mathbf M = \ sum_i \ mathbf M \ vec a_i \ vec b_i ^ \ intercal \ mathbf M – \ vec b_i \ vec a_i ^ \ intercal = \ mathbf M \ mathbf P \ mathbf M – \ mathbf P ^ \ intercal [/ math],
donde [math] \ textstyle \ mathbf P = \ sum_i \ vec a_i \ vec b_i ^ \ intercal [/ math]. Eventualmente, [math] \ mathbf M [/ math] convergerá al estado de energía más bajo que minimiza [math] \ textstyle \ sum_i | \ mathbf M \ vec a_i – \ vec b_i | ^ 2 [/ math], donde lo hará dejar de girar:
[matemática] \ mathbf 0 = \ mathbf M \ mathbf P \ mathbf M – \ mathbf P ^ \ intercal [/ math]
[matemática] \ mathbf 0 = (\ mathbf P \ mathbf M) ^ 2 – \ mathbf P \ mathbf P ^ \ intercal [/ math]
[matemáticas] \ mathbf P \ mathbf M = (\ mathbf P \ mathbf P ^ \ intercal) ^ {1/2} [/ math]
[math] \ mathbf M = \ mathbf P ^ {- 1} (\ mathbf P \ mathbf P ^ \ intercal) ^ {1/2} [/ math].

([math] \ mathbf M [/ math] es la matriz ortogonal más cercana a [math] \ mathbf P ^ {- 1} [/ math].)

Asumiré que lo que está sucediendo es esto: tienes algunos puntos en el espacio y luego les ocurre una rotación desconocida. Desea recuperar la rotación. Desafortunadamente, hay algo de ruido en la medición de los puntos, por lo que es imposible recuperar la rotación exacta y, por lo tanto, desea recuperar la mejor estimación posible de cuál era la matriz de rotación real.

Probablemente hay muchas maneras de abordar este problema, pero la más fácil probablemente sea ejecutar una optimización, para lo cual ya hay algoritmos escritos que puede usar. Su variable independiente es la rotación estimada, y puede encontrar que los ángulos de Euler son una forma útil de codificarla. http://en.wikipedia.org/wiki/Eul… . (Una rotación tiene tres grados de libertad, por lo que se ahorrará un dolor de cabeza si usa exactamente tres números para codificarlo).

Hay un par de funciones de costo que podría usar, pero la más simple es dejar que el error de cada punto sea el cuadrado de la distancia entre donde su rotación estimada envía el punto y donde la rotación real desconocida envió el punto. Suma el error sobre todos tus puntos y tendrás una función de costo.

Una vez que ejecute la optimización, escupirá los ángulos de rotación de Euler que mejor coincidan con sus datos, en el sentido de que los puntos rotados de la estimación de optimización serán lo más cercanos posible a los de sus datos originales.

¡Buena suerte!