前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ROS2使用 Fast DDS Discovery Server 作为发现协议

ROS2使用 Fast DDS Discovery Server 作为发现协议

原创
作者头像
buzzfrog
发布2024-02-02 10:52:39
4075
发布2024-02-02 10:52:39
举报
文章被收录于专栏:云上修行云上修行

背景

在当今的机器人技术和自动化系统中,快速、可靠的消息传递机制是实现高效通讯的关键。作为优秀的机器人操作系统,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工作原理

在Fast DDS Discovery Server架构中,Discovery Server负责收集系统中所有节点的信息,并维护这些信息。当一个新节点加入时,它只需要与Discovery Server交换其元数据,而不是与每个现有节点单独交换,这降低了网络带宽的使用率和系统的总体负载。此外,当节点需要相互通信时,它们可以通过查询Discovery Server来获取对方的信息,然后直接建立通信连接。

基于以上架构,Fast DDS具有以下特点:

  1. 提高可扩展性:通过集中化的节点发现机制,能有效管理成百上千的节点,极大提高了系统的可扩展性。
  2. 减少资源消耗:减少了网络上的广播和多播消息,显著降低了带宽和处理资源的消耗。
  3. 支持复杂网络拓扑:能够支持多种网络结构,并在复杂的网络环境中稳定运行,如跨子网工作。
  4. 高度灵活和配置性:提供了丰富的配置选项,用户可以根据自己的需求进行详细的设置,以适应不同的应用场景。

实操案例

环境

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

代码语言: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可以获得它的使用说明。

代码语言:bash
复制
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窗口中,分别执行:

代码语言:bash
复制
# 第一个窗口
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
代码语言:bash
复制
# 第二个窗口
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
代码语言:bash
复制
# 第三个窗口

ros2 run demo_nodes_cpp listener --ros-args --remap __node:=simple_listener
代码语言:bash
复制
# 第四个窗口

ros2 run demo_nodes_cpp talker --ros-args --remap __node:=simple_talker

其中,窗口一会接收窗口二的消息,窗口三会接收窗口四的消息。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
  • Fast DDS Discovery Server工作原理
  • 实操案例
    • 环境
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档