ROS поддерживает два основных коммуникационных механизма: темы и сервисы. Темы имеют издателей и подписчиков и используются в отправке и получении сообщений (см., обмениваются Данными с Издателями ROS и Подписчиками). Сервисы, с другой стороны, реализуют более трудную связь путем разрешения коммуникации ответа запроса. Сервисный клиент отправляет сообщение запроса в сервисный сервер и ожидает ответа. Сервер будет использовать данные в просьбе создать сообщение ответа и передает его обратно клиенту. Каждый сервис имеет тип, который определяет структуру сообщений запроса и ответа. Сервисы также имеют имя, которое уникально в сети ROS.
Эта сервисная коммуникация имеет следующие характеристики:
Запрос на обслуживание (или сервисный вызов) используется в непосредственной коммуникации. Один узел будет инициировать запрос, и только один узел получит запрос и передаст ответ обратно.
Сервисный клиент и сервисный сервер сильно связываются, когда сервисный вызов выполняется. Сервер должен существовать во время сервисного вызова и если запрос отправлен, клиент блокируется, пока ответ не получен.
Концепция сервисов проиллюстрирована в следующем изображении:
Этот пример показывает вам, как настроить сервисные серверы, чтобы рекламировать сервис к сети ROS. Кроме того, вы изучите, как использовать сервисные клиенты, чтобы вызвать сервер и получить ответ.
Предпосылки: Запуск с ROS, соединитесь с сетью ROS, обменивайтесь данными с издателями ROS и подписчиками
Прежде, чем исследовать сервисные концепции, запустите ведущее устройство ROS в MATLAB® и демонстрационной сети ROS. exampleHelperROSCreateSampleNetwork
создаст некоторые сервисные серверы, чтобы симулировать реалистическую сеть ROS.
rosinit
Initializing ROS master on http://ah-rhosea:53941/. Initializing global node /matlab_global_node_58335 with NodeURI http://ah-rhosea:53945/
exampleHelperROSCreateSampleNetwork
Предположим, что вы хотите сделать простой сервисный сервер, который отображает "Сервисный клиент, вызывает", когда вы вызываете сервис. Создайте сервис с помощью rossvcserver
команда. Задайте сервисное имя и сервисный тип сообщения. Также задайте функцию обратного вызова как exampleHelperROSEmptyCallback
. Функции обратного вызова для сервисных серверов имеют очень определенную подпись. Для получения дополнительной информации см. документацию rossvcserver
.
testserver = rossvcserver('/test', 'std_srvs/Empty', @exampleHelperROSEmptyCallback)
testserver = ServiceServer with properties: ServiceName: '/test' ServiceType: 'std_srvs/Empty' NewRequestFcn: @exampleHelperROSEmptyCallback
Вы видите свой новый сервис, /test
, когда вы перечисляете все сервисы в сети ROS.
rosservice list
/add /reply /test
Можно получить больше информации о сервисном использовании rosservice
info
. Глобальный узел перечислен как узел, где сервисный сервер достижим, и вы также видите его std_srvs/Empty
сервисный тип.
rosservice info /test
Node: /matlab_global_node_58335 URI: rosrpc://ah-rhosea:53946/ Type: std_srvs/Empty Args:
Используйте сервисные клиенты, чтобы запросить информацию у сервисного сервера ROS. Чтобы создать клиент, использовать rossvcclient
с сервисом называют как аргумент.
Создайте сервисный клиент для /test
сервис, который мы только создали.
testclient = rossvcclient('/test')
testclient = ServiceClient with properties: ServiceName: '/test' ServiceType: 'std_srvs/Empty'
Создайте пустое сообщение запроса для сервиса. Используйте rosmessage
функционируйте и передайте клиент в качестве первого аргумента. Это создаст функцию запроса на обслуживание, которая имеет тип сообщения, который задан сервисом.
testreq = rosmessage(testclient)
testreq = ROS EmptyRequest message with properties: MessageType: 'std_srvs/EmptyRequest' Use showdetails to show the contents of the message
Когда это необходимо, чтобы получить ответ от сервера, используйте call
функция, которая вызывает сервисный сервер и возвращает ответ. Сервисный сервер, который вы создали прежде, возвратит пустой ответ. Кроме того, это вызовет exampleHelperROSEmptyCallback
функционируйте и отображается, строка "Сервисный клиент вызывает". Можно также задать Timeout
параметр, который указывает, сколько времени клиент должен ожидать ответа.
testresp = call(testclient,testreq,'Timeout',3);
До сих пор сервисный сервер не сделал никакой значимой работы, но можно использовать сервисы в расчетах и манипулировании данными. Создайте сервис, который добавляет два целых числа.
Существует существующий сервисный тип, roscpp_tutorials/TwoInts
, то, что мы можем использовать в этой задаче. Можно смотреть структуру сообщений запроса и ответа путем вызова rosmsg show
. Запрос содержит два целых числа, A
и B
, и ответ содержит их сложение в Sum
.
rosmsg show roscpp_tutorials/TwoIntsRequest
int64 A int64 B
rosmsg show roscpp_tutorials/TwoIntsResponse
int64 Sum
Создайте сервисный сервер с этим типом сообщения и функцией обратного вызова, которая вычисляет сложение. Для вашего удобства, exampleHelperROSSumCallback
функционируйте уже реализует это вычисление. Задайте функцию как коллбэк.
sumserver = rossvcserver('/sum', 'roscpp_tutorials/TwoInts', @exampleHelperROSSumCallback)
sumserver = ServiceServer with properties: ServiceName: '/sum' ServiceType: 'roscpp_tutorials/TwoInts' NewRequestFcn: @exampleHelperROSSumCallback
Чтобы вызвать сервисный сервер, необходимо создать сервисный клиент. Обратите внимание на то, что этот клиент может быть создан где угодно в сети ROS. В целях этого примера мы создадим клиент для /sum
сервис в MATLAB.
sumclient = rossvcclient('/sum')
sumclient = ServiceClient with properties: ServiceName: '/sum' ServiceType: 'roscpp_tutorials/TwoInts'
Создайте сообщение запроса. Можно задать эти два целых числа, A
и B
, которые добавляются вместе, когда вы используете call
команда.
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
Ожидание состоит в том, что сумма этих двух чисел будет 3. Чтобы вызвать сервис, используйте следующую команду. Сервисное сообщение ответа будет содержать Sum
свойство, которое хранит сложение A
и B
.
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
Удалите демонстрационные узлы и сервисные серверы от сети ROS.
exampleHelperROSShutDownSampleNetwork
Закройте ведущее устройство ROS и удалите глобальный узел.
rosshutdown
Shutting down global node /matlab_global_node_58335 with NodeURI http://ah-rhosea:53945/ Shutting down ROS master on http://ah-rhosea:53941/.
Относитесь, чтобы работать с Основными сообщениями ROS, чтобы исследовать, как сообщения ROS представлены в MATLAB.