lunes, 3 de febrero de 2014

Nuevo proyecto: Air Hockey Robot (3D printer hack)

[English version here]

Este proyecto se encuentra ahora en: http://jjrobots.com/air-hockey-robot-a-3d-printer-hack/
JJROBOTS (http://jjrobots.com) es el nuevo portal que hemos creado para los proyectos de robotica. Contiene blog, tienda online, instrucciones de montaje, "como funciona", foros... mas info

Después del último proyecto de B-ROBOT, esto es en lo que he estado entretenido los últimos meses...



   Todo surgió a raíz de la construcción de mi impresora 3D. Por un lado, la posibilidad de diseñar y fabricar mis propias piezas y por otro lado, la idea de ¿cómo aprovechar los materiales y los conocimientos en la construcción de la impresora 3D para hacer otra cosa? Es decir, ¿como podría hackear los componentes de una impresora 3D para convertirla en algo distinto?
   Había visto varios proyectos muy interesantes de robots para pintar, para fabricar PCBs etc... pero buscaba algo distinto.
   A esto se unió la afición que mi hija tiene por las máquinas de Air Hockey (y la mía por la robótica) y así un día surgió la idea: Y si.... Mmmmm....Parecía bastante complicado y con muchas incógnitas (detección del disco??, velocidad de movimiento??), pero eso es lo divertido no?



   Tomando como base las piezas de una impresora 3D RepRap típica, es decir, motores NEMA17, drivers, Arduino Mega, RAMPS, correas, rodamientos, varillas, piezas impresas... comenzamos a darle forma al proyecto. La gran ventaja de usar estas piezas es que son baratas y fáciles de conseguir.
   Primero comencé con la construcción de la mesa. Pensé en un tamaño medio (mi casa es pequeña, jeje) pero que fuera suficiente para jugar. Por otro lado tomé las medidas del maletero del coche (quería que el proyecto fuera transportable) y así elegí las dimensiones finales de 100x60cm.
   Compré los tableros y los listones de madera y me puse a montar el bastidor. Primero estaba huyendo de hacerlo con aire y simplemente buscar alguna superficie que deslizara bastante y llegué a montar una mesa de esta forma y se podía jugar, pero la verdad es que perdía bastante gracia, asi que me decidí a hacer una mesa con aire. Tenía muchas incognitas, asi que probé distintas posibilidades hasta que dí con una combinación muy sencilla con 2 ventiladores viejos de PC que funciona muy bien. Por otro lado agujerear la mesa parecía que iba a ser un trabajo enorme pero en realidad, usando una guía para los agujeros, salió bastante fácil.
   Pues bien, ya tenía una mesa de Air Hockey totalmente operativa!! y un par de horitas de juego que le echamos ;-)



   Mientras tanto fui diseñando las piezas del robot. Barajé dos diseños, uno H-Bot y otro el actual. Finalmente me decidí por el actual diseño con 3 motores (2 para el eje Y y uno para el X). Tras varias iteraciones de diseño de las piezas, y algunos cambios de materiales para reducir al máximo los pesos y las inercias (y así incrementar las aceleraciones) llegamos a un diseño bastante operativo. Una de las sustituciones mas importantes es la sustitución de las varillas del eje X por tubos de carbono de cometas que funcionan perfectamente con rodamientos impresos en PLA y ahorran muchísimo peso.



   La parte del código comenzó estudiando el código del Marlin (software típico de las RepRap) pero finalmente decidí no reaprovecharlo por varias razones, primero porque toda la parte de GCODE no era necesaria, y segundo porque los software de las impresoras 3D tienen una parte muy importante de planificación de movimientos que no es la forma en que debe de funcionar el robot de Air Hockey. Las impresoras 3D planifican los movimientos para obtener recorridos suaves pasando por todos los puntos. En el caso del robot de Air Hockey cada nuevo comando que le enviemos debería generar una respuesta inmediata, anulando al anterior, porque lo que prima es que el robot se mueva lo más rápidamente posible a la nueva posición que le hemos indicado.
   De esta forma decidí comenzar el código totalmente desde 0, empezando por implementar el driver para los motores Steppers usando las interrupciones del Arduino y haciendo el código lo más eficiente posible. He implementado un control de posición, velocidad y aceleración, usando una rampa de aceleración con un perfil S-profile en el arranque para hacer los movimientos un poco mas suaves.
  El control de velocidad permite generar pulsos hasta 25Khz que es la máxima velocidad que he conseguido con los steppers. El control de posición funciona a 1Khz.



   Una vez que el robot estaba montado, comenzaron las pruebas e incluso hice una interfaz para controlarlo manualmente desde el móvil por Wifi.
   Para la detección del disco pensé algunas posibilidades pero finalmente decidí usar un sistema de visión.
