PROYECTO 1: El robot mascota

El siguiente tutorial va de la mano del repositorio jus_follower ubicado en GitHub. Este robot se basa en las medidas del sensor de distancia para avanzar o retroceder. Básicamente, es como una mascota siguiendo a su amo.

¿Qué voy a aprender?

Trabajando con este robot, conseguirás entender los siguientes procesos:

  • Calibración de motores. Para que nuestro robot vaya en línea recta, habrá que corregir las diferencias en el comportamiento de cada uno de los servos, ya que, al estar constituidos por piezas mecánicas, incorporan un error variable. Es decir, cada servo es único.
    Además, tendremos que elegir las velocidades adecuadas para cada movimiento (línea recta, rotación, giro, evitación de obstáculos,...). Este, se trata de un problema de la robótica de solución múltiple y abierta, es decir, no hay una única solución válida.

  • Calibración de sensores. Un sensor recibe un estímulo del exterior (luz, temperatura, humedad,...) y genera un voltaje variable según la intensidad de ese estímulo. Si queremos medir en la magnitud deseada (por ejemplo, lux para la luz o cm para la distancia), debemos calibrar el sensor experimentalmente.

  • Lógica de los robots. Cuando observamos todos los nodos de este robot, podemos separar claramente entre sensores, "cerebro" y actuadores. Cada uno de estos módulos se corresponde con una de las partes del proceso de funcionamiento de un robot: captación de un estímulo, procesamiento de la información recibida y respuesta acorde al estímulo.

Preparación

Para poder desplegar este robot, es necesario tener ROS instalado en nuestra Raspberry Pi y haber clonado el repositorio anteriormente indicado en un paquete de ROS.

¿Como se crean nuevos paquetes?

El siguiente proceso es el mismo para todos los robots que ejecutaremos: jus_avoid, jus_fall,...

[1] Nos dirigimos al directorio src y ejecutamos el comando catkin_create_pkg nombre_del_paquete para crear el paquete. Realmente, crear un paquete no es más que crear un directorio en el workspace de ROS que incluya los ficheros CMakeLists (necesario para compilar) y package.xml y un directorio src.

$ cd ~/catkin_ws/src
$ catkin_create_pkg jus_follower # El nombre del paquete es indiferente. En nuestro caso, por comodidad, se llamará "jus_follower".

[2] Una vez creado, compilamos el workspace. Esto lo hacemos desde catkin_ws (la ruta de nuestro workspace), para que compile todos los paquetes que están incluidos en src.

$ cd ~/catkin_ws
$ catkin_make

[3] Ahora, tendremos que ejecutar el siguiente comando para tener acceso al paquete de ROS que hayas creado y tener configurado tu workspace apropiadamente.

$ source ~/catkin_ws/devel/setup.bash

[4] Como ya está nuestro espacio de trabajo configurado, clonamos el repositorio jus_follower (que contiene todos los archivos de código) dentro del paquete que hemos creado:

$ roscd jus_follower # Comando de ROS para acceder directamente a un paquete. Se puede ejecutar desde cualquier directorio.
$ git clone https://github.com/therobotacademy/jus_follower

Cuando tengamos compilado el espacio de trabajo, lo tendremos todo listo para lanzar el robot con el siguiente comando:

roslaunch jus_follower follow_me.launch

Explicación del programa

Como estamos trabajando en ROS, el fichero .launch inicializará una serie de nodos, cada uno de ellos correspondiente a un programa en Python. En total, se lanzan 5 nodos (6 si contamos el roscore):

  • servoL.py y servoR,py: son los programas que se encargan de mandarle a los servos las órdenes del "cerebro" del sistema.

  • sharp_publisher.py y sharp_subscriber.py: sharp_publisher.py se encarga de mandar a través de un topic la lectura del sensor de distancia, mientras que sharp_subscriber.py se ocupa de recibir esa medida y mostrarla por pantalla.

  • follow_me.py: es el cerebro del sistema y su función es considerar si se tiene un objeto cerca o no. En tal caso, mandaría las órdenes correspondientes a los servomotores.

El grafo del sistema es el siguiente:
jus_follower

Variantes

Aparte del programa principal, que es el más básico, tenemos otras variaciones, como start_stop.launch. En este caso, el robot JUS estará girando hacia la izquierda en todo momento a no ser que le coloquemos un objeto delante (la mano, por ejemplo), en cuyo caso girará hacia el lado contrario.

Otras muchas variantes son posibles y, como siempre, desde The Robot Academy os animamos a desarrollar las vuestras propias y a compartirlas con la comunidad.