isServerAvailable

Определите, доступен ли сервер ROS 2 ROS или сервиса

Описание

пример

status = isServerAvailable(client) определяет, называет ли сервисный сервер с тем же сервисом как client доступно и возвращает status соответственно.

Примеры

свернуть все

Соединитесь с сетью 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 скаляр. Если сервер того же имени и типа как client не доступно, status будет false.

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

Введенный в R2021b