В современных системах робототехники и автоматизации быстрые и надежные механизмы обмена сообщениями являются ключом к эффективной коммуникации. Будучи превосходной операционной системой для роботов, ROS2 представляет расширенные механизмы связи и архитектуру. Среди них сервер обнаружения Fast DDS (ранее Fast RTPS) может использоваться в качестве протокола обнаружения посредством настройки, обеспечивая возможность обнаружения узлов и доставки сообщений в сети. Система ROS2 более эффективный и надежный метод.
Fast DDS Discovery Server — это коммуникационная архитектура, основанная на протоколе DDS (служба распространения данных), разработанная eProsima. В традиционной модели Pub/Sub обнаружение узлов обычно выполняется посредством широковещательной или многоадресной рассылки. Когда масштаб системы увеличивается, этот метод приведет к широковещательным штормам в сети, что повлияет на эффективность и стабильность связи. Discovery Server меняет эту модель и управляет процессом обнаружения узлов через один или несколько центральных серверов, тем самым значительно сокращая количество сообщений об обнаружении в сети и улучшая масштабируемость и эффективность всей системы.
Целью этой статьи является анализ принципов и характеристик сервера Fast DDS Discovery и способов его использования в ROS2 для оптимизации обнаружения узлов и передачи данных.
В архитектуре Fast DDS Discovery Server Discovery Server отвечает за сбор информации обо всех узлах системы и поддержание этой информации. Когда присоединяется новый узел, ему необходимо обмениваться метаданными только с Discovery Server, а не с каждым существующим узлом по отдельности, что снижает использование полосы пропускания сети и общую нагрузку на систему. Кроме того, когда узлам необходимо взаимодействовать друг с другом, они могут получить информацию друг о друге, запросив сервер Discovery, а затем напрямую установить коммуникационное соединение.
На основе описанной выше архитектуры Fast DDS имеет следующие характеристики:
ubuntu Сервер 20.04, установлена ROS2 galacticВерсия。(еслииспользоватьsudo apt install ros-galactic-desktopУстановитьROS2,Вы можете напрямую выполнить следующее руководство,еслииспользоватьsudo apt install ros-galactic-ros-baseУстановитьROS2,则需要额外Установитьsudo apt install ros-galactic-rmw-fastrtps-cpp)
существовать~/.bashrcДобавьте строку в:source /opt/ros/galactic/setup.bash
ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:56ff:fef2:94b9 prefixlen 64 scopeid 0x20<link>
ether 02:42:56:f2:94:b9 txqueuelen 0 (Ethernet)
RX packets 19113 bytes 11375364 (11.3 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2179 bytes 352756 (352.7 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 549822 bytes 172821223 (172.8 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 549822 bytes 172821223 (172.8 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vethe0caf8a: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::78fe:72ff:fe94:db60 prefixlen 64 scopeid 0x20<link>
ether 7a:fe:72:94:db:60 txqueuelen 0 (Ethernet)
RX packets 19123 bytes 11643286 (11.6 MB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 2256 bytes 361105 (361.1 KB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlp0s20f3: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.15.37 netmask 255.255.252.0 broadcast 172.16.15.255
inet6 fe80::3fc3:8152:fab9:bccb prefixlen 64 scopeid 0x20<link>
ether 4c:03:4f:65:86:cd txqueuelen 1000 (Ethernet)
RX packets 4739660 bytes 4342172075 (4.3 GB)
RX errors 0 dropped 12908 overruns 0 frame 0
TX packets 1188329 bytes 311106346 (311.1 MB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
fastdds discovery --server-id 0
Примечание: fastdds Discovery --help может получить инструкции по использованию.
eProsima Версия инструмента Server-Client Discovery Assistant Builder 1.0.0
Как использовать: fastdds discovery -i {0-255} [необязательный параметр]
Распространенные варианты:
-h --help Отображение справочной информации.
-i --server-id Обязательный уникальный идентификатор сервера. Указать ROS_DISCOVERY_SERVER Местоположение сервера, отсчитываемое от нуля, в переменной среды.
-l --ip-address Интерфейс, выбранный сервером для прослушивания клиентов. По умолчанию любое (0.0.0.0).
-p --port Выбранный клиент для прослушивания UDP порт. По умолчанию 11811
-b --backup Создание сервера, связанного с файлом резервной копии.
Пример:
1. использовать id для 0 Запуск сервера по умолчанию (ROS_DISCOVERY_SERVER первый включен)
Слушайте все доступные интерфейсы UDP порт 11811. На каждой машине может быть только один
Сервер использует значение по умолчанию.
$ fastdds discovery -i 0
2. использовать id для 1 Запуск сервера по умолчанию (ROS_DISCOVERY_SERVER второй)
существовать localhost Монитор включен,ииспользовать UDP порт 14520. только localhost клиент
能够использовать ROS_DISCOVERY_SERVER=;127.0.0.1:14520 Достичь сервера
$ fastdds discovery -i 1 -l 127.0.0.1 -p 14520
3. использовать id для 3 Запуск сервера по умолчанию (ROS_DISCOVERY_SERVER третий выше)
соответственносуществовать Wi-Fi (192.168.36.34) Сумма Ethernet (172.20.96.1) локальный
Слушайте интерфейс, UDP портсоответственнодля 8783 и 51083
(Адрес ипорт был составлен для примера).
$ fastdds discovery -i 1 -l 192.168.36.34 -p 14520 -l 172.20.96.1 -p
51083
4. использовать id для 4 Запуск сервера по умолчанию (ROS_DISCOVERY_SERVER четвертый выше)
существовать 172.30.144.1 Слушай, UDP портдля 12345 и обеспечивает
документы. Если сервер выйдет из строя, он автоматически возобновит свою работу.
предыдущее состояние.
$ fastdds discovery -i 1 -l 172.30.144.1 -p 12345 -b
В трех других окнах терминала выполните:
# первое окно
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
export ROS_DOMAIN_ID=0 # Нет необходимости писать
export ROS_DISCOVERY_SERVER=172.16.15.37:11811
ros2 run demo_nodes_cpp listener --ros-args --remap __node:=listener_discovery_server
# второе окно
export RMW_IMPLEMENTATION=rmw_fastrtps_cpp
export ROS_DOMAIN_ID=0 # Нет необходимости писать
export ROS_DISCOVERY_SERVER=172.16.15.37:11811
ros2 run demo_nodes_cpp talker --ros-args --remap __node:=talker_discovery_server
# третье окно
ros2 run demo_nodes_cpp listener --ros-args --remap __node:=simple_listener
# четвертое окно
ros2 run demo_nodes_cpp talker --ros-args --remap __node:=simple_talker
Среди них первое окно будет получать сообщения из второго окна, а третье окно будет получать сообщения из четвертого окна.