Plataformas Software en Robótica
Boletín 3: Servicios con ROS en C++
•Ej1: Cread un mensaje personalizado (fibo.srv) para un servicio con los campos:
◦tope (int32, request)
◦lista (string, response)
•Ej2: Cread un servicio “fibonacci” que reciba un mensaje personalizado fibo.srv y
calcule la secuencia de números fibonacci hasta el elemento “tope”. Los numeros
generados se guardarán en un string y se devolverán al cliente del servicio.
◦No hace falta usar recursividad para el cálculo de los números fibonacci. Lo
podéis hacer con un bucle for.
◦Los números fibonacci crecen muy rápido. Usad un double para almacenarlos.
◦Es un servicio de juguete, no pongáis un tope muy alto (aprox. tope<100)
◦Para guardar los números en un string usad la librería stringstream que facilita
las cosas. Funciona parecido a cout pero almacena el contenido en un buffer
que luego podemos convertir a cadena
#include<sstream>
using namespace std;
…
stringstream ss;
ss<<numero<<”,”<<numero2;
..
ss.str()
•Ej3: Cread un cliente para llamar al servicio fibonacci empleando el mensaje
personalizado fibo.srv. El cliente deberá de esperar a que el servicio esté activo y
solicitará por pantalla el tope para crear la lista de números. Una vez finalice
correctamente el servicio, se imprimirá por pantalla la lista de números fibonacci
devuelta en el mensaje.
•Ej4: Lanzad el simulador stage con el turtlebot para crear un servicio que permita
mover al robot realizando movimientos en cuadrado. Para lanzar el servicio
necesitamos llamarlo con un mensaje que contenga el área del cuadrado y el
número de cuadrados que va a dibujar. El área del cuadrado sera un concepto que
realmente definirá lo “grande” que es cada lado y para eso usaremos el valor que le
pasamos en “request.area” como si fuesen segundos en los que el robot se va a
mover a una velocidad de 0.3 para dibujar cada lado. Ej. si le pasamos área=2 el
robot avanzará 2 segundos a una velocidad 0.3 para dibujar cada lado (movemos,
esperamos 1 sg, volvemos a mover, volvemos a esperar). Al terminar de dibujar un
lado tendrá que girar para hacer el siguiente lado. El robot parará el movimiento si
detecta un obstáculo enfrente a menos de 1 metro (requiere varios hilos de
escucha). El servicio deberá de devolver un valor booleano (response.status= true)
si ejecutó el movimiento previsto o false si no pudo realizarlo por estar muy cerca
de un obstáculo.
◦Para que gire 90º habría que estar mandando mensajes en un bucle y vigilando
la odometría. Para hacerlo más sencillo podéis usar este bucle que “encaja” el
giro:
msg.angular.z=1.6;
for (int i =0;i<2; i++){
pub.publish(msg);
loop_rate.sleep(); //loop_rate de 1hz
}