
Введение
В данной статье мы опишем процесс установки ROS2 на Raspberry Pi.
ROS (Robot Operating System) — это фреймворк с открытым исходным кодом, предназначенный для разработки программного обеспечения для роботов. Это набор инструментов, библиотек и соглашений, которые помогают разработчикам создавать сложные и надежные роботизированные приложения. ROS 2 — это второе поколение ROS, в нём устранены недостатки оригинальной системы и расширены возможности.
Raspberry Pi — это малогабаритный одноплатный компьютер с богатым набором интерфейсов, хорошо подходящий для широкого круга задач, например, для прототипирования робототехнических систем, в частности — хорошо интегрируется с ROS 2.
Наши исходные параметры
одноплатный компьютер — Raspberry Pi 5 8Gb;
операционная система — Raspberry Pi OS (Debian Bookworm 12);
версия / релиз ROS — ROS 2 Jazzy Jalisco.
Выбор конфигурации
Raspberry Pi предоставляет богатый выбор операционных систем для установки:
Raspberry Pi OS на базе Debian Bookworm/Bullseye;
Ubuntu;
Apretis (на базе Debian);
RISC OS Pi;
Ultramarine Linux (на базе Fedora);
Bass OS;
Armbian OS;
другие.
В ROS 2 платформы / операционные системы разделены на три уровня (Tiers) поддержки в зависимости от степени стабильности, качества поддержки и тестирования. Эти уровни помогают разработчикам понимать, насколько надёжно ROS 2 будет работать на той или иной платформе (источник):
Tier 1 / Уровень 1
Платформы этого уровня регулярно подвергаются тестированию. Ошибки или баги, обнаруженные в работе ROS на таких платформах, приоритетно исправляются командой разработчиков. Разработчики ROS стремятся устранить все известные высокоприоритетные ошибки до выпуска новых версий.
На таких платформах ROS 2 официально протестирован и гарантированно будет работать.
Tier 2 / Уровень 2
Платформы этого уровня подлежат периодическому тестированию. В выпущенных версиях продукта могут присутствовать ошибки. Известные ошибки будут устраняться в зависимости от доступности ресурсов команды разработчиков ROS и могут быть исправлены или не исправлены до выпуска новой версии. Чтобы оказаться на данном уровне одна или несколько организаций должны взять на себя обязательство продолжать поддержку платформы.
На таких платформах ROS 2 не прошёл полный цикл тестирования, но, скорее всего, будет работать стабильно.
Tier 3 / Уровень 3
Платформы этого уровня — такие, для которых отчёты сообщества указывают на то, что релиз функционален. Команда разработчиков ROS не проводит каких-либо тестов данных платформ. Инструкции по установке должны быть доступны и актуальны, чтобы платформа могла быть указана для данного уровня. Члены сообщества могут оказывать помощь с этими платформами.
На таких платформах ROS 2 будет собран, но стабильная работа не гарантирована.
Как видно, наиболее надежный с точки зрения поддержки — Tier 1 / Уровень 1.
Согласно официальной документации:
Ubuntu относится к Уровню 1
Debian Bookworm/Bullseye относится к Уровню 3
В то же время, в нашем проекте следует учитывать и особенности среды, в которой мы планируем выполнять установку, а именно — Raspberry Pi. Исходя из этого, перед нами также стоит задача экономии ресурсов.
В качестве компромиссного решения нами была выбрана следующая конфигурация программного обеспечения:
Raspberry Pi OS на базе Debian Bookworm 64 — в силу того, что это официальная сборка операционной системы под Raspberry Pi, рекомендованная вендором и учитывающая особенности Raspberry Pi, оптимизирующая потребление ресурсов.
Docker — для запуска контейнеров; позволит изолировать использование ROS от Debian платформы и использовать версию, ориентированную на Tier 1.
ROS2 jazzy Docker image — образ для развёртывания / установки Docker-платформы.
Подготовка Raspberry Pi
Подключили к ПК запоминающее устройство (SD/SSD-карту)
C официального сайта скачали Raspberry Pi Imager:

3. После загрузки запустили приложение и указали в качестве устройства имеющуюся версию Raspberry Pi (в нашем случае — Raspberry Pi 5):

4. После выбора устройства, перешли к пункту выбора ОС, где из предложенного списка выбрали актуальную версию сборки Raspberry Pi OS (она отмечена меткой Recommended):

5. После выбора ОС указали запоминающее устройство, которое использовалось в качестве носителя ОС:

6. После указания всех параметров перешли к следующему этапу настройки нажатием кнопки «Далее».
Приложение-установщик предложило задать дополнительные параметры — это ещё одно из преимуществ работы с Raspberry Pi OS — возможность сконфигурировать «на лету» настройки желаемой сети, ssh и прочее.
Вкладка «Общие» содержит:
настройки хоста:
Имя — по умолчанию значение raspberrypi.local;
Параметры доступа — логин / пароль.
Настройки доступной Wi-Fi сети, к которой Raspberry будет подключаться по умолчанию:

Вкладка «Службы» содержит настройки SSH, в частности — конфигурацию доступа. Она возможна по логину и паролю, указанным на предыдущем шаге (в предыдущей вкладке), либо с помощью ключа, который можно сгенерировать нажав соответствующую кнопку:

