ros2svcserver

Создайте сервисный сервер ROS 2

Описание

Используйте ros2svcserver создать сервисный сервер ROS 2, который может получить запросы из и отправить ответы на, сервисный клиент ROS 2.

Когда вы создаете сервисный сервер, он указывает себя с сетью ROS 2. Когда вы создаете сервисный клиент, это устанавливает связь с сервером. Связь сохраняется, в то время как и клиент-сервер существует и может достигнуть друг друга. Получить список сервисов или получить информацию о конкретном сервисе, который доступен в текущей сети ROS 2, использование ros2 функция.

Сервис имеет связанный тип сообщения, который содержит пару сообщений: один для запроса и один для ответа. Сервисный сервер получает запрос, создает соответствующий ответ на основе функции обратного вызова и возвращает его в клиент. Поведение сервисного сервера является по сути асинхронным, потому что это становится активным только, когда сервисный клиент соединяется с сетью ROS 2 и издает приказ. Для получения дополнительной информации смотрите Вызов и Предоставьте ROS 2 Услуги.

Создание

Описание

пример

server = ros2svcserver(node,servicename,servicetype,callback) создает сервисный сервер заданного servicetype доступный в сети ROS 2 под именем servicename. Это присоединяет сервер к узлу ROS 2, заданному ros2node объект, node. Это также задает callback функция, которая установлена в NewRequestFcn свойство. Входные параметры servicename и servicetype, установлены в ServiceType и ServiceName свойства, соответственно.

пример

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

Свойства

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

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

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

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

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

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

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

Свойство Callback в виде указателя на функцию или массива ячеек. В первом элементе массива ячеек задайте или указатель на функцию, строковый скаляр или вектор символов, представляющий имя функции. В последующих элементах задайте пользовательские данные.

Сервисная функция обратного вызова требует по крайней мере двух входных параметров с одним выходом. Первый аргумент, reqMsg, объект сообщения запроса, отправленный сервисным клиентом. Второй аргумент является объектом сообщения ответа по умолчанию, defaultRespMsg. Коллбэк возвращает сообщение ответа, response, на основе входа запрос обмениваются сообщениями, и передает его обратно сервисному клиенту. Используйте сообщение ответа по умолчанию в качестве начальной точки для построения сообщения запроса. Функциональный заголовок для коллбэка:

function response = serviceCallback(reqMsg,defaultRespMsg)

Задайте NewRequestFcn свойство как:

server.NewRequestFcn = @serviceCallback;

При установке коллбэка вы передаете дополнительные параметры функции обратного вызова включением и функция обратного вызова и параметры как элементы массива ячеек. Функциональный заголовок для коллбэка:

function response = serviceCallback(reqMsg,defaultRespMsg,userData)

Задайте NewRequestFcn свойство как:

server.NewRequestFcn = {@serviceCallback,userData};

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

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

Пример: "keeplast"

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

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

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

Пример: 42

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

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

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

Примечание

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

Пример: "reliable"

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

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

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

Примечание

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

Пример: "volatile"

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

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

ros2messageСоздайте структуры сообщения 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
Для просмотра документации необходимо авторизоваться на сайте