ROS2之DDS问题汇集

参考:

answers.ros.org/question/403517/ros2-network-communication-does-it-even-work-reliably/



reliably?

目前,调通就很开心,最长测试过100小时,还别说,各种小bug,但是大问题不会有。

算可靠稳定吗?


汇总:

111

首先,可以说已经设法让两台计算机互相看到。超级简单,只需将它们设置在同一个 wifi 和 BAM 中,就可以在另一台计算机上看到正在发布的主题。但是,通信随机中断,必须重置 ros2 守护程序才能使其再次工作。此外,跨计算机发布和订阅主题似乎可行,但尝试发送导航目标(行动服务器调用),但该目标从未被接受。对于如此简单的任务,这似乎非常不可靠。

222 

最近才开始考虑将 ROS 整合到工业自动化应用程序中,并且遇到了类似的“破坏性”问题。

实验是在 Foxy 上使用 FastDDS。
遇到的特殊情况是:

  • 带有 ROS 发布者的 Windows PC
  • 办公室网络上的 IP 网络接口
  • 具有 ROS 订阅者的 Linux PC
  • 一个真实的网络接口,在办公网络上有一个 IP 地址
  • 由 Docker/VMware 创建的具有奇怪本地 IP 地址的各种其他网络接口

使用默认设置运行此安排会导致办公网络瘫痪,并使互联网带宽饱和。网络不是强项,但对发生的事情的理解是:

  • 订阅者看到它想要的主题已发布
  • 它将其所有 IP 地址作为潜在目的地发送给发布者
  • 然后发布者尝试发布到所有这些地址
  • 正确的通过(所以一切似乎都有效)
  • 但是不正确的没有路由(因为它们是用于子 PC 上的 VMware 等),因此数据包被发送到路由器,然后发送到互联网
  • 在这种情况下,模拟了来自 4 个 64 层激光雷达、数百兆比特的数据,并且外部带宽饱和了几天,直到问题被发现(都认为路由器出现故障或其他问题)。

尽管关闭整个办公室互联网令人沮丧,但真正关心的是,客户通常在偏远地区的有限带宽网络(控制设备 100Mb 或更少)上运行安全关键应用程序,所以需要谨慎传输数据的方式。过去一直使用 TCP 作为我们方法的一部分,我们希望 ROS/FastDDS 中的默认 UDP 实现仍然适用,但显然不是。

333

见过类似的问题,不是每个网络都有,但主要是无线网状网络有许多无线 AP 相互通信,其中 ROS2/DDS 流量导致它停止运行。

444

快速添加:从技术上讲,export ROS_LOCALHOST_ONLY=1不执行原始帖子的 XML 中指定的所有配置步骤。它错过了关于 <MaxAutoParticipantIndex>120</MaxAutoParticipantIndex>.

如果没有此设置,一旦有多个节点,就会遇到此错误:ros2: Failed to find a free participant index for domain ...

555

fastdds

机器人

<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
    <participant profile_name="disable_multicast" is_default_profile="true">
        <rtps>
            <builtin>
                <metatrafficUnicastLocatorList>
                    <locator/>
                </metatrafficUnicastLocatorList>
                <initialPeersList>
                    <locator>
                        <udpv4>
                            <address>127.0.0.1</address>
                        </udpv4>
                    </locator>
                </initialPeersList>
            </builtin>
        </rtps>
    </participant>
</profiles>

笔记本

<?xml version="1.0" encoding="UTF-8" ?>
<profiles xmlns="http://www.eprosima.com/XMLSchemas/fastRTPS_Profiles">
    <participant profile_name="unicast_connection" is_default_profile="true">
        <rtps>
            <builtin>
                <metatrafficUnicastLocatorList>
                    <locator/>
                </metatrafficUnicastLocatorList>
                <initialPeersList>
                    <locator>
                        <udpv4>
                            <address>$ROBOT_IP</address>
                        </udpv4>
                    </locator>
                </initialPeersList>
            </builtin>
        </rtps>
    </participant>
</profiles>

666

此外,最新发布的 Discovery Server 版本允许通过仅发现属于同一主题的发布者和订阅者来减少高达 93% 的发现流量。 


### ROS 2DDS 的介绍与使用 #### DDSROS 2 架构中的角色 在 ROS 2 中,DDS (Data Distribution Service) 取代了 ROS 1 中的 Master 中心节点,成为核心通信机制[^2]。这意味着所有的节点间通信不再依赖于单一的中心化管理器,而是通过分布式的方式完成。 #### 分布式特性带来的优势 由于 DDS 默认是完全分布式的,因此即使某个节点发生故障也不会影响其他节点之间的正常通讯。这种去中心化的架构提高了系统的可靠性和鲁棒性。 #### Middleware 层的作用 为了确保不同厂商提供的各种 DDS 实现能够无缝协作,在 ROS 2 下方引入了一层名为 Middleware 的抽象层。这一层定义了一系列标准化接口,使得开发者可以在不改变应用程序逻辑的情况下切换不同的 DDS 库版本或者供应商产品[^3]。 #### 安全性的增强 所有兼容的 DDS 实现都必须以互操作方式支持安全功能(参见 DDS-Security 规范的第 2.3 节),这使得 ROS 2 的安全性得到了极大提升,并且可以轻松地跨供应商工作[^1]。 #### QoS 政策的重要性 质量服务策略(Quality of Service Policies, QoS) 是 DDS 提供的一项重要特性之一。它允许发布者和订阅者之间协商数据传输的具体参数,比如可靠性、持久性等,从而更好地满足特定应用场景的需求。 ```python import rclpy from std_msgs.msg import String def main(args=None): rclpy.init(args=args) node = rclpy.create_node('dds_example') publisher = node.create_publisher(String, 'topic', qos_profile=10) msg = String() while True: msg.data = "Hello World" publisher.publish(msg) if __name__ == '__main__': main() ``` 此代码片段展示了如何创建一个简单的 ROS 2 发布者程序,其中 `qos_profile` 参数用于指定所采用的质量服务水平。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhangrelay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值