ROS2

Материал из ALT Linux Wiki

ROS (Robot Operating System)Операционная система для роботов — это экосистема для программирования роботов, предоставляющая функциональность для распределённой работы. ROS был первоначально разработан в 2007 году под названием switchyard в Лаборатории Искусственного Интеллекта Стэнфордского Университета. В 2008 году развитие продолжается в Willow Garage, научно-исследовательском институте/инкубаторе робототехники, совместно с более чем двадцатью сотрудничающими институтами. [1]

C 2007 года произошло много изменений в робототехнике и сообществе ROS. Цель проекта ROS 2 - адаптироваться к этим изменениям, сохранив достоинства ROS 1 и исправив недостатки.

Установка

На момент создания этой страницы необходимые для установки ROS 2 пакеты созданы в процессе вступления в ALT Linux Team и (пока) не допущены в Sisyphus. По рекомендации инструкция по установке ROS 2 на основе этих пакетов публикуется на ALT Linux Wiki. Возможно, это будет полезно кому-либо.

Установка идёт по рецепту "Building from source", когда опакечен только инструментарий ROS, а сами пакеты ROS загружаются и автоматически собираются этим инструментарием (Для других официально поддерживаемых ROS дистрибутивов: рецепт для Ubuntu, рецепт для RHEL).

Добавление репозиториев задач с пакетами

# apt-repo add task 317325
# apt-repo add task 317354
# apt-get update

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

# apt-get install \
	cmake \
	patch \
	gcc-c++ \
	git \
	libstdc++-devel-static \
	pip \
	python3-module-pytest \
	python3-module-flake8 \
	python3-module-flake8-docstrings \
	python3-module-flake8-import-order \
	python3-module-mypy \
	python3-module-notify2 \
	python3-module-pytest \
	python3-module-pytest-repeat \
	python3-module-pytest-rerunfailures \
	python3-module-setuptools
# apt-get install \
	python3-module-colcon-common-extensions \
	python3-module-rospkg \
	python3-module-vcstool \
	rosdep

Загрузка исходного кода пакетов ROS 2

Создание workspace и клонирование репозиториев пакетов ROS 2.

$ mkdir -p ~/ros2_humble/src
$ cd ~/ros2_humble
$ vcs import --input https://raw.githubusercontent.com/ros2/ros2/humble/ros2.repos src

Установка пакетов-зависимостей с помощью rosdep

При настроенном sudo:

$ rosdep update
$ rosdep install --from-paths src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers ignition-math6 ignition-cmake2"

В отстуствие sudo:

# rosdep update
# rosdep install --from-paths /home/<имя_пользователя>/ros2_humble/src --ignore-src -y --skip-keys "fastcdr rti-connext-dds-6.0.1 urdfdom_headers ignition-math6 ignition-cmake2"
# rm -rf ~/.ros

Сборка кода ROS в workspace

$ cd ~/ros2_humble/
$ colcon build --symlink-install

Если ресурсы системы не велики (виртуальная машина или одноплатный компьютер), для ограничения количества одновременно собираемых пакетов для colcon build можно добавить опцию --parallel-workers <количество пакетов>, и следить за наличем в системе достаточной свободной памяти, при необходимости добавить swap. Сборку можно прервать (Ctrl+C) и перезапустить с новыми опциями. Для вывода в терминал лога компиллятора colcon build нужно добавить опцию --event-handlers console_direct+. Например:

$ colcon build --symlink-install --parallel-workers 1 --event-handlers console_direct+

Для сборки определённого ROS пакета добавьте опцию --packages-select <название пакета ROS>.

Настройка среды окружения

Для работы с пакетами, содержащимися в полученном workspace, выполните source следующего файла:

$ . ~/ros2_humble/install/local_setup.sh 

При частой работе с ROS эту команду можно разместить в ~/.bashrc, создать alias в ~/.bashrc или настроить специальный вызов терминала с выполнением этой команды вначале.

Запуск простейшего примера

В одном окне терминала запустите С++ talker:

$ . ~/ros2_humble/install/local_setup.bash
$ ros2 run demo_nodes_cpp talker

В другом окне терминала запустите Python Listener

$ . ~/ros2_humble/install/local_setup.bash
$ ros2 run demo_nodes_py listener

Вы должны увидеть, что talker сообщает, что публикует сообщения, а listener говорит, что их получает.

$ ros2 run demo_nodes_cpp talker
[INFO] [1684548966.316005384] [talker]: Publishing: 'Hello World: 1'
[INFO] [1684548967.405009930] [talker]: Publishing: 'Hello World: 2'
[INFO] [1684548968.484030516] [talker]: Publishing: 'Hello World: 3'
[INFO] [1684548969.567005999] [talker]: Publishing: 'Hello World: 4'
[INFO] [1684548970.659537722] [talker]: Publishing: 'Hello World: 5'
[INFO] [1684548971.751981133] [talker]: Publishing: 'Hello World: 6'
[INFO] [1684548972.819593271] [talker]: Publishing: 'Hello World: 7'
$ ros2 run demo_nodes_py listener
[INFO] [1684548966.356507779] [listener]: I heard: [Hello World: 1]
[INFO] [1684548967.407002517] [listener]: I heard: [Hello World: 2]
[INFO] [1684548968.486265827] [listener]: I heard: [Hello World: 3]
[INFO] [1684548969.569117162] [listener]: I heard: [Hello World: 4]
[INFO] [1684548970.661470457] [listener]: I heard: [Hello World: 5]
[INFO] [1684548971.753917595] [listener]: I heard: [Hello World: 6]
[INFO] [1684548972.821490540] [listener]: I heard: [Hello World: 7]