martes, 29 de noviembre de 2016

"Allí está, ahora falta descubrir cómo llegar hasta él" - Cinemática Inversa

Bueno, ya estoy metido en un nuevo proyecto, uno más.  

La verdad es que tengo dos o tres empezados y no terminados, unas veces por falta de conocimientos técnicos, otras por falta de tiempo, y otras, las que más, porque soy un “picaflor” y no puedo parar con el culo quieto y cada vez que veo alguna cosa chula o se me ocurre algo, dejo lo que estoy haciendo en ese momento y empiezo otra cosa, así, la verdad, es que no se puede. 

 Bueno, vamos a lo que nos ocupa en esta entrada y no, no voy a decir que es ese nuevo proyecto, aún estoy en esa fase en la que tengo tantas cosas que aprender que aún no sé si llegará a buen puerto, y si lo hace, cuando será eso






 Lo que si voy a contar, y por eso escribo esta entrada en el blog, es lo que ando estudiando y, con ello, puede que os dé una pista de lo que me ronda por la cabeza.

Lo que estoy investigando y aprendiendo no es otra cosa que

CINEMÁTICA

cómo me gusta esta palabra

CINEMÁTICA

y en inglés "mola" mucho más

KINEMATIC

¡¡¡buah!!! impresionante.

Pues sí, ando estudiando Cinemática, ya que o bien en su día no le hice ni caso, o bien le han cambiado el nombre en la última reforma educativa. 

Si, si, en serio, eso pasa mucho. Mi hija me pregunta a veces cosas del cole que yo no he oído en mi vida,  por lo que me toca informarme y buscar por "internes" que es aquello tan raro que tu hija te pregunta. Al final, resulta que en tu época ("Yo fui a EGB") eso tan raro se llamaba de una forma distinta.

Y eso, amigos, es para lo que sirven las Reformas Educativas en este país, para liar a los padres de buena voluntad y volverlos locos.

¿Qué es la Cinemática?

 

 "Cinemática es una rama de la física dedicada al estudio del movimiento de los cuerpos en el espacio, sin atender a las causas que lo producen (lo que llamamos fuerzas). Por tanto, la cinemática solo estudia el movimiento en sí, a diferencia de la dinámica que estudia las interacciones que lo producen" wikipedia

  
O sea, que la Cinemática es la parte de la física que se ocupa de estudiar el movimiento sin mas, "mondo y lirondo", al estudio de trayectorias.

- Espera, espera, me parece que empiezo a recordad, esto tenía algo que ver con vectores y cosas así ¿no?  

Además, cuando mezclamos cinemática y robots, suele aparecer un nuevo término en escena:

CINEMÁTICA INVERSA

y en inglés

REVERSE KINEMATICS

como mola, no me digáis que no. Poned si no voz de Darth Vader y decir conmigo


REVERSE KINEMATICS

¿a que se os ponen los pelos de punta? jajaja 
    
 La Cinemática Inversa (IK) está muy ligada a la robótica y es:

"La técnica que permite determinar el movimiento de una cadena de articulaciones para lograr que un actuador final se ubique en una posición concreta" wikipedia


O sea, que gracias a la Cinemática Inversa podemos calcular los valores o ángulo tienen que tomar cada una de las articulaciones de un robot para que su extremo final se coloque exactamente donde queremos dentro de un espacio tridimensional. 

Para hacer ésto, tenemos que tener en cuenta el número de articulaciones que tenga el robot y la longitud de las mismas, como están colocadas, los límites del espacio que queremos cubrir, etc.

Hay una frase que oí hace poco en una de las películas de Harry Potter en la que Dumbledore dice una frase que describe bien que es la Cinemática Inversa, y es algo así:

"Allí está, ahora falta descubrir cómo llegar hasta él" 

 Simuladores


Buscando por internet sobre el asunto, he encontrado, como es lógico, mucha información, pero quiero destacar un sitio que me ha sido de una gran utilidad y que ha provocado que haga lo que vengo a presentar.

El sitio es :
 
y es una pena que no haya ningún dato de la persona o personas que lo ha realizado, porque, como os digo es un gran trabajo y me hubiese gustado mencionar a su autor y agradecerle su labor.

Si visitáis el sitio, veréis que además de explicar todo de forma fácil y sencilla, con muchas imágenes y gráficos, tiene desarrollados los programas necesarios para implementar todo lo que vamos a ir necesitando en este asunto: Cinemática Inversa, trayectorias, simuladores, etc. ¡Una mina!



Al ver todo este material, pensé que sería una buena idea para asentar conocimientos y, además, ponerlos en práctica sin empezar a construir físicamente nada (cosa que no he cumplido), programar un simulador de un brazo robótico. Aprendería como funciona y cómo manejar la Cinemática Inversa y, además, seguro que todo el trabajo me servirá más adelante el proyecto.

El caso es que, como he comentado, en la página está todo descrito y programado.  El lenguaje que utiliza para todo esto es principalmente Basic (FreeBasic), por lo que se me ocurrió que podría reescribirlo en otro lenguaje y, en este caso, he decidido hacerlo en Processing.

