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.
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.
Aunque experimentando sea fácil de ver, la forma de manejar la wiimote es tal y como se ve en la siguiente imagen.
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!