ros2svcclient

Свяжите с сервисным сервером ROS 2

Описание

Используйте ros2svcclient создать сервисный объект клиента ROS 2. Этот сервисный клиент использует связь, чтобы отправить запросы к и получить ответы из, сервисный сервер ROS 2. Для получения дополнительной информации смотрите Вызов и Предоставьте ROS 2 Услуги.

Создание

Описание

пример

client = ros2svcclient(node,servicename,servicetype) создает сервисный клиент заданного servicetype независимо от ли сервисный сервер, предлагающий servicename доступно. Это присоединяет клиент к узлу ROS 2, заданному ros2node объект, node.

пример

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

[client,reqmsg] = ros2svcclient(___) возвращает новое сообщение запроса на обслуживание в reqmsg, использование любого из аргументов от предыдущих синтаксисов. Тип сообщения reqmsg определяется входным сервисным типом. Сообщение инициализируется значениями по умолчанию. Можно также создать использование сообщения запроса ros2message.

Свойства

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

Это свойство доступно только для чтения.

Имя сервиса в виде строкового скаляра или вектора символов.

Пример: "/gazebo/get_model_state"

Это свойство доступно только для чтения.

Тип сервиса в виде строкового скаляра или вектора символов.

Пример: "gazebo_msgs/GetModelState"

Это свойство доступно только для чтения.

Режим хранения запросов в очереди в виде строки или вектора символов. Если заливки очереди с запросами, ожидающими, чтобы быть обработанным, то старые запросы будут пропущены, чтобы создать место для нового. Когда установлено в "keeplast", очередь хранит количество запросов, установленных Depth свойство. В противном случае, когда установлено в "keepall", очередь хранит все запросы до MATLAB® пределы ресурса.

Пример: "keeplast"

Типы данных: char | string

Это свойство доступно только для чтения.

Размер очереди запроса в количестве запросов сохранен в очереди в виде non-negative scalar integer. Это только применяется когда History установлен в "keeplast" или Durability установлен в "transientlocal".

Пример: 42

Типы данных: double

Это свойство доступно только для чтения.

Требование к гарантии доставки запроса в виде строки или вектора символов. Если "reliable", затем доставка гарантируется, но может повторить вызов многократно. Если "besteffort", затем делайте попытку доставки и не повторяйте. "reliable" установка рекомендуется для сервисов.

Примечание

Reliability и Durability качество сервисных настроек должно быть совместимым между сервисными серверами и клиентами для связи, которая будет сделана.

Пример: "reliable"

Типы данных: char | string

Это свойство доступно только для чтения.

Требование к персистентности запросов в виде строки или вектора символов. Если "volatile", затем запросы не сохраняются. Если "transientlocal", затем все недавно отправленные запросы сохраняются до номера, заданного Depth. "volatile" установка рекомендуется для сервисов.

Примечание

Reliability и Durability качество сервисных настроек должно быть совместимым между сервисными серверами и клиентами для связи, которая будет сделана.

Пример: "volatile"

Типы данных: char | string

Функции объекта

ros2messageСоздайте структуры сообщения ROS 2
callВызовите ROS или сервисный сервер ROS 2 и получите ответ
isServerAvailableОпределите, доступен ли сервер ROS 2 ROS или сервиса
waitForServerОжидайте ROS или сервисного сервера ROS 2, чтобы запуститься

Примеры

свернуть все

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

Введенный в R2021b