Rosserial es una libreria de arduino que sirve para crear un nodo de comunicacion serial de ROS con este nodo se puede crear un topico , ya puede ser un publisher , subscriber o incluso un service , esto dependera del uso que se le quiera dar al arduino o tros placas con referencia a ROS.
Especificaciones de la libreria Rosserial para el arduino: ATMEGA328P(6/6 Publishers o subscribers 150/150 bytes). ATMEGA328P(25/25 Publishers o subscribers 280/280 bytes). Otros(25/25 Publishers o subscribers 512/512 bytes).
Ademas rosserial posee para librerias para diferentes hardwares: Rosserial_arduino Rosserial_xbee Rosserial_teensy Rosserial_stm32 Rosserial_windows Rosserial_embededlinux Rosserial_mbed Rosserial_tivac
Para trabajar con rosserial_arduino debemos añadir los paquetes de rosserial mediante la clonacion del git: https://github.com/ros-drivers/rosserial
Una vez copiado compilamos el catkin_ws o el espacio de trabajo de ROS.
Creamos un paquete de ROS para poder crear nuestro topic y subscriber , en este ejemplo lo que quiero hacer es : Usar el arduino como publisher para mandar un string o texto en un topic. Usar el ROS como publisher para mandar tiempo de retardo entre apagado y encendido del led en segundos , y el arduino como subscriber para obtener esos datos del topic.
Primero se debe instalar la libreria rosserial en arduino IDE para ellos sigue las siguientes instrucciones. http://wiki.ros.org/rosserial_arduino/Tutorials/Arduino%20IDE%20Setup Despues de ello creamos un sketch de arduino para compilar , el cual se encuentra en la carpeta ARDUINO_ROS dentro del catkin_Ws.
Una vez subido el sketch al arduino se debe activar el roscore.
Despues lanzar el rosserial_node con el comando "rosrun rosserial_python serial_node.py /dev/ttyACM0".
Ahora si procemos a usar "rostopic list" tendremos lo siguiente:
Si procedemos a ver el topic led_state que declaramos que tendria un publisher de tipo string que mandaria un mensaje "Proceso ok" , para ello introducir el siguiente comando "rostopic echo /led_state":
Despues para mandar publicar un mensaje al topic /led_builtin , en el cual se puede mandar el tiempo del parpadeo del led , para ello podemos usar el siguiente comando "rostopic pub /led_builtin std_msgs/Int32 [TAB] + [TAB]", presionar dos veces TAB no escribirlas.
Sin embargo , se observara que al lanzarlo o cada vez que lo ejecutemos este cambiara de estado ,esto se debe a que solo manda un mensaje publicador una sola vez , entonces si creamos un topic_publisher con ROS , podremos hacer que este parpadee en x tiempo.
Ahora ejecutemos el launch topic_pub.launch para ello se usa el siguiente comando:
Despues de esto el led deberia estar parpadeando a razon de un segundo a no ser que se cambie el valor del retard.data en el publisher.
Consejos para optimizar el codigo en arduino: Usar variables que ocupen el espacio necesario , es decir si necesitas una variable que solo posee dos estados , entonces es recomendable usar un bool en vez de un int , ya que estos ocupan mucha mas memoria. No usar la comunicacion serial de arduino (Serial.print) ya que este tambien ocupa espacio de memoria innecesario. Utilizar constantes en vez de variables es decir usar: #define LED 13 #CONSUME MENOS MEMORIA int led=13 #CONSUME MAS MEMORIA INNECESARIO Reducir y hacer mas simple el codigo , ejemplos: C=C+1; C++; Es recomendable crear funciones para reutilizar codigo.