3 minute read

KOBUKI BASE

Las semanas 2 y 3 consistieron en investigar como usar el robot Turtlebot 2 en ROS 2 Foxy ya sea en el robot real como en el simulado, ya que la idea es que mi tfg consista en usar dicho robot para la aplicación que vaya a desarrollar.

Me encontré con el problema de que en Ros 2 Foxy hay pocos robots disponibles y el Turtlebot 2 no está disponible de modo que tuve que dividir el problema en 3 partes. Como la base del Turtlebot 2 es un Kobuki, me centraría en encontrar los drivers del Kobuki para ROS 2 y posteriormente sólo tendríamos que conectar el láser y la cámara al sistema.

Para obtener los drivers de la base Kobuki seguí estos pasos gracias a su documentación (desde el directorio del WorkSpace):

$ mkdir kobuki && cd kobuki
$ wget https://raw.githubusercontent.com/kobuki-base/kobuki_documentation/release/1.0.x/resources/venv.bash
$ wget https://raw.githubusercontent.com/kobuki-base/kobuki_documentation/release/1.0.x/resources/colcon.meta
$ wget https://raw.githubusercontent.com/kobuki-base/kobuki_documentation/release/1.0.x/resources/kobuki_standalone.repos

Lanzamos el entorno virtual descargado de Python3 y compilamos:

$ source ./venv.bash
$ cd ..
$ mkdir -p src/kobuki
$ vcs import src/kobuki < kobuki/kobuki_standalone.repos
$ pip3 install lark numpy pytest-rerunfailures
$ colcon build --symlink-install
$ deactivate

El siguiente paso era instalar los paquetes adaptados para ROS 2: kobuki_ros y kobuki_ros_interfaces.
Sin embargo, se me presentaba un problema: No había paquetes para simular en Gazebo 11 el robot Kobuki. De modo que hice un fork del repositorio original kobuki_ros e implemente kobuki_gazebo

$ git clone --recursive https://github.com/Carlosalpha1/kobuki_ros.git
$ git clone --recursive https://github.com/kobuki-base/kobuki_ros_interfaces.git

Para lanzar kobuki en Gazebo y controlarlo a mano a través del topic /cmd_vel:

$ ros2 launch kobuki_gazebo minimal.launch.py
$ ros2 run kobuki_keyop kobuki_keyop_node

Aun así la meta propuesta no estaba alcanzada, ya que el bumper no me estaba funcionando en Gazebo o algunos micro fallos en las Transformadas de los links se reflejaban en Rviz2. Esto solo era el principio.

El siguiente paso era probar los drivers y lanzadores en el robot real.
Para ello conecté el portátil a la base kobuki mediante un cable USB de entrada y salida y ejecutaba el siguiente comando una vez que estuviera la entrada USB registrada en /dev/ttyUSB0:

$ ros2 launch kobuki_node kobuki_node-launch.py

GROOT

Otro de los objetivos de la semana era profundizar más sobre Behavior Trees. Una de las subtareas era probar algún editor gráfico para realizar Árboles de Comportamiento de manera sencilla. Uno de los mejores es Groot. Tiene soporte tanto para ROS como para ROS 2.

Se basa en bloques (Sequences, Fallbacks Nodes, Decorators, etc) que te permite usarlos para combinar las acciones que se defina el usuario para el comportamiento de su aplicación.

Para practicar se me ocurrió probar con un sencillo Behavior Tree que simulara un comportamiento similar pero muy simplificado de una aspiradora robótica de gama media-alta. Su arbol diseñado con Groot sería el siguiente:

Una vez desarrollado el árbol, lo guardamos y automáticamente se nos genera un fichero xml como el siguiente:

<?xml version="1.0"?>
<root main_tree_to_execute="BehaviorTree">
    <!-- ////////// -->
    <BehaviorTree ID="BehaviorTree">
        <Sequence>
            <Fallback>
                <Inverter>
                    <Action ID="CheckBattery"/>
                </Inverter>
                <Inverter>
                    <Action ID="CleanAction"/>
                </Inverter>
            </Fallback>
            <Action ID="Recharge"/>
        </Sequence>
    </BehaviorTree>
    <!-- ////////// -->
    <TreeNodesModel>
        <Action ID="CheckBattery"/>
        <Action ID="CleanAction"/>
        <Action ID="Recharge"/>
    </TreeNodesModel>
    <!-- ////////// -->
</root>

Posteriormente desarrollé las acciones en C++. Simplemente nos creamos un fichero .cpp y .hpp por cada Acción, heredamos de la clase BT::ActionNodeBase y redefinimos los métodos virtuales de “tick()” y “halt()”.

El video de ejecución es el siguiente:

La arquitectura está dividida en dos partes:

  • Por un lado tenemos un monitor de batería que actúa de servidor y está disponible para gastar, alimentar y proporcionar el valor de la batería.
  • Por otro tenemos nuestro árbol de comportamiento donde cada nodo hoja posee un cliente para solicitar servicios a la batería (Consumir, Recargar, Obtener Valor)

Behavior Trees en Python

Por último, tuve que investigar sobre Behavior Trees en Python para usarlos en ROS 2. Para ello use la librería async_btree. No encontré librerías para implementar Behavior Trees en Python para ROS2 de modo que esta librería era la mejor que se adaptaba. Personalmente, me pareció una librería más limitada que la que proporciona C++. Sin embargo, pude implementarme una aplicación Bump And Go de prueba usando el paquete Turtlesim de ROS 2.

Este fue el resultado: