Управляйте качеством обслуживаний в приложении ROS 2 с TurtleBot

Этот пример демонстрирует лучшие практики в политиках Качества сервиса (QoS) управления для приложения с помощью ROS 2. Политики QoS позволяют, чтобы гибкое настроилось коммуникационного поведения между издателями и подписчиками, и изменяют способ, которым сообщения транспортируются в сети ROS 2. Для получения дополнительной информации смотрите, Управляют Качеством Обслуживаний в ROS 2.

В этом примере вы используете скрипт MATLAB®, чтобы запустить контроллер дистанционного управления для симулированного TurtleBot®, чтобы следовать за путем в на основе инструкций в среде.

Запустите средство моделирования робота

Запустите средство моделирования ROS 2 для TurtleBot® и сконфигурируйте связь MATLAB со средством моделирования робота.

Этот пример использует виртуальную машину (VM). Загрузите Подчеркивание штриховой линией ROS 2 и Gazebo VM использование инструкций в Начало работы с Gazebo и Симулированным TurtleBot.

  • Запустите виртуальную машину Ubuntu®.

  • Выберите Gazebo ROS2 Maze на рабочем столе Ubuntu, чтобы запустить мир Gazebo, созданный для этого примера.

  • Введите эти команды в командное окно MATLAB, чтобы проверить, что темы от средства моделирования робота отображаются в MATLAB.

setenv('ROS_DOMAIN_ID','25')
ros2('topic','list')
/camera/camera_info
/camera/image_raw
/clock
/cmd_vel
/imu
/joint_states
/odom
/parameter_events
/rosout
/scan
/tf

Настройте коммуникацию ROS 2

Создайте два ROS 2 узла: /robotDataProcessingNode и /humanOperatorNode. /robotDataProcessingNode получает данные о датчике к процессу и публикует сообщения, чтобы отслеживать количество обнаруженных знаков. /humanOperatorNode отправляет скоростные команды, чтобы управлять TurtleBot вокруг среды и получает подтверждение каждый раз, когда знак обнаруживается.

domainID = 25;
robotDataProcessingNode = ros2node("/robotDataProcessingNode",domainID);
humanOperatorNode = ros2node("/humanOperatorNode",domainID);

Эта схема обобщает взаимодействие между MATLAB и средством моделирования робота.

Качество обслуживаний для команд управления

Создайте издателей и подписчиков на релейные сообщения к и от средства моделирования робота по сети ROS 2. Пара издателя и подписчика может иметь совместимые, но различные политики QoS, если любые политики QoS подписчика не являются более строгими, чем те из издателя. Например, необходимо передать скоростные команды в надежном канале от издателя подписчику. Чтобы гарантировать совместимость, задайте "Reliability" и "Durability" Политики QoS издателя как "reliable"и "transientlocal", соответственно. Эта настройка указывает на максимальное качество, что контроллер предусматривает отправку сообщений надежно. Если приемник на роботе не оборудован хорошим оборудованием, чтобы надежно обработать сообщения, можно установить более низкую норму QoS для подписчика. Таким образом задайте "Reliability" и "Durability" Политики QoS подписчика на "besteffort"и "volatile"соответственно, который является минимальным качеством, которое приемник готов принять. Эти настройки QoS демонстрируют лучшую практику для определения "Reliability", и "DurabilityПараметры. Издатели с политиками "besteffort"или "volatile"не соединяйтесь с подписчиками с политиками "reliable", или "transientlocal". Поскольку подписчик просит более высокий стандарт QoS, чем издатель предлагает, предоставление сообщений издателя не гарантируется.

velPub = ros2publisher(humanOperatorNode,"/cmd_vel","geometry_msgs/Twist","Reliability","reliable","Durability","transientlocal","Depth",5);

Качество обслуживаний для высокочастотных данных о датчике

Чтобы получить последнее чтение данных о датчике, опубликованных на высоком показателе, установите "Reliability"Политика QoS подписчика на "besteffort" и, "Durability"политика к "volatile", с маленьким "Depth" значение. Эти настройки включают высокоскоростную коммуникацию путем сокращения служебного времени для отправки и получения подтверждения сообщения и гарантируют, что подписчики обрабатывают новые сообщения. Эти настройки могут привести к подписчикам, не получающим сообщения в сетях или интенсивного трафика с потерями, или не обрабатывающим все сообщения, полученные, если обработка не может поддержать на высоком уровне. Примените эту политику QoS к обоим камера и лоцируйте датчик.

imageSub = ros2subscriber(robotDataProcessingNode,"/camera/image_raw","sensor_msgs/Image","Reliability","besteffort","Durability","volatile","Depth",5);
laserSub = ros2subscriber(robotDataProcessingNode,"/scan","sensor_msgs/LaserScan","Reliability","besteffort","Durability","volatile","Depth",5);

Поскольку одометрия очень важна в размещении сканов лидара в контексте, пропущенного результата сообщений одометрии во вводящих в заблуждение показаниях лидара. Чтобы предотвратить пропущенные сообщения, политиками надежности и длительности для издателя одометрии в узле Gazebo является "reliable" и "transientlocal", соответственно. Когда этот конкретный алгоритм не нужен в прошлых сообщениях, задает политики QoS для подписчика одометрии как "reliable"и "volatile".

