Вызовите и предоставьте услуги ROS

ROS поддерживает два основных коммуникационных механизма: темы и сервисы. Темы имеют издателей и подписчиков и используются в отправке и получении сообщений (см., обмениваются Данными с Издателями 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

Удалите демонстрационные узлы и сервисные серверы от сети 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/.

Следующие шаги