Inicialmente pensaba usar el sensor CMUCAM5 (Pixy) que encajaba muy bien con este proyecto (y en futuro prepararé una versión para este sensor), pero lo cierto es que los retrasos han hecho que la cámara todavía no este disponible, así que improvisé un plan B: Usar la cámara de la PS3 EYE junto con un PC para desarrollar el sistema de visión. El sistema de visión lo he desarrollado en C usando las librerías de OpenCV para la captura, umbralizado, filtrado y segmentación. 
   El sistema detecta el disco de hockey que debe de tener un color diferenciado y el resultado se envia por un puerto serie al Arduino. El sistema de visión envía paquetes de información que contienen la posición del disco y del robot en píxels dentro de la imagen. La cámara esta funcionando a 60Hz y con una resolución de 320x240. Afortunadamente la cámara tiene muy poca distorsión y no he tenido que realizar correcciones de distorsión de la lente.  A su vez se graba un vídeo en el PC con lo que se está capturando, lo cual es muy útil para depurar.



   Uno de los principales problemas que he tenido es que los motores NEMA17 están bastante justos de potencia para este proyecto y el inconveniente de usar motores paso a paso es que si perdemos pasos (que puede pasar fácilmente, por ejemplo al tropezar el robot con el disco en una pared) no nos damos cuenta y perdemos por completo el posicionamiento del robot. Para solucionar esto, lo que he hecho es aprovechar el sistema de visión para detectar también el robot (con otro color distinto) y así poder detectar cuando el robot ha perdido pasos y solucionarlo.
   Con todo esto, lo que restaba era la implementación (dentro del Arduino) del sistema de predicción de trayectorias y del sistema de estrategia del propio robot. Una vez que tenemos detectado el disco en dos fotogramas consecutivos podemos calcular la trayectoria que va a seguir (ecuación de la recta que pasa por dos puntos, esto son matemáticas del colegio eh!!). También podemos calcular si la trayectoria va a tener rebote con las paredes laterales y su nueva trayectoria. Todos estos cálculos de trayectoria se le pasan al sistema de estrategia que decide qué es lo que va a hacer el robot: Defender, Defender y atacar a la vez o preparar un nuevo ataque.



   Una parte bonita de este proyecto es que el subsistema de estrategia esta totalmente aislado y es muy fácil que cualquiera pueda en el Arduino modificar la estrategia y programar su propio código aislándose de las complejidades del control de los motores, del sistema de visión y de la predicción de trayectorias. Al final la estrategia es lo que hace que el robot gane o pierda!! así que se plantean posibles competiciones de robots de Air Hockey ??

A pesar de que pueda parecer complejo, es un proyecto reproducible, con materiales asequibles y totalmente abierto:

  • Repositorio de código, diseños 3D, documentación: GitHub
  • Manual de construcción (disponible también en inglés): Manual
(*) El manual de construcción incluye fotos detalladas del proyecto

