Создание пакета в ROS пошаговая инструкция

Как создать пакет в ros

Как создать пакет в ros

ROS (Robot Operating System) требует структурированного подхода к организации кода. Пакет – базовая единица, содержащая узлы, библиотеки, конфигурации и зависимости. Без правильно сформированного пакета невозможно корректно развернуть функционал, будь то простой узел публикации топиков или сложная система навигации. В этой инструкции рассмотрен процесс создания пакета с нуля, включая обязательные файлы, настройку окружения и проверку работоспособности.

Для начала убедитесь, что установлена актуальная версия ROS (например, ROS Noetic для Ubuntu 20.04 или ROS 2 Humble для Ubuntu 22.04). Рабочая директория должна находиться в ~/catkin_ws/src/ (для ROS 1) или ~/ros2_ws/src/ (для ROS 2). Используйте команду roscd для проверки текущего рабочего пространства. Если директория отсутствует, создайте её вручную и инициализируйте с помощью catkin_init_workspace (ROS 1) или colcon build (ROS 2).

Создание пакета начинается с команды catkin_create_pkg (ROS 1) или ros2 pkg create (ROS 2). Укажите имя пакета, зависимости (например, roscpp, rospy, std_msgs) и версию лицензии. Пример для ROS 1: catkin_create_pkg my_package roscpp rospy std_msgs --license Apache-2.0. Для ROS 2: ros2 pkg create --build-type ament_cmake my_package --dependencies rclcpp std_msgs. После выполнения команды в директории появится шаблон с минимально необходимыми файлами: CMakeLists.txt, package.xml и подкаталог src/.

Файл package.xml содержит метаданные пакета: имя, версию, автора, лицензию и зависимости. Убедитесь, что все зависимости перечислены в секции <depend> (ROS 1) или <exec_depend> (ROS 2). Пример для ROS 2: <exec_depend>rclcpp</exec_depend>. В CMakeLists.txt настройте сборку узлов, библиотек и экспортируемых ресурсов. Для ROS 1 минимальная конфигурация включает find_package(catkin REQUIRED COMPONENTS roscpp rospy) и catkin_package(). Для ROS 2 – find_package(rclcpp REQUIRED) и ament_export_dependencies(rclcpp).

После настройки файлов выполните сборку пакета. В ROS 1 используйте catkin_make в корне рабочего пространства. В ROS 2 – colcon build --packages-select my_package. Проверьте работоспособность пакета, запустив узел с помощью rosrun my_package my_node (ROS 1) или ros2 run my_package my_node (ROS 2). Если узел не запускается, проверьте логи на наличие ошибок компиляции или отсутствующих зависимостей.

Создание пакета в ROS: пошаговая инструкция

Создание пакета в ROS: пошаговая инструкция

Создайте пакет в ROS с помощью команды catkin_create_pkg, указав имя пакета и зависимости. Например: catkin_create_pkg my_package rospy std_msgs. Эта команда генерирует базовую структуру каталогов: src/, include/, CMakeLists.txt и package.xml. Убедитесь, что рабочее пространство (catkin_ws) инициализировано и находится в актуальном состоянии – выполните catkin_make в корневой директории после создания пакета.

В файле package.xml отредактируйте метаданные: укажите имя автора, лицензию (например, BSD), зависимости и описание. Для добавления зависимостей используйте теги <depend> или <build_depend>. В CMakeLists.txt настройте сборку: добавьте исполняемые файлы с помощью add_executable(), укажите зависимости через target_link_libraries() и настройте установку ресурсов с install(). Пример минимальной конфигурации для Python-узла: catkin_install_python(PROGRAMS scripts/my_node.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}).

Проверьте корректность пакета командами rospack profile и roscd my_package. Запустите узел через rosrun my_package my_node.py или добавьте его в launch-файл для комплексного тестирования. Для отладки используйте rosnode info и rostopic list, чтобы убедиться в правильной публикации/подписке на топики.

Установка необходимых инструментов и зависимостей для работы с ROS

Перед созданием пакета установите базовый набор инструментов ROS. Для Ubuntu 20.04 или 22.04 выполните команду:

sudo apt update && sudo apt install ros-<distro>-desktop-full,
где <distro> – версия ROS (например, noetic или humble). После установки инициализируйте rosdep:
sudo rosdep init && rosdep update.
Это обеспечит доступ к основным утилитам (catkin_make, roscore, rviz) и библиотекам.

Для работы с Python-пакетами установите pip и необходимые зависимости:
sudo apt install python3-pip python3-rosdep python3-rosinstall-generator python3-wstool build-essential.
Если планируется использовать Python 3, убедитесь, что переменная окружения PYTHONPATH содержит пути к ROS-библиотекам:
export PYTHONPATH=$PYTHONPATH:/opt/ros/<distro>/lib/python3/dist-packages.
Добавьте эту строку в ~/.bashrc, чтобы изменения применялись автоматически.

Управление зависимостями осуществляется через rosdep и package.xml. Перед сборкой пакета выполните:
rosdep install --from-paths src --ignore-src -r -y.
Эта команда установит все зависимости, перечисленные в манифестах пакетов в директории src. Для корректной работы с системными библиотеками используйте теги <depend> (для обязательных зависимостей) и <exec_depend> (для зависимостей времени выполнения) в package.xml.

Для сборки пакетов на C++ установите компилятор и инструменты сборки:

sudo apt install cmake gcc g++.

Если требуется поддержка графических интерфейсов (например, Qt), добавьте:

sudo apt install qtbase5-dev qt5-qmake.
Проверьте версию cmake – для ROS Noetic и новее требуется не ниже 3.10.2. Убедитесь, что все зависимости разрешены до запуска catkin_make, иначе сборка завершится с ошибками.

Создание рабочего пространства catkin и его базовая настройка

Создание рабочего пространства catkin и его базовая настройка

Для корректной работы с несколькими рабочими областями используйте механизм оверлеев. Создайте новую область, например catkin_ws_overlay, и соберите её аналогично. При подключении через source новая область будет перекрывать пакеты из предыдущей, если они имеют одинаковые имена. Это позволяет тестировать изменения без модификации основной рабочей области. Убедитесь, что порядок подключения в .bashrc соответствует приоритету областей.

Оптимизируйте сборку с помощью флагов catkin_make. Для ускорения процесса добавьте параметр -j4 (или -jN, где N – количество ядер процессора), чтобы использовать параллельную компиляцию. Исключите ненужные пакеты из сборки с помощью catkin_make --only-pkg-with-deps , что сократит время компиляции. Для очистки временных файлов используйте catkin_make clean, но учтите, что это удалит все скомпилированные бинарники.

Настройте переменные окружения для специфических задач. Например, для отладки с помощью gdb добавьте в .bashrc строку export ROSCONSOLE_CONFIG_FILE=~/catkin_ws/src/my_package/config/rosconsole.config, чтобы перенаправить логи в файл. Для работы с аппаратными устройствами установите export ROS_MASTER_URI=http://localhost:11311 или укажите IP удалённого мастера. Эти параметры можно задавать временно в терминале или прописывать в .bashrc для постоянного действия.

Проверьте целостность рабочей области после настройки. Выполните roscd && pwd – результат должен указывать на ~/catkin_ws/devel. Запустите rospack list и убедитесь, что в списке присутствуют стандартные пакеты ROS и ваши собственные. Если пакеты не отображаются, пересоберите область командой catkin_make и повторно выполните source. Для диагностики проблем используйте catkin_find – инструмент поиска файлов в рабочей области.

Инициализация нового пакета с помощью команды catkin_create_pkg

Инициализация нового пакета с помощью команды catkin_create_pkg

catkin_create_pkg – основной инструмент для генерации структуры ROS-пакета. Команда создаёт минимально необходимый набор файлов: CMakeLists.txt, package.xml и директорию src/. Синтаксис: catkin_create_pkg <имя_пакета> [зависимости]. Например, для пакета my_robot_control с зависимостями от roscpp и std_msgs выполните: catkin_create_pkg my_robot_control roscpp std_msgs. Зависимости указываются через пробел – они автоматически прописываются в package.xml и CMakeLists.txt.

После выполнения команды проверьте содержимое сгенерированных файлов. В package.xml должны появиться теги <depend> для каждой указанной зависимости. В CMakeLists.txt – минимальные секции find_package() и catkin_package(). Если пакет требует дополнительных библиотек (например, OpenCV), добавьте их вручную в оба файла: в package.xml – через <build_export_depend> или <exec_depend>, в CMakeLists.txt – через find_package(OpenCV REQUIRED) и target_link_libraries().

Для пакетов с Python-нодами добавьте директорию scripts/ и создайте в ней исполняемый файл с шебангом #!/usr/bin/env python3. Убедитесь, что файл имеет права на выполнение (chmod +x script.py). В CMakeLists.txt раскомментируйте и настройте секцию catkin_install_python(), указав путь к скрипту: catkin_install_python(PROGRAMS scripts/script.py DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}). Это обеспечит корректную установку скрипта при сборке пакета.

