В этом примере демонстрируются передовые практики управления политиками качества обслуживания (QoS) для приложения с использованием ROS 2. Политики QoS позволяют гибко настраивать поведение связи между издателями и подписчиками и изменять способ передачи сообщений в сети ROS 2. Дополнительные сведения см. в разделе Управление политиками качества обслуживания в ROS 2.
В этом примере сценарий MATLAB ® используется для запуска контроллера телеоперации для имитируемого TurtleBot ®, чтобы следовать по пути в на основе инструкций в среде.
Запустите имитатор ROS 2 для устройства TurtleBot ® и настройте соединение MATLAB с роботом-имитатором.
В этом примере используется виртуальная машина. Загрузите виртуальную машину ROS 2 Dashing и Gazebo, используя инструкции в разделе Начало работы с беседкой и моделируемым TurtleBot.
Запустите виртуальную машину Ubuntu ®.
Выберите Gazebo ROS2 Maze на рабочем столе Ubuntu, чтобы запустить мир Gazebo, построенный для этого примера.
Введите эти команды в окне MATLAB Command Window, чтобы убедиться в том, что разделы имитатора робота видны в 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: /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);
Поскольку одометрия критична при размещении сканирования лидара в контексте, отброшенные сообщения одометрии приводят к вводящим в заблуждение показаниям лидара. Чтобы предотвратить отбрасывание сообщений, политики надежности и долговечности для издателя одометрии в узле "Беседка": "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"соединение без подтверждения, когда абонент получает сообщение. Аналогично, в разделах команд odometry и velocity "transientlocal«издателей и»volatile"подписчики имеют совместимые политики QoS. Издатели сохраняют опубликованные сообщения, в то время как подписчики не запрашивают ранее отправленные сообщения.
Запустите контроллер телеоперации для перемещения робота. Обработка данных датчика помогает роботу визуализировать и перемещаться в среде. Когда робот перемещается близко к знаку, алгоритм обнаружения знака выдает сообщение подтверждения с инструкцией найти следующий знак. Эта задача повторяется до тех пор, пока робот не достигнет знака остановки. Для получения информации о запуске робота в автономном режиме см. раздел Sign Following Robot with 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 обрабатывают сетевые соединения с потерями или с высоким трафиком, используйте утилиту управления трафиком для моделирования сети с задержкой. На виртуальной машине откройте новый терминал и введите эту команду.
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