Algunas otras consideraciones que se han tenido durante el proyecto (y para el futuro):
  • Reproducible: Facilidad para conseguir los materiales, documentación, código y hardware abiertos...
  • Transportable: El robot se desmonta completamente solamente con 6 tornillos. Así que se puede desmontar para jugar o transportar.
  • Adaptable: Es muy fácil adaptar el nivel de juego del robot, por ejemplo para jugar con niños, simplemente bajando la aceleración y velocidad máxima del robot (esto se podria mejorar en un futuro o incluso que fuera dinámico)
  • Actualmente el robot no detecta los goles pero se podría plantear algún sensor para ello (futuro).
  • En un futuro el robot podrá autocalibrar la cámara usando unos movimientos predefinidos al inicio (evitaría la calibración de la cámara).
  • Competiciones: La mesa permite colocar 2 robots, uno a cada lado. Competiciones entre robots ???? Al final cada uno podría tener su código con la estrategia y comparar distintas estrategias en un torneo...
  • Ciencia: Es un proyecto estupendo y entretenido para enseñar ciencia y en especial a los niños:
    • Conceptos de física: Rozamiento, movimiento continuo y uniforme, rebotes, conceptos de posición, velocidad y aceleración
    • Conceptos matemáticos : Ecuación de la recta que pasa por dos puntos, predicción, Sistema cartesiano XY
    • Robótica: Motores, Sistemas de visión, Control, Arduino.
    • Filosofia DIY : Construye tu propia mesa de Air Hockey!
    • Hacking : Usar las piezas de una impresora 3D para construir algo totalmente diferente.

  ¿Cuál es el nivel de juego actual del robot? Pues bien, actualmente el robot le gana fácilmente a un niño. Un adulto con cierta experiencia (yo mismo jeje) todavía le puede ganar al robot, pero seguramente con algunas pequeñas mejoras más va a estar realmente difícil ganarle...

  El proyecto esta totalmente vivo y en fase de mejoras, tanto en el código como en el robot... cualquier aportación al proyecto será bienvenida...


