Bueno, os voy a hablar un poco en el blog de mi actual Proyecto de Fin de Carrera: ChessO.
Como ya sabréis, en las ingenierías hay que realizar un proyecto para titularse. Este proyecto puede desarrollarse por cuenta propia, es decir, un proyecto que la Universidad te ofrezca, o bien algo que tú mismo propongas a algún profesor del departamento que te interese, y éste te lo acepte. O bien puedes desarrollarlo en una empresa, presentando como PFC parte del trabajo que tengas que realizar allí.
Como soy bastante “manitas” y además soy autodidacta de corazón, siempre me sentí atraido por algún proyecto que implicara crear algo físico, alguna chorrada, algo con cables… y no algo en una empresa. Así que cuando me ofrecieron esto no dudé en aceptar al momento.
Se trata de implementar un prototipo que sea capaz de jugar una partida de ajedrez con un oponente humano, siendo capaz tanto de reconocer automáticamente los movimientos realizados por éste, como de mover sus propias piezas hasta dar jaque mate al rey contrario.
Con estas dos características, lo que intentaré es superar la interactividad ofrecida por los juegos de ajedrez electrónicos, donde el jugador humano tiene que indicar mediante teclas (o presionando la celda) a donde acaba de mover su pieza, así como moverle las piezas al propio ordenador.
El proyecto es super interesante, ya que tengo que tocar bastantes aspectos de la carrera. Además me puse como objetivo aprender, aprender todo lo que pudiese, y eso estoy haciendo.
Concretamente, los campos en los que estoy teniendo que investigar estos meses son los siguientes:
Programación en Java:
Hasta ahora, desde que empezé con el ya olvidado (por mí) Visual Basic, he aprendido unos pocos lenguajes de programación. Pero a Java le tenía yo ganas oye, no sé por qué. Así que lo primero que decidí fue que el proyecto lo desarrollaría en este lenguaje. Hasta ahora no me va mal, con mi más y mis menos, pero me saco las castañas del fuego. Qué remedio, no?!
Inteligencia Artificial:
Realmente el código de IA no es mío, sino que me lo han proporcionado. No estudio informática, y el conocimiento de ese campo no era el que me interesaba. De lo que trata mi proyecto es de conectar esa IA que sabe jugar al ajedrez, con los periféricos necesarios para cumplir los objetivos.
El modelo de ajedrez está programado con Prolog con el motor de inferencias SWI-Prolog. Este programa es el que sabe jugar y controla la verdadera partida de ajedrez, así como todas sus variables. Es él quien decide si el movimiento de un usuario es un movimiento legal o no, y el que elige el mejor movimiento realizable en cada momento para el ordenador.
En su estado primitivo, cualquiera puede jugar una partida de ajedrez con este programa a través de la interfaz de SWI-Prolog. El programa pedirá que el usuario introduzca la ficha que desea mover y el destino. A continuación mostrará su movimiento en la pantalla.
Procesamiento de imágenes:
La forma que el sistema tendrá de determinar qué pieza a movido el jugador humano será mediante una webcam, la cual actuará como ojo del robot. Cuando el jugador humano realize un movimiento el sistema tendrá que capturar una imagen del tablero para analizarla, y saber así a donde se ha movido.
Para esto, son necesarias técnicas de procesado de imágenes, tales como la detección de objetos por segmentación o la detección de bordes, además de todo el tratamiento previo que se requiera para las imágenes como enfoques/desenfoques, ajustes geométricos, filtrados, ajuste de niveles, etc.
Una vez este módulo haya determinado que pieza se ha movido, tendrá que interactuar con el módulo de IA para comprobar que el movimiento es legal, antes de continuar con la partida.
Una vez hecha la comprobación, y siempre que el último movimiento del jugador humano sea legal, el sistema procedería a realizar su siguiente movimiento (que aún muestra por pantalla).
Para esto, barajaba dos posibilidades: trabajar con Matlab, que tiene un potencial enorme en procesado de imagen gracias a un toolbox dedicado a ello, o tirar de Java también para esto, trabajando con el paquete ImageJ. Finalemente, por problemas de licencias con la Universidad, acabe siendo programado en Java.
Robótica:
El último paso para completar el sistema será hacer que, después de obtener el movimiento del humano, procesarlo, comprobar el movimiento, y pensar la siguiente jugada, éste sea capaz de coger su pieza y moverla de sitio. Para ello tengo a mi disposición un fantástico no tan fantástico Lynx5 de Lynxmotion. Este bichejo será el encargado de realizar el transporte de piezas de un lado a otro del tablero.
La verdad es que estoy contento con él… a pesar de que ya me he cargado un par de juegos de repuesto para los servomotores del gripper (la pinza que recoge). En verdad la culpa es mía por gañan, pero me molesta que sea tan delicado. Además, los acabados no les han salido muy bien, y tiene un par de puntos débiles importantes pero bueno, eso será otro post…
Finalmente todo esto tendrá que estar unido con Java, el cual se encargará de gestioar las llamadas necesarias tanto al puerto de comunicaciones COMM al cual está conectado el Lynx5, como al sistema de IA de SWI-Prolog, con quien se comunica a través de la interfaz Java/Prolog ofrecida por los desarrolladores de SWI-Prolog, y que se llama JPL.
Como véis es un proyecto completito y bastante complicado teniendo en cuenta que:
- Estoy aprendiendo a programar en Java ‘on the fly’ (a.k.a ’sobre la marcha’) lo cual me gusta porque le da emoción, pero también me retrasa…
- Nunca he trabajado con procesado de imágenes, ni he tenido el placer de tener esa asignatura, lo cual me hace perder horas, días enteros, investigando aquí y allá, probando ejemplos y ejemplos sin parar.
- No sabía nada sobre robótica, ni sobre cinemática, ni sobre dinámica… aunque tenía bastantes ganas de empezar con ella… una vez casi encargo un Lego Mindstorm.
- Mi carrera es una ingeniería de 3 años, por lo que se espera menos de mí en esto que de un ingeniero de 5 años. Eso sí, puedo asegurar que mi proyecto es mil veces más interesante, motivante y complicado que el 90% de los proyectos publicados en mi universidad, ya sean para superiores o técnicos, lo cual me motiva más aún.
Este primer prototipo no implementara el juego entero de ajedrez, sino que se ha acotado el sistema para jugar un final de ajedrez Torre Rey contra Rey (o Lone Rook Mate). Así que la partida empezará solamente con esas piezas, y continuará hasta dar jaque a su oponente… Y garantizo que será siempre así. En siguientes versiones se intentará implementar el juego completo, pero me temo que debido a limitaciones del robot no podrá ser: Es un robot con 4 grados de libertad (4DOF), así que no tiene rotación de muñeca. Además, dado su tamaño, no tiene mucho alcanze, por lo que el tablero tendrá que tener unas dimensiones máximas establecidas. Yo actualmente estoy utilizando un tablero de ajedrez (impreso) cuyas celdas miden una pulgada de lado (2,54cm), que tiene aproximadamente 20cm de lado, el cual cabe en un DIN-A4. Así que con estas dos limitaciones combinadas, tenemos que vamos a necesitar jugar con las piezas muy juntas, y sin rotación de muñeca, lo cual impediría que todas las piezas estuvieran disponibles para ser agarradas en cualquier momento.
Así que nada, he conseguido 3 directores de proyecto (Informática, Procesado de imágenes y Robótica) y en ello estoy, aprendiendo todo lo que puedo.
Y ahora que conocéis un poco el tema, ¿!¿no os parece emocionante?!?… a mí me encanta.
Bueno, este primer post ha sido una introducción bastante ligera, y nada técnica. En siguiente capítulos iré analizando un poco más los problemas que surgen del proyecto, la planificación en modo general, y más adelante pasaré a repasar aspectos técnicos, analizando toda la programación módulo por módulo, hasta que termine con él.
Aunque soy tan chapucero programando que no sé si me dara demasiada vergüenza como para publicar el código…
Es una broma, será lo primero que haga, ya que si tengo que dar gracias a alguien cuando termine con todo esto, será a las personas que cuelgan su trabajo, escriben tutoriales, o gastan su tiempo respondiendo a las preguntas de los ijjjnorantes como yo en los foros. Seguro que a alguien ayudará.
En el próximo capítulo… Introducción (II)
Saludos, Luso.