Настройки сети ROS
Удалённое подключение к ROS
Архитектура ROS позволяет подключать множество сетевых устройств в одну ROS-сеть. В этом режиме любое устройство имеет доступ к данным других устройств. Например, вы можете объединить настольный компьютер и робот в одну сеть и работать с ними удалённо.
В таком режиме удобно на компьютере запускать программы визуализации, такие как rviz, или ресурсоёмкие процессы.
Что такое DDS
В ROS 2 обмен данными между узлами (нодами) построен на технологии DDS (Data Distribution Service) — промышленном стандарте передачи данных в распределённых системах. DDS отвечает за то, чтобы топики, сервисы и экшены работали «из коробки» без необходимости вручную настраивать транспорт. Когда один узел публикует сообщение, DDS автоматически находит всех подписчиков в сети и доставляет им данные, обеспечивая надёжную и предсказуемую связь.
ROS 2 поддерживает несколько реализаций DDS от разных производителей: FastDDS, CycloneDDS и другие. Каждая из них имеет свои особенности по производительности и настройке. На роботе TurtleBro 2 используется FastDDS — реализация с открытым исходным кодом от компании eProsima, которая является DDS по умолчанию в ROS 2 Jazzy и совместима с microROS.
Режимы работы FastDDS
FastDDS поддерживает два основных режима обнаружения участников сети: Simple Discovery и Discovery Server. Они определяют, каким образом узлы ROS 2 находят друг друга при запуске. Выбор режима напрямую влияет на стабильность работы, объём служебного трафика и удобство настройки, особенно когда робот работает по WiFi или в одной сети с другими роботами.
Simple Discovery — режим по умолчанию в ROS 2. В этом режиме каждый узел периодически рассылает широковещательные (multicast) пакеты в локальную сеть, сообщая о своём существовании. Все остальные узлы принимают эти объявления и автоматически устанавливают связь. Режим не требует никакой дополнительной настройки — достаточно, чтобы все устройства находились в одной подсети и имели одинаковое значение ROS_DOMAIN_ID. Это удобно для быстрого старта и отладки на одном компьютере.
Однако у Simple Discovery есть существенные ограничения. Multicast-трафик плохо работает через WiFi-маршрутизаторы — пакеты могут теряться или блокироваться. В учебном классе, где одновременно работают несколько роботов, широковещательные объявления от всех устройств создают лишнюю нагрузку на сеть и приводят к тому, что узлы одного робота могут «видеть» узлы другого, если значение ROS_DOMAIN_ID совпадает.
Discovery Server решает эти проблемы. В этом режиме один из участников сети назначается сервером обнаружения — остальные узлы подключаются к нему напрямую по заданному IP-адресу и порту. Multicast-рассылка не используется, весь обмен служебной информацией идёт через сервер. Это делает работу по WiFi стабильной и предсказуемой, а узлы разных роботов полностью изолированными друг от друга, поскольку каждый робот использует свой собственный Discovery Server.
На роботе TurtleBro 2 по умолчанию используется режим Discovery Server. Бортовой компьютер робота выступает сервером обнаружения, а все ROS-узлы (включая microROS на контроллере) подключаются к нему как клиенты. Для подключения удалённого компьютера к роботу достаточно указать IP-адрес робота в конфигурационном файле FastDDS и задать переменную окружения.
Настройка робота для работы с Discovery Server
Основные настройки находятся в файле /home/pi/.ros_params.
К настройке работы по сети относятся несколько переменных окружения.
# Установка ROS_DOMAIN_ID для режима Simple Discovery
export ROS_DOMAIN_ID=1
# Определение типа DDS
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
# Подключение файла конфигурации для режима Discovery Server
export FASTRTPS_DEFAULT_PROFILES_FILE=/home/pi/.ros/fastdds_superclient.xml
Если установлено значение FASTRTPS_DEFAULT_PROFILES_FILE, то робот работает в режиме Discovery Server. Если эту строчку закомментировать, робот будет работать в режиме Simple Discovery.
Настройка рабочего места для подключения к сети ROS
Чтобы ваш компьютер мог видеть топики, сервисы и узлы робота, его необходимо подключить к Discovery Server, который работает на бортовом компьютере робота. Существует два способа это сделать: через XML-файл конфигурации FastDDS или через переменные окружения ROS 2.
Способ 1: XML-файл конфигурации (рекомендуемый)
Скачайте готовый файл конфигурации с настройками Super Client:
wget https://raw.githubusercontent.com/voltbro/turtlebro2/refs/heads/jazzy/extra/fastdds_superclient.xml
Откройте скачанный файл fastdds_superclient.xml в текстовом редакторе. Ключевые параметры, которые нужно понимать:
- Тег
<discovery_protocol>SUPER_CLIENT</discovery_protocol>— определяет роль вашего компьютера в сети. ЗначениеSUPER_CLIENTозначает, что ваш компьютер будет подключаться к Discovery Server как привилегированный клиент, который видит все топики и сервисы. ОбычныйCLIENTвидит только те узлы, с которыми он обменивается данными напрямую. - Тег
<leaseDuration>— задаёт время аренды (в секундах и наносекундах), в течение которого сервер считает клиента активным. По умолчанию установлено 60 секунд. Если клиент не отправляет сигналы в течение этого времени, сервер считает его отключённым. - Блок
<RemoteServer>— содержит адрес и порт Discovery Server, к которому нужно подключиться.
Найдите в файле строку с адресом сервера и замените 127.0.0.1 на IP-адрес вашего робота в сети:
<address>192.168.1.10</address>
<port>11811</port>
Порт 11811 является стандартным портом FastDDS Discovery Server и обычно не требует изменения.
Примените конфигурацию, задав переменную окружения в терминале:
export FASTRTPS_DEFAULT_PROFILES_FILE=./fastdds_superclient.xml
INFO Чтобы не вводить эту команду каждый раз при открытии нового терминала, добавьте её в файл
~/.bashrc, указав полный путь до XML-файла:echo 'export FASTRTPS_DEFAULT_PROFILES_FILE=/полный/путь/до/fastdds_superclient.xml' >> ~/.bashrc
Способ 2: Переменные окружения (быстрый)
Если вам не нужна тонкая настройка параметров DDS, можно подключиться к Discovery Server без XML-файла, используя только переменные окружения ROS 2:
export ROS_DISCOVERY_SERVER="192.168.1.10:11811"
export ROS_SUPER_CLIENT=TRUE
Переменная ROS_DISCOVERY_SERVER указывает адрес и порт Discovery Server (бортового компьютера робота). Переменная ROS_SUPER_CLIENT со значением TRUE переводит узел в режим Super Client, что позволяет видеть все топики и сервисы в сети, аналогично настройке через XML.
Этот способ удобен для быстрой проверки связи или временной работы с роботом, когда не требуется изменять параметры аренды, таймауты и другие расширенные настройки FastDDS.
Проверка подключения
Независимо от выбранного способа, выполните тестовую команду:
ros2 topic list
Если подключение настроено правильно, вы увидите список топиков робота. Если список пуст, попробуйте перезапустить ROS-демон, который может хранить устаревший кеш обнаружения:
ros2 daemon stop
Также для режима отладки вы можете откдючить использование кеширования списка топиков, и увеличть время на полечение данных до 5 секунд.
ros2 topic list --no-daemon --spin-time 5
После этого повторите команду ros2 topic list.
Работа без Discovery Server
При необходимости вы можете переключить робота в режим Simple Discovery — например, для отладки на одном компьютере без сети или для работы в среде, где multicast работает стабильно.
Отключение на роботе
Откройте файл настроек окружения на роботе:
nano /home/pi/.ros_params
Закомментируйте или удалите строку, подключающую XML-конфигурацию:
# export FASTRTPS_DEFAULT_PROFILES_FILE=/home/pi/.ros/fastdds_superclient.xml
Остальные переменные (ROS_DOMAIN_ID, RMW_IMPLEMENTATION) оставьте без изменений. После сохранения файла перезапустите робота, чтобы изменения вступили в силу:
sudo reboot
Отключение на рабочем компьютере
Если вы ранее настраивали подключение к Discovery Server на своём компьютере, эти настройки также необходимо убрать.
Если вы использовали XML-файл — удалите переменную окружения из текущей сессии и из ~/.bashrc:
unset FASTRTPS_DEFAULT_PROFILES_FILE
Если вы использовали переменные окружения — сбросьте их:
unset ROS_DISCOVERY_SERVER
unset ROS_SUPER_CLIENT
Настройка ROS_DOMAIN_ID
WARNING В режиме Simple Discovery все устройства в одной сети с одинаковым
ROS_DOMAIN_IDбудут видеть друг друга. Это означает, что если в классе работает несколько роботов и на всех установлен одинаковыйROS_DOMAIN_ID, их узлы будут пересекаться.
По умолчанию значение ROS_DOMAIN_ID на роботе устанавливается согласно номеру на наклейке, расположенной на Ethernet-разъёме Raspberry Pi. Чтобы роботы не мешали друг другу в режиме Simple Discovery, каждому роботу нужно назначить уникальный идентификатор домена. При необходимости вы можете изменить значение в файле /home/pi/.ros_params:
export ROS_DOMAIN_ID=5
На рабочем компьютере установите такое же значение:
export ROS_DOMAIN_ID=5
INFO Допустимые значения
ROS_DOMAIN_ID— от 0 до 101. Значение 0 используется по умолчанию в ROS 2, поэтому рекомендуется выбирать значения от 1 и выше, чтобы избежать конфликтов с другими ROS-устройствами в сети.
Если вы работаете в режиме Simple Discovery, то важно, чтобы ROS_DOMAIN_ID также был верно установлен на системной плате с microROS. Для этого существует ROS-сервис /domain_id:
ros2 service call /domain_id turtlebro/srv/DomainIDService "set_domain_id:
data: 5"
В ответ вы получите подтверждение с установленным значением:
response:
turtlebro.srv.DomainIDService_Response(have_domain_id=std_msgs.msg.UInt16(data=5))
После установки ROS_DOMAIN_ID на системной плате её необходимо перезагрузить.