call

Вызовите ROS или сервисный сервер ROS 2 и получите ответ

Описание

пример

response = call(serviceclient) отправляет сообщение запроса на обслуживание по умолчанию и ожидает сервиса response. Сообщение запроса на обслуживание по умолчанию является пустым сообщением типа serviceclient.ServiceType.

пример

response = call(serviceclient,requestmsg) задает сообщение запроса на обслуживание, requestmsg, быть отправленным службе.

пример

[response,status,statustext] = call(___) возвращает status указание, ли response был получен успешно, и statustext это получает дополнительную информацию о status, использование любого из аргументов от предыдущих синтаксисов. Если вызов перестал работать, status будет false с пустым response по умолчанию обменивайтесь сообщениями, и эта функция не отобразит ошибку.

пример

response = call(___,Name,Value) предоставляет дополнительные возможности, заданные одним или несколькими Name,Value парные аргументы, с помощью любого из аргументов от предыдущих синтаксисов.

Примеры

свернуть все

Соединитесь с сетью ROS.

rosinit
Launching ROS Core...
Done in 0.70501 seconds.
Initializing ROS master on http://192.168.0.10:53173.
Initializing global node /matlab_global_node_44612 with NodeURI http://bat6312glnxa64:44533/

Настройте сервисный сервер. Используйте структуры для формата данных сообщения ROS.

server = rossvcserver('/test', 'std_srvs/Empty', @exampleHelperROSEmptyCallback,...
                      'DataFormat','struct');
client = rossvcclient('/test','DataFormat','struct');

Проверяйте, доступен ли сервисный сервер. Если это, ожидайте сервисного клиента, чтобы связать с сервером.

if(isServerAvailable(client))
    [connectionStatus,connectionStatustext] = waitForServer(client)
end
connectionStatus = logical
   1

connectionStatustext = 
'success'

Вызовите сервисный сервер с сообщением по умолчанию.

response = call(client)
response = struct with fields:
    MessageType: 'std_srvs/EmptyResponse'

Если call функция выше сбоев, это приводит к ошибке. Вместо ошибки, если вы предпочли бы реагировать на отказ вызова с помощью условных выражений, возвращают status и statustext выходные параметры от функции вызова. status выведите указывает если вызов, за которым следуют, в то время как statustext предоставляет дополнительную информацию.

numCallFailures = 0;
[response,status,statustext] = call(client,"Timeout",3);
if ~status
    numCallFailures = numCallFailues + 1;
    fprintf("Call failure number %d. Error cause: %s\n",numCallFailures,statustext)
else
    disp(response)
end
    MessageType: 'std_srvs/EmptyResponse'

Закройте сеть ROS.

rosshutdown
Shutting down global node /matlab_global_node_44612 with NodeURI http://bat6312glnxa64:44533/
Shutting down ROS master on http://192.168.0.10:53173.

Соединитесь с сетью ROS.

rosinit
Launching ROS Core...
Done in 0.65163 seconds.
Initializing ROS master on http://192.168.0.10:49767.
Initializing global node /matlab_global_node_59302 with NodeURI http://bat6312glnxa64:42155/

Настройте сервисный сервер и клиент. Этот сервер вычисляет сумму двух целых чисел и основан на сервисном примере ROS.

sumserver = rossvcserver('/sum','roscpp_tutorials/TwoInts',@exampleHelperROSSumCallback);
sumclient = rossvcclient('/sum');

Получите сообщение запроса для клиента и измените параметры.

reqMsg = rosmessage(sumclient);
reqMsg.A = 2;
reqMsg.B = 1;

Вызовите сервис и получите ответ. Ответ должен быть суммой этих двух целых чисел, данных в сообщении запроса. Ожидайте 5 секунд сервиса испытать таймаут.

response = call(sumclient,reqMsg,'Timeout',5)
response = 
  ROS TwoIntsResponse message with properties:

    MessageType: 'roscpp_tutorials/TwoIntsResponse'
            Sum: 3

  Use showdetails to show the contents of the message

Закройте сеть ROS.

rosshutdown
Shutting down global node /matlab_global_node_59302 with NodeURI http://bat6312glnxa64:42155/
Shutting down ROS master on http://192.168.0.10:49767.

Создайте демонстрационную сеть ROS 2 с двумя узлами.

node_1 = ros2node("node_1");
node_2 = ros2node("node_2");

Настройте сервисный сервер и присоедините его к узлу ROS 2. Задайте функцию обратного вызова flipstring, который инвертирует входную строку. Функция обратного вызова задана в конце этого примера.

server = ros2svcserver(node_1,'/test','test_msgs/BasicTypes',@flipString);

Настройте сервисный клиент того же сервисного типа и присоедините его к различному узлу.