Y en esto estoy, por ahora, he reescrito dos simuladores de un brazo robótico de 3 Grados de Libertad (3GL) y aunque no están terminados al 100% y tendría que refinarlos un poco, os los traigo aquí.

El primero que hice está programado en 2D y es muy esquemático. El brazo se "dedica" a apuntar con su "apéndice" el puntero del ratón, mientras este se mueve por la pantalla


 ScreenHunter_285 Nov. 17 10.45.jpg

El segundo ya es algo mas vistoso, ya que es en 3D. En este caso, el brazo se mueve manejado por unos controles incorporados en la esquina superior izquierda


ScreenHunter_286 Nov. 17 10.46.jpg


No voy a contar mucho mas, ya os digo que el mérito total es del autor de la página que os he comentado antes, yo no he hecho otra cosa que reescribir lo ya escrito. El motivo de este post es mas comentar lo útil e instructivo que resulta ponerse manos a la obra y meterse en el barro cuando tienes que aprender algo nuevo, se aprende mucho mas haciendo e investigando que memorizando (esto va por algunos "profes").


La parte fundamental de los simuladores se encuentra en esta función:


void cinematicInv(){
  float Beta;
  float Afx = cos(radians(Cabeceo))*longMunec;
  float ladoB = abs(X) - Afx;
  float Afy = sin(radians(Cabeceo))*longMunec;
  float ladoA = abs(Y) - Afy;
  float hipotenusa = sqrt(pow(ladoA,2)+pow(ladoB,2));
  float Alfa = atan2(ladoA, ladoB);
  Beta = acos((pow(longBrazo,2)-pow(longAntBrazo,2)+pow(hipotenusa,2))/(2*longBrazo*hipotenusa));
  angBrazo = Alfa + Beta; //Angulo del brazo en radianes
  float Gamma = acos((pow(longBrazo,2)+pow(longAntBrazo,2)-pow(hipotenusa,2))/(2*longBrazo*longAntBrazo));
  angAntBrazo = -(radians(180)-Gamma);  //Angulo del antebrazo en radianes
  angMunec = Cabeceo - angBrazo - angAntBrazo;
  Xaux = X;
  Yaux = Y;
}

que no es otra cosa que trigonometría pura y dura: Teorema de Pitágoras y Teorema del Coseno, nada más ni nada menos. Y es simplemente una transcripción a Processing de esto




El resto, se trata de dibujar con las herramientas propias de cada lenguaje aquello que queremos representar.


De todas formas, como siempre, os dejo los programas en mi cuenta de GitHub por si alguien los quiere retomar, aprovechar y mejorar. Yo por mi parte, seguiré con trayectorias y mas cosillas interesantes que hay en dicha página.

Si que hay una cosa que me gustaría resaltar a la hora de crear un simulador 3D con Processing y es que podemos utilizar nuestros propios diseños. Yo los he creado en FreeCad y los he exportado en formato ".obj". Despues, solo tenemos que ponerlos en una carpeta llamada "data" dentro del directorio de nuestro proyecto en Processing.

La forma de cargar nuestros diseños en Processing es mediante la función loadShape("fichero.obj"), como podemos ver a continuación:


   base = loadShape("base2.obj");
   brazo = loadShape("brazo.obj");
   antebrz = loadShape("brazo.obj");
   mano = loadShape("mano.obj");


Una cosa más, esta para profesores de matemáticas y/o tecnología, la idea de hacer un simulador de un brazo robótico es un proyecto transversal perfecto entre ambas asignaturas. Hay que "currarse" la trigonometría a tope, pero cuando se terminan, es muy gratificante ver como se puede manejar el brazo, y además, puede programarse en Scratch, que es mucho mas sencillo con chavales.

Y no, no insistáis, mi proyecto no es un brazo robótico, funciona como tal, pero no lo es. Para brazo robótico ya está Thor.


Código Fuente:

PD.- Estando escribiendo este post alguien hizo este pedazo simulador para Thor. Esto es un simulador y no lo que yo he hecho. jajajajaja

No me importa, yo solo quería aprender y entender, no hacer el mejor simulador del mundo.

4 comentarios:

  1. El motivo de este post es mas comentar lo útil e instructivo que resulta ponerse manos a la obra y meterse en el barro cuando tienes que aprender algo nuevo, se aprende mucho mas haciendo e investigando que memorizando (esto va por algunos "profes").

    Por lo que parece, has estudiado.

    Aunque parezca extraño, no somos los profesores los que estimulamos el aprendizaje memorístico sino los propios alumnos. Les resulta más cómodo estudiarse de memoria las materias que estudiarlo y entenderlo).

    Por ejemplo, la fórmula de Taylor (por poner un ejemplo elemental que todo el mundo conoce) es tremendamente sencilla de entender y completamente evidente de demostrar... una vez que te tomas la molestia de estudiarla.
    Si no, lo más cómodo es estudiársela de memoria y si eso falla, me lo llevo en una chuleta.

    ¿Podemos los profesores poner exámenes en los cuales evaluemos el conocimiento de verdad y no el memorístico? Ese profe es de lo peor, es que va a pillar en los exámenes.... pregunta cosas que no ha contado en clase, no está en los apuntes... ¿No nos suena?

    ResponderEliminar