Proyecto 2: JUS_FALL

En este tutorial vamos a indagar en los contenidos del repositorio jus_fall ubicado en GitHub.
El robot consigue evitar obstáculos y caídas gracias a la toma de medidas en tiempo real del sensor de distancia y al software desarrollado en Python e integrado en el metasistema operativo ROS

¿QUE 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.

  • Dar más de una funcionalidad al módulo "cerebro". Ya que en este proyecto se evitarán obstáculos y caídas, en el caso que ejecutemos el archivo do_not_crash_nor_fall.launch.

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.

Colocación del sensor

Si has implementado el robot Mascota y has calibrado el sensor de distancia te habrás percatado de que no podemos colocar el sensor en la misma posición para el desarrollo de este robot... Lo siguiente reforzará los conceptos.

sensor distancia

Para que la realización de este proyecto sea factible, hay que colocar el sensor en un posición inicial tal que la magnitud medida sea de 13 cms. Esto se debe a que después de varias pruebas experimentales hemos establecido que es la distancia de referencia, ya que si el sensor capta una magnitud menor a esa medida los servomotores son capaces de girar sin chocar con el obstáculo y si es mayor es capaz de cambiar su dirección sin caerse. Si se colocara en la misma posición que para el Robot Mascota si no hubiera obstáculos mediría una distancia mayor que la de referencia y el robot no pararía de cambiar de dirección, ya que pensaría que hay una caída.

¿Como se crean nuevos paquetes? REPASO

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_fall # El nombre del paquete es indiferente. En nuestro caso, por comodidad, se llamará "jus_fall".

[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_fall # Comando de ROS para acceder directamente a un paquete. Se puede ejecutar desde cualquier directorio.
$ git clone https://github.com/therobotacademy/jus_fall

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

roslaunch jus_fall jus_fall.launch

EXPLICACIÓN DEL PROGRAMA

En este repositorio contamos con los archivos.launch, cada uno de llos corresponde a un programa en Python. Se lanzan en total 6 nodos en cada uno (contando con el roscore):

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.

  • jus_fall.py y do_not_crash_nor_fall.py : Son el cerebro del sistema.

En el jus_fall se establece una distancia mínima, si es mayor a esa distancia interpretamos que hay caída o que no existe superficie en la dirección a la que se mueve el robot por lo que se mandan órdenes a los servomotores para que se varié la dirección de JUS.

En el do_not_crash_nor_fall. Además de que el robot no se caiga deberá también evitar obstáculos. Esto lo realiza a partir de la distancia establecida con anterioridad, cuando la distancia es menor establecemos que hay un obstáculo en su camino por tanto enviamos órdenes a los servomotores para que cambien la dirección de JUS. En caso de que sea mayor tendrá la misma funcionalidad que el robot jus_fall.