client = ros2svcclient(node_2,'/test','test_msgs/BasicTypes');

Ожидайте сервисного клиента, чтобы связать с сервером.

[connectionStatus,connectionStatustext] = waitForServer(client)
connectionStatus = logical
   1

connectionStatustext = 
'success'

Создайте сообщение запроса на основе клиента. Присвойте строку соответствующему полю в сообщении, string_value.

request = ros2message(client);
request.string_value = 'hello world';

Проверяйте, доступен ли сервисный сервер. Если это, отправьте запрос на обслуживание и ожидайте ответа. Укажите, что сервис ожидает 3 секунды ответа.

if(isServerAvailable(client))
    response = call(client,request,'Timeout',3);
end

Ответ является инвертированной строкой из сообщения запроса, которое вы видите в string_value поле .

response.string_value
ans = 
'dlrow olleh'

Если call функция выше сбоев, это приводит к ошибке. Вместо ошибки, если вы предпочли бы реагировать на отказ вызова с помощью условных выражений, возвращают status и statustext выходные параметры от функции вызова. status выведите указывает если вызов, за которым следуют, в то время как statustext предоставляет дополнительную информацию.

numCallFailures = 0;
[response,status,statustext] = call(client,request,"Timeout",3);
if ~status
    numCallFailures = numCallFailues + 1;
    fprintf("Call failure number %d. Error cause: %s\n",numCallFailures,statustext)
else
    disp(response.string_value)
end
dlrow olleh

Функция обратного вызова, используемая, чтобы инвертировать строку, задана ниже.

function resp = flipString(req,resp)
% FLIPSTRING Reverses the order of a string in REQ and returns it in RESP.
resp.string_value = fliplr(req.string_value);
end

Входные параметры

свернуть все

ROS или сервисный клиент ROS 2 в виде ros.ServiceClient или ros2serviceclient указатель на объект, соответственно.

Запросите сообщение в виде Message указатель на объект или структура. Типом сообщения по умолчанию является serviceclient.ServiceType.

Примечание

В будущем релизе ROS Toolbox будет использовать структуры сообщения вместо объектов для сообщений ROS.

Чтобы использовать структуры сообщения теперь, установите "DataFormat" аргумент значения имени к "struct". Для получения дополнительной информации смотрите, что ROS передает Структуры.

Аргументы name-value

Задайте дополнительные разделенные запятой пары Name,Value аргументы. Name имя аргумента и Value соответствующее значение. Name должен появиться в кавычках. Вы можете задать несколько аргументов в виде пар имен и значений в любом порядке, например: Name1, Value1, ..., NameN, ValueN.

Пример: "TimeOut",5

Тайм-аут для сервисного ответа в секундах в виде разделенной запятой пары, состоящей из "Timeout" и скаляр. Если сервисный клиент не получает сервисный ответ, и период тайм-аута протекает, call отображает сообщение об ошибке и позволяет MATLAB® продолжите запускать текущую программу. Значение по умолчанию inf препятствует тому, чтобы MATLAB запустил текущую программу, пока сервисный клиент не получает сервисный ответ.

Формат сообщения для сервисных клиентов ROS в виде "object" или "struct". Установите это свойство на создании сервисного клиента, использующего вход значения имени. Для получения дополнительной информации смотрите, что ROS передает Структуры. Этот аргумент применяется к сервисным клиентам ROS только.

Выходные аргументы

свернуть все

Сообщение ответа отправляется сервисным сервером, возвращенным как Message указатель на объект или структура.

Состояние сервисного звонка, отвеченного как logical скаляр. Если вызов перестанет работать, состоянием будет false.

Примечание

Используйте status выходной аргумент, когда вы используете вызов в функции точки входа для генерации кода. Это избежит, чтобы ошибки периода выполнения вывели состояние вместо этого, которое может реагироваться на в коде вызова.

Текст состояния, сопоставленный с сервисом, вызывает состояние, возвращенное как одно из следующего:

  • 'success' — Сервисный ответ был успешно получен.

  • 'input' — Вход к функции недопустим.

  • 'timeout' — Сервисный ответ не был получен в заданном тайм-ауте.

  • 'unknown' — Сервисный ответ не был получен из-за неизвестных ошибок.

Советы

  • Сервисные серверы ROS 2 не могут передать ошибки в выполнении обратного вызова непосредственно клиентам. В таких ситуациях серверы только возвращают ответ по умолчанию без любой индикации относительно отказа. Следовательно, рекомендуется использовать блоки try-catch в функции обратного вызова и установить определенные поля в сообщении ответа передавать успех/отказ выполнения обратного вызова на серверной стороне.

Вопросы совместимости

развернуть все

Изменение поведения в будущем релизе

Расширенные возможности

Введенный в R2019b