17 votos

Encontrar una Rotación de Transformación a partir de dos Coordenadas Marcos en el 3-Espacio

La pregunta que estoy tratando de averiguar que yo tengo 3 puntos P1, P2 y P3 en el espacio. En un frame (Marco de Un llamé a) los puntos son: Pa1, Pa2 y Pa3, la misma historia de Marco B (a saber: Pb1, Pb2 y Pb3).

Cuál es la matriz de rotación de uno a otro? Eso es, literalmente, toda la información que tengo. Lo que se planteó fue hacer un intermedio marco de coordenadas y alinee uno de los ejes' con un punto. Sin embargo, yo no veo cómo esto va a ayudar con el problema.

Nadie ofrece algunos consejos de cómo hacer frente a este problema? Estoy perplejo.

Gracias, Edit: que Ambos cuadros tienen el mismo origen, por lo que no hay traducción componente.

11voto

user12289 Puntos 6

El problema se llama Wahba del problema (a pesar de que es probable que tenga otros nombres demasiado) y busca minimizar la siguiente:

$J(\mathbf{R}) = \frac{1}{2} \sum_{k=1}^{N} a_k|| \mathbf{w}_k - \mathbf{R} \mathbf{v}_k ||^2$

donde $a_k$ son pesos, $\mathbf{w}_k$ son los vectores en un marco, $\mathbf{v}_k$ son los vectores en el otro marco y $\mathbf{R}$ es la matriz de rotación que usted busca.

Usted puede construir de dos vectores a partir de los 3 puntos que tienes.

La forma más fácil de resolver es (en mi opinión) es mediante una Descomposición de Valor Singular como se informó por Markley (1988):

  1. Obtener una matriz $\mathbf{B}$ como sigue:

$\mathbf{B} = \sum_{i=1}^{n} a_i \mathbf{w}_i {\mathbf{v}_i}^T$

  1. Encontrar el SVD de a $\mathbf{B}$

$\mathbf{B} = \mathbf{U} \mathbf{S} \mathbf{V}^T$

  1. La matriz de rotación es simplemente:

$\mathbf{R} = \mathbf{U} \mathbf{M} \mathbf{V}^T$

donde $\mathbf{M} = diag(\begin{bmatrix} 1 & 1 & det(\mathbf{U}) det(\mathbf{V})\end{bmatrix})$

La respuesta va a ser "exacto" de 2 vectores. Con más de 2 vectores, va a elegir el "mejor" de la rotación que se ajusta a la función de costo.

Por exactamente 2 vectores, también puede utilizar la Tríada Método que es algo más sencillo de implementar.

Referencias: Markley, F. L. Actitud Determinación utilizando el Vector de Observaciones y la Descomposición de Valor Singular de la Revista de la Astronáutica de las Ciencias, 1988, 38, 245-258

3voto

animuson Puntos 195

Considere la matriz $M_a$ que le da el primer fotograma de la representación de los vectores $P_1, P_2, P_3$: $P_{a1}=M_a \cdot P_1, P_{a2}=M_a \cdot P_2, P_{a3}=M_a \cdot P_3$. Del mismo modo, usted tiene algunos matriz $M_b$ que le da el segundo marco de la representación: $P_{b1}=M_b \cdot P_1, P_{b2}=M_b \cdot P_2, P_{b3}=M_b \cdot P_3$. Desde cualquier $P_i$ es una columna vectorial, las ecuaciones anteriores permiten combinar las columnas en las matrices: $P=(P_1 P_2 P_3), P_a=(P_{a1} P_{a2} P_{a3}), P_b=(P_{b1} P_{b2} P_{b3})$,$P_a=M_a \cdot P$$P_b=M_b \cdot P$. Queremos encontrar una matriz, $X$, que sería la de transformar $M_a$ en $M_b$: $M_b=M_a \cdot X$, a continuación,$X=M_a^{-1} \cdot M_b$.

Que se derivan de $M_a$ y $M_b$: $P_a \cdot P^{-1} = M_a$, $P_b \cdot P^{-1} = M_b$. A continuación,$X = P \cdot P_a^{-1} \cdot P_b \cdot P^{-1}$. Que requiere, obviamente, no degenerada (no planas) conjunto inicial de $P$ y no degenerada fotogramas $M_a$$M_b$.

1voto

thejh Puntos 143

Creo que el problema general se conoce como la orientación absoluta problema y sugerir a leer a continuación papel.