Избегайте использования пробелов и специальных символов в именах пакетов – допустимы только латинские буквы, цифры и подчёркивания. Если пакет зависит от других пользовательских пакетов, убедитесь, что они перечислены в package.xml и доступны в рабочем пространстве (catkin_ws/src/). После создания пакета выполните catkin_make в корне рабочего пространства, чтобы проверить корректность зависимостей и сборки. Ошибки на этом этапе обычно связаны с отсутствующими зависимостями или неверными путями в CMakeLists.txt.

Добавление зависимостей и редактирование файла package.xml

Файл package.xml определяет метаданные пакета ROS и его зависимости. Без корректного заполнения этого файла пакет не сможет корректно собираться или запускаться. Основные теги, отвечающие за зависимости: <build_depend>, <exec_depend>, <build_export_depend> и <depend>. Выбор тега зависит от типа зависимости и этапа, на котором она требуется.

Для зависимостей, необходимых только на этапе сборки (например, компиляторы или инструменты сборки), используйте <build_depend>. Пример:

  • <build_depend>cmake</build_depend> – если пакет использует CMake;
  • <build_depend>catkin</build_depend> – обязательно для всех пакетов ROS.

Если зависимость требуется только во время выполнения (например, библиотеки или узлы ROS), применяйте <exec_depend>. Например:

  • <exec_depend>roscpp</exec_depend>
  • <exec_depend>std_msgs</exec_depend>

Тег <depend> объединяет <build_depend> и <exec_depend>, если зависимость нужна на обоих этапах. Это упрощает поддержку файла, но снижает гибкость. Пример:

  • <depend>rospy</depend> – если пакет использует Python-узлы;
  • <depend>tf2_ros</depend> – для работы с трансформациями.

Для зависимостей, которые экспортируются другим пакетам (например, заголовочные файлы или библиотеки), используйте <build_export_depend>. Это актуально, если ваш пакет предоставляет API для других пакетов. Пример:

  • <build_export_depend>eigen</build_export_depend> – если пакет использует Eigen для линейной алгебры.

После редактирования package.xml выполните команду rosdep check <имя_пакета>, чтобы проверить корректность зависимостей. Если обнаружены ошибки, rosdep предложит исправления. Также убедитесь, что все зависимости установлены в системе с помощью rosdep install --from-paths src --ignore-src -r -y.

Избегайте дублирования зависимостей. Например, если пакет уже зависит от roscpp, не добавляйте roslib, так как roscpp включает его автоматически. Для проверки зависимостей используйте rospack depends <имя_пакета> или rospack depends1 <имя_пакета> для прямых зависимостей.

Написание первого узла ROS и его компиляция в пакете

Создайте файл узла в директории src вашего пакета, например, simple_node.cpp. Минимальный рабочий узел ROS включает заголовок #include "ros/ros.h" и функцию main, где инициализируется узел с помощью ros::init(argc, argv, "node_name") и запускается цикл обработки сообщений: ros::spin(). Для публикации данных добавьте объект ros::Publisher, например, для топика /chatter типа std_msgs::String. Пример кода:

#include "ros/ros.h"
#include "std_msgs/String.h"
int main(int argc, char **argv) {
ros::init(argc, argv, "talker");
ros::NodeHandle nh;
ros::Publisher pub = nh.advertise<std_msgs::String>("/chatter", 10);
ros::Rate loop_rate(10);
while (ros::ok()) {
std_msgs::String msg;
msg.data = "Hello ROS";
pub.publish(msg);
ros::spinOnce();
loop_rate.sleep();
}
return 0;
}

Для компиляции узла отредактируйте CMakeLists.txt в корне пакета: добавьте find_package(catkin REQUIRED COMPONENTS roscpp std_msgs) в секцию зависимостей, а после catkin_package() – команду add_executable(simple_node src/simple_node.cpp) и target_link_libraries(simple_node ${catkin_LIBRARIES}). Запустите сборку из рабочей области командой catkin_make или colcon build (для ROS 2). Проверьте результат в терминале: после успешной компиляции узел появится в списке доступных исполняемых файлов при вызове rosrun <package_name> <executable_name>. Для отладки используйте rosnode info <node_name> или rostopic echo /chatter.

Ссылка на основную публикацию