Ajustar un conjunto de puntos a otro mediante un movimiento rígido

8

No estoy realmente seguro de cómo explicar este problema claramente, así que tengan paciencia conmigo. Tengo una base de 3 vectores de unidades ortonormales y una posición, una matriz de transformación 4x4 estándar en gráficos de computadora.

También tengo varios puntos (compensaciones) en ese espacio que me transformo en espacio mundial. Los puntos se perturban un poco y ahora deseo encontrar la nueva base más cercana a la representación de los puntos perturbados.

No es exactamente como encontrar componentes principales, porque quiero que respete las compensaciones originales. Si eso tiene sentido. Como brota de cada nuevo punto a sus respectivas posiciones iniciales. Creo que la respuesta está en resolver un problema de mínimos cuadrados, pero lo examiné y ahora me duele la cabeza.

¿Alguien puede explicarlo simplemente por mí? Preferiría una solución de forma cerrada, pero una iterativa también estaría bien. Muchas gracias

DaleyPaley
fuente
Es necesario indicar más detalles de su problema. Aparentemente tiene una transfomación rígida ("3 vectores de unidad ortonormales y una posición") que consiste en una transformación ortogonal y una traducción. Probablemente esté preguntando cómo modificar la transformación ortogonal, dejando fija la porción de traducción, de modo que los puntos recién perturbados se aproximen mejor (aplicando la transformación rígida ajustada a los puntos originales). Deletree los detalles: nombre las transformaciones, la traducción, los puntos. Lo más importante es indicar qué criterio (¿mínimos cuadrados?) Determina el mejor ajuste.
hardmath
Sí, lo siento, no estoy seguro acerca de la terminología y la mejor manera de describirla. En realidad, también quiero modificar la posición. La base ortogonal + posición es una transformación afín ¿verdad? Así que tengo una transformación afín, A, que transforma una pequeña cantidad de puntos, y quiero encontrar A 'para que la transformación' siga 'los puntos lo mejor posible después de que se hayan perturbado. Espero que sea más claro.
DaleyPaley
1
Este es un problema "clásico" con un nombre "clásico", el problema ortogonal de Procrustes , mi aplicación favorita de SVD (descomposición de valores singulares).
hardmath
1
Sí, dame un poco para pensar en escribirlo bien.
hardmath
1
Sé que esto es aproximadamente 2 años demasiado tarde, pero tengo un código en Github que usa el SVD para resolver este tipo de problema. ¿Tal vez te sea de utilidad? Aquí está el enlace
Desarrollador Paul

Respuestas:

14

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,,xn}{y1,,yn}RdXyo

yo=1norteEl |El |RXyo+re-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

minRSO(3)El |El |RUNA-siEl |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 FUNA=[X1-X¯,...,Xnorte-X¯]si=[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 TUNA,si3×norteRC=siUNAT

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σ 30U,VS=diag(σ1,σ2,σ3)σ1σ2σ30 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¯-RX¯

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

hardmath
fuente
1
¡Fantástico! Muchas gracias por tomarse el tiempo para escribir eso. Muy útil de hecho.
DaleyPaley
¿Existe una forma estándar de resolver la versión "ponderada" de este problema, donde los ruidos en los distintos puntos tienen diferentes variaciones?
nibot
@nibot: Eche un vistazo a la disertación de T. Vikland (2006) , que presenta una exposición y artículos publicados sobre el problema de Procrustes ortogonal ponderado (WOPP): "La solución a un WOPP no se puede calcular tan fácilmente como para un OPP. Además , un WOPP puede tener varios mínimos locales ".
hardmath
Hay otro artículo similar y útil sobre el enfoque SVD de ETHZ: igl.ethz.ch/projects/ARAP/svd_rot.pdf
Linuxios