在当今的机器人技术和自动化系统中,快速、可靠的消息传递机制是实现高效通讯的关键。作为优秀的机器人操作系统,ROS2引入了先进的通讯机制和架构设计,其中,通过配置可以使用Fast DDS (原Fast RTPS) Discovery Server作为发现协议,为ROS2系统中的节点发现和消息传递提供了一种更加高效和可靠的方法。
Fast DDS Discovery Server是由eProsima公司开发的一种基于DDS (Data Distribution Service)协议的通讯架构。在传统的Pub/Sub模型中,节点发现通常采用广播或多播的方式来进行,当系统规模增大时,这种方式将导致网络上的广播风暴,从而影响通信效率和稳定性。而Discovery Server则改变了这一模式,通过一个或多个中心服务器来管理节点的发现过程,从而大幅减少网络上的发现消息,提高整个系统的可扩展性和效率。
本文旨在解析Fast DDS Discovery Server的原理、特点以及如何在ROS2中使用它来优化节点发现和数据通信。
在Fast DDS Discovery Server架构中,Discovery Server负责收集系统中所有节点的信息,并维护这些信息。当一个新节点加入时,它只需要与Discovery Server交换其元数据,而不是与每个现有节点单独交换,这降低了网络带宽的使用率和系统的总体负载。此外,当节点需要相互通信时,它们可以通过查询Discovery Server来获取对方的信息,然后直接建立通信连接。
基于以上架构,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 服务器-客户端发现辅助生成器工具版本 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
在另外三个Terminal窗口中,分别执行:
# 第一个窗口
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
其中,窗口一会接收窗口二的消息,窗口三会接收窗口四的消息。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。