ROS2学习笔记26--使用快速DDS查找服务作为查找协议(社区贡献)
Posted 鸿_H
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS2学习笔记26--使用快速DDS查找服务作为查找协议(社区贡献)相关的知识,希望对你有一定的参考价值。
概要:这篇内容主要介绍使用快速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
)在发现阶段的网络流量减少情况:
为了使用该功能,可以使用participant
的XML
配置(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
(或更新版本)。如果你安装使用的是低于Foxy
的ROS2
版本,则不能使用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设置发现服务器
首先启动id
为0
、端口为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_server
和talker_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 1
和Talker 2
,因为它们共享Server 1
。Listener 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 2
与talker 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 generator
(https://docs.ros.org/en/foxy/_downloads/ad4519121a351c00b85e86ff01a4d54f/generate_discovery_packages.bash)
python3 graph generator
(https://docs.ros.org/en/foxy/_downloads/4147240a509b185e34adb1b0fe9320dd/discovery_packets.py)
XML configuration
(https://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节点隐藏基础设施话题,流量也可以大幅减少。
其他
个人感觉这节课看得很迷,没搞明白.
这课程是在等毕业证那十几天搞的,室友问,现在在线翻译这么强大,为啥还在这里瞎折腾呢?我说,我的目地是好好认真看一下,了解一下,自己折腾,目前是我想到最好的办法来获得最佳效果,即使这翻译有点别扭,哈哈哈.
#####################
不积硅步,无以至千里
好记性不如烂笔头
感觉有点收获的话,麻烦大大们点赞收藏哈
以上是关于ROS2学习笔记26--使用快速DDS查找服务作为查找协议(社区贡献)的主要内容,如果未能解决你的问题,请参考以下文章
ROS2 Humble LTS 第一款5年长支持版本及默认DDS