odomSub = ros2subscriber(robotDataProcessingNode,"/odom","nav_msgs/Odometry","Reliability","reliable","Durability","volatile","Depth",5);

Качество обслуживаний для состояний робота и операционных режимов

В этом примере применяются информация о текущем этапе обновлений робота в низкой частоте и значение в последнем полученном сообщении, пока подписчик не получает следующее сообщение. Создайте издателя, который отправляет сообщения надежно и хранит их для поздно присоединяющихся подписчиков. Если "Depth" значение издателя является достаточно большим, для подписчиков возможно запросить целую историю издателя, когда они соединяют сеть. Сконфигурируйте издателя /signCounter тема с "Reliability"набор политики к "reliable", "Durability"набор политики к "transientlocal", and "Depth"набор значений к 100.

stagePub = ros2publisher(robotDataProcessingNode,"/signCounter","std_msgs/Int8","Reliability","reliable","Durability","transientlocal","Depth",100);

Эта таблица суммирует политики QoS для пяти пар издателей и подписчиков.

Совместимость в качестве обслуживаний

Для сообщений, чтобы передать успешно от издателя подписчику по теме, их политики QoS должны быть совместимыми. У издателей в таблице не всегда есть те же параметры QoS как их соответствующие подписчики, но они все еще совместимы. Например, в датчике камеры, скоростная команда и лазер сканируют темы, "reliable" издатели и "besteffort" подписчики могут соединиться. Связь ведет себя как "besteffort"связь, без подтверждения, когда подписчик получает сообщение. Точно так же в темах команды одометрии и скорости, "transientlocal"издатели и "volatile"у подписчиков есть совместимые политики QoS. Издатели сохраняют опубликованные сообщения, в то время как подписчики не запрашивают ранее отправленных сообщений.

Управляйте роботом Используя дистанционное управление

Запустите контроллер дистанционного управления, чтобы переместить робота. Обработайте данные о датчике, чтобы помочь роботу визуализировать и перейти в среде. Когда перемещения робота близко к знаку, обнаруживающий знак алгоритм выводит подтверждающее сообщение с инструкцией найти следующий знак. Эти повторения задачи, пока робот не достигает знака Стоп. Для получения информации о выполнении робота в автономном режиме смотрите Знак Следовать за Роботом с ROS 2 в MATLAB.

[laserPlotObj,imageAxesHandle,signText,axesHandle] = ExampleHelperQoSTurtleBotSetupVisualizer(velPub);
% Wait to receive sensor messages before starting the control loop
receive(laserSub,5);
receive(odomSub,5);
receive(imageSub,5);
% Set callback functions for subscribers
imageSub.NewMessageFcn = @(msg)ExampleHelperQoSTurtleBotPlotImage(msg,imageAxesHandle);
laserSub.NewMessageFcn = @(msg)ExampleHelperQoSTurtleBotPlotScan(msg,laserPlotObj,odomSub);
r = rateControl(10);
LastStage = false;
while ~LastStage
    [~,blobSize,blobX] = ExampleHelperQoSTurtleBotProcessImg(imageSub.LatestMessage); % Process image
    [nextStage,LastStage,stageMsg,textHandle] = ExampleHelperQoSTurtleBotSignDetection(LastStage,signText,blobX,blobSize,stagePub,axesHandle); % Sign detection algorithm
    if nextStage && ~LastStage  % When the algorithm detects a sign, publish a message to keep track of it.    
        send(stagePub,stageMsg);
    end
    waitfor(r);    
end

Когда датчики обнаруживают знак Стоп, создают нового подписчика в /humanOperatorNode узел, чтобы запросить прошлые сообщения в истории издателя. Извлеките информацию обо всех обнаруженных знаках.

send(stagePub,stageMsg);
stageSub = ros2subscriber(humanOperatorNode,"/signCounter","std_msgs/Int8","Reliability","reliable","Durability","transientlocal","Depth",100);
stageSub.NewMessageFcn = @(msg)ExampleHelperQoSTurtleBotSignCountUpdate(msg,textHandle);
pause(2); % Allow time for the persisting messages to be received and processed

% Clean up entities in ROS 2 to remove them from the network. 
clear laserSub odomSub velPub imageSub stagePub stageSub robotDataProcessingNode humanOperatorNode

Наблюдайте эффекты качества обслуживаний в сетях с потерями

В низком трафике и сетях без потерь, между reliable существует мало различия и best-effort коммуникация. Чтобы визуализировать, как различные политики QoS обрабатывают сетевые подключения или интенсивного трафика с потерями, используйте утилиту управления движением, чтобы симулировать сеть с задержкой. На VM откройте новый терминал и введите эту команду.

sudo tc qdisc add dev ens33 root netem delay 0.5ms

Утилита управления движением симулирует установленную сумму задержки со всеми пакетами на ens33 сетевой интерфейс. Запустите пример снова, наблюдая заикающийся эффект потока изображений из-за некоторой потери пакетов в "best-effort" коммуникация. Если вы изменяете подписчика изображений на "reliable", поток изображений сглаживает, но отстает от фактической точки зрения робота немного из-за сетевой задержки.

Чтобы вымыться, удалите искусственную сетевую задержку путем ввода этой команды.

sudo tc qdisc delete dev ens33 root netem delay 0.5ms