FastDDS的服务器记录-译-

博主在ROS2 Humble上遇到FastDDS的发现问题,导致节点间连接不稳定,尤其是在重启后。尽管ROS2强调无单点故障,但发现服务器似乎是解决大型系统中发现问题的常见方案。作者比较了FastDDS和CycloneDDS,发现后者在稳定性上更胜一筹。社区成员建议直接向FastDDS团队报告问题并探讨解决方案,同时指出默认配置可能需要优化以适应更广泛的用例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

discourse.ros.org/t/fastdds-without-discovery-server/26117/9


有疑问如下:

我一直在以多种方式与 FastDDS(在 ROS2 Humble 上)作斗争——但最大的问题是发现。

对于我的机器人,我有一个用于驱动程序的启动文件,第二个用于定位,第三个用于导航——它们都在机器人计算机上运行。如果我按顺序启动它们,一切正常 - 但然后说我必须重新启动导航才能更改配置 - 大约 75% 的时间,它无法连接某些主题(尤其是 tf 似乎是一个问题),然后我必须重新启动驱动程序启动文件 - 我会注意到我认为问题在于发现,因为现有连接(例如定位节点到驱动程序)继续起作用。切换到 CycloneDDS 也使问题消失。

当我开始研究解决方案时 - 一切似乎都表明“解决方案”是发现服务器:

eProsima 发现服务器 
新发现服务器 
将 ROS 2 与 Fast-DDS 发现服务器一起使用
ROS2 最受吹捧的“特性”之一,即没有单点故障 (rosmaster),是否真的不适用于更大的系统和默认的 DDS?

还是开箱即用的配置不起作用,我需要以某种特定方式配置 FastDDS?

在这里寻找反馈/帮助 - 因为根据技术评估报告 1一半的受访者表示他们喜欢 FastDDS 而不是 CycloneDDS——但我无法让事情顺利进行。

Fergs

我有点认为这就是我在这里所做的 - 鉴于我没有在一些大型花哨的商业产品中使用它,我的期望是我将依赖社区支持。我什至不确定我会在哪里发布问题(rmw 实现,FastDDS 本身?)。鉴于这更像是一个“系统”问题,我没有一个可重现的最小示例来分享。

我的问题实际上是:我正在寻找有关如何让更大的系统(25 个以上节点)工作的见解,因为我运气不太好。我什至不完全确定从哪里开始。我希望您的许多用户中的一些可能能够指向一个资源/帖子,上面写着“嘿,这就是我们使事情变得真正可靠的方式” - 到目前为止,一切似乎都指向发现服务器(这似乎违反直觉,因为过去几年围绕 ROS2 进行营销,但也许这是正确的答案,我应该去使用它)。

我与 RMW 报告的链接更多的是它告诉我,那里有一半的用户正在让它非常可靠地工作——我想知道他们的技巧/提示。


smac

即使这是答案,也应该作为默认配置文件而不是用户处理。您正在尝试做的是非常基本的/基本的-我很震惊 Fast-DDS 存在问题。

我将 Cyclone 用于涉及硬件机器人的大多数事情,我发现它在启动/常规服务调用中更稳定,但自从我认真研究 Fast-DDS 以来已经有一段时间了。现在它是默认设置,我将开始更多地使用它,因为我需要支持 Nav2 用户,但这对于移动机器人社区来说并不是一个很好的第一印象。

我现在也开始在 Nav2 中看到 RMW/DDS 相关票证的增加,这是自 Foxy 时代以来我从未见过的,上次 Fast-DDS 是默认设置,令人不安的是,我们可能已经退步了即用即用行为,即使 TSC RMW 报告指标未捕获该信息。还值得注意的是 Fast-DDS 报告的 RMW 问题:在运行时使用专用回调组创建的订阅者不起作用 · 问题 #613 · ros2/rmw_fastrtps · GitHub 5对于我所在的世界特定角落来说,这是一个非常关键的回归。

我想我很清楚,由于 Fast-DDS 现在是默认设置,我想确保处理任何零碎的事情,以便 ROS 2 中的 Nav2 和移动机器人用户获得良好的体验,因为我希望每个人都能关于同一页。

没有人建议任何激进的措施。这是一个讨论潜在问题和收集反馈的论坛,这就是这里发生的一切。


jaime

非常有趣的时间家伙。

如果您遇到可重现的问题,可以很容易地联系到 Fast DDS 背后的团队。为什么不发布问题?我在这里看不到任何真正的问题。许多用户确实会见我们并与我们一起评论他们的架构。你为什么不试试那个频道?GitHub?打电话给我们?

有了 Foxy、Galactic 和现在的 Humble,我们的主要 Fast DDS 存储库每月有大约 50K 的克隆。此外,我们的商业客户也在稳步增长。我们有很多用户,他们中的大多数,无论是直接使用 ROS 2 还是 DDS,都是满意的用户。

不幸的是,在某些情况下,我们可能会遇到错误,或者其他实现对于特定用例可能会表现得更好。因为在中间件中,所有的决策都需要权衡,而且我们肯定不是所有潜在用例的最佳选择。

