lunes, 30 de enero de 2017

Una Clase para controlarlos a todos...bueeeno, solo a unos pocos. (Cinemática II)

Lo prometido es deuda y aquí estamos de nuevo con otra entrada a cerca de la dichosa Cinemática, esta vez para contaros que he creado una clase en Python que nos simplifica y nos hace más fácil la tarea de controlar un brazo robótico (vaya, para no querer hacer un brazo robótico, me estoy poniendo un poco pesadito con el tema).




Como ya he dicho en alguna ocasión, la idea de todo esto no es otra que la de aprender y entender lo mejor posible el funcionamiento de la cinemática, por lo que voy despacio, de lo sencillo a lo un poco mas complicado, y lo que tocaba ahora era meterse de lleno a controlarla mediante software. Es cierto que ya había hecho mis pinitos en el simulador, de hecho, he reutilizado parte del código pero reescribiéndolo en Python.

La clase que he creado sirve para controlar un brazo robótico de 3 grados de libertad (3GL). Posteriormente, tengo la intención de hacer otra de 4 grados, pero el funcionamiento es más o menos el mismo, así que vamos a lo sencillo y si luego lo complicamos, ya lo publicaré.

Lo que haré en esta entrada será mostraros como utilizar y como funciona la Clase, el código fuente y su documentación la podéis encontrar, como siempre, en mi Github, además, en esta ocasión me he lanzado a hacer mi primera Wiki en la he descrito cada una de las clases (documentándolo todo, no parezco programador 😆😆😆).

También quisiera decir que es una primera versión y quedan cosas que refinar y es posible (seguro) que sea mejorable, pero... para eso ya estáis vosotros, jajaja

Vamos a ello!!


Para este sistema de brazo robótico de 3GL, he escrito una clase principal la cual hace uso de otras dos clases auxiliares:
  1.  Brazobot3GL .- Es una clase para definir y controlar un brazo robótico de 3 Grados de Libertad (3GL) de forma rápida y simple.
  2.  Articulacion.- Que es una clase que nos permite definir una articulación de un robot y la comunicación por puerto serie con Arduino para mover el actuador (servomotor) que controla dicha articulación
  3.  Bresenham2d.- Es una clase que nos permite realizar los cálculos correspondientes al algoritmo de mismo nombre para realizar trayectorias y mover nuestro brazo desde un punto a otro. Como indica el nombre de la clase, calcula trayectorias en un plano (2D - 2 Dimensiones).  


La Clase Brazobot3GL

Como he comentado anteriormente no voy a dedicar esta entrada a describir todo el código, sino, que para que sea más ameno, vamos ver cómo utilizarla para manejar un brazo robótico. 

Como cada vez que queremos trabajar con una clase, lo primero que tenemos que hacer es crear un objeto de esa clase

RA3GL = Brazobot3GL(sp, 514, 'Y', 0)

Bien, pues con esto ya tenemos nuestro objeto tipo Brazobot3GL, pero ¿qué significan los parámetros que le hemos pasado?

Parámetros de entrada para el constructor de la clase:

  1. sp.- Serial Port o sea, el puerto serie al que está conectado nuestro Arduino y que habremos obtenido anteriormente usando el procedimiento misUtilidades.getSPArduino().
  2. alt.- Altura a la que se encuentra la primera articulación.
  3. conCab.- Indica si nuestro brazo robótico tiene cabeceo o no (Boolean). ¿Qué es el cabeceo? Cabeceo es cuando queremos que la posición de una extremidad, por ejemplo, la muñeca, permanezca constante desde el punto de vista del observador, por ejemplo, que permanezca siempre paralela a la base. Valor por defecto="Y"
  4. angCab .- Angulo en el que establecemos el valor del cabeceo. Valor por defecto= 90
Ya tenemos creado nuestro objeto, pero ahora lo que tenemos que hacer es darle personalidad, definir sus características propias, tenemos que definir sus articulaciones:

RA3GL.setBrazo([0, 160],546)
RA3GL.setAnteBrazo([20, 180],854)
RA3GL.setMuneca([0, 180],455)


Con estas tres sencillas sentencias definimos cada una de las articulaciones del Brazo Robótico: Brazo, Antebrazo y Muñeca.

Los valores que le pasamos a la función que define cada una de las articulaciones son:


  • Amplitud.- Es una lista de dos valores que son los ángulos mínimos y máximos dentro de los cuales queremos que se mueva esa articulación. A veces, estos valores vienen dados por la baja calidad de los servos que adquirimos y que no operan bien si llegamos a sus valores límites, otras, sin embargo, pueden ser determinadas por como queremos que funcione nuestro brazo.
  • Longitud.- Pues eso, la longitud de la extremidad.

Muy bien, pues simplemente con eso ya estamos listos para manejar nuestro SuperBrazo Robótico, sencillo ¿verdad? y para ello disponemos de tres funciones operacionales: 

  • posDK(ang1, ang2, ang3).- Posicionamos por Cinemática Directa dandole cada uno de los ángulos que debe tomar los servos correspondientes a cada articulación.
  • posIK(X, Y).- Posicionamos por Cinemática Inversa, por lo que lo que pasamos a la función las coordenadas X e Y de destino.
  • posIKTray(X, Y).- Posicionamos el brazo por Cinemática Directa, igual que en el método anterior, pero lo realiza calculando trayectorias de Bresenham, por lo que los movimientos son más suaves.
Ahora, lo que nos queda es verlo en acción ¿a que estáis deseando? 

Para ello, podía haber hecho un Notebook y comprobar los datos de los resultados, peeero, ya sé que dije que no iba hacer un brazo robótico, pero no solo de teoría vive un maker, y claro, no me he podido resistir a fabricarme un brazo para probar todo esto, soy débil, tenía que verlo funcionar.




Míralo ahí, que "bonico" es!!!

Es un brazo muy básico y sencillo, pero ideal para testear y realizar las pruebas que necesitaba.



Como siempre, os dejo todo los fuentes en Github, incluido el diseño en FreeCad del "Bracito" y los Notebooks de pruebas:

Solo me queda decir que el firmware que se carga en Arduino, es de Obijuan (https://github.com/Obijuan/zum-servos) en este caso con una pequeña modificación y es que como ambos servos, el que controla el brazo y el del antebrazo,  están colocados invertidos uno respecto al otro,  los ángulos que se envían al servo del antebrazo, hay que invertirlos de forma que 0º se convierte en 180º y viceversa.

Dar de nuevo mi agradecimiento al autor de la web https://sites.google.com/site/proyectosroboticos/ por toda la información compartida.

Bueno, esto es todo, yo sigo investigando para mi siguiente proyecto que como os he dicho otras ocasiones, NO ES UN BRAZO ROBÓTICO.

   

1 comentario: