Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Создание пакета

Что вы узнаете в этом разделе:

  • Зачем нужны пакеты в ROS2
  • Как создать свой первый ROS2 пакет
  • Структуру Python-пакета ROS2
  • Как настроить файлы package.xml и setup.py
  • Как собрать пакет с помощью colcon
  • Как добавить новые программы в существующий пакет
  • Как запускать программы из пакета через ros2 run

Часть 1: Зачем нужны пакеты?

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

Аналогия из жизни: Пакет ROS2 можно сравнить с модулем конструктора LEGO или готовым набором инструментов для конкретной задачи. Например, набор "Навигация" содержит все детали (программы, библиотеки, настройки) для создания системы навигации робота. Как набор LEGO имеет инструкцию по сборке, так и пакет имеет файлы конфигурации, которые объясняют системе, как его собрать и использовать. Пакеты можно переиспользовать, комбинировать и делиться ими с другими, как готовые модули конструктора.

Зачем их создавать?

  1. Модульность: Вы разбиваете сложную систему робота (например, навигация, управление манипулятором) на независимые, хорошо определенные компоненты. Каждый пакет решает свою конкретную задачу.
  2. Переиспользование: Хорошо написанный пакет можно легко скопировать и использовать в другом проекте или поделиться с сообществом.
  3. Управление зависимостями: Пакет явно объявляет, от каких других пакетов или библиотек Python он зависит. Это позволяет инструментам ROS2 автоматически устанавливать всё необходимое.
  4. Сборка: Система сборки (colcon) знает, как собрать и установить именно ваш код, потому что он оформлен в виде пакета с правильными файлами конфигурации.
  5. Простота тестирования: Можно писать и запускать тесты для конкретного пакета, не затрагивая всю систему.

Создание первого пакета

Есть некоторое отличие в создании пакета для разработки на 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

Ключевые файлы и их настройка:

  1. 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).
  2. setup.py: Главный скрипт для сборки Python-пакета.

    • Самая важная часть — точка входа (entry_points), где вы регистрируете свои узлы как консольные скрипты.
    entry_points={
        'console_scripts': [
            'my_first_node = my_first_package.my_first_node:main',
            # 'имя_исполняемого_файла = python_пакет.имя_файла:функция_main'
        ],
    },
    

    При сборке пакета colcon создаст исполняемые файлы в системе, которые будут напрямую вызывать вашу функцию main.

  3. Файл c программой my_first_node.py

def main():
    print('Hi from my_first_package.')


if __name__ == '__main__':
    main()

Сборка, настройка окружения и запуск

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

Результатом успешной сборки является создание специальных директорий ( build, install и log) в рабочем пространстве. В папке install создаются все исполняемые файлы, библиотеки, конфигурации и другие файлы (артефакты), необходимые для запуска пакета. Именно из этой директории будут запускаться программы.

  1. Сборка: Вернитесь в корень рабочего пространства (~/user_ws) и выполните:
colcon build --packages-select my_first_package

Флаг --packages-select указывает собрать только один конкретный пакет.

  1. Настройка окружения: После сборки необходимо добавить рабочее пространство с нашим пакетом в сессию терминала.
source ~/user_ws/install/setup.bash

(Это нужно делать в каждом новом терминале! Чтобы избежать этого, можно добавить эту строку в ваш ~/.bashrc).

  1. Запуск первой программы: Теперь вашим узлом можно управлять как любой другой 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