23/07/2018, 01:06:10 am *
Bienvenido(a), Visitante. Por favor, ingresa o regístrate.

Ingresar con nombre de usuario, contraseña y duración de la sesión
Noticias: ¡Atención! Hay que poner la matemática con LaTeX, y se hace así (clic aquí):
 
 
Páginas: [1]   Ir Abajo
  Imprimir  
Autor Tema: Crear sistema de coordenadas a partir de 3 puntos en el espacio  (Leído 1044 veces)
0 Usuarios y 1 Visitante están viendo este tema.
Aiken
Nuevo
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 4


Ver Perfil
« : 04/06/2018, 07:43:32 am »


Muy buenas a tod@s!!

Soy nuevo en el foro, me dedico a la programación y soy nulo en mates, de hecho me ha costado elegir donde meter este tema, la cosa es que llevo ya una semana con este problema y no veo luz por ningún lado, espero que me podais dar alguna pista, de antemano muchas gracias por vuestro tiempo.

Lo que pretendo es crear un sistema de coordenadas a partir de tres puntos conocidos, para ello lo que hago es:

Defino 3 puntos P1, p2 y p3
P1, define el origen del sistema.
P2, define el vector del eje X.
P3, define el plano XY.

Calculo vector en eje X
[texx]\overrightarrow{VX} = P2 - P1[/texx]

vector auxiliar para calcular VY
[texx]\overrightarrow{VA} = P3 - P1[/texx]

Vector en eje Y
[texx]\overrightarrow{VY} = \overrightarrow{VX} * \overrightarrow{VA}[/texx]

y vector en eje z
[texx]\overrightarrow{VZ} = \overrightarrow{VY} * \overrightarrow{VX}[/texx]

Calcúlo los vectores unitarios para formar la matriz de transformación
[texx]
Matriz Rot = \begin{bmatrix}{VXnorm.x}&{VYnorm.x}&{VZnorm.x}\\{VXnorm.y}&{VYnorm.y}&{VZnorm.y}\\{VXnorm.z}&{VYnorm.z}&{VZnorm.z}\end{bmatrix}
[/texx]

Hasta aqui creo que voy bien, ahora necesito obtener los angulos sobre cada eje para hacer las rotaciones.
Segun leo en http://www.songho.ca/opengl/gl_anglestoaxes.html una de las muchas (pero muchas) páginas que he consultado, para un orden de rotaciones ZXY (es el que necesito) tengo que aplicar las siguientes ecuaciones:

EJE Y:
[texx]VXnorm.z = -Sin(B)[/texx] ; B = rot en Y, por lo tanto
[texx]rot Y = 90 - arcCos(-VXnorm.z) [/texx], aqui tendria que ser arcSin(-VXnorm.z), pero el sistema donde tengo que implementar la programación no me permite la función arcoseno y por lo que he visto así también se puede calcular.

EJE X:
[texx]VZnorm.z = Cos(B)Cos(A)[/texx] ; A = rot en X, por lo tanto

[texx]\displaystyle rot X = arcCos(\frac{VZnorm.z}{Cos(rot Y)}) [/texx]

EJE Z:
[texx]VXnorm.x = Cos(C)Cos(B)[/texx] ; C = rot en Z, por lo tanto

[texx]\displaystyle rot Z = arcCos(\frac{VXnorm.x}{Cos(rot Y)}) [/texx]

Es esto correcto?, esta bien aplicado?

Uso un simulador 3d para comprobar los calculos, y me dan resultados diferentes, por ejemplo:

P1 = -278, 182, 45
P2 = -230, 178, -30
P3 = -210, 160, -10

la matriz de rotacion resultante es:

[texx]
Matriz Rot = \begin{bmatrix}
{0.538511}&{-0.484505}&{0.689392}\\
{-0.0448759}&{-0.833484}&{-0.550718}\\
{-0.841423}&{-0.265631}&{0.470583}\end{bmatrix}
[/texx]

El programa de simulación que utilizo tiene una función que hace esto mismo que pretendo hacer y me da los siguientes resultados:
rX = 119.44
rY = 57.29
rZ = -4.76

Y según mis calculos:
rX = 29.44, muy diferente, coincide que 119.44 - 90 = 29.44, sospechoso, pero ni idea
rY = 57.29, este valor siempre me da bien
rZ = 4.76, mismo valor pero con signo cambiado

Intuyo que tiene algo que ver con que cos(20) = cos(340), es decir que tengo el mismo resultado de coseno para dos valores distintos, pero.. ¿en función de qué modifico el valor de los resultados??
 :BangHead: :BangHead: :BangHead:

Cualquier ayuda o aclaración me seria de gran ayuda, perdón por el tocho pero no sabia como resumirlo

