waitForServer

Ожидайте ROS или сервисного сервера ROS 2, чтобы запуститься

Описание

пример

waitForServer(client) ожидает, пока сервисный сервер не запущен и доступен, чтобы получить запросы. Нажмите Ctrl+C, чтобы отменить ожидание.

waitForServer(client,Timeout=timeoutperiod) задает период тайм-аута в секундах с помощью пары "имя-значение" Timeout=timeoutperiod. Если сервисный сервер не запускает в период тайм-аута, эта функция отображает ошибку и позволяет MATLAB® продолжите запускать текущую программу. Значение по умолчанию inf препятствует тому, чтобы MATLAB запустил текущую программу, пока сервисный клиент не получает сервисный ответ.

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

Примеры

свернуть все

Соединитесь с сетью 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 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 указатель на объект, соответственно. Этот сервисный клиент позволяет вам отправить запросы к сервисному серверу.

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

свернуть все

Состояние сервисного запуска сервера, возвращенного как logical скаляр. Если сервер не доступен в период тайм-аута, status будет false.

Примечание

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

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

  • 'success' — Сервер доступен.

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

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

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

Введенный в R2021b
Для просмотра документации необходимо авторизоваться на сайте