Note: This tutorial assumes that you have completed the previous tutorials: Comprendiendo Tópicos ROS.
(!) Please ask about problems and questions regarding this tutorial on answers.ros.org. Don't forget to include in your question the link to this page, the versions of your OS & ROS, and also add appropriate tags.

Comprendiendo Servicios (Services) y Parametros (Parameters) ROS

Description: Este tutorial es introductoria de Servicios ROS como tambien asi de parámetros (Parameters), utilizando las herramientas de linea de comando rosservice y rosparam.

Tutorial Level: BEGINNER

Next Tutorial: Using rqt_console and roslaunch

Suponiendo que tu turtlesim_node todavía se está ejecutando desde el último tutorial, veamos qué servicios proporciona turtlesim:

Servicios ROS (ROS Services)

Los servicios son otra forma en que los nodos pueden comunicarse entre sí. Los servicios permiten a los nodos enviar una solicitud (request) y recibir una respuesta (response).

Usando rosservice

rosservice puede plegarse fácilmente al marco de cliente / servicio de ROS con servicios (ROS service). rosservice tiene muchos comandos que se pueden usar en los servicios, como se muestra a continuación:

Uso:

rosservice list         print information about active services
rosservice call         call the service with the provided args
rosservice type         print service type
rosservice find         find services by service type
rosservice uri          print service ROSRPC uri

rosservice list

$ rosservice list

El comando list (lista) nos muestra que el nodo turtlesim proporciona nueve servicios: reset, clear, spawn, kill, turtle1/set_pen, /turtle1/teleport_absolute, /turtle1/teleport_relative, turtlesim/get_loggers y turtlesim/set_logger_level. También hay dos servicios por separado y relacionados con el nodo rosout: /rosout/get_loggers y /rosout/set_logger_level.

  • /clear
    /kill
    /reset
    /rosout/get_loggers
    /rosout/set_logger_level
    /spawn
    /teleop_turtle/get_loggers
    /teleop_turtle/set_logger_level
    /turtle1/set_pen
    /turtle1/teleport_absolute
    /turtle1/teleport_relative
    /turtlesim/get_loggers
    /turtlesim/set_logger_level

Veamos más de cerca el servicio clear usando rosservice type:

rosservice type

Uso:

rosservice type [service]

Let's find out what type the clear service is:

$ rosservice type /clear
  • std_srvs/Empty

Este servicio está vacío, esto significa que cuando se realiza la llamada al servicio este no toma argumentos (es decir, no envía datos cuando realiza una solicitud y no recibe datos cuando recibe una respuesta). Llamemos a este servicio usando rosservice call:

rosservice call

Uso:

rosservice call [service] [args]

Aquí llamaremos sin argumentos porque el servicio es de tipo empty (vacío):

$ rosservice call /clear

Esto hace lo que esperamos, borra el fondo del turtlesim_node.

  • turtlesim.png

Ahora mediante la observación de la información del servicio engendrado, veamos el caso en el que el servicio tiene argumentos:

$ rosservice type /spawn | rossrv show
  • float32 x
    float32 y
    float32 theta
    string name
    ---
    string name

Este servicio nos permite engendrar una nueva tortuga en una ubicación y orientación determinadas. El campo de nombre es opcional, así que no le demos un nombre a nuestra nueva tortuga y dejemos que turtlesim cree uno para nosotros.

$ rosservice call /spawn 2 2 0.2 ""

La llamada al servicio regresa con el nombre de la tortuga recién creada.

  • name: turtle2

Ahora nuestro turtlesim debería verse así:

  • turtle(service).png

Usando rosparam

rosparam le permite almacenar y manipular datos en el Parameter Server de ROS. El servidor de parámetros puede almacenar enteros, flotantes, booleanos, diccionarios y listas. rosparam usa el lenguaje de marcado YAML para la sintaxis. En casos simples, YAML parece muy natural: 1 es un número entero,1.0 es un flotante, one es una cadena, true es un booleano, [1, 2, 3] es una lista de enteros y {a: b, c: d} es un diccionario. rosparam tiene muchos comandos que se pueden usar en los parámetros, como se muestra a continuación:

Uso:

rosparam set            set parameter
rosparam get            get parameter
rosparam load           load parameters from file
rosparam dump           dump parameters to file
rosparam delete         delete parameter
rosparam list           list parameter names

Veamos qué parámetros se encuentran actualmente en el servidor de parámetros:

rosparam list

$ rosparam list

Aquí podemos ver que el nodo turtlesim tiene tres parámetros en el servidor de parámetros para el color de fondo:

  • /rosdistro
    /roslaunch/uris/host_nxt__43407
    /rosversion
    /run_id
    /turtlesim/background_b
    /turtlesim/background_g
    /turtlesim/background_r

Cambiemos uno de los valores de los parámetros usando rosparam set:

rosparam set y rosparam get

Uso:

rosparam set [param_name]
rosparam get [param_name]

Aquí cambiará el canal rojo del color de fondo:

$ rosparam set /turtlesim/background_r 150

Esto cambia el valor del parámetro, ahora tenemos que llamar al servicio clear para que el cambio de parámetro surta efecto:

$ rosservice call /clear

Ahora nuestro turtlesim se ve así:

  • turtle(param).png

Ahora veamos los valores de otros parámetros en el servidor de parámetros. Obtengamos el valor del canal de fondo verde:

$ rosparam get /turtlesim/background_g 
  • 86

También podemos usar rosparam get / para mostrarnos el contenido de todo el servidor de parámetros.

$ rosparam get /
  • rosdistro: 'noetic
    
      '
    roslaunch:
      uris:
        host_nxt__43407: http://nxt:43407/
    rosversion: '1.15.5
    
      '
    run_id: 7ef687d8-9ab7-11ea-b692-fcaa1494dbf9
    turtlesim:
      background_b: 255
      background_g: 86
      background_r: 69

Es posible que desee almacenar esto en un archivo para poder volver a cargarlo en otro momento. Esto es fácil usando rosparam:

rosparam dump y rosparam load

Uso:

rosparam dump [file_name] [namespace]
rosparam load [file_name] [namespace]

Aquí escribimos todos los parámetros en el archivo params.yaml

$ rosparam dump params.yaml

Incluso puede cargar estos archivos yaml en nuevos espacios de nombres, p. Ej. copy_turtle:

$ rosparam load params.yaml copy_turtle
$ rosparam get /copy_turtle/turtlesim/background_b
  • 255

Ahora que comprende cómo funcionan los servicios y parámetros de ROS,tratemos de usar rqt_console y roslaunch

Wiki: es/ROS/Tutoriales/ComprendiendoServiciosParametros (last edited 2021-08-27 05:51:41 by JuanEduardoRiva)