Campeonato ProgramaRobot 2016: DRONECAMPEONES
ProgramaRobot: DRONECAMPEONES
Horario (8 de abril 2016)
* 10h rondas clasificatorias, laboratorio de Robótica (L3104 campus Fuenlabrada)
* 12h conferencia robótica, a cargo de Dr. Antonio Barrientos (UPM)
* 13h ronda final
* Entrega de premios: 14h, salón de grados edificio de Gestión
Introducción
Los drones son robots aéreos que han ganado popularidad en los últimos años. Nacieron en el ámbito militar y con el abaratamiento de sus costes se han abierto posibilidades de uso comercial en varias aplicaciones civiles como la monitorización de infraestructuras, agricultura, vigilancia, grabación de eventos, etc.. Son robots, y como tales, están compuestos de sensores, actuadores y procesadores en el lado hardware. Su inteligencia sin embargo reside en su software.
Este campeonato plantea como reto la programación de un cuadricóptero (que llamaremos gato) para que busque, persiga a otro robot aéreo (que llamaremos ratón) y se mantenga cerca de él. En el Laboratorio de Robótica de la Universidad Rey Juan Carlos hemos preparado el entorno del campeonato utilizando el simulador Gazebo y la plataforma robótica JdeRobot. JdeRobot simplifica el acceso a sensores y actuadores y permite programar el comportamiento del gato en lenguaje Python.
Para participar es OBLIGATORIO inscribirse envíando un correo a josemaria.plaza AT urjc.esantes del 15 de marzo (para dimensionar y poder organizarlo bien). Cada participante deber inscribirse individualmente. El premio para el ganador es un cuadricóptero real (Ar.Drone2 de Parrot). Para los mensajes a los participantes usaremos la lista de correo campeonatodrones@gsyc.es (te puedes registrar aquí, y se borrará una vez realizado el campeonato).
Entorno software
Simulador Gazebo
Los simuladores en robótica son usados para crear mundos virtuales y observar cómo un robot emulado actúa en dicho entorno. De esta forma se pueden programar aplicaciones robóticas y probarlas sin depender de un robot físico, haciendo que las pruebas sean más baratas y menos peligrosas. Si el robot se choca o tiene un comportamiento extraño que no se había previsto es posible reiniciar la simulación sin que el modelo real (o las personas cercanas) haya sufrido daños. Algunos de estos simuladores representan los mundos en 3D y recrean la física de éste (gravedad, empujes, colisiones…) emulando de modo muy realista el movimiento del robot en distintos escenarios.
Gazebo es un simulador muy completo que distribuye la organización OSRF (Open Source Robotics Foundation) como software libre y se ha convertido en una referencia internacional en robótica. Cuenta con modelos de robots que pueden usarse directamente, además de incluir la posibilidad de que el usuario cree su propio robot y entornos (e.g un campo de fútbol de la RoboCup, un pueblo o el interior de un edificio) incluyendo texturas, luces y sombras. Incorpora varios motores de físicas y dispone de una amplia clase de sensores como cámaras, lásers, sensores de contacto, IMU, etc. Este simulador fue el seleccionado hace cuatro años por el DARPA norteamericano para su competición internacional DRC, inyectando varios millones de dolares en su desarrollo.
Plataforma JdeRobot
JdeRobot es una plataforma de software libre para el desarrollo de aplicaciones con robots y visión artificial. Este proyecto ha sido desarrollado y está mantenido por el Laboratorio de Robótica de la Universidad Rey Juan Carlos desde 2008. Ha sido recientemente financiada por Google.
Ofrece un entorno de programación basado en componentes donde la aplicación está formada por varios componentes y cada uno se ejecuta como un proceso. Los componentes interoperan entre sí a través del middleware de comunicaciones ICE(Internet Communications Engine, software libre de la empresa ZeroC). Además, pueden estar escritos en diferentes lenguajes (C++, Python, Java, etc..) pero interoperan sin problemas.
Esta plataforma abstrae al programador del acceso a los dispositivos hardware del robot, como la lectura de los sensores o el envío de comandos a los motores. Simplifica el acceso a ellos, permitiendo obtener la lectura de un sensor (aunque sea remoto) a través de una llamada a función.
Instalación de la infraestructura
En primer lugar es necesario instalar JdeRobot, para ello sigue las siguientes instrucciones concretamente las secciones Requirements: Linux package sources y Installation for running JdeRobot. A continuación es necesario configurar el simulador gazebo instrucciones. Para poder instalar el componente cat_py es necesario instalar el paquete teaching_robotics tienes las instrucciones aquí. Finalmente ejecuta los siguientes comandos para terminar con la configuración de la infraestructura:
cd ~/teaching_robotics/src/cat_py/
mkdir gazebo
cd gazebo
cp /usr/local/share/jderobot/gazebo/worlds/dronecampeones.world .
Componente Cat_py
Hemos preparado un componente de JdeRobot en Python que permite teleoperar el AR.Drone e insertar en él el código de cada participante para ejecutarlo. Este componente obtiene los datos sensoriales del drone (imágenes, inclinómetros, brújula, etc.) y muestra una interfaz gráfica para el manejo del AR.Drone y la visualización de sus datos sensoriales.
El código de tu prueba se empotrará dentro de este componente, y es tu código el que tomará las decisiones de movimiento adecuadas en función de la información sensorial. En esto reside la inteligencia del cuadricóptero y que su comportamiento sea bueno o no. El componente arranca en modo teleoperación, para que puedas gobernar el movimiento del cuadricóptero manualmente. Con el deslizador vertical se puede subir o bajar de altura y con la cruceta hacerlo girar y/o avanzar en horizontal.
-
Antes de ejecutar tu algoritmo pulsa sobre el botón Play, y cat.py entra en modo automático invocando periódicamente a tu código inserto en MyAlgorithm.py, el método execute. Lo llama unas 10 veces por segundo, lo que permite a tu software tener el control en todo momento del movimiento del drone.
-
Para terminar con la ejecución de tu algoritmo pulsa el botón Stop, que hace entrar a cat.py nuevamente en modo teleoperación.
Ejecución del mundo del campeonato y el componente cat_py
Con toda la infraestructura instalada ya podemos ejecutar el componente que utilizaremos en el campeonato.
En una terminal ejecuta el simulador:
cd ~/teaching_robotics/src/cat_py/gazebo
gazebo dronecampeones.wor
Ahora en otro terminal ejecutaremos el componente cat_py:
cd ~/teaching_robotics/src/cat_py/
python main.py --Ice.Config=cat.cfg
Prueba: el juego del gato y el ratón con drones
La prueba consiste en programar en lenguaje Python la inteligencia de un drone cuadricóptero que llamamos gato. Su objetivo es buscar, perseguir y mantenerse cerca de otro cuadricóptero similar que llamamos ratón. El gato tiene dos cámaras (una frontal y otra ventral) y un sensor de posición 3D como equipamiento sensorial. Sus actuadores son los motores de sus hélices. El ratón es de color rojo, para facilitar su detección en las imágenes.
Para la prueba se ha preparado un mundo 3D en el simulador Gazebo. En este nuevo mundo tendremos dos robots: el cuadricóptero AR.Drone que hace de ratón (que tiene color rojo) y el cuadricóptero gato. No hay más obstáculos en el mundo, salvo el suelo. En el siguiente video se muestra un gato de ejemplo persiguiendo a un ratón:
Robot gato persiguiendo al ratón
Mundo 3D simulado en Gazebo con gato y ratón
En la fase de preparación puedes teleoperar un ratón con la herramienta uav_viewer de JdeRobot conectado a él, mientras que cat.py se conecta al gato y ejecuta el código que has preparado para él. También puedes dejar el ratón quieto o programarle un comportamiento fijo. En la fase de competición del campeonato se pondrán varios ratones (componentes mouse) programados por la organización, que serán los mismos para todos los participantes.
Configuración del entorno
Para configurar el entorno de la prueba hay que (1) lanzar Gazebo con el fichero del mundo adecuado, (2) ejecutar el componente mouse que gobierna el comportamiento del drone ratón y (3) arrancar el cat.py que gobierna el comportamiento del drone gato. Opcionalmente (4) se puede lanzar también el componente árbitro que se utilizará para medir la puntuación de cada participante. Puedes lanzar el árbitro para ver si tu gato lo está haciendo mejor o peor en las pruebas de preparación.
Para ejecutar Gazebo con este mundo realiza los siguientes pasos:
-
cd ~/.gazebo/cfg/programaciondrones/
-
gazebo gato_raton_1.world
El árbitro consta de un plugin y un visor. Mide la distancia real instantánea entre gato y ratón y muestra en pantalla la evolución temporal a lo largo de la duración de la manga. Cuando está por debajo del umbral considerado cercano la pinta en verde y cuando está por encima, rojo. De este modo mide cuántos segundos de esas ejecuciones tu gato ha estado suficientemente cerca del ratón y lo muestra en pantalla.
Ejecución de una prueba | Gráfica del árbitro con la puntuación final |
Programando el drone gato dentro de cat.py
El comportamiento del cuadricóptero gato típicamente tendrá una parte perceptiva y una parte de control. La parte de percepción recoge los datos sensoriales (la cámara principalmente) y los analiza, extrae información de ellos. La parte de control decide qué movimiento es el adecuado y emite órdenes a los motores del robot. Cat.py tiene naturaleza iterativa, ejecuta continuamente iteraciones y en cada una de ellas se percibe y se controla. El componente Cat.py se apoya en las interfaces ICE de JdeRobot para dialogar con el simulador Gazebo. En particular con los plugins de Gazebo que materializan los sensores y actuadores del cuadricóptero. Todo este diálogo queda oculto al programador, que simplemente tiene unos cuantos métodos en Python como interfaz de programación para leer los datos de la cámara, del sensor GPS y motores del cuadricóptero.
Recogiendo imágenes
Las imágenes de la cámara frontal del gato se obtienen desde la clase MyAlgorithm. La instrucción siguiente nos devuelve la imagen de la cámara activa del drone y la almacena en la variable droneImage. A partir de este momento, dicha variable contiene una imagen que podremos tratar como queramos. Por ejemplo usando la biblioteca OpenCV de visión artificial.
droneImage = self.sensor.getImage()
Puedes cambiar la cámara activa del drone invocando el siguiente método:
self.sensor.toggleCam()
Para esta prueba necesitaremos detectar al robot ratón. El ratón es de color verde. Típicamente se localiza muy bien dentro de las imágenes usando un filtro HSV convenientemente ajustado.
Leyendo la posición y orientación en 3D (GPS e inclinómetros)
En el escenario del campeonato se usan dos sistema de referencia: uno absoluto y otro solidario con el cuadricóptero. Son los que se muestran en la Figura \ref{fig:drone_referencia}.
El seguimiento del ratón se puede abordar sin necesidad de saber la posición absoluta del drone en el mundo. Sin embargo, puede ser útil si se quiere optimizar la búsqueda del ratón cuando no se aprecia en la imagen. Para obtener la posición 3D se tiene el método getPose3D. Las instrucciones siguientes entregan las coordenadas X,Y y Z del drone dentro del mundo de Gazebo.
self.sensor.getPose3D().x
self.sensor.getPose3D().y
self.sensor.getPose3D().z
Para obtener la orientación (cuaternión) del drone:
self.sensor.getPose3D().q0
self.sensor.getPose3D().q1
self.sensor.getPose3D().q2
self.sensor.getPose3D().q3
Ordenando movimiento a los motores del drone
La clase sensor dentro de cat.py incluye varios métodos para interactuar con el drone y ordenarle movimiento. En particular el método sendCMDVel() envía comandos de velocidad de traslación y velocidades de rotación. Las velocidades de traslación siguen el sistema de referencia que se muestra en la figura anterior, solidario con el propio drone: vx de frente/atrás, vy izquierda/derecha y vz arriba/abajo. La velocidad de yaw marca el giro alrededor de un eje vertical, perpendicular al plano del drone. El método sendCMDVel() recibe 6 parámetros: vy, vx, vz, yaw, roll y pitch. Cada uno de los valores se debe indicar entre -1 y 1. Los valores roll y pitch no tienen efecto en el mundo simulado de Gazebo.
Por ejemplo, el comando siguiente ordena al drone que se mueva de manera inmediata hacia delante a una velocidad de 0.5 (a la mitad de potencia). Esta órden estará activa hasta que se le indique otra cosa.
self.sensor.sendCMDVel(0,0.5,0,0,0,0)
El método sendCMDVel() permite comandar distintas órdenes a la vez. El comando siguiente provoca que el drone se mueva hacia delante a una velocidad de 0.5, a la vez se traslade hacia la derecha a 0.4 y simultáneamente se eleve en el eje Z a 0.2 y rote sobre el eje Z a una velocidad de 0.1.
self.sensor.sendCMDVel(-0.4,0.5,0.2,0.1,0,0)
Finalmente, para detener el movimiento del drone se puede utilizar la siguiente instrucción.
self.sensor.sendCMDVel(0,0,0,0,0,0)
Insertando tu código
Para implementar el algoritmo se recomienda seguir los siguientes pasos:
-
Abre con tu entorno de programación el componente cat.py y dirígete a la clase MyAlgorithm que se encuentra en el fichero cat/MyAlgorithm.py.
-
Dirígite a la definición del método execute().
-
En primer lugar se recomienda implementar un método que nos permita detectar en la imagen obtenida del drone ratón, obteniendo su posición en píxeles. Típicamente el centro de masas de los píxeles que superan el filtro rojo puede ser una buena aproximación del centro del robot ratón (hay otras mejores).
-
Con el robot ratón detectado en la imagen, el siguiente paso es decidir qué movimiento es el adecuado ordenar a los motores del gato con el método sendCMDVel(). Aquí hay muchas maneras de decidirlo: control basado en casos, control PID, autómatas, etc.. Aquí es donde entra en juego tu habilidad.
Evaluando tu algoritmo
Para determinar la puntuación de tú algoritmo hemos creado un árbrito, este componente calculará la distancia a la que se encuentra tu gato del ratón durante 2 minutos. Mientras que el gato se encuentre cerca del ratón se incrementará la puntuación, si tu gato no está lo suficientemente cerca del gato no puntuará.
Ejecución de los componentes para la evaluación del algoritmo. Copia al directorio del gato el fichero de configuración del árbrito:
cp /usr/local/share/jderobot/conf/refereeViewer.cfg ~/teaching_robotics/src/cat_py/
En un terminal lanza el mundo dronecampeones.world:
cd ~/teaching_robotics/src/cat_py/gazebo
gazebo dronecampeones.world
En otro terminal ejecuta tu gato:
cd ~/teaching_robotics/src/cat_py/
python main.py --Ice.Config=cat.cfg
En otro terminal, prepara (sin ejecutar) el ratón:
cd ~/teaching_robotics/src/trainning_mouse_x64/
En otro terminal, prepara (sin ejecutar) el árbrito:
cd ~/teaching_robotics/src/cat_py/
Despega tu gato con el botón Take off del componente cat_py y a continuación pulsa sobre el botón Play para ejecutar el algoritmo.
De manera simultánea, ejecuta el ratón:
./trainning_mouse --Ice.Config=trainning.cfg
y el árbitro:
refereeViewer --Ice.Config=refereeViewer.cfg
Ratones para el campeonato
Ratón de entrenamiento
Para implementar el algoritmo de seguimiento del campeonato os hemos preparado un ratón de entrenamiento que implementa la mayoría de movimientos que tendrán los ratones de las mangas puntuables. Este ratón tiene una dificultad incremental, empezando con unos movimientos muy simples a la velocidad mínima, continuando con unos movimientos más complejos a una velocidad media y terminando con movimientos aún más complejos a la máxima velocidad.
Podéis descargarlo en el siguiente enlace:
Ejecución del ratón de entrenamiento
Una vez descargado y descomprimido, puedes copiar o mover el ratón de entrenamiento al directorio teaching_robotics:
cp -r trainning_mouse_x64/ ~/teaching_robotics/src/
Lanza el mundo dronecampeones.world:
cd ~/teaching_robotics/src/cat_py/gazebo
gazebo dronecampeones.world
En otro terminal ejecuta el ratón:
cd ~/teaching_robotics/src/trainning_mouse_x64/
./trainning_mouse --Ice.Config=trainning.cfg
Organización, evaluación y premio
Para participar es OBLIGATORIO inscribirse envíando un correo a josemaria.plaza AT urjc.esantes del 15 de marzo (para dimensionar y poder organizarlo bien). Cada participante deber inscribirse individualmente.
Despues hay que programar, retocando el fichero MyAlgorithm.py (el método execute) adecuadamente, y enviarlo a la organización por correo electrónico (josemaria.plaza AT urjc.es) antes del 5 de abril 2016 (23:00 horas UTC) junto con los datos personales. Pasado ese día la organización publicará en la web la lista de todos los participantes. Las finales del campeonato tendrán lugar el 8 de abril de 2016. Ese día se retransmitirá en streaming por YouTube la sesión final (Q3). Si el volumen de participantes lo permite, también las sesiones eliminatorias Q1 y Q2.
La evaluación consiste arrancar a tu robot gato en diferentes configuraciones (2 mangas) con el robot ratón que hemos preparado y en una máquina de la organización. Tu fichero MyAlgorithm.py se incorporará a cat.py para que gobierne el comportamiento del cuadricóptero. La máquina y el comportamiento del ratón es exactamente el mismo para todos los participantes. En cada manga, de 2 minutos, tu robot comienza en una posición relativa diferente respecto del ratón, deberá buscarlo y perseguirlo. El componente árbitro mide cuántos segundos de esas ejecuciones tu gato ha estado suficientemente cerca del ratón y lo muestra en pantalla. Esa es la puntuación. Que tu gato toque al ratón supone la descalificación en esa manga y el participante reune 0 puntos en ella.
El campeonato está organizado en fases eliminatorias, donde tu gato se va enfrentando paulatinamente a ratones más difíciles de seguir. Tras la primera ronda (Q1) pasan a la siguiente los mejores 20 gatos, en la segunda (Q2) los mejores 10 y en la última (Q3) ya se deciden las posiciones definitivas en el campeonato. Gana el campeonato aquel gato que esté cerca del ratón durante más tiempo en el acumulado de las dos mangas de Q3.
El premio para el ganador es un cuadricóptero Ar.Drone2 de Parrot, patrocinado por la ETS Ing.Telecomunicación (ETSIT) de la URJC. El jurado será una comisión de la ETSIT-URJC, que podrá dejar el premio desierto si la solución no es de suficiente calidad. Sus decisiones son inapelables. El campeonato terminará con la entrega de premios, es obligatorio que el ganador esté presente físicamente o por videoconferencia para que recoja el premio.
Reglamento
Borrador del reglamento. Está sujeto a cambios, a medida que lo vamos perfeccionando.
Preguntas frecuentes
¿Quiénes pueden participar?
Cualquiera, es un campeonato abierto. Está dirigido a estudiantes universitarios de ingeniería, principalmente a los de la Universidad Rey Juan Carlos, pero está abierto a cualquier participante.
¿Puedo utilizar otro middleware para acceder al robot aéreo?
Para el campeonato, no. Más allá del campeonato, usa el que quieras :-). Para que la comparativa sea justa todos los participantes utilizarán la misma versión del simulador Gazebo y la misma versión del middleware JdeRobot. De hecho han de entregar su código en un fichero MyAlgorithms.py que se prueba dentro del componente Introrob.py que hemos desarrollado para este campeonato.
Patrocinadores