## page was copied from ROS/Tutorials/UnderstandingServicesParams
####################################
##FILL ME IN
####################################
## links to any required tutorials
## note.0= [[es/ROS/Tutoriales/ComprendiendoTopicosROS|Comprendiendo Tópicos ROS]]
## descriptive title for the tutorial
## title = Comprendiendo Servicios (Services) y Parametros (Parameters) ROS
## multi-line description to be displayed in search 
## 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]].
## the next tutorial description 
## next =
## links to next tutorial
## next.0.link=  [[ROS/Tutorials/UsingRqtconsoleRoslaunch|Using rqt_console and roslaunch]]
## next.1.link=
## what level user is this tutorial for
## level= BeginnerCategory
####################################

<<IncludeCSTemplate(TutorialCSHeaderTemplate)>>

<<TOC(4)>>

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`.

 {{attachment: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í:

 {{attachment: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í:

 {{attachment: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,[[ROS/Tutorials/UsingRqtconsoleRoslaunch|tratemos de usar rqt_console y roslaunch]]


## AUTOGENERATED DO NOT DELETE 
## TutorialCategory
## ROSTutorialCategory
## TutorialTurtlesim