АФК поддерживает два основных механизма коммуникации: темы и услуги. Разделы имеют издателей и подписчиков и используются для отправки и получения сообщений (см. раздел Обмен данными с издателями и подписчиками ROS). С другой стороны, службы реализуют более жесткую связь, обеспечивая связь запрос-ответ. Клиент службы отправляет сообщение запроса на сервер службы и ожидает ответа. Сервер использует данные в запросе для создания ответного сообщения и отправляет его обратно клиенту. Каждая служба имеет тип, который определяет структуру сообщений запроса и ответа. Службы также имеют уникальное имя в сети ROS.
Эта сервисная связь имеет следующие характеристики:
Запрос на обслуживание (или вызов на обслуживание) используется для связи «один к одному». Один узел инициирует запрос, и только один узел принимает запрос и отправляет ответ.
Сервисный клиент и сервисный сервер тесно связаны при выполнении сервисного вызова. Сервер должен существовать во время вызова службы, и после отправки запроса клиент блокирует его до получения ответа.
Концепция услуг проиллюстрирована на следующем рисунке:

В этом примере показано, как настроить серверы служб для объявления службы в сети ROS. Кроме того, вы узнаете, как использовать сервисные клиенты для вызова сервера и получения ответа.
Предпосылки: начало работы с ROS, подключение к сети ROS, обмен данными с издателями и подписчиками ROS
Перед изучением концепции услуг запустите мастер ROS в MATLAB ® и пример сети ROS .exampleHelperROSCreateSampleNetwork создаст несколько серверов услуг для моделирования реалистичной сети ROS.
rosinit
Initializing ROS master on http://HYD-GDAVULUR:53363/. Initializing global node /matlab_global_node_86569 with NodeURI http://HYD-GDAVULUR:53367/
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_86569 URI: rosrpc://HYD-GDAVULUR:53368/ 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_86569 with NodeURI http://HYD-GDAVULUR:53367/ Shutting down ROS master on http://HYD-GDAVULUR:53363/.
Для получения информации о представлении сообщений ROS в MATLAB см. раздел Работа с базовыми сообщениями ROS.