http://cis.jhu.edu/software/lddmm-similitude/umeyama.pdf

0voto

Philip Kelley Puntos 19032

La forma en que la pregunta está redactada, parece que ya tiene dos cuadros a y B (que son bases ortonormales) fácilmente disponible, lo que haría que los puntos redundantes.

[ Si usted tiene solamente los puntos, siempre y cuando no sean colineales, siempre se puede construir un ONB de cualquiera de ellos: han vector u que va de P1 a P2 y v de P1 a P3, entonces i = u/|u|; j = uxv, j = j/|j|; k = ixj; y su base es (i,j,k). ]

Puesto que a es una transformación de la común "neutral" sistema de coordenadas Un sistema de coordenadas, multiplicando con la inversa de Una va a ser una transformación de la espalda para el sistema de coordenadas común. En este caso, es un ONB, por lo que "inversa" y "transpose" son sinónimos, lo que hace la vida mucho más fácil.
De manera similar, B, se transforma en el neutro del sistema de coordenadas a la B sistema de coordenadas.

Así, para transformar cualquier punto de la a a la B, que se multiplica con UnaT y, a continuación, con B. puede multiplicar las matrices juntos para hacer la transformación en un solo paso si tienes que transformar en muchos puntos.

Tenga en cuenta que si se puede hacer esto en un programa de computadora, la transposición en realidad guarda usted computional el esfuerzo más que la adición de algunos, si eres sabio, mientras que la multiplicación de las matrices juntos (no el ingenuo ruta de llamar transpose() primero y luego multiplicar()).
La multiplicación de dos matrices puede ser visto como tomar los productos de puntos de filas y columnas. O, si usted mira de esta manera, los productos de puntos de filas y transposición de filas. Lo que hace que la multiplicación de una matriz transpuesta se vea mucho mejor, porque ahora los mapas perfectamente a las instrucciones SIMD y diseño de memoria.

0voto

Jorrit Reedijk Puntos 129

Doy un ejemplo el uso de la matriz-calculadora-idioma MatMate. Tenemos una matriz de Una que representa tres puntos en 3D-sistema de coordenadas; las columnas representan los x,y,z-ejes. A continuación, tenemos una rotación, sus coordenadas en la matriz B. Tratamos de encontrar la roationmatrix t que proporciona Un * t = B. Para proporcionar válido matrices de generar una matriz aleatoria de Una y por un azar de la rotación tx generar una válida/significativo de la matriz B, La clave es encontrar la rotación a un "normalizada" de la posición, por ejemplo, un diseño triangular de la coordenada-matrices. A continuación, con t1 rotación de Un->triangular y t2 de rotación B->triangular obtenemos B = a * t1 * inversa(t2)
Ejemplo:

 A = randomu(3,3)   // provide a random matrix with 3 points in 3 axes
      A : 
   28.78       28.00       27.32
    9.36       87.72       54.37
   62.89       16.12       96.08

 tx = gettrans(randomu(3,3),"drei")   // provide a random rotation-matrix
 B = A*tx  // generate a valid matrix B which is a rotation of A
      B : 
   46.98        8.03       -9.36
   86.42       50.39       27.03
  108.94      -38.80       -8.57

===========================================================================

t1 = gettrans(A,"drei")  // find a "normalized" position of A, for example the     
                         // rotation to the "triangular" position/layout. 
                         // keep the required rotation-matrix in t1
A1 = A * t1              // rotate A to A1
      t1 : 
    0.59       -0.74       -0.32
    0.58        0.66       -0.47
    0.56        0.10        0.82

      A1 : 
   48.57        0.00       -0.00
   86.70       56.75        0.00
  100.61      -26.37       51.27


t2=gettrans(B,"drei") // now find the rotation which rotates B to the
                      // same "normalized" (=triangular) position/layout
B1 = B * t2
      t2 : 
    0.97        0.04        0.25
    0.17        0.64       -0.75
   -0.19        0.77        0.61

      B1 : // we see, that A1 and B1 are equal
   48.57        0.00        0.00
   86.70       56.75       -0.00
  100.61      -26.37       51.27


 chk = A * t1 * t2'  // check whether the combined rotation t1 and 
                     // inverse(t2)=transpose(t2) rotates A to B
      chk : 
   46.98        8.03       -9.36
   86.42       50.39       27.03
  108.94      -38.80       -8.57
 // We see, that this is equal to B and the combined rotation is tx=t1*t2' 

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X