Muchas gracias y saludos,



En línea
Masacroso
Pleno*
*****

Karma: +1/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 852


Ver Perfil
« Respuesta #1 : 04/06/2018, 03:02:15 pm »

¿Un sistema de coordenadas ortonormal de un espacio tridimensional? Entonces eso es una traslación y rotación del sistema de coordenadas estándar.

La traslación viene dada por [texx]P_1[/texx] y la rotación sería una matriz [texx]3\times 3[/texx] de cambio de base definida por el cambio de base desde la base ortonormal estándar [texx]e_1:=(1,0,0),\, e_2:=(0,1,0)[/texx] y [texx]e_3:=(0,0,1)[/texx] a tu base particular [texx]v_1,v_2,v_3[/texx].

Asumo tu base ortonormal, por simplificar, entonces [texx]v_1=\overline{P_1P_2}/\|\overline{P_1P_2}\|[/texx], donde [texx]\|\overline{P_1P_2}\|[/texx] es el módulo del vector [texx]\overline{P_1P_2}[/texx], dividimos por el módulo para normalizar el vector.

Ahora bien si definimos [texx]v_2:=\overline{P_1P_3}[/texx] primero debemos verificar que [texx]v_1[/texx] y [texx]v_2[/texx] son linealmente independientes, lo que nos asegura que los dos vectores (junto a [texx]P_1[/texx]) definen un plano en [texx]\Bbb R^3[/texx]. Eso se verifica viendo que no existe [texx]\lambda\in\Bbb R[/texx] tal que [texx]\lambda v_2=v_1[/texx].

Una vez hecho queremos hallar un vector ortonormal a [texx]v_1[/texx], llamémoslo [texx]\tilde v_2[/texx], tal que entre los dos definan el mismo plano. Eso se puede hacer usando el algoritmo de Gram-Schmidt, es decir hallando [texx]\tilde v_2=\frac{v_2-(v_2\mid v_1)v_1}{\|v_2-(v_2\mid v_1)v_1\|}[/texx].

Hallados ya [texx]v_1,\tilde v_2[/texx] para hallar un tercer vector ortonormal tomamos cualquier punto no contenido en el plano, llamémoslo [texx]P_4[/texx], definiendo [texx]v_3:=\overline{P_1P_4}[/texx] hallamos un tercer vector ortonormal aplicando de nuevo el algoritmo de Gram-Schmidt:

[texx]\displaystyle \tilde v_3=\frac{v_3-( v_3\mid\tilde v_2)\tilde v_2-(v_3\mid v_1)v_1}{\|v_3-( v_3\mid\tilde v_2)\tilde v_2-(v_3\mid v_1)v_1\|}[/texx]

