Дорожная карта обученияПродвинутый

Основы ROS 2: узлы, системы координат и компьютерное зрение

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

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

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

Затем идёт TF2 — часть, которая незаметно ставит в тупик. Робот представляет собой дерево систем координат: базу, колёса и каждый датчик. Почти каждая реальная ошибка — это отсутствующее, устаревшее или привязанное не к тому родителю преобразование. Когда системы координат становятся понятны, откалиброванная камера превращается в ещё один узел, публикующий положение в это дерево; именно так компьютерное зрение включается в остальную часть робота.

Прежде чем начать

Вам нужно уверенно работать в командной строке Linux и уметь читать код на Python или C++. Raspberry Pi — обычная целевая платформа, но всё до аппаратных узлов работает на ноутбуке. Настройка займёт примерно один вечер: ROS 2 — распределённая система, и ведёт себя она как распределённая уже с первой команды.

Чему вы сможете научиться

  • Правильно выбирать между темой, сервисом и действием, не превращая всё в темы и не обнаруживая ограничения позже.
  • Строить дерево систем координат TF2, преобразующее точку из системы координат датчика в систему координат робота, и отлаживать отсутствующее преобразование.
  • Калибровать камеру, получать положение маркера и понимать, относительно чего заданы числа.
  • Преобразовывать скоростной вектор cmd_vel в скорости левого и правого колёс с ограничением, сохраняющим заданную дугу.

Где обычно возникают трудности

Узлы не видят друг друга. Автоматическое обнаружение в ROS 2 работает, пока не перестаёт. Две машины с разными значениями ROS_DOMAIN_ID невидимы друг для друга, а Wi-Fi, блокирующий многоадресную передачу, полностью нарушает обнаружение, хотя каждый узел безупречно сообщает о своём состоянии.

Несовпадение QoS. Издатель с best-effort и подписчик с reliable не соединятся, и — что не помогает — ни одна сторона не запишет ошибку. По теме просто ничего не передаётся. Обычно виноваты данные датчиков, поскольку их драйверы по умолчанию используют best-effort.

Забытое подключение рабочего пространства. Новый терминал ничего не знает о пакетах, пока рабочее пространство не подключено, поэтому ros2 run сообщает об отсутствии явно существующего пакета.

Система координат с двумя родителями. TF2 является деревом. Публикация одной дочерней системы координат из двух источников даёт ей двух родителей, и запросы начинают периодически сбоить в зависимости от времени — это одна из наиболее трудных для обнаружения ошибок ROS, поскольку система работает большую часть времени.

Пустые метки времени и идентификаторы систем координат (IDs). Сообщение без frame_id в заголовке нельзя преобразовать, а сообщение с нулевой меткой времени невозможно согласовать по времени. Оба проходят проверку типов без возражений, и ошибка возникает только при совместном использовании.

Что понадобится

Что Зачем это нужно пути Примечания
Уверенная работа в командной строке Linux ROS 2 — система, ориентированная прежде всего на Linux, и инструменты рассчитаны на неё В Ubuntu доступны официальные двоичные пакеты; для другой системы нужна сборка
Python или C++ Код узла пишется на одном из двух языков Python быстрее освоить; C++ используется для узлов, критичных к производительности
Машина с настоящим экраном Отладка распределённой системы по SSH излишне мучительна Ноутбук лучше Pi без дисплея как цель обучения
Raspberry Pi (только для аппаратных узлов) Нужен, когда робот несёт собственный компьютер Pi 4 или лучше; Pi Zero разочарует
Камера (только для узла зрения) Последний узел пути Модуль Pi Camera или любая веб-камера с поддержкой USB Video Class (UVC)
Вечер на настройку Это не шутка — часть пути Установка действительно является первым сложным шагом

Почему путь устроен именно так

Сначала шаблоны обмена данными, потому что неверный выбор позднее обходится дорого. Четыре способа обмена между узлами ROS 2 не взаимозаменяемы, а стандартная ошибка начинающих — сделать всё темами, а затем через триста строк обнаружить, что нужны отмена и отчёт о ходе выполнения и что действия были реализованы вручную. Десять минут на выбор между темой, сервисом и действием экономят переписывание.

TF2 идёт вторым, потому что это часть, которая незаметно ставит в тупик. Когда несколько узлов публикуют данные о физическом мире, каждое из этих значений означает свои «3 метра» относительно камеры, базы или карты. TF2 связывает эти системы, и большинство реальных ошибок ROS — это отсутствующее, устаревшее или привязанное не к тому родителю преобразование. Изучить это как отдельную тему до того, как она понадобится, намного дешевле, чем встретить загадочный сбой запроса.

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

Узел управления приводом завершает путь, поскольку именно там ROS встречается с оборудованием, которому посвящён этот сайт. Скоростной вектор cmd_vel — стандартный интерфейс, которым пользуется каждый компонент навигации ROS, а его преобразование в скорости левого и правого колёс с ограничением, сохраняющим заданную дугу вместо её искажения, служит мостом между миром ROS и миром двигателей.

Контрольные точки: как проверить усвоение этапа