目前,选择 RMW 默认值的过程是透明的:技术报告和 TSC 成员的职业,他们都是 ROS 2 的重度用户和重要贡献者。@smac认为旋风更好,他可能投票给旋风。但是我们也有非常重的ROS 2用户支持Fast DDS,在生产系统和商业机器人中使用ROS 2和Fast DDS,我们赢得了投票。我喜欢这样:投票基于可重复的技术论点和公正的测量,以及民主。

我的团队非常愿意讨论任何发现场景。我们甚至对可扩展性进行了非常大规模的研究,您可以在此处查看:

快速 DDS 发现机制分析 2

如果您需要解决方案,请在技术上讨论您的方案,与我们会面等。很容易找到我们。给我留言吧。或者,如果您想要公开讨论,可重现的问题是一个很好的起点。我们总是愿意改进我们的实施。

25+ 个节点,并不是一个真正的大系统。我们有更大的生产部署,其中一些使用默认发现,其中一些使用发现服务器。

是的,大型系统中可能会发生发现问题:这不是特定的实现,也不是 DDS,而是架构的本质。然后,您需要微调您的系统,使用 Discovery Server 等工具


我的个人经验来自一家没有多少资源可花费也没有 DDS 配置专业知识的公司:
我们使用 Fast DDS 开始了我们在 ROS2 galactic 中的工作。当时我们遇到了非常令人沮丧的问题,即服务没有响应、没有被发现或以巨大的延迟响应 + 一些高 CPU 使用率(所有这些都被报告了)。而且它不是一个分布式系统:一切都在 Ubuntu 20.04 下的强大 x86 计算机上运行(再标准不过了)。没什么太花哨的:定制的 nav2 堆栈、使用组合避免序列化的 3D 点云处理管道和硬件接口。
切换到 Cyclone DDS 后,我们所有的问题都神奇地消失了。
回想起来,对我们来说,从 ROS1 切换到 ROS2 的最高成本是解决 DDS 相关问题(另一个例子:localhost only 需要在环回接口上启用多播才能工作以及如何激活它,即“ip link set lo multicast on ”,该信息很难找到)。
从我在这篇文章中读到的内容来看,与默认 DDS 供应商更改相关的核心 ros 功能(发布/订阅/主题/服务/操作)似乎仍然存在一些不稳定性。从这个意义上说(单台计算机上的节点到节点通信),ROS2 仍然与 ROS1 不同。在 ROS1 中它可以正常工作。

作为一个“天真”的 ros 用户,我的反馈是:我相信有一些质量系统测试缺少针对 DDS 功能的测试。我们在 Galactic 下遇到的有关服务的问题被忽视是不正常的。对于影响 Humble 下回调组订阅的当前问题也是如此。如果是 DDS 配置问题,那么默认配置应该至少在标准系统(x86 Ubuntu LTS)上适用于标准 ROS 接口(发布/订阅/主题/服务/操作)。我认为等待非滚动发布来测试和迭代这些问题是不可接受的。我完全可以理解需要深入研究异国用例的配置,但请记住,绝大多数用户在单台计算机上运行 ROS 而不必担心网络延迟,
如果需要,我愿意帮助描述基本的测试用例。


### FastDDS Python 中的共享内存支持 FastDDS 支持多种传输机制来优化不同应用场景下的性能表现。对于高效的数据交换,特别是同一主机上的应用间通信,FastDDS 提供了基于 System V 风格的共享内存功能[^2]。 为了验证 FastDDS-Python 是否启用并配置了共享内存特性,可以创建一个简单的发布者和订阅者的例子: #### 发布者代码示例 ```python from fastdds import DomainParticipant, Publisher, Topic, DataWriter, SHMTransportDescriptor import time # 创建域参与者 participant = DomainParticipant() # 添加共享内存传输描述符到参与者的默认属性中 shm_transport_descriptor = SHMTransportDescriptor() participant.get_default_participant_qos().transport().use_builtin_transports = False participant.get_default_participant_qos().transport().user_transports.push_back(shm_transport_descriptor) publisher = Publisher(participant) topic = Topic(participant, 'HelloWorldTopic', 'HelloWorld') writer = DataWriter(publisher, topic) for i in range(10): sample = {'index': i, 'message': f'Hello {i}'} writer.write(sample) time.sleep(1) ``` #### 订阅者代码示例 ```python from fastdds import DomainParticipant, Subscriber, Topic, DataReader, SHMTransportDescriptor def on_data_available(reader): samples = reader.take() for s in samples: print(f'Received: index={s["index"]}, message="{s["message"]}"') participant = DomainParticipant() # 同样设置共享内存传输方式 shm_transport_descriptor = SHMTransportDescriptor() participant.get_default_participant_qos().transport().use_builtin_transports = False participant.get_default_participant_qos().transport().user_transports.push_back(shm_transport_descriptor) subscriber = Subscriber(participant) topic = Topic(participant, 'HelloWorldTopic', 'HelloWorld') reader = DataReader(subscriber, topic, on_data_available=on_data_available) while True: pass # Keep alive to receive messages ``` 上述代码展示了如何在 FastDDS 的 Python API 下使用 `SHMTransportDescriptor` 来激活共享内存作为传输协议的一部分。这使得在同一台机器上运行的应用程序之间能够更快速地传递消息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值