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!