Этап Проверка Признак успешного прохождения
Установка Выполните ros2 topic list в новом терминале Работает после подключения рабочего пространства, и вы понимаете причину сбоя до него
Два узла Запустите talker (отправитель) и listener (получатель) на двух машинах Сообщения приходят, и вы можете назвать общий domain ID
Тема и сервис Напишите по одному для одних и тех же данных За одно предложение объясните, почему каждый шаблон подходит для своей задачи
Действия Запустите долгое действие и отмените его в середине Оно корректно останавливается, а во время работы поступает отчёт о ходе выполнения
QoS Намеренно задайте несовпадающую надёжность темы Она молча не передаёт ничего — теперь вы узнаёте симптом
Дерево TF2 Выполните ros2 run tf2_tools view_frames Одно дерево, один корень, ни одной системы координат с двумя родителями
Запрос преобразования Преобразуйте точку из системы координат датчика в систему координат базы Число верно, и его можно проверить рулеткой
Устаревшие преобразования Остановите издатель преобразования во время запроса Получаете ошибку экстраполяции — теперь у сбоя есть название
Калибровка камеры Откалибруйте камеру и проверьте ошибку репроекции Значение значительно меньше одного пикселя; большое значение означает плохой набор снимков
Положение маркера Поместите маркер на измеренном расстоянии и прочитайте его положение Совпадает с рулеткой, и вы можете назвать систему координат, в которой оно задано
cmd_vel Опубликуйте вектор с линейной и угловой составляющими Оба колеса вращаются правильно, а при ограничении одного колеса масштабируется скорость другого для сохранения дуги

Где заканчивается этот путь

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

Он не рассматривает стек Nav2 — стандартное решение для автономной навигации в ROS 2 и одновременно самостоятельную крупную систему: карты стоимости, деревья поведения, планировщики и регуляторы, которые настраивают, а не пишут. Nav2 предполагает рабочее дерево TF и интерфейс cmd_vel — именно то, что даёт этот путь.

Он не рассматривает URDF (унифицированный формат описания робота) — XML-формат, который сообщает остальной части ROS о форме вашего робота. Здесь все преобразования публикуются вручную; URDF позволяет перестать это делать.

Он не рассматривает моделирование в Gazebo, в котором происходит большая часть серьёзной разработки ROS, или ros2_control, стандартный уровень абстракции оборудования для реальных приводов.

Он также не рассматривает поведение реального времени. ROS 2 построен на службе распределения данных (Data Distribution Service, DDS) и значительно сильнее ROS 1, но компьютер с Linux, выполняющий узел на Python, не является системой управления реального времени. Жёсткие контуры — балансировка, регулирование тока и всё, что работает с частотой в килогерцах, — по-прежнему должны оставаться на микроконтроллере, а ROS 2 — работать над ними. Такое разделение — обычная архитектура серьёзного робота, а не компромисс.

Дорожная карта обучения

Путь

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

0 / 5 выполнено

100%
Цель

Структурируйте робота в ROS 2

Навык открыт

Частые вопросы

Часто задаваемые вопросы

Когда роботу следует переходить с Arduino на ROS 2?

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

Тема, сервис или действие — как выбрать в ROS 2?

Сопоставьте шаблон обмена данными с задачей. Тема — поток без ответа: данные датчиков, одометрия, команды скорости, то есть всё, что публикуется непрерывно и где важно последнее значение. Сервис — быстрый запрос и ответ для задач, завершающихся за миллисекунды, например получения параметра или переключения режима. Действие предназначено для долгих задач, для которых нужен отчёт о ходе выполнения или возможность отмены: переход к цели или сжатие схвата вокруг объекта. Самая частая ранняя ошибка — сделать всё темами, а затем вручную реализовать поверх них семантику запроса и ответа.

Почему мои узлы ROS 2 не видят друг друга?

Почти всегда причина одна из трёх. Разные значения ROS_DOMAIN_ID делают две машины полностью невидимыми друг для друга, хотя обе безупречно сообщают о своём состоянии. Wi-Fi-сети, блокирующие многоадресную передачу, полностью нарушают протокол обнаружения, поэтому узлы часто находят друг друга по Ethernet, но не через офисную точку доступа. Несовпадение QoS (качества обслуживания), когда издатель предлагает best-effort (без гарантии доставки), а подписчик требует reliable (с гарантией доставки), также не позволяет им соединиться, причём ни одна сторона не записывает ошибку. Сначала проверьте идентификатор домена (domain ID): это ничего не стоит и чаще всего даёт ответ.

Что такое TF2 и почему преобразования не работают?

TF2 поддерживает дерево систем координат робота: базы, колёс и каждого датчика, позволяя запросить положение точки в системе координат камеры относительно системы координат робота. Запросы завершаются ошибкой по трём повторяющимся причинам. Система координат с двумя родителями нарушает дерево и работает большую часть времени, поскольку сбой зависит от того, какой издатель выиграл гонку. Пустой frame_id в заголовке сообщения означает, что сообщение вообще нельзя преобразовать. Нулевая или устаревшая метка времени означает, что преобразование существует не для запрошенного момента. Все три случая проходят проверку типов без возражений.

Нужен ли Raspberry Pi для изучения ROS 2?

Нет. Всё, кроме узлов драйверов оборудования, полностью работает на ноутбуке, который даже лучше подходит для обучения: быстрая сборка, настоящий экран и отсутствие риска повредить SD-карту и потерять вечер. Pi становится необходим, когда роботу нужен собственный компьютер. Если вы всё же используете его, считайте Pi узким местом: конвейер камеры и планировщик вместе быстро достигнут пределов Pi 4.

Почему ros2 run сообщает, что пакета нет, хотя он явно существует?

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