Esta página es para la versión anterior. La página correspondiente en inglés ha sido eliminada en la versión actual.

Llame y proporcione los servicios de ROS

ROS soporta dos mecanismos principales de comunicación: temas y servicios. Los temas tienen editores y suscriptores y se utilizan para enviar y recibir mensajes (vea, por otro lado, implementar un acoplamiento más estricto al permitir la comunicación de solicitud-respuesta.Intercambiar datos con ROS editores y suscriptoresServicios A envía un mensaje de solicitud a a y espera una respuesta.service clientservice server El servidor utilizará los datos de la solicitud para construir un mensaje de respuesta y lo enviará de vuelta al cliente. Cada servicio tiene un tipo que determina la estructura de los mensajes de solicitud y respuesta. Los servicios también tienen un nombre que es único en la red de ROS.

Esta comunicación de servicio tiene las siguientes características:

  • Una solicitud de servicio (o llamada de servicio) se utiliza para la comunicación uno a uno. Un solo nodo iniciará la solicitud y solo un nodo recibirá la solicitud y enviará una respuesta.

  • Un cliente de servicio y un servidor de servicio están estrechamente acoplados cuando se ejecuta una llamada de servicio. El servidor tiene que existir en el momento de la llamada del servicio y una vez que se envía la petición, el cliente bloqueará hasta que se reciba una respuesta.

El concepto de servicios se ilustra en la siguiente imagen:

Este ejemplo muestra cómo configurar servidores de servicio para anunciar un servicio a la red de ROS. Además, aprenderá a usar clientes de servicio para llamar al servidor y recibir una respuesta.

Requisitos previos:Empiece con ROSConéctese a una red de ROSIntercambiar datos con ROS editores y suscriptores

Crear servidor de servicio

Antes de examinar los conceptos de servicio, inicie el Master de ROS en MATLAB® y la red de muestra de ROS. creará algunos servidores de servicio para simular una red ROS realista.exampleHelperROSCreateSampleNetwork

rosinit
Initializing ROS master on http://bat583208glnxa64:37949/. Initializing global node /matlab_global_node_30652 with NodeURI http://bat583208glnxa64:35805/ 
exampleHelperROSCreateSampleNetwork

Supongamos que desea crear un servidor de servicio simple que se muestre cuando llame al servicio."A service client is calling" Cree el servicio mediante el comando. Especifique el nombre del servicio y el tipo de mensaje de servicio. También defina la función de devolución de llamada como.exampleHelperROSEmptyCallback Las funciones de devolución de llamada para servidores de servicio tienen una firma muy específica. Para obtener más información, consulte la documentación de.

testserver = rossvcserver('/test', 'std_srvs/Empty', @exampleHelperROSEmptyCallback)
testserver =    ServiceServer with properties:        ServiceName: '/test'       ServiceType: 'std_srvs/Empty'     NewRequestFcn: @exampleHelperROSEmptyCallback  

Puede ver su nuevo servicio, cuando enumere todos los servicios en la red de ROS./test

rosservice list
/add /reply /test 

Puede obtener más información sobre el uso de su servicio.rosservice info El nodo global se enumera como nodo donde el servidor de servicio es accesible y usted también ve su tipo de servicio.std_srvs/Empty

rosservice info /test
Node: /matlab_global_node_30652 URI: rosrpc://bat583208glnxa64:41819/ Type: std_srvs/Empty Args: 

Crear cliente de servicio

Utilice clientes de servicio para solicitar información de un servidor de servicio de ROS. Para crear un cliente, utilice con el nombre del servicio como argumento.

Cree un cliente de servicio para el servicio que acabamos de crear./test

testclient = rossvcclient('/test')
testclient =    ServiceClient with properties:      ServiceName: '/test'     ServiceType: 'std_srvs/Empty'  

Cree un mensaje de solicitud vacío para el servicio. Utilice la función y pase el cliente como primer argumento.rosmessage Esto creará una función de solicitud de servicio que tiene el tipo de mensaje especificado por el servicio.

testreq = rosmessage(testclient)
testreq =    ROS EmptyRequest message with properties:      MessageType: 'std_srvs/EmptyRequest'    Use showdetails to show the contents of the message  

Cuando desee obtener una respuesta del servidor, utilice la función, que llama al servidor de servicio y devuelve una respuesta. El servidor de servicio que creó antes devolverá una respuesta vacía. Además, llamará a la función y mostrará la cadena.exampleHelperROSEmptyCallback"A service client is calling" También puede definir un parámetro, que indica cuánto tiempo debe esperar el cliente para una respuesta.Timeout

testresp = call(testclient,testreq,'Timeout',3);

Cree un servicio para agregar dos números

Hasta ahora, el servidor de servicio no ha realizado ningún trabajo significativo, pero puede usar servicios para cálculos y manipulación de datos. Cree un servicio que agregue dos enteros.

Hay un tipo de servicio existente, que podemos usar para esta tarea.roscpp_tutorials/TwoInts Puede inspeccionar la estructura de los mensajes de solicitud y respuesta llamando.rosmsg show La solicitud contiene dos enteros y la respuesta contiene su adición.ABSum

rosmsg show roscpp_tutorials/TwoIntsRequest
int64 A int64 B 
 rosmsg show roscpp_tutorials/TwoIntsResponse
int64 Sum 

Cree el servidor de servicio con este tipo de mensaje y una función de devolución de llamada que calcule la adición. Para su conveniencia, la función ya implementa este cálculo.exampleHelperROSSumCallback Especifique la función como devolución de llamada.

sumserver = rossvcserver('/sum', 'roscpp_tutorials/TwoInts', @exampleHelperROSSumCallback)
sumserver =    ServiceServer with properties:        ServiceName: '/sum'       ServiceType: 'roscpp_tutorials/TwoInts'     NewRequestFcn: @exampleHelperROSSumCallback  

Para llamar al servidor de servicio, debe crear un cliente de servicio. Tenga en cuenta que este cliente se puede crear en cualquier lugar de la red de ROS. A los efectos de este ejemplo, crearemos un cliente para el servicio en MATLAB./sum

sumclient = rossvcclient('/sum')
sumclient =    ServiceClient with properties:      ServiceName: '/sum'     ServiceType: 'roscpp_tutorials/TwoInts'  

Cree el mensaje de solicitud. Puede definir los dos enteros y, que se agregan juntos cuando se utiliza el comando.AB

sumreq = rosmessage(sumclient); sumreq.A = 2; sumreq.B = 1
sumreq =    ROS TwoIntsRequest message with properties:      MessageType: 'roscpp_tutorials/TwoIntsRequest'               A: 2               B: 1    Use showdetails to show the contents of the message  

La expectativa es que la suma de estos dos números será 3. Para llamar al servicio, utilice el siguiente comando. El mensaje de respuesta de servicio contendrá una propiedad, que almacena la adición de y.SumAB

sumresp = call(sumclient,sumreq,'Timeout',3)
sumresp =    ROS TwoIntsResponse message with properties:      MessageType: 'roscpp_tutorials/TwoIntsResponse'             Sum: 3    Use showdetails to show the contents of the message  

Apague la red ROS

Quite los nodos de muestra y los servidores de servicio de la red ROS.

exampleHelperROSShutDownSampleNetwork

Apague el maestro ROS y borre el nodo global.

rosshutdown
Shutting down global node /matlab_global_node_30652 with NodeURI http://bat583208glnxa64:35805/ Shutting down ROS master on http://bat583208glnxa64:37949/. 

Próximos pasos