20 votos

Giratoria 3-uno vector a otro

He escrito un algoritmo para resolver el siguiente problema: Dados dos 3-vectores, decir: $a,b$, hallar la rotación de $a$, de modo que su orientación coincide con $b$.

Sin embargo, no estoy seguro de si el siguiente algoritmo funciona en todos los casos:

1) Encontrar el eje y el ángulo utilizando el producto vectorial y producto escalar:

$$\mathbf{x}=\frac{a\times b}{||a\times b||}\\ \theta=\cos^{-1}(\frac{a\cdot b}{||a||\cdot ||b||})$$

3) Encontrar la matriz de rotación utilizando exponencial mapa:

$$\mathbf{R}=e^{\mathbf{A}\theta} =\mathbf{I}+\sin(\theta)\cdot \mathbf{A}+\left(1-\cos(\theta)\right) \cdot \mathbf{A}^{2}$$

donde $\mathbf{A}$ es un sesgo de simetría de la matriz correspondiente a $\mathbf{x}$:

$$\mathbf{A}=[\mathbf{x}]_{\times}=\begin{bmatrix}0 & -\mathbf{x}_{3} & \mathbf{x}_{2} \\ \mathbf{x}_{3} & 0 & -\mathbf{x}_{1} \\ -\mathbf{x}_{2} & \mathbf{x}_{1} & 0\end{bmatrix}$$

Notas:

El eje se calcula utilizando la cruz del producto ya que esto da un vector perpendicular tanto a a$a$$b$. Sólo la dirección del eje es importante, por lo que se divide por su magnitud. Sin embargo, no estoy seguro de si $\mathbf{x}$ siempre tendrá la dirección correcta (el resultado puede ser $-\mathbf{x}$ en lugar de $\mathbf{x}$?).

La matriz de rotación se calcula utilizando Rodrigues' rotación de la fórmula.

Finalmente, el vector $\mathbf{R}a$ debe tener la misma dirección como $b$.

He probado este numéricamente y parece que funciona, pero me gustaría estar seguro de que las fórmulas de trabajo para cualquiera de los dos $a,b$.

11voto

Rob Dickerson Puntos 758

Esta es la derecha debe manejarse planteamiento general, pero la esquina caso $\|a\times b\| \approx 0$.

Si $\theta < \epsilon,$ $R=I$.

Si $\pi-\theta < \epsilon$, usted puede elegir para $\mathbf{x}$ cualquier vector ortogonal a $\mathbf{a}$, por ejemplo $\mathbf{x} = \frac{\mathbf{a} \times e_i}{\|\mathbf{a}\times e_i\|}$, donde $i$ es el índice del componente de $\mathbf{a}$ con menos magnitud.

4voto

levibostian Puntos 131

Deje $F_n(x) = x - {2 \over n . n} n (n \ . \ x)$ ser la transformación que refleja $x$ a través del plano que es perpendicular a $n$. Componer dos reflexiones da un giro: si el ángulo de $a$ $b$ $\phi$ $F_b(F_a(x))$rota $x$ sobre el plano atravesado por $a$$b$$2 \phi$.

Dados los vectores normalizados $\hat a=a/|a|$, $\hat b=b/|b|$, $\hat c=c/|c|$, donde $c = \hat a + \hat b$, el ángulo de$\hat a$$\hat c$$\phi$, la mitad que el ángulo de$\hat a$$\hat b$.

De hecho, $F_{\hat c}(F_{\hat a}(x))$ rota $x$ $\phi$ sobre el plano atravesado por $a$$b$. Esto es válido incluso si $a$ $b$ son paralelas. Esto evita el cálculo de una cruz de producto, y la inversa del coseno, seno y coseno, o la división por una magnitud que puede ser arbitrariamente cercano a cero.

2voto

Muphrid Puntos 12245

No tengo claro por qué tiene un factor de $A^2$ $R$ en su expresión. En particular, wikipedia enumera la matriz forma la fórmula de Rodrigues como

$$R = I \cos \theta + A \sin \theta + (1-\cos \theta) x x^T$$

1voto

joshuahedlund Puntos 108

Tengo un sencillo método proviene "Mecánica de la Continua" de Erigen. Aquí R es la matriz de rotación que gira de vectores "a" alinea con el vector "b"

Código de MATLAB:

%%%%%% Rotate vector a align with vector b%%%%%%%%%%
syms ax ay az bx by bz k real

a=[ax ay az]'

au=a./sqrt(ax^2+ay^2+az^2)

b=[bx by bz]'

bu=b./sqrt(bx^2+by^2+bz^2)

R=[bu(1)*au(1) bu(1)*au(2) bu(1)*au(3);

    bu(2)*au(1) bu(2)*au(2) bu(2)*au(3)

    bu(3)*au(1) bu(3)*au(2) bu(3)*au(3)]

% You can verify it by type

c=R*a

cu=c./sqrt(c(1)^2+c(2)^2+c(3)^2)

simple(bu-cu)

%the result is zero means c(a after rotation) and b are aligned with each other.  

simple(sqrt(c(1)^2+c(2)^2+c(3)^2)-sqrt(c(1)^2+c(2)^2+c(3)^2))

%the result is zero means c(a after rotation) and a are of the same length


%%%%%%%End%%%%%%%%%%%%

0voto

function [ R ] = RotAtoB( a,b )
    x = [a(2)*b(3) - b(2)*a(3);a(3)*b(1) - b(3)*a(1);a(1)*b(2) - b(1)*a(2)];
    x = x/norm(x);
    theta = acos(a'*b/(norm(a)*norm(b)));
    A = [0    -x(3)  x(2)
         x(3)   0   -x(1)
        -x(2)  x(1)   0  ];
    R = eye(3) + sin(theta)*A + (1-cos(theta))*A^2;
end

Calcular las potencias de la matriz: potencia n-ésima de una matriz cuadrada y la Binet fórmula para la secuencia de Fibonacci

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