概要:这篇内容主要介绍使用快速DDS查找服务作为查找协议(社区贡献)

环境:ubuntu20.04,ros2-foxy,vscode

最后如果没有陈述实操过程中碰到问题的话,则表示该章节都可被本人正常复现

4.2使用快速DDS查找服务作为查找协议(社区贡献)(原文:https://docs.ros.org/en/foxy/Tutorials/Discovery-Server/Discovery-Server.html

>>教程>>使用快速DDS查找服务作为查找协议(社区贡献)

你正阅读的是ros2较老版本(Foxy),但仍然支持的说明文档.想查看最新版本的信息,请看galactic版本链接( https://docs.ros.org/en/galactic/Tutorials.html

使用快速DDS查找服务作为查找协议(社区贡献)

目标:这节课展示的是如何使用快速DDS查找服务目录协议来启动ros2节点.

课程等级:中级(提高篇)

时长:20min

目录

1.背景
2.快速DDS查找服务v2
3.预备知识
4.跑教程
4.1设置发现服务器
4.2启动listener服务
4.3启动talker服务
4.4演示执行发现服务器
4.5可视化工具rqt_graph
5.高级应用案例
5.1冗余服务器
5.2备份服务器
5.3分区查找
6.对比快速DDS查找服务和一般查找协议

1.背景

ros2 Eloquent Elusor版本开始,快速DDS发现服务器协议提供了一个集中式动态发现机制,而不是DDS默认使用的分布式机制。本教程解释了如何使用快速DDS发现服务器功能作为发现通信,运行一些ROS2案例。

为了获得关于可用发现配置的更多信息,请查看以下文档(https://fast-dds.docs.eprosima.com/en/v2.1.0/fastdds/discovery/discovery.html)或阅读Fast DDS discovery Server特定文档(https://fast-dds.docs.eprosima.com/en/v2.1.0/fastdds/discovery/discovery_server.html#discovery-server)。

简单发现协议(https://fast-dds.docs.eprosima.com/en/v2.1.0/fastdds/discovery/simple.html)是DDS标准(https://www.omg.org/omg-dds-portal/)中定义的标准协议。然而,在某些情况下,它也有缺点。

*它不能有效地扩展,因为随着新节点的增加,交换数据包的数量显著增加。

*它需要多播功能,但在某些场景下可能无法可靠工作,例如WiFi。

快速DDS发现服务器提供了一个客户机-服务器体系结构,允许节点通过一个中间服务器相互连接。每个节点作为一个发现客户端,与一个或多个发现服务器共享其信息,并从服务器接收发现信息。这减少了与发现相关的网络流量,并且不需要多播功能。


为了在网络上创建冗余并避免出现单点故障,这些发现服务器可以是独立的、重复的或彼此连接的。

2.快速DDS查找服务v2

最新的ROS2 foxxy Fitzroy版本(2020年12月)包括一个新版本,快速DDS发现服务器的版本2。这个版本包括一个新的过滤器特性,进一步减少了发送的发现消息的数量。这个版本使用不同节点的话题来决定两个节点是否希望通信,或者它们是否可以不匹配(即不发现彼此)。发现消息减少的情况如下图所示:


这种体系结构极大地减少了服务器和客户机之间发送的消息数量。下图显示了RMF Clinic demonstration(https://github.com/osrf/rmf_demos#Clinic-World)在发现阶段的网络流量减少情况:

为了使用该功能,可以使用participantXML配置(https://fast-dds.docs.eprosima.com/en/v2.1.0/fastdds/discovery/discovery_server.html#discovery-server)对发现服务器进行配置。还可以使用fastdds工具(https://fast-dds.docs.eprosima.com/en/v2.1.0/fastddscli/cli/cli.html#discovery)和环境变量对发现服务器进行配置,这是本教程中使用的方法。有关发现服务器配置的更详细说明,请访问Fast DDS discovery server文档(https://fast-dds.docs.eprosima.com/en/v2.1.0/fastdds/discovery/discovery_server.html#discovery-server)。

3.预备知识

本教程假设你已经安装了ROS 2 Foxy(或更新版本)。如果你安装使用的是低于FoxyROS2版本,则不能使用fastdds工具。因此,为了使用Discovery Server,您可以更新存储库以使用不同的Fast DDS版本,或者使用Fast DDS XML QoS配置(https://fast-dds.docs.eprosima.com/en/v2.1.0/fastdds/discovery/discovery_server.html#discovery-server)对发现服务器进行配置。

4.跑教程

ROS2案例talker-listener里创建一个talker节点,该节点每秒发布一个“hello world”消息,并创建一个listener节点来侦听这些消息。

通过source一下ROS2环境变量,将获得CLI工具fastdds。此工具提供对发现工具(https://fast-dds.docs.eprosima.com/en/v2.1.0/fastddscli/cli/cli.html#discovery)的访问权,该工具可用于启动发现服务器。该服务器将管理连接到它的节点的发现过程。

重要的

每新开一个终端,别忘了source一下环境变量.

4.1设置发现服务器

首先启动id0、端口为11811(默认端口)的发现服务器,并侦听所有可用的接口。

打开终端,运行:

fastdds discovery server-id 0

4.2启动listener服务

执行listener,以侦听/chatter主题。

在新终端中,将环境变量ROS_DISCOVERY_SERVER设置为发现服务器所在位置。(别忘在每一个新终端source一下ROS 2环境变量)

export ROS_DISCOVERY_SERVER=127.0.0.1:11811

启动 listener节点。使用参数—remap node:=listener_discovery_server来更改本教程中节点的名称。

 

ros2 run demo_nodes_cpp listener ros-args remap node:=listener_discovery_server

这将创建一个ROS2节点,该节点将自动为发现服务器创建一个客户机,并连接到之前创建的服务器以执行发现,而不是使用多播。

4.3启动talker服务

打开一个新终端,并像前面一样设置ROS_DISCOVERY_SERVER环境变量,以便节点启动发现客户端。

export ROS_DISCOVERY_SERVER=127.0.0.1:11811
ros2 run demo_nodes_cpp talker ros-args remap node:=talker_discovery_server

 

你现在应该看到talker发布“hello world”消息,而listener接收这些消息。

 

4.4演示执行发现服务器

 

到目前为止,还没有证据表明这个例子和标准的talker-listener例子的运行方式不同。要清楚地演示这一点,请运行未连接到发现服务器的另一个节点。在新的终端中运行一个新的listener(默认情况下侦听/chatter话题),并检查它是否连接到已经运行的talker

ros2 run demo_nodes_cpp listener ros-args remap node:=simple_listener

新的listener节点不应该收到“hello world”消息。

为了最终验证一切是否运行正确,可以使用简单的发现协议(默认的DDS分布式发现机制)创建一个新的talker进行发现。

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

 

现在你应该看到simple_listener节点接收来自simple_talker“hello world”消息,但没有接收来自talker_discovery_server的其他消息

 

4.5可视化工具rqt_graph

 

rqt_graph工具可以用来验证这个案例的节点和结构。请记住,为了将rqt_graph与发现服务器协议一起使用(例如,查看listener_discovery_servertalker_discovery_server节点),必须在启动它之前设置ROS_DISCOVERY_SERVER环境变量。

 

5.高级应用案例

 

以下部分展示了发现服务器的不同特性,这些特性允许你通过网络构建健壮的发现服务器。

 

5.1冗余服务器

 

使用fastdds工具可以创建多个发现服务器。发现客户端(ROS节点)可以连接到任意数量的服务器。这允许有一个冗余网络,即使一些服务器或节点意外关闭也可以工作。下图显示了一个提供服务器冗余的简单体系结构。

 

 

在多个终端中,运行以下代码与冗余服务器建立通信。

 

fastdds discovery server-id 0 ip-address 127.0.0.1 port 11811

 

fastdds discovery server-id 1 ip-address 127.0.0.1 port 11888

 

—server-id N 表示服务器的id N.当使用ROS_DISCOVERY_SERVER引用服务器时,服务器0必须是第一位的,服务器1是第二位的。

export ROS_DISCOVERY_SERVER="127.0.0.1:11811;127.0.0.1:11888"
ros2 run demo_nodes_cpp talker --ros-args --remap __node:=talker

export ROS_DISCOVERY_SERVER="127.0.0.1:11811;127.0.0.1:11888"
ros2 run demo_nodes_cpp listener --ros-args --remap __node:=listener

现在,如果其中一个服务器出现故障,仍然可以使用发现功能,节点仍然可以相互发现。

 

5.2备份服务器

 

Fast DDS Discovery Server允许创建具有备份功能的服务器。这允许服务器在关闭时恢复它保存的最后一个状态。


在不同的终端中,运行以下代码与备份服务器建立通信。

 

fastdds discovery server-id 0 ip-address 127.0.0.1 port 11811 backup

export ROS_DISCOVERY_SERVER=127.0.0.1:11811
ros2 run demo_nodes_cpp talker ros-args remap 
node:=talker

export ROS_DISCOVERY_SERVER=127.0.0.1:11811
ros2 run demo_nodes_cpp listener ros-args remap node:=listener

 

在发现服务器的工作目录(它启动的目录)中创建了几个备份文件。两个SQLite文件和两个json文件包含启动新服务器和在失败时恢复失败服务器状态所需的信息,避免了再次进行发现过程,并且不会丢失信息。

 

5.3分区查找

 

可以分割与发现服务器的通信,在发现信息中创建虚拟分区。这意味着,如果两个端点之间存在共享发现服务器或发现服务器网络,那么它们将只知道彼此。我们将执行使用两个独立的服务器示例。下图显示了体系结构。

 

 

使用这个模式,Listener 1将连接到Talker 1Talker 2,因为它们共享Server 1Listener 2将与talk1连接,因为它们共享Server2。但是Listener 2不会听到来自Talker 2的消息,因为它们不共享任何发现服务器或发现服务器,包括间接通过冗余发现服务器之间的连接。

 

使用默认端口11811运行localhost上监听的第一个服务器。

 

fastdds discovery server-id 0 ip-address 127.0.0.1 port 11811

 

在另一个终端中,运行第二台服务器,使用另一个端口(在本例中为11888端口)监听本地主机。

 

fastdds discovery server-id 1 ip-address 127.0.0.1 port 11888

现在,在不同的终端上运行每个节点。使用ROS_DISCOVERY_SERVER环境变量来(https://fast-dds.docs.eprosima.com/en/v2.1.0/fastdds/env_vars/env_vars.html)决定它们连接到哪个服务器。注意,id必须匹配。

export ROS_DISCOVERY_SERVER=127.0.0.1:11811;127.0.0.1:11888
ros2 run demo_nodes_cpp talker ros-args remap 
node:=talker_1

export ROS_DISCOVERY_SERVER=127.0.0.1:11811;127.0.0.1:11888
ros2 run demo_nodes_cpp listener ros-args remap node:=listener_1

 

export ROS_DISCOVERY_SERVER=127.0.0.1:11811
ros2 run demo_nodes_cpp talker ros-args remap 
node:=talker_2

export ROS_DISCOVERY_SERVER=“;127.0.0.1:11888
ros2 run demo_nodes_cpp listener ros-args remap __node:=listener_2

我们应该看到Listener 1如何接收来自两个谈talker节点的消息,而Listener 2talker 2在不同的分区中,因此没有从它(talker 2)接收消息。

注意
一旦两个端点(ROS节点)发现了彼此,它们就不需要它们之间的发现服务器网络来监听彼此的消息。

6.对比快速DDS查找服务和一般查找协议

为了比较使用Simple Discovery Protocol(发现的默认DDS机制是分布式)或发现服务器的执行节点,使用了两个脚本,它们执行一talker 和许多listener,并在此期间分析网络流量。对于这个实验,需要在你的系统上安装tshark。配置文件是必需的,以避免使用进程内模式。

注意
这些脚本需要一个发现服务器闭包特性,该特性只能从比ROS 2 Foxy版本更新的版本中获得。为了使用这个功能,编译ROS2,Fast DDS v2.1.0版本或者更高的。

这些脚本的特性是高级目的的参考,它们的研究留给用户。

bash network traffic generatorhttps://docs.ros.org/en/foxy/_downloads/ad4519121a351c00b85e86ff01a4d54f/generate_discovery_packages.bash)

python3 graph generatorhttps://docs.ros.org/en/foxy/_downloads/4147240a509b185e34adb1b0fe9320dd/discovery_packets.py)

XML configurationhttps://docs.ros.org/en/foxy/_downloads/0b98d1b30b08762953ff15b80a8c3a73/no_intraprocess_configuration.xml)

运行带有到setup.bash文件路径的bash脚本,将ROS2环境变量作为setup.bash文件的参数。这将为简单的发现生成流量跟踪。使用第二个参数SERVER执行相同的脚本。它将生成使用发现服务器的跟踪。

注意
根据你的tcpdump配置,此脚本可能需要sudo特权来读取跨网络设备的流量。

在两次执行完成后,运行Python脚本生成一个类似于下面的图。

export FASTRTPS_DEFAULT_PROFILES_FILE="no_intraprocess_configuration.xml"
sudo bash generate_discovery_packages.bash ~/ros2_foxy/install/local_setup.bash
sudo bash generate_discovery_packages.bash ~/ros2_foxy/install/local_setup.bash SERVER
python3 discovery_packets.py

这张图是某一特定实验的结果。读者可以执行脚本并生成自己的结果进行比较。可以很容易地看到,当使用发现服务时,网络流量减少。

通信量的减少是避免每个节点宣布自己,并等待网络上其他节点的响应的结果。这在大型架构中产生了大量的流量。这种方法的(使得通信量的)减少随着节点数量的增加而增加,使得这种体系结构比简单发现协议方法更具可伸缩性。

新的Fast DDS Discovery Server v2在Fast DDS v2.0.2之后可用,取代了旧的发现服务器。在这个新版本中,那些不共享主题的节点将不会自动发现彼此,保存连接它们和它们的端点所需的整个发现数据。上面的实验并没有显示出这种情况,但即使如此,由于ROS 2节点隐藏基础设施话题,流量也可以大幅减少。

其他

个人感觉这节课看得很迷,没搞明白.

这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.

原文链接:https://blog.csdn.net/qq_45701501/article/details/119297788