7. Когда все настройки были заданы нажали кнопку «Да»:

8. Приложение скачало выбранную ранее версию ОС, установило на выбранный диск и применило дополнительные параметры; после чего накопитель переключили в Raspberry Pi.

Изначально, загруженная ОС работала в режиме терминала и мы установили SSH соединение с Raspberry Pi, используя конфигурацию заданную на этапе загрузки образа на накопитель (см. предыдущие шаги). Для SSH соединения подходит любой клиент, например PuTTy:

Для дальнейшей работы нам потребовалось использование VNC. Raspberry Pi OS поддерживает VNC и, чтобы включить его использование, окне терминала выполнили команду:
sudo raspi-config
В открывшемся меню выбрали:
Interface Options ‑> VNC ‑> Enable

После того как система завершила необходимые действия по настройке VNC, перезагрузили ОС:
sudo reboot
После этого Raspberry Pi OS стала готовой к работе с VNC клиентами. Каких-либо значимых ограничений нет и подходит любой VNC клиент, например, RealVNC Viewer.
При первом запуске система попросила указать дополнительную конфигурацию:
Настройки локализации (язык, часовой пояс, раскладка клавиатуры);
Параметры учетной записи (имя пользователя и пароль);
Желаемая Wi-Fi сеть (из списка).
По завершению, система проверила обновления, и стала полностью готовой к работе.
Установка Docker
Docker позволил нам запускать ROS в изолированных контейнерах, игнорируя особенности «окружающей среды».
Следуя официальной документации для установки Docker на дистрибутив Debian выполнили следующие команды:
1. Настройка apt репозитория Docker:
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
2. Установка основных пакетов Docker:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
3. Проверка работоспособности (опционально):
Для проверки того, что Docker успешно установлен, мы использовали стандартный образ «hello world», выполнив следующую команду:
sudo docker run hello-world
Docker скачал данный образ (поскольку использовался впервые) и запустил. В результате исполнения мы увидели следующее:

Это означало, что Docker работает!
Из полезного также в окне, в пункте 2 мы увидели текущую архитектуру — arm64v8. Это полезно знать, поскольку есть образы платформозависимые.
Установка ROS2
Теперь все было готово для установки ROS2!Мы использовали текущую LTS версию. Согласно официальной документации на момент установки — это Jazzy Jalisco.
Для установки ROS2 Jazzy Jalisco мы использовали образ ros:jazzy, поскольку он поддерживает нашу платформу — arm64v8:
sudo docker run -it --rm ros:jazzy
Для проверки готовности ROS2 к работе мы использовали Turtlesim.
Turtlesim — это демонстрационный пакет для ROS2 в виде 2-D симуляционной среды. Она представляет собой окно с полем, на котором находится черепашка. Черепашка симулирует поведение дрона / робота, её можно перемещать по полю. При этом, для взаимодействия с черепашкой используются базовые механизмы ROS2. Turtlesim показывает, как при помощи ROS2 можно организовать управление дроном / роботом.
Для запуска Turtlesim подготовили Dockerfile:
FROM ros:jazzy
SHELL ["/bin/bash", "-c"]
WORKDIR /app
RUN apt-get update && apt-get install -y \
ros- ${ROS_DISTRO}-turtlesim
CMD ["bash"]
Данный образ использовал ros:jazzy и после запуска выполнил загрузку пакета turtlesim для целевого релиза ROS.
Turtlesim использует GUI для работы с ROS2 GUI и существует несколько подходов -- https://wiki.ros.org/docker/Tutorials/GUI.
Мы следовали простому подходу и собрали Docker образ из ранее подготовленного файла:
sudo docker build --tag 'test1'
Отключили контроль доступа для X11 сервера, чтобы предоставить доступ к дисплею (это небезопасный способ, который использовался в тестовых целях; более продвинутые и безопасные подходы смотри по ссылке выше):
xhost +
Запустили подготовленный Docker образ:
sudo docker run -it --privileged --net=host --device /dev/dri --env="DISPLAY" --env="QT_X11_NO_MITSHM=1" --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" --rm 'test1'
После запуска контейнера для запуска пакета Turtlesim выполнили следующую команду:
ros2 run turtlesim turtlesim_node & ros2 run turtlesim turtle_teleop_key
Она запустила 2 узла (node) ROS2:
Turtlesim_node — узел, эмулирующий передвижения робота;
Turtle_teleop_key — узел, принимающий сигналы управления (в нашем случае в качестве управления использовалась клавиатура).
На видео демонстрируется работа двух узлов, работающих вместе и обменивающихся информацией \ сигналами с помощью средств ROS2:
Заключение
В данной статье мы описали наш процесс настройки Raspberry Pi, установки и подготовки к работе ROS2 Jazzy Jalisco.
Установка и настройка ROS2 открыли для нас путь к запуску и тестированию выбранных SLAM методов.
В следующий раз мы планируем рассказать о ключевых элементах ROS, таких как: узлы (node), конвейеры сообщений (pipeline) и других. Также разберём какие функции выполняют эти компоненты в ROS и как взаимодействуют между собой.