Знакомство с ROS2. Часть 2. Ключевые концепции: нода, топик, издатель, подписчик, сервисы и действия

@

В ROS2 есть несколько ключевых концепций, которые лежат в основе его архитектуры. Рассмотрим три основных компонента: ноды, издатели и подписчики.

Основные компоненты ROS2

1. Нода (Node)

Нода — это процесс, выполняющий вычисления в системе ROS2. Ноды предназначены для модульности: система робота обычно содержит множество нод, каждая из которых отвечает за отдельную функцию.

Пример:

  • Нода управления двигателями
  • Нода обработки данных с камеры
  • Нода планирования маршрута

Обнаружение нод

Благодаря функции обнаружения нод, ноды могут запускаться на удаленных компьютерах, что позволяет им обмениваться данными между собой с использованием моделей коммуникации ROS 2 надежно и прозрачно для пользователя.

Обнаружение нод обеспечивает 4 преимущества:

  • динамическую конфигурацию сети без ручного вмешательства
  • децентрализованное общение между узлами
  • масштабируемость для систем с тысячами узлов
  • кросс-платформенную совместимость независимо от оборудования или операционной системы

Представьте сценарий, где мобильный манипулятор должен передавать объекты стационарному промышленному роботу. Раньше настройка такого взаимодействия требовала сложной конфигурации, теперь достаточно подключить оба устройства к одной сети с одинаковым domain ID, и роботы автоматически обнаружат друг друга для выполнения совместных задач.

Эта функциональность особенно ценна для телеоперации роботов в опасных зонах — камера на роботе может транслировать видеопоток на наземную станцию управления, а оператор отправлять команды обратно на робота. Такая гибкость позволяет распределять вычислительную нагрузку: например, обработку тяжелых данных (изображений) можно перенести на отдельный компьютер, сохраняя основные ресурсы для управления приводами.

2. Топик (Topic)

Топик — это именованный канал, через который ноды обмениваются сообщениями. Топики реализуют модель публикации/подписки, которая отделяет производство информации от ее потребления.

Пример:

  • /camera/image — топик для передачи изображений с камеры
  • /robot/velocity — топик для команд управления скоростью
  • /sensor/temperature — топик для данных о температуре

Примечание: Если в сети ROS 2 не обнаружено подписчиков для данного топика, данные не передаются.

3. Издатель (Publisher)

Издатель — это нода или часть ноды, которая публикует (отправляет) сообщения в определенный топик.

Пример:

  • Нода камеры публикует изображения в топик /camera/image
  • Нода датчика температуры публикует данные в топик /sensor/temperature

4. Подписчик (Subscriber)

Подписчик — это нода или часть ноды, которая подписывается на топик, чтобы получать сообщения.

Пример:

  • Нода обработки изображений подписывается на топик /camera/image
  • Нода датчика температуры подписывается на топик /sensor/temperature

5. Сервисы (Services)

Сервисы в ROS 2 представляют собой синхронную модель коммуникации, основанную на парадигме запрос-ответ. Эта модель идеально подходит для операций, требующих конкретного ответа. В отличие от модели публикации-подписки, запрос сервиса достигает конкретную ноду, а ответ возвращается именно запрашивающей ноде.

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


6. Действия (Actions)

Для выполнения длительных задач в ROS 2 предусмотрена модель Действий. Сообщение, используемое клиентом для запроса выполнения удаленной функции, представляет собой файл действия, состоящий из трех полей: цели, обратной связи и результата. Клиент заполняет цель для запроса выполнения действия, а сервер после получения цели начинает выполнение, предоставляя обратную связь для информирования клиента о статусе задачи и, в конечном итоге, отправляя результат. Преимущество этой модели в том, что она не блокирует цикл кода клиента в ожидании ответа сервера.

Если во время выполнения задачи сервером возникают непредвиденные ситуации, работа сервера может быть прервана запросом новой цели для того же действия или напрямую отменена. Реализация модели действий сложнее, чем публикации-подписки и сервисов, поскольку необходимо реализовать механизм обработки процедур прерывания и отмены. Это важно в контексте парадигмы восприятие-планирование-действие (почувствовал-подумал-сделал), где робот должен постоянно проверять все входные данные и быстро реагировать на любые неожиданные ситуации, будь то препятствие на пути или новая команда от пользователя.

Colcon

Colcon (COLlective CONstruction) — это система сборки, специально разработанная для ROS2. Она пришла на смену catkin, которая использовалась в ROS1.

Colcon позволяет:

  • Собирать пакеты ROS2 из исходного кода
  • Управлять зависимостями между пакетами
  • Обрабатывать пакеты разных типов (CMake, Python и др.)
  • Выполнять сборку пакетов параллельно для ускорения процесса
  • Поддерживать инкрементальную сборку (пересборку только изменившихся пакетов)

Установка colcon

Для установки colcon в ROS2 вам потребуется выполнить следующие шаги:

Bash
sudo apt install python3-colcon-common-extensions

Базовое использование colcon

После установки мы можем использовать colcon для сборки пакетов ROS2. Вот несколько базовых команд:

Сборка всех пакетов в рабочем пространстве:

Bash
cd ~/ros2_ws
colcon build

Сборка конкретного пакета:

Bash
colcon build --packages-select my_package

Сборка пакета и его зависимостей:

Bash
colcon build --packages-up-to my_package

Тестирование пакетов:

Bash
colcon test

После сборки вам нужно будет настроить переменные окружения. После того как мы собрали пакеты ROS2 с помощью colcon, система еще не «знает» о местоположении этих пакетов и не может их использовать. Чтобы ROS2 мог найти и использовать собранные пакеты, необходимо настроить определенные переменные окружения в текущей сессии терминала.

Команда source install/setup.bash загружает специальный скрипт, который автоматически настраивает все необходимые переменные окружения для рабочего пространства ROS2:

Bash
source install/setup.bash

Эту команду нужно выполнять в каждом новом терминале. Переменные окружения действуют только в рамках текущей сессии терминала. Для автоматизации этого процесса можно добавить эту команду в файл .bashrc:

Bash
echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc

Это обеспечит автоматическую настройку переменных окружения при каждом открытии нового терминала.

Статья дополняется

***

Содержание

  1. Установка на Windows и Ubuntu
  2. Ключевые концепции: