Inge Söderkvist (2009) tiene una buena descripción de cómo resolver el problema del movimiento del cuerpo rígido por descomposición de valores singulares (SVD).
Supongamos que se nos dan puntos 3D que después de la perturbación toman las posiciones { y 1 , ... , y n } respectivamente. Buscamos un "movimiento" rígido, es decir, una rotación R y una traslación d combinadas, aplicadas a los puntos x i que minimiza la suma de cuadrados de los "errores":{ x1, ... , xnorte}{ y1, ... , ynorte}RreXyo
∑i = 1norteEl | El | R xyo+ d- yyoEl | El |2
Xyo, yyoR3 × 3det ( R ) = 1
El primer paso es restar los medios respectivos de los puntos , que tiene el efecto de "eliminar" (por ahora) la traducción desconocida . Es decir, el problema se convierte en: xi,yidX¯¯¯, y¯¯¯Xyo, yyore
minR ∈ SO ( 3 )El | El | RA-B | El |F
donde y . Aquí denota el grupo ortogonal especial de matrices de rotación en 3D de las cuales podemos elegir , y la norma de matriz aquí denota la norma de Frobenius , es decir, la raíz cuadrada de la suma de cuadrados de entradas de matriz (como un Euclidiano) norma, pero en entradas de matriz).B = [ y 1 - ¯ y , … , y n - ¯ y ] S O ( 3 ) R FA = [ x1- x¯¯¯, ... , xnorte- x¯¯¯]B = [ y1- y¯¯¯, ... , ynorte- y¯¯¯]SO ( 3 )RF
Ahora son ambas matrices. La minimización anterior es un problema de Procrustes ortogonal que solo permite matrices de rotación. La solución se obtiene tomando la descomposición del valor singular de la matriz de "covarianza" :3 × n R C = B A TA , B3 × nRC= B AT
C= USVT
donde son matrices ortogonales y es la matriz diagonal de valores singulares . Los paquetes de álgebra lineal numérica como Matlab y Octave calcularán la SVD por usted.S = diag ( σ 1 , σ 2 , σ 3 ) σ 1 ≥ σ 2 ≥ σ 3 ≥ 0U, VS= diag ( σ1, σ2, σ3)σ1≥ σ2≥ σ3≥ 0
Una vez que tengamos la SVD, defina donde se elige el signo en el factor medio para hacer . Normalmente, una aplicación del mundo real tendrá y, por lo tanto, el signo elegido sería positivo. De lo contrario, significa que el mejor ajuste ortogonal (preservación de la distancia) a los nuevos puntos implica una reflexión, y sugiere verificar los datos en busca de errores. det ( R ) = 1 det ( U V T ) = 1R = Udiag ( 1 , 1 , ± 1 ) VTdet ( R ) = 1det ( UVT) = 1
Finalmente definimos la traducción . ¡Hecho!re= y¯¯¯- R x¯¯¯
La variante de los problemas de Procrustes ortogonales donde solo se permiten rotaciones es también el tema de otro artículo de Wikipedia sobre el algoritmo Kabsch . La notación en los artículos de Wikipedia difiere de la nuestra en la multiplicación por a la derecha, en lugar de (como aquí) a la izquierda.R