Entonces el sistema de vectores ortonormales [texx]v_1,\tilde v_2,\tilde v_3[/texx] junto con el punto [texx]P_1[/texx] define tu sistema de coordenadas de esta manera: supongamos que tienes un punto [texx]Q[/texx] en las coordenadas estándar y lo quieres pasar a tu nuevo sistema de coordenadas, entonces las coordenadas del punto en este nuevo sistema serían [texx](Q')^T=A^{-1}(\overline{P_1Q})^T[/texx], donde [texx]A[/texx] es una matriz [texx]3\times 3[/texx] donde sus columnas son [texx]v_1,\tilde v_2,\tilde v_3[/texx], y [texx]\overline{P_1Q}^T[/texx] es el vector [texx]\overline{P_1Q}[/texx] traspuesto.

Para completar los cálculos añadir que si [texx]x=(a,b,c)[/texx] y [texx]y=(d,e,f)[/texx] entonces [texx](x\mid y)=ad+be+cf[/texx], es decir, el producto escalar que conoces, y por tanto [texx](x\mid y)y[/texx] es el vector [texx]y[/texx] multiplicado por ese escalar. Y también aclarar que [texx]\|x\|=\sqrt{a^2+b^2+c^2}[/texx] y [texx]\overline {PQ}=Q-P[/texx].

Si tienes alguna duda pregunta.
En línea
Aiken
Nuevo
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 4


Ver Perfil
« Respuesta #2 : 04/06/2018, 05:11:52 pm »

Muy buenas, gracias por responder Masacroso,

Lo que comentas de la base ortonormal, pues realmente se me escapa, la idea es crear un sistema de coordenas con la siguiente definición:

Sis_Coord = {X, Y, Z, A, B, C}

Donde X Y y Z son las coordendas del origen del nuevo sistema respecto a un sistema base, y A B y C son las rotacion sobre el eje Z, el eje Y y el eje X respectivamnete y por ese orden.

El procedimiento para hallar lo he sacado de esta pagina
http://www.robot-forum.com/robotforum/kuka-robot-forum/abc-3-point-base-measurement-how-does-algorithm-works/
donde se habla del tema, entiendo que la primera parte del procemiento donde se obtiene la matriz de rotación la tengo bien, pero no lo tengo claro.

Y la que no consigo de ninguna manera, es la parte donde obtiene los angulos de la matriz de rotación, he visto muchisimos sitios y no he sacado nada claro.
La rotación sobre Y si que me sale siempre bien, pero X y Z no.

También lo explica en esta página de una manera aparentemente sencilla
http://javakuka.com/xyzabc/
pero me ha dejado más confundido aún,

Saludos y gracias de nuevo,





En línea
Masacroso
Pleno*
*****

Karma: +1/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 852


Ver Perfil
« Respuesta #3 : 04/06/2018, 05:49:21 pm »

Muy buenas, gracias por responder Masacroso,

Lo que comentas de la base ortonormal, pues realmente se me escapa, la idea es crear un sistema de coordenas con la siguiente definición:

Sis_Coord = {X, Y, Z, A, B, C}

Donde X Y y Z son las coordendas del origen del nuevo sistema respecto a un sistema base, y A B y C son las rotacion sobre el eje Z, el eje Y y el eje X respectivamnete y por ese orden.

El procedimiento para hallar lo he sacado de esta pagina
http://www.robot-forum.com/robotforum/kuka-robot-forum/abc-3-point-base-measurement-how-does-algorithm-works/
donde se habla del tema, entiendo que la primera parte del procemiento donde se obtiene la matriz de rotación la tengo bien, pero no lo tengo claro.

Y la que no consigo de ninguna manera, es la parte donde obtiene los angulos de la matriz de rotación, he visto muchisimos sitios y no he sacado nada claro.
La rotación sobre Y si que me sale siempre bien, pero X y Z no.

También lo explica en esta página de una manera aparentemente sencilla
http://javakuka.com/xyzabc/
pero me ha dejado más confundido aún,

Saludos y gracias de nuevo,







Aquí

http://www.robot-forum.com/robotforum/kuka-robot-forum/abc-3-point-base-measurement-how-does-algorithm-works/

describe lo mismo que yo he hecho, con la diferencia de que tendría que comprobar que el algoritmo Gram-Schmidt usado define la misma orientación de [texx]\tilde v_2[/texx] y [texx]\tilde v_3[/texx] que el producto vectorial. En cualquier caso puedes usar el producto vectorial en vez del procedimiento Gram-Schmidt y ya está, es decir [texx]n_3:=\frac{v_1\times v_2}{\|v_1\times v_2\|}[/texx] es un vector ortonormal al plano definido por [texx]v_1[/texx] y [texx]v_2[/texx], entonces defines [texx]n_2:=\frac{n_3\times v_1}{\|n_3\times v_1\|}[/texx] y tienes una base ortonormal [texx]v_1,n_2,n_3[/texx] (que es la misma que [texx]v_1,\tilde v_2,\tilde v_3[/texx] excepto quizá el signo de los últimos dos vectores).

Entonces la matriz de rotación se define por las columnas que son esos vectores, y a partir de ahí supuestamente se deben hallar los ángulos de Euler aunque no tengo mucha idea de cómo se hace (la página de la wikipedia en inglés es algo confusa y además hay bastantes convenciones involucradas, lo que oscurece un poco el asunto).

Parece que aquí viene algo mejor explicado:

http://javakuka.com/xyzabc/

pero es un poco coñazo ponerse a estudiar todo esto, lo siento, no soy fan del cálculo. A lo mejor algún ingeniero del foro te echa un cable. En cualquier caso te queda por averiguar como hallar los valores A, B y C conociendo la matriz de rotación.
En línea
Aiken
Nuevo
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 4


Ver Perfil
« Respuesta #4 : 04/06/2018, 06:00:15 pm »

ese es el tema, hallar los ángulos de euler a partir de una matriz de rotación, creo que me estoy metiendo en un jardín que me tiene desvelado ...
 :¿eh?:

pero seguiré intentandolo, si averiguo algo volveré a dejar constancia por si le sirve a alguien.
En línea
Masacroso
Pleno*
*****

Karma: +1/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 852


Ver Perfil
« Respuesta #5 : 04/06/2018, 06:13:07 pm »

Creo que ya entiendo la notación... Los ángulos de Euler se definen por orden de rotación a través de cada eje en el nuevo sistema después de cada giro. En tu caso, según describe @panic mode en uno de los enlaces tenemos que [texx]A=Z_1,\, B= Y_2,\, C=X_3[/texx].

Si tienes la matriz de rotación y acceso a Wolfram Mathematica entonces hallas esos valores con el código "EulerAngles[r,{3,2,1}]" donde r es la matriz de rotación antes descrita. Lo he mirado aquí.

Luego con más ganas a lo mejor me pongo a mirar cómo se hace el cálculo manualmente.
En línea
Abdulai
Moderador Global
Pleno*
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
Argentina Argentina

Mensajes: 2.031


Ver Perfil
« Respuesta #6 : 05/06/2018, 01:47:54 am »

........
Lo que pretendo es crear un sistema de coordenadas a partir de tres puntos conocidos, para ello lo que hago es:

Defino 3 puntos P1, p2 y p3
P1, define el origen del sistema.
P2, define el vector del eje X.
P3, define el plano XY.

Calculo vector en eje X
[texx]\overrightarrow{VX} = P2 - P1[/texx]

vector auxiliar para calcular VY
[texx]\overrightarrow{VA} = P3 - P1[/texx]

Vector en eje Y
[texx]\overrightarrow{VY} = \overrightarrow{VX} * \overrightarrow{VA}[/texx]

y vector en eje z
[texx]\overrightarrow{VZ} = \overrightarrow{VY} * \overrightarrow{VX}[/texx]


Están cambiados los ejes, debe ser:

Vector en eje z

[texx]\overrightarrow{VZ} = \overrightarrow{VX} * \overrightarrow{VA}[/texx]

y vector en eje y
[texx]\overrightarrow{VY} = \overrightarrow{VZ} * \overrightarrow{VX}[/texx]

La matriz de rotación que calculás mas adelante termina siendo la misma pero con dos columnas intercambiadas.

[texx]
Matriz Rot = \begin{bmatrix}
{0.538511}  & {0.689392}  & {-0.484505} \\
{-0.0448759}& {-0.550718} & {-0.833484} \\
{-0.841423} & {0.470583}  & {-0.265631} \end{bmatrix}
[/texx]
 

Cita
................
................
EJE X:
[texx]VZnorm.z = Cos(B)Cos(A)[/texx] ; A = rot en X, por lo tanto

[texx]\displaystyle rot X = arcCos(\frac{VZnorm.z}{Cos(rot Y)}) [/texx]

No es una buena elección porque el coseno es un función par y arcCos te devuelve solo valores positivos.
Tenés que usar [texx]VXnorm.y = \sin C \cos B[/texx]


Cita
EJE Z:
[texx]VXnorm.x = Cos(C)Cos(B)[/texx] ; C = rot en Z, por lo tanto
[texx]\displaystyle rot Z = arcCos(\frac{VXnorm.x}{Cos(rot Y)}) [/texx]

Acá te va a pasar lo mismo que en el caso anterior cuando el ángulo sea negativo.  Ahora te da bien porque es positivo (habiendo corregido el tema de las columnas)
En línea
Aiken
Nuevo
*

Karma: +0/-0
Desconectado Desconectado

Sexo: Masculino
España España

Mensajes: 4


Ver Perfil
« Respuesta #7 : 05/06/2018, 04:05:55 am »

Muchas gracias Abdulai!

Es cierto estaba cambiado el eje Z por el Y, y por eso me daba resultados erroneos.
Respecto a lo que comentas de utilizar la ecuación con arcosenos, tampoco funciona bien, según en que cuadrante esten definidos los puntos P1, p2 y P3,  en el eje Z a veces tengo que cambair el signo y en el eje X a veces tengo que sumar 90º.

Una vez corregido el problema he hecho pruebas utilizando éstas ecuaciones con tangentes (las vi en un video de youtube a altas horas de la noche y no tengo el enlace):

[texx]\begin{bmatrix}{a}&{b}&{c}\\{d}&{e}&{f}\\{g}&{h}&{i}\end{bmatrix} \Rightarrow{rX, rY, rZ}[/texx]

[texx] rX = arcTan2(h,i)[/texx]
[texx] rY = arcSin(-g)[/texx]
[texx] rZ = arcTan2(d,a)[/texx]

He hecho pruebas con diferentes posiciones de los puntos y los resultados estan bien, pero no sé si habría algún problema cuando alguno de los ejes del nuevo sistema es paralelo al del sistema de referencia, habría que probar, en mi caso no me preocupa por que no se va a dar el caso.

Gracias por el aporte, saludos,

En línea
Páginas: [1]   Ir Arriba
  Imprimir  
 
Ir a:  

Impulsado por MySQL Impulsado por PHP Powered by SMF 1.1.4 | SMF © 2006, Simple Machines LLC XHTML 1.0 válido! CSS válido!