viernes, 15 de abril de 2011

Problemas en las prácticas

C++ como problema

El primer problema es C++. Siempre me ha parecido un mal lenguaje; un lenguaje supuestamente de alto nivel diseñado de manera que su código fuente sea un superconjunto de C, que es un lenguaje de bajo nivel, ya suena raro. Sobre eso tenemos que mucha gente opina que no es un buen diseño de lenguaje, por diferentes razones:  Por ejemplo, Jamie Zawinski dice "C++ es una abominación. Todo está equivocado en él de todas las maneras posibles", para seguir luego "cuando programas en C++ nadie puede ponerse de acuerdo en qué 10% del lenguaje es seguro usar. Siempre hay alguien que decide 'necesito usar plantillas'. Y acabamos descubriendo que no hay dos compiladores que implementen las plantillas de la misma forma".
Las críticas cubren tres razones principales:

  • el lenguaje es mucho más grande y complejo de lo necesario
  • el problema de elegir que subconjunto se usa hace difícil la compatibilidad
  • los mensajes de error cuando se usan plantillas son crípticos y complejos de usar


En las prácticas los dos primeros problemas son irrelevantes, ya que nuestro código es un callback al que el sistema llama repetidamente, lo que simplifica mucho el código. Sólo el último problema fue real, encontrando algunos errores relacionados con std::vector<float>, que usamos para recibir los valores del laser. Esos errores eran siempre extraordinariamente oscuros y difíciles de aislar, pero afortunadamente fueron pocos y en seguida pude localizarlos.

Gestión de versiones

El mayor problema, con diferencia, fue que el conjunto de versiones cambiaba continuamente. Para hacer una idea, empezamos con la versión 3.0 de introrob,  y acabamos con la 3.8, pasando por todas las intermedias, si recuerdo bien. Normalmente esos cambios de versión eran por problemas en el código, y no eran importantes en sí, salvo que, al no tener el código de introrob (ni el mío, mea culpa) bajo control de versiones, tenía que pasar 30 minutos cada vez que entraba en el laboratorio inspeccionando el código nuevo, para ver si había cambiado algo en la parte que modificábamos nosotros, y luego mezclando el código nuestro en la nueva versión.

Casi al final del proceso me di cuenta de que la solución habría sido poner yo bajo git las diferentes versiones de introrob que nos proporcionaban, en una rama tipo "vendor", y mezclarlas con mis modificaciones en ramas "practica1", "practica2", etc

Sin embargo la idea se me ocurrió tarde, cuando ya estábamos en la versión 3.8 y no llegué a implementarla.


Imposibilidad de desarrollar en mis equipos

Cuando probé la instalación en mis equipos, encontré un error: gazebo daba una "violación de segmento". Depurándola con gdb encontré que era en código de OpenGL. El profesor me confirmó que no tenía arreglo, y que pasaba en equipos con determinadas implementaciones de OpenGL. En mi caso un chip gráfico Intel.

Puesto que todos los ordenadores de casa tienen chips gráficos Intel de varias generaciones, cosa normal porque, no juego en el ordenador y desarrollo habitualmente para servidores y no he hecho programación gráfica desde hace la tana de años, resulta que no pude usar el entorno de simulación en mis máquinas, viéndome obligado a ir a los laboratorios linux en Móstoles cada vez que quería probar código.

martes, 12 de abril de 2011

La primera práctica, primeras impresiones

La primera práctica consiste en programar un comportamiento para el robot análogo a esos muñecos "Choca-gira" que detectan cuando chocan con un obstáculo, retrocediendo y girando al azar, para continuar avanzando después.

Una de las técnicas más sencillas para generar el comportamiento de un robot es la de los sistemas reactivos, que consiste en dividir nuestro "mundo", en situaciones mútuamente excluyentes, usando uno o más sensores y, para cada situación, disparar una o más acciones. Un robot reactivo consiste en una función, a la que se llama cada cierto tiempo, y en la que, dependiendo de valores de los sensores, se adopta un valor en los actuadores.

Para simplificar la lógica de los sistemas reactivos y sus "tablas"  se adopta en un diseño "modular", en el que la lógica de nuestro robot es la de un autómata de estado finito. Para cada estado tendremos:

  • un sistema reactivo simple diferente.
  • lógica para cambiar de estado


Nuestro Choca-gira tiene un diseño relativamente simple:

  • un estado "avanzando"
    • en él la velocidad es hacia adelante
    • cuando los láseres indican que estamos cerca de un obstáculo se pasa al estado "retrocediendo"
  • un estado "retrocediendo"
    • en él la velocidad es hacia atrás
    • después de un tiempo, suficiente para separarnos algo del obstáculo, se pasa al estado "girando"
  • un estado "girando"
    • en él se gira aleatoriamente durante un tiempo
    • después de completado ese tiempo se pasa al estado "avanzando"


viernes, 8 de abril de 2011

El entorno de las prácticas

Trabajamos en un entorno simulado con gazeboJDErobot. En particular, usamos Introrob, un componente que visualiza información de los sensores y controla los actuadores del robot. Introrob usa JDErobot para comunicarse con gazebo. Gazebo es un simulador multirobot que nos permite simular un Pioneer2AT con pleno realismo, y proporciona un mundo en el que probar nuestros algoritmos.


Para lanzar el entorno se deben seguir los pasos siguientes:

  1. lanzar gazebo en el mundo de nuestra simulación. En una terminal hacer:gazebo /usr/local/share/gazebo/worlds/depar2.world
  2. lanzar gazeboserver para que introrob puedaa comunicarse con la instancia de gazebo. En otra terminal:
    cd /usr/local/share/jderobot/glade/
    LD_LIBRARY_PATH=/usr/local/lib/jderobot/lib gazeboserver --Ice.Config=../conf/gazeboserver.cfg
  3. Compilar y lanzar introrob. En una tercera terminal:
    cd ~/introrob-3.8
    LD_LIBRARY_PATH=/usr/lib/gearbox make -f Makefile-introrob && ./introrob --Ice.Config=introrob.cfg
El directorio introrob-3.8 hace referencia al resultado de desempaquetar un tgz que descargamos del código fuente C++ de introrob. En él hay una clase, navega.cpp, que contiene el código de control. El entorno llama al método Navega::iteracionControl repetidamente. En ese método debemos actualizar los valores de los actuadores con información de los sensores.

lunes, 4 de abril de 2011

Arrancando este blog...

Uno de los requisitos de las prácticas de robótica del Master en Sistemas Telemáticos e Informáticos de la Universidad Rey Juan Carlos es que se documente nuestro trabajo en un blog.


Aproveché la ocasión para probar las facilidades de autoría de Blogger, en lugar de añadir otro blog al motor sobrecargado y poco mantenido que uso en memojo.com, tanto para el blog en español (El Agente Secreto) como para el blog en inglés (Boxes and Glue).

Esta entrada es para probar qué tal funciona el motor de Blogger antes de empezar a documentar en serio... seguiremos informando.