rossvcclient

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

Описание

Используйте rossvcclient или ros.ServiceClient создать сервисный объект клиента ROS. Этот сервисный клиент использует персистентную связь, чтобы отправить запросы к и получить ответы из, сервисный сервер ROS. Связь сохраняется, пока сервисный клиент не удален, или сервисный сервер становится недоступным.

Используйте ros.ServiceClient синтаксис при соединении с определенным узлом ROS.

Примечание

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

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

Создание

Описание

пример

client = rossvcclient(servicename) создает сервисный клиент с данным ServiceName это соединяется с и получает его ServiceType от, сервисный сервер. Этот синтаксис команд предотвращает текущий MATLAB® программа от выполнения, пока это не может связать с сервисным сервером.

client = rossvcclient(servicename,Name,Value) предоставляет дополнительные возможности, заданные одним или несколькими Name,Value парные аргументы.

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

[___] = rossvcclient(___,"DataFormat","struct") использование передает структуры вместо объектов. Для получения дополнительной информации смотрите, что ROS передает Структуры.

пример

client = ros.ServiceClient(node, name) создает сервисный клиент, который связывает с сервисным сервером. Клиент получает его сервисный тип от сервера. Сервисный клиент присоединяет к ros.Node указатель на объект, node.

client = ros.ServiceClient(node, name,"Timeout",timeout) задает период тайм-аута в секундах для клиента, чтобы соединить сервисный сервер.

[___] = ros.ServiceClient(___,"DataFormat","struct") использование передает структуры вместо объектов. Для получения дополнительной информации смотрите, что ROS передает Структуры.

Свойства

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

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

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

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

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

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

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

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

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

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

Примеры

свернуть все

Соединитесь с сетью 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 путем создания ServiceServer объект и использование ServiceClient объекты запросить информацию по сети. Функция обратного вызова, используемая сервером, берет строку, инвертирует его и возвращает обратную строку.

Запустите ведущее устройство ROS и узел.

master = ros.Core;
Launching ROS Core...
Done in 0.67778 seconds.
node = ros.Node('/test');

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

server = ros.ServiceServer(node,'/data/string',...
                            'roseus/StringString','DataFormat','struct');

Создание функции обратного вызова. Эта функция берет входную строку в качестве Str свойство req и возвращает его как Str свойство resp. Функциональное определение показывают здесь, но задают ниже примера. req сообщение ROS, вы создаете использование rosmessage.

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

Присвойте функцию обратного вызова для входящих сервисных вызовов.

server.NewRequestFcn = @flipString;

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

Создайте сообщение запроса на основе клиента.

client = ros.ServiceClient(node,'/data/string','DataFormat','struct');
request = rosmessage(client);
request.Str = 'hello world';

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

response = call(client,request,'Timeout',3)
response = struct with fields:
    MessageType: 'roseus/StringStringResponse'
            Str: 'dlrow olleh'

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

Очистите сервисный клиент, сервисный сервер и узел ROS. Закройте ведущее устройство ROS.

clear('client', 'server', 'node')
clear('master')
function [resp] = flipString(~,req,resp)
% FLIPSTRING Reverses the order of a string in REQ and returns it in RESP.
resp.Str = fliplr(req.Str);
end

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

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

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

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

Не рекомендуемый запуск в R2021b

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

Введенный в R2019b