Создание пакета
Что вы узнаете в этом разделе:
- Зачем нужны пакеты в ROS2
- Как создать свой первый ROS2 пакет
- Структуру Python-пакета ROS2
- Как настроить файлы
package.xmlиsetup.py - Как собрать пакет с помощью
colcon - Как добавить новые программы в существующий пакет
- Как запускать программы из пакета через
ros2 run
Часть 1: Зачем нужны пакеты?
В ROS2 пакет — это основная единица организации кода. Это контейнер, который содержит всё необходимое для определенного функционального модуля: узлы (ноды), библиотеки, данные конфигурации, файлы запуска, зависимости и т.д.
Аналогия из жизни: Пакет ROS2 можно сравнить с модулем конструктора LEGO или готовым набором инструментов для конкретной задачи. Например, набор "Навигация" содержит все детали (программы, библиотеки, настройки) для создания системы навигации робота. Как набор LEGO имеет инструкцию по сборке, так и пакет имеет файлы конфигурации, которые объясняют системе, как его собрать и использовать. Пакеты можно переиспользовать, комбинировать и делиться ими с другими, как готовые модули конструктора.
Зачем их создавать?
- Модульность: Вы разбиваете сложную систему робота (например, навигация, управление манипулятором) на независимые, хорошо определенные компоненты. Каждый пакет решает свою конкретную задачу.
- Переиспользование: Хорошо написанный пакет можно легко скопировать и использовать в другом проекте или поделиться с сообществом.
- Управление зависимостями: Пакет явно объявляет, от каких других пакетов или библиотек Python он зависит. Это позволяет инструментам ROS2 автоматически устанавливать всё необходимое.
- Сборка: Система сборки (
colcon) знает, как собрать и установить именно ваш код, потому что он оформлен в виде пакета с правильными файлами конфигурации. - Простота тестирования: Можно писать и запускать тесты для конкретного пакета, не затрагивая всю систему.
Создание первого пакета
Есть некоторое отличие в создании пакета для разработки на
pythonиcpp. Мы рассмотрим только то, что касается работы сpython.
Перейдите в src -- директорию вашего рабочего пространства (workspace) и выполните команду:
cd ~/user_ws/src
ros2 pkg create my_first_package --build-type ament_python --dependencies rclpy std_msgs --node-name my_first_node
Разберем параметры:
ros2 pkg create: основная команда для создания пакета.my_first_package: имя вашего нового пакета. Используйтеsnake_case.--build-type ament_python: указывает, что мы будем писать на Python и использовать систему сборкиament.--dependencies rclpy std_msgs: перечисляет пакеты, от которых зависит ваш код.rclpy— это клиентская библиотека ROS2 для Python,std_msgs— содержит стандартные типы сообщений. Эти зависимости автоматически добавятся в файлыpackage.xmlиsetup.py.--node-name my_first_node: опционально создает заготовку Python-файла для узла в директорииmy_first_package/my_first_package.
Структура созданного пакета
После выполнения команды вы увидите следующую структуру файлов:
user_ws/
└── src/
└── my_first_package/
├── package.xml
├── setup.py
├── setup.cfg
├── resource/
│ └── my_first_package
├── test/
│ └── ...
└── my_first_package/
├── __init__.py
└── my_first_node.py # Создан благодаря --node-name
Ключевые файлы и их настройка:
-
package.xml: Файл метаданных пакета.- Обязательно обновите поля
<description>,<maintainer>и<license>. - Здесь объявляются зависимости.
- Зависимости бывают трех типов:
ament_python(дляbuildtool_depend): Указывает, что для сборки нуженament_python.depend: Универсальная зависимость (например,rclpy,std_msgs). Включает в себяbuild_depend,exec_dependиbuild_export_depend.exec_depend: Зависимость, необходимая только для запуска вашего кода (например, если ваш узел публикует сообщение типаsensor_msgs/Image, добавьтеexec_depend sensor_msgs).
- Обязательно обновите поля
-
setup.py: Главный скрипт для сборки Python-пакета.- Самая важная часть — точка входа (
entry_points), где вы регистрируете свои узлы как консольные скрипты.
entry_points={ 'console_scripts': [ 'my_first_node = my_first_package.my_first_node:main', # 'имя_исполняемого_файла = python_пакет.имя_файла:функция_main' ], },При сборке пакета
colconсоздаст исполняемые файлы в системе, которые будут напрямую вызывать вашу функциюmain. - Самая важная часть — точка входа (
-
Файл c программой
my_first_node.py
def main():
print('Hi from my_first_package.')
if __name__ == '__main__':
main()
Сборка, настройка окружения и запуск
Под сборкой пакета, мы понимаем набор множества операций над исходным кодом, которые необходимо выполнить для того, чтобы созданные программы ROS могли функционировать. Можем выделить несколько ключевых операций: компилирование исходного кода (для программ на cpp), установка и проверка зависимостей, копирование различных файлов.
Результатом успешной сборки является создание специальных директорий ( build, install и log) в рабочем пространстве. В папке install создаются все исполняемые файлы, библиотеки, конфигурации и другие файлы (артефакты), необходимые для запуска пакета. Именно из этой директории будут запускаться программы.
- Сборка: Вернитесь в корень рабочего пространства (
~/user_ws) и выполните:
colcon build --packages-select my_first_package
Флаг --packages-select указывает собрать только один конкретный пакет.
- Настройка окружения: После сборки необходимо добавить рабочее пространство с нашим пакетом в сессию терминала.
source ~/user_ws/install/setup.bash
(Это нужно делать в каждом новом терминале! Чтобы избежать этого, можно добавить эту строку в ваш ~/.bashrc).
- Запуск первой программы: Теперь вашим узлом можно управлять как любой другой ROS2-нодой:
ros2 run my_first_package my_first_node ==== Hi from my_first_package.
Добавление новой программы в пакет
Скопируем пример из второй части нашего курса (файл temp_topic_publisher.py) в директорию пакета src/my_first_package/my_first_package/
Добавим в файл setup.py новую точку входа
entry_points={
'console_scripts': [
'my_first_node = my_first_package.my_first_node:main',
'temp_topic_publisher = my_first_package.temp_topic_publisher:main'
],
Пересоберем пакет
colcon build --packages-select my_first_package
Запустим нашу новую ноду
ros2 run my_first_package temp_topic_publisher
====
[INFO] [1757431348.282070055] [minimal_publisher]: Publishing CPU temp: 48.5
[INFO] [1757431348.760248464] [minimal_publisher]: Publishing CPU temp: 48.5
Программа запущена и работает
Дополнительная информация
При работе с Python-кодом удобнее не пересобирать пакет после каждого изменения. Для этого можно использовать опцию --symlink-install, которая создает символическую ссылку в директории install на программу из директории src. Это позволяет запускать измененный код сразу через ros2 run без необходимости повторной сборки.
colcon build --packages-select my_first_package --symlink-install
Официальная документация на работу с Creating a workspace
Официальная документация по созданию пакетов Creating a package