Что такое пакет (Package)?
Пакет — это контейнер исходного кода, разработанного в ROS 2. Пакет можно создать самостоятельно, загрузить из репозиториев или установить в систему с помощью менеджера пакетов. Такая организация позволяет легко делиться разработанным кодом с другими членами команды или сообществом ROS 2. По сути, пакеты ROS 2 — это модульные единицы программного обеспечения, содержащие ноды, библиотеки и конфигурационные файлы, что обеспечивает модульность и возможность повторного использования. ROS 2 в основном поддерживает два типа пакетов: C++ и Python. Впрочем, члены сообщества ROS 2 создали дополнительные клиентские библиотеки для Android, C#, Rust и других языков.
Пакет может содержать несколько нод, организованных в разных исходных файлах. Несколько нод могут быть объединены в одном пакете ROS 2, что позволяет модульно разрабатывать роботизированные приложения. Пакет создается с помощью инструментов командной строки ROS 2. Кроме того, пакет может содержать как обязательные, так и необязательные файлы или директории.
Простейшая структура пакета ROS 2, созданного для размещения нод Python, выглядит так:
wtf_package/
setup.py
package.xml
resource/wtf_package
Эти файлы обязательны для идентификации пакета ROS 2, и их содержимое используется следующим образом:
- package.xml: файл, содержащий метаинформацию о пакете, такую как информация о пакете, авторах, лицензиях и зависимостях.
- setup.py: содержит инструкции по установке пакета.
- setup.cfg: требуется, когда пакет содержит исполняемые файлы, чтобы ROS 2 мог их найти.
- resource/<имя_пакета>: директория с тем же именем, что и наш пакет, используемая инструментами ROS 2 для поиска пакета в системе.
Однако создание пакета только с этими файлами бесполезно, поскольку в нем нет конфигурационных или исполняемых файлов. Помимо указанных файлов, пакет ROS 2 может содержать следующие ключевые элементы:
- Ноды: отдельные процессы, выполняющие определенные задачи в роботизированной системе. Они представлены файлами реализации (например, написанными на C++, Python), определяющими функциональность нод и других компонентов.
- Файлы запуска: конфигурационные файлы для запуска нескольких нод и установки их параметров.
- Конфигурационные файлы: файлы, определяющие параметры, настройки или другие конфигурации, используемые нодами.
- Зависимости: внешние библиотеки или пакеты, необходимые для функционирования пакета.
- Документация: описания, инструкции и руководства по использованию пакета и его компонентов.
- Тесты: модульные тесты, интеграционные тесты или другие тестовые скрипты для обеспечения корректности и надежности пакета.
При реализации вышеупомянутых моделей коммуникации пакет ROS 2 может содержать все необходимые файлы для реализации интерфейсов связи:
- Файлы сообщений (.msg): определяют структуру данных, которыми обмениваются ноды. Сообщения могут представлять показания датчиков, команды управления или любой другой тип данных, передаваемых между компонентами роботизированной системы.
- Файлы сервисов (.srv): определяют модель коммуникации «запрос-ответ» между узлами. Сервисы позволяют узлам предоставлять функциональность, которую могут вызывать другие ноды, обеспечивая синхронную коммуникацию.
- Файлы действий (.action): определяют более сложную модель коммуникации, чем сервисы, позволяющую асинхронное, целеориентированное поведение.
Рабочее пространство (Workspace)
Рабочее пространство — это не что иное, как директория, в которой расположены все пакеты ROS 2. Эта директория также содержит файлы, генерируемые во время установки и компиляции нового программного обеспечения. В этом контексте из рабочего пространства пакеты ROS 2 собираются, устанавливаются и управляются. Конечно, рабочее пространство ROS 2 может содержать несколько пакетов ROS 2, даже написанных на разных языках программирования. Также в этом случае файлы и поддиректории, содержащиеся в рабочем пространстве, не строго определены. Общая структура и основные файлы рабочего пространства выглядят следующим образом:
wtf_worskapce/
build/
install/
setup.bash
log/
src/
pkg1/
pkg2/
CmakeLists.txt
Значение каждой директории и файла:
- build: директория, содержащая артефакты сборки, генерируемые в процессе компиляции.
- install: директория, куда устанавливаются собранные пакеты. Она содержит исполняемые бинарные файлы, библиотеки, файлы запуска и другие ресурсы, необходимые для запуска пакетов ROS 2.
- log: директория, где хранятся файлы журналов, генерируемые во время сборки и выполнения.
- src: исходная директория для пакетов ROS 2. Каждая поддиректория соответствует пакету ROS 2, содержащему файлы исходного кода, конфигурационные файлы и другие ресурсы, специфичные для пакета.
- CMakeLists.txt: верхнеуровневый скрипт сборки CMake, который настраивает процесс сборки для всего рабочего пространства и указывает зависимости между пакетами.
- setup.bash: скрипт, используемый для настройки переменных окружения для рабочего пространства ROS 2. Обычно он подключается перед работой с командами и инструментами ROS 2.
Перед запуском узлов ROS 2 рабочее пространство, в котором находится пакет, содержащий узел, должно быть правильно подключено (активировано), чтобы проинформировать операционную систему о его доступности. Рабочее пространство не уникально. В одной системе могут сосуществовать несколько рабочих пространств. Чтобы обеспечить сосуществование различных рабочих пространств в одной системе, необходимо ввести концепцию наложения (overlay).
Наложение (overlay)
Наложение рабочего пространства ROS 2 означает, что у нас может быть несколько директорий рабочих пространств и соответствующих им пакетов, которые сосуществуют и используются вместе. Это позволяет расширять или модифицировать функциональность существующих пакетов без прямого изменения их исходного кода. Вот как работает наложение в рабочем пространстве ROS 2:
- Несколько рабочих пространств: в нашей системе может быть несколько рабочих пространств ROS 2. Каждое рабочее пространство — это структура директорий, содержащая пакеты ROS 2.
- Порядок приоритета: при выполнении команд ROS 2 пакеты в активном рабочем пространстве имеют приоритет. Если пакет с одним и тем же именем существует в нескольких рабочих пространствах, будет использоваться тот, который находится в активном рабочем пространстве.
- Наложение: мы можем наложить одно рабочее пространство поверх другого. Это означает, что пакеты из накладываемого рабочего пространства используются вместе с пакетами из базового рабочего пространства. Если пакет существует как в накладываемом, так и в базовом рабочем пространстве, приоритет имеет пакет из накладываемого рабочего пространства.
***