ROS turtlesim teleop con una wiimote

En este post vamos a trabajar con la tortuga turtlesim de ROS y la controlaremos con una wiimote. El problema que podemos encontrarnos a la hora de trabajar este ejemplo es el de las versiones de implementación de los distintos elementos. En este caso, el tutorial [link] para crear el nodo de teleoperación de la wiimote  está diseñado para versiones anteriores a ROS Hydro y no emplea catkin. De modo que con este post pretendo mostrar los pasos que he seguido a la hora de implementar la teleoperación del turtlesim. Lo he probado en las versiones de ROS Hydro y Jade, espero haber transcrito todos los pasos de forma correcta.

¡Comencemos!

REQUISITOS INICIALES:

  • ROS Hydro (o más reciente).
  • Un área de trabajo catkin generado.
  • Los paquetes de ROS turtlesim y wiimote.

CREAR NUEVO PAQUETE:

Comenzamos creando un nuevo paquete con catkin y añadiendo en el comando las diferentes dependencias que necesitará (roscpp, turtlesim y wiimote).

catkin_create_pkg turtle_wiimote roscpp turtlesim wiimote

En este nuevo paquete se habrán generado dos ficheros de forma automática: package.xml y CMakeLists.txt. Es un buen hábito modificar estos ficheros para rellenarlos con los datos e información necesaria.


Se edita el package.xml

<version>0.0.1</version>
<maintainer email="developer@larreamikel.com">Mikel Larrea</maintainer>

Se edita el CMakeLists.txt: En el mismo fichero se hacen varias modificaciones.

(línea 130 aprox.) Se añade el ejecutable del fichero que crearemos en el siguiente punto.

## Declare a C++ executable
add_executable(turtle_wiimote_node src/turtle_wiimote_node.cpp)

(línea 137 aprox.)

## Specify libraries to link a library or executable target against
target_link_libraries(turtle_wiimote_node
${catkin_LIBRARIES}
)

 

CREAR FICHERO CPP:


Se genera y edita el fichero src/turtle_wiimote_node.cpp

(NOTA: En el link http://wiki.ros.org/wiimote/Tutorials/WritingTeleopNode, apartado 1.2.1 se encuentra el código pero para versiones anteriores a Hydro, y que no emplea catkin). En este punto veremos las modificaciones que se deben realizar para emplearlo en Hydro.

(línea 2 ) se cambia el

#include <turtlesim/Velocity.h> por #include <geometry_msgs/Twist.h>

(línea 35) debe reflejar los cambios de versiones anteriores a catkin.

vel_pub_ = nh_.advertise<geometry_msgs::Twist>("turtle1/cmd_vel", 1);

Dentro de la función joyCallback, tampoco se emplea Velocity:

void TeleopTurtle::joyCallback(const sensor_msgs::Joy::ConstPtr& joy)
{
geometry_msgs::Twist vel;
vel.angular.z = a_scale_*joy->axes[angular_];
vel.linear.x = l_scale_* 0.3;
vel_pub_.publish(vel);
}

Esta función de callback publica la velocidad angular recogida de la wiimote (al girarla). La velocidad lineal es constante en este ejemplo.

CREAR FICHERO LAUNCH:


Se genera y edita el fichero launch/turtle_wiimote.launch con el siguiente contenido.

<launch>

<node pkg="turtlesim" type="turtlesim_node" name="sim"/>

<!-- wiimote node -->
<node pkg="wiimote" type="wiimote_node.py" name="turtle_wiimote"/>

<!-- Axes -->
<param name="axis_linear" value="1" type="int"/>
<param name="axis_angular" value="1" type="int"/>
<param name="scale_linear" value="5" type="double"/>
<param name="scale_angular" value="0.25" type="double"/>

<node pkg="turtle_wiimote" type="turtle_wiimote_node" name="teleop"/>

</launch>

Este fichero lanzará los nodos de turtlesim, wiimote y el que hemos realizado en este post, turle_wiimote_node.

COMPILAR Y LANZAR:

Compila el nuevo paquete ejecutando catkin_make en el directorio de trabajo de catkin (en mi caso ~/catkin_ws). Al final del proceso deberíamos recibir un mensaje parecido a este donde vemos que la compilación ha finalizado sin errores.

turtle_wiimote1b

Ahora queda lanzar el fichero turtle_wiimote.launch que acabamos de realizar.

roslaunch turtle_wiimote turtle_wiimote.launch

El launch, tal y como hemos comentado arriba, inicia un turtlesim, lanza el script de la wiimote y el ejemplo de teleop que acabamos de realizar. Tras emparejar la wiimote con el PC manteniedo los botones 1 y 2 pulsados durante unos 6 segundos (hasta que las luces dejen de parpadear) podemos mover la wiimote y ver la reacción de la tortuga.

En esta primera imagen vemos el resultado en la ventana del turtlesim.

turtle_wiimote2

Aunque experimentando sea fácil de ver, la forma de manejar la wiimote es tal y como se ve en la siguiente imagen.

wiimote


 

Con este ejemplo hemos realizado la teleoperación empleando un mando de la wiimote. El ejemplo es muy simple y se puede mejorar de mil maneras, por ejemplo, empleando los botones para subir o bajar la velocidad de la tortuga. Este ejemplo lo trabajó en su momento Egoitz Alonso para controlar un summit de robotnik y lo retomo como entrada para este blog con la versión de ROS actualizada.

Espero que este post haya servido de ayuda o por lo menos interesante e instructivo. Seguiré describiendo ejemplos básicos de ROS en los siguientes posts.

¡Saludos y hasta pronto!

 

 

Bienvenido al apasionante mundo de ROS

Sirva este post como introducción a lo que deseo hacer en este blog en lo referente a ROS.

¿QUÉ ES ROS?

ROS [link] es el acrónimo de Robot Operating System. Es una estructura para crear software de robótica de forma modular y reutilizable. Existe una gran variedad de robots en los que actualmente se puede emplear ROS; desde humanoides hasta UAVs pasando por vehículos terrestres y acuáticos.

ROS es una gran plataforma para la investigación ya que permite no reinventar la rueda y en base a módulos existentes construir robots de forma “sencilla”. De este modo se pueden centrar los esfuerzos en la aplicación o desarrollo concreto en el que se desee investigar.

¿POR QUÉ TE GUSTA ROS?

Primero, decir que no soy ni mucho menos un experto en ROS, pero me gusta mucho la filosofía que tiene detrás y las posibilidades de desarrollo que ha generado desde sus inicios. Existen multitud de empresas  y grupos de investigación que han adoptado ROS como marco de desarrollo de sus aplicaciones y soluciones. De modo que se disponen de herramientas del estado del arte en materias como visión, mapeado, generación de trayectorias, etc. Poder trabajar con estos desarrollos ya que disponen de licencias tipo GPL es muy gratificante.

¿QUÉ VAMOS A VER EN ESTA WEB?

Dentro de la categoría de ROS, me he propuesto ir describiendo los distintos problemas y soluciones que he ido encontrando en el manejo de ROS. Para ello iré trabajando los tutoriales hasta adquirir nivel suficiente para realizar desarrollos propios. Mezclando dos categorías de esta web, también espero poder traer ejemplos de uso de ROS con snappy.

Además de los tutoriales y guías propios de la web de ROS, en la actualidad estoy siguiendo el libro que resulta de gran ayuda.

Dispone del código en Github [link] y aunque esté escrito para ROS-Hydro, muchos de los ejemplos sirven para Indigo o Jade.

CONCLUSIÓN:

En resumidas cuentas, vamos a intentar informar, aprender y desarrollar en ROS.

¡Saludos!