Inge Söderkvist (2009) tem uma boa descrição de como resolver o problema do movimento do corpo rígido por decomposição de valor singular (SVD).
Suponha que recebamos pontos 3D que após a perturbação tomem posições respectivamente. Procuramos um "movimento" rígido, isto é, uma rotação e translação combinadas, aplicadas aos pontos que minimizam a soma dos quadrados dos "erros":{ y 1 , ... , y n } R d x i{x1,…,xn}{y1,…,yn}Rdxi
∑i=1n||Rxi+d−yi||2
Pense nos pontos como colunas e na rotação como uma matriz ortogonal . A rigor, exigimos porque, como movimento contínuo, uma rotação preserva a "orientação" dos pontos, ou seja, não envolve refleti-los.xi,yiR3×3det(R)=1
O primeiro passo é subtrair os respectivos meios dos pontos , que tem o efeito de "eliminar" (por enquanto) a tradução desconhecida . Ou seja, o problema se torna:x¯¯¯,y¯¯¯xi,yid
minR∈SO(3)||RA−B||F
onde e . Aqui denota o grupo ortogonal especial de matrizes de rotação em 3D que podemos escolher , e a norma da matriz aqui denota a norma Frobenius , ou seja, a raiz quadrada da soma dos quadrados das entradas da matriz (como um Euclidiano). norma, mas nas entradas da matriz).A=[x1−x¯¯¯,…,xn−x¯¯¯]B=[y1−y¯¯¯,…,yn−y¯¯¯]SO(3)RF
Agora são ambas matrizes . A minimização acima é um problema ortogonal de Procrustes, permitindo apenas matrizes de rotação. A solução é dada pela decomposição do valor singular da matriz "covariância" :A,B3×nRC=BAT
C=USVT
onde são matrizes ortogonais e é a matriz diagonal de valores singulares . Pacotes de álgebra linear numérica como Matlab e Octave calcularão o SVD para você.U,VS=diag(σ1,σ2,σ3)σ1≥σ2≥σ3≥0
Quando tivermos o SVD, defina onde o sinal no fator do meio é escolhido para fazer . Normalmente, uma aplicação no mundo real terá e, portanto, o sinal escolhido seria positivo. Caso contrário, significa que a melhor adaptação ortogonal (preservação da distância) aos novos pontos envolve uma reflexão e sugere a verificação dos dados quanto a erros.R=Udiag(1,1,±1)VTdet(R)=1det(UVT)=1
Finalmente, definimos a tradução . Feito!d=y¯¯¯−Rx¯¯¯
A variante de problemas ortogonais de Procrustes, onde apenas rotações são permitidas, também é objeto de outro artigo da Wikipedia sobre o algoritmo Kabsch . A notação nos artigos da Wikipedia difere da nossa ao multiplicar por à direita, e não (como aqui) à esquerda.R