rossvcserver

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

Описание

Используйте rossvcserver или ros.ServiceServer создать сервисный сервер ROS, который может получить запросы из и отправить ответы на, сервисный клиент ROS. Необходимо создать сервисный сервер прежде, чем создать сервисный клиент rossvcclient.

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

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

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

Примечание

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

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

Создание

Описание

пример

server = rossvcserver(servicename,svctype) создает сервисный серверный объект с заданным ServiceType доступный в сети ROS под именем ServiceName. Объект службы не может ответить на запросы на обслуживание, пока вы не задаете коллбэк указателя на функцию, NewMessageFcn.

server = rossvcserver(servicename,svctype,callback) задает функцию обратного вызова, которая создает ответ, когда сервер получает запрос. callback задает NewMessageFcn свойство.

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

server = ros.ServiceServer(node, name,type) создает сервисный сервер, который присоединяет к узлу ROS, node. Сервер становится доступным через заданное сервисное имя и тип, если указатель функции обратного вызова задан в NewMessageFcn.

server = ros.ServiceServer(node, name,type,callback) задает функцию обратного вызова, которая установлена в NewMessageFcn свойство.

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

Свойства

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

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

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

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

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

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

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

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

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

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

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

function response = serviceCallback(src,reqMsg,defaultRespMsg)

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

server.NewMessageFcn = @serviceCallback;

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

function response = serviceCallback(src,reqMsg,defaultRespMsg,userData)

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

server.NewMessageFcn = {@serviceCallback,userData};

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

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

rosmessageСоздайте сообщения ROS

Примеры

свернуть все

Соединитесь с сетью 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.

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

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

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

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

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

Введенный в R2019b