Пакеты в ROS. Установка и сборка. Утилита Catkin.
Пакет (Package)
Пакет является одной из основных единицей ROS. Любое приложение в ROS оформляется в пакет, в котором определяются: конфигурация, необходимые программы, зависимости от других пакетов ROS, системные зависимости.
Работа с пакетами ROS очень похожа на работу с пакетами linux. Пакет ROS можно поставить готовым из репозитория пакетов, так и скачать и скомпилировать из исходных кодов.
В данный момент написано и доступно для использования более 6000 пакетов. Около 3000 пакетов доступны для установки через пакетный менеджер apt
Поиск пакетов ROS лучше начинать на сайте http://wiki.ros.org/
Структура пакета
Пакет ROS содержат множество различных файлов. Для того, чтобы было проще ориентироваться с файлами любого пакета, сообщество разработчиков рекомендует использовать единообразную файловую структуру пакета:
bin/Директория, в которой хранятся скомпилированные программыinclude/Директория содержит файлы с заголовками (headers) библиотекlaunch/Директория для хранения файлов конфигурации запуска.launchmsg/Директория для сообщений (для топиков)src/Директория для хранения исходников программ (в том числе и скриптов)srv/Директория для хранения сообщений для использования Сервисами (Services)CMakeLists.txt:Файл форматыCmakeс инструкциями для установки пакетаpackage.xmlФайл "манифест" для описания пакета
С точки зрения "системы пакетов" самый важный файл в структуре -- это файл package.xml. Именно в нем описано описание пакета, что делает "обычную" директорию с файлами, именно пакетом.
Также в этом файле описаны все необходимые "внешние" зависимости, необходимые для работы. Если пакет установлен "верно", это гарантирует, что нам не нужно самим разбираться с дополнительными "установками".
Минимально в файле должно находиться описание следующих полей:
<name> - Название пакета
<version> - Версия пакета
<description> - Описание пакета
<maintainer> - Авторы пакета
<license> - Описание лицензии
Самый простой файл package.xml может выглядеть так
<package format="2">
<name>foo_core</name>
<version>1.2.4</version>
<description>
This package provides foo capability.
</description>
<maintainer email="ivana@osrf.org">Ivana Bildbotz</maintainer>
<license>BSD</license>
</package>
Для описания зависимостей в файл могут быть добавлены параметры (xml теги)
buildtool_depend - Зависимости от системы "сборки"
depend - Зависимости необходимые для всех случаев использования (сборка, запуск, тестирование и тд)
build_depend - Зависимости необходимые при "сборке" пакета
exec_depend - Зависимости необходимые при запуске пакета
test_depend - Зависимости необходимые при запуске тестов
Не слишком сложный файл package.xml
<package format="2">
<name>foo_core</name>
<version>1.2.4</version>
<description>
This package provides foo capability.
</description>
<maintainer email="ivana@willowgarage.com">Ivana Bildbotz</maintainer>
<license>BSD</license>
<url>http://ros.org/wiki/foo_core</url>
<author>Ivana Bildbotz</author>
<buildtool_depend>catkin</buildtool_depend>
<depend>roscpp</depend>
<depend>std_msgs</depend>
<build_depend>message_generation</build_depend>
<exec_depend>message_runtime</exec_depend>
<exec_depend>rospy</exec_depend>
<test_depend>python-mock</test_depend>
<doc_depend>doxygen</doc_depend>
</package>
Более подробно можно посмотреть на странице Manifest
Установка пакета ROS из репозитория
Если мы используем дистрибутив линукс семейства Ubuntu, то сообщество разработчиков ROS уже подготовило за нас основные пакеты, и мы можем просто установить их утилитой apt. Именно таким способом мы и устанавливали "весь" ROS ранее.
Посмотреть уже установленные пакеты ROS можно командой
apt list --installed | grep ros-noetic
Поиск пакета ROS
apt seach ros-noetic-Имя
Если вы нашли пакет pkg_name на wiki, то скорее всего в системе apt будет назваться ros-noetic-pkg_name
Установка нового пакета происходит стандартным способом
sudo apt install ros-noetic-pkg_name
Установка пакетов и исходного кода
Если пакет ROS доступен только в виде исходного кода, то мы тоже можем его установить (для этого чаще используют формулировку "собрать") на свой компьютер и начать его использовать.
Такая операция сложнее, чем использование установка через apt, но позволяет устанавливать любые пакеты, а не только те, которые уже были "собраны" заранее.
Убедитесь, что вы "правильно" установили ROS Установка и запуск ROS, выполнили часть "Настройка рабочего окружения" http://wiki.ros.org/ROS/Tutorials/InstallingandConfiguringROSEnvironment
Если все выполнено правильно, то у вас в домашней директории пользователя должна быть директория catkin_ws
Зайдем в директорию, где должны находиться исходные коды пакетов
cd ~/catkin_ws/src
Для демонстрации мы будем устанавливать наш тестовый пакет https://github.com/voltbro/ros_book_samples
Получим исходный код пакета
git clone https://github.com/voltbro/ros_book_samples
У нас должны получиться директория ros_book_samples с исходниками пакета.
Мы может "собрать" конкретно наш пакет командой
catkin_make --pkg=ros_book_samples
После этого мы увидим процесс сборки и установки пакета в систему. При сборке демонстрационного пакета будут добавлены новые типы сообщений, которые добавились с пакетом.
[ 0%] Built target std_msgs_generate_messages_cpp
[ 0%] Built target _ros_book_samples_generate_messages_check_deps_Barometer
[ 0%] Built target _ros_book_samples_generate_messages_check_deps_DoDishesResult
[ 0%] Built target actionlib_msgs_generate_messages_cpp
[ 0%] Built target _ros_book_samples_generate_messages_check_deps_DoDishesActionFeedback
[ 0%] Built target _ros_book_samples_generate_messages_check_deps_DoDishesFeedback
[ 0%] Built target _ros_book_samples_generate_messages_check_deps_AddTwoInts
[ 0%] Built target _ros_book_samples_generate_messages_check_deps_DoDishesActionGoal
[ 0%] Built target _ros_book_samples_generate_messages_check_deps_DoDishesActionResult
[ 0%] Built target _ros_book_samples_generate_messages_check_deps_DoDishesAction
[ 0%] Built target _ros_book_samples_generate_messages_check_deps_DoDishesGoal
[ 0%] Built target std_msgs_generate_messages_nodejs
[ 0%] Built target actionlib_msgs_generate_messages_nodejs
[ 0%] Built target std_msgs_generate_messages_lisp
[ 0%] Built target actionlib_msgs_generate_messages_lisp
[ 0%] Built target std_msgs_generate_messages_eus
[ 0%] Built target actionlib_msgs_generate_messages_eus
[ 0%] Built target std_msgs_generate_messages_py
[ 20%] Built target ros_book_samples_generate_messages_cpp
[ 20%] Built target actionlib_msgs_generate_messages_py
[ 37%] Built target ros_book_samples_generate_messages_nodejs
[ 57%] Built target ros_book_samples_generate_messages_eus
[ 77%] Built target ros_book_samples_generate_messages_lisp
[100%] Built target ros_book_samples_generate_messages_py
[100%] Built target ros_book_samples_generate_messages
Также мы можем пересобрать сразу все пакеты нашей рабочей директории командой
catkin_make
После сборки пакета проверим правильность его установки, например, командой
roscd ros_book_samples
Команда должны выполнится без ошибок, а мы должны перейти в директорию ~/catkin_ws/src/ros_book_samples
Установка пакета ROS из исходников завершена. Обычно для установки более сложный примеров разработчики формируют полные инструкции о том, как установить их пакет.
Утилита catkin
catkin это модуль, который служит для "сборки" пакетов. "Сборкой" называют ряд определенный действий по установке пакета в систему. Это могут быть операции копирования файлов, компиляция программ (например для языка С), генерации сообщений и т.д.
Для описания необходимый операция по установке, используется стандарт CMake (Cross Platform Make), а сама последовательность операций описана в файле CMakeLists.txt.
Стандарт CMake был изменен в ROS для создания системы сборки, более специфичной для нужд ROS, так появился catkin, который стал стандартом для ROS, начиная с версии Groovy
Навигация по файлам пакетов ROS
В ROS есть несколько консольных утилит, которые могу упростить навигацию по файлам разных пакетов.
Наиболее часто используемые утилиты rospack,rospcd, rosls
Например если мы хотим найти директорию с установленным пакетом turtlesim
rospack find turtlesim
То мы получим директорию установки пакета /opt/ros/noetic/share/turtlesim
Получить список файлов пакета rosls turtlesim
rosls turtlesim
===
cmake images msg package.xml srv
Перейти в директорию пакета
roscd turtlesim
pwd
Мы увидим, что находимся в директории пакета /opt/ros/noetic/share/turtlesim