Recueda, las nuevas actualizaciones de este proyecto las encontrarás en JJROBOTS (http://jjrobots.com)

Science&fun
  Jose Julio (@jjdrones). JJROBOTS.COM (@jjrobots)

20 comentarios:

  1. Impresionante, lleno de creatividad, y sencillamente FANTASTICO!!

    ResponderEliminar
  2. Brutal! haces que algo complicado, parezca hasta fácil! Muy bueno! Enhorabuena!

    ResponderEliminar
  3. Eres un crack ! gracias por compartir !

    ResponderEliminar
  4. Alucinado me ha dejado, felicidades
    Veo que el motor del eje X, que debe pesar bastante, va montado sobre el carro.
    Una posible mejora será dejarlo fijo en un extremo del recorrido y transmitir su movimiento a través de un eje giratorio de sección cuadrada que pase a través del carro, de esa manera la masa del carro móvil baja sustancialmente y es mas fácil de controlar

    ResponderEliminar
  5. El sistema tiene feed-back de la posición del cabezal desde la cámara ¿Por que usas motores paso a paso?, ¿no sería mas barato, sencillo y ligero usar motores normales y corregir posición según la posición detectada con la cámara?
    Saludos

    ResponderEliminar
    Respuestas
    1. El feedback de la cámara solamente se realiza cuando el robot esta en reposo (posicion de defensa), no esta preparado para ser un feedback que permita controlar los movimientos del robot, esta solo pensado para detectar le pérdida de pasos de los steppers. Si no usara steppers (que son bastante baratos) necesitaria motrores DC con reductora y con algun feedback de tipo encoder, lo cual en general es mas caro y dificil de controlar...

      Eliminar
    2. Hola jjdrones, gracias por contestar. Me sorprende que los motores p.p. sean mas baratos los DC con reductora, siempre pensé que era al contrario, supongo que sabes mas que yo de eso. Tu respuesta es técnicamente satisfactoria. Lo único que puedo sugerir, si algún día decides introducir una mejora es que en lugar de utilizar encoders en los ejes de motores, coloques encoders lineales en las guías, te los puedes hacer tu y eliminan todos los problemas de holguras en las transmisiones pues te dan el feedback exacto de la posición.

      Eliminar
  6. ...sin desmeritar el logro de por sí increíble, me gustaría mucho que esta creatividad se dirigiese por ejemplo a la búsqueda de factores energéticos que no contaminen. Por ejemplo, la utilización de campos magnéticos, aprovechamiento de la luz solar y de los vientos, el mismo campo gravitacional de la tierra, en fín. Ustedes son los genios.

    ResponderEliminar
  7. Me ha encantado, mi más sincera enhorabuena y admiración por tu trabajo.
    Me pregunto, ¿cuanto tiempo dirías que te ha llevado cada parte? (diseño/construcción de la mesa, diseño/impresión/montaje del robot, programación y pruebas).
    ¿Has tenido alguna sorpresa? (yo tendría pánico a sobre/infradimensionar la potencia de los motores, a encontrarme con vibraciones inesperadas, etc.).
    Y ya que estoy con las preguntas prácticas, ¿cuánto dirías que te ha costado cada parte del proyecto?

    De nuevo, te expreso mi admiración. Yo soy ingeniero en Informática y en Organización Industrial, he hecho mis experimentos con microcontroladores PIC, PWM, baquelitas insoladas, etc., pero la habilidad que demuestras con este proyecto en un conjunto tan amplio de disciplinas me causa una gran inspiración.
    Saludos,
    Joel Santirso

    ResponderEliminar
    Respuestas
    1. La verdad es que no he hecho el esfuerzo de contabilizar las horas de cada fase pero mas o menos si el proyecto me ha llevado unos 4 meses (no tengo demasiado tiempo libre) yo diria que la parte de la construcción de la mesa se llevaría un 30% del tiempo, el diseño/montaje del robot 20%, el codigo del Arduino un 20%, el codigo del sistema de visión 10%, un 10% en pruebas y correcion de errores y un 10% en el video y difusion...
      Todo muy aproximado ya te digo...
      La sorpresa mas desagradable fue cuando comprobé que los motores paso a paso perdian pasos en determinadas circunstancias y tuvo que improvisar el sistema para detectar la perdida de pasos con la camara detectando el robot. Otro factor decepcionante fue cuando al principio monté el robot y iba muy lento (en acelerar) hasta que me puse a aligerar peso y mejorar las aceleraciones... Desde luego ha sido un problema tras otro pero siempre es un poco asi...
      De precio pues seria un poco mas barato que una impresora 3D (una prusa por ejemplo) porque tiene menos motores/drivers y no tiene hotend y el coste de la madera para la mesa es pequeño... (sin contar la camara de la PS3).

      Eliminar
  8. Hala, a REDDIT:
    http://www.reddit.com/r/videos/comments/1xcu8f/3d_printer_air_hockey_opponent/

    ResponderEliminar
  9. HOLA DONDE PUEDO CONSEGUIR ESTE TIPO DE SISTEMA DE HOCKEY

    ResponderEliminar
  10. Que buen proyecto, esta bastante interentante, me gusto muchisimo, de hecho al parecido, ¿no se si me podrias ayudar, con mi tabajo?

    ResponderEliminar
  11. Un gran trabajo!
    Yo tambien como ingeniero de desarrollo software y hardware siempre tengo cosas en la cabeza por hacer y muy poco tiempo para desarrollarlas...así que realmente admiro el tiempo que le has dedicado para "terminarlo", teniendo en cuenta que estas cosas nunca se acaban...

    Has pensado en usar motores brushless si el control de posición ya lo estás haciendo mediante visión?

    El algoritmo de visión lo tienes corriento en un PC? Has pensado en usar algun minipc como la Odroid U3 sobre Linux?

    Un saludo y a seguir desarrollando! :)

    ResponderEliminar
  12. Es realmente admirable tu trabajo, muchas felicidades :D

    ResponderEliminar
  13. ¡Qué pasada! ¿Para cuándo una unidad R2?

    ResponderEliminar
  14. Dear Mr. Jose Julio

    I am Motaz Awad from Jordan and I am one of your biggest fans about your inventions.

    Air Hockey Robot, the most amazing invention I have ever seen, So I decided to make one for my graduation project just like yours by my modest skills, I entered to github site and I tried to follow your instructions and I succeed to make the hardware, but I had faced a problems on software of the camera and the Arduino.

    Its my pleasure if you can help me about these problems, and i will explain to you what problems that i faced.

    Regards

    ResponderEliminar