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

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

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

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

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

Этот пример использует виртуальную машину (VM). Загрузите ROS 2 Dashing и 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. The /robotDataProcessingNode принимает данные датчика для обработки и публикует сообщения для отслеживания количества обнаруженных признаков. The /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, что и их соответствующие подписчики, но они все еще совместимы. Для примера в датчике камеры, команде скорости и темах лазерного скана the "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

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

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

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