质量 of 服务设置 [17510]

概述 [17016]

ROS 2提供了丰富多样的质量 of 服务(QoS)策略,允许您调整节点之间的通信。通过正确的一组质量 of 服务策略,ROS 2可以像TCP一样可靠,也可以像UDP一样尽力而为,中间还有许多可能的状态。与主要仅支持TCP的ROS 1不同,ROS 2受益于底层DDS传输的灵活性,在存在丢包无线网络的环境中,"尽力而为"策略更适合,或者在实时计算系统中,需要正确的质量 of 服务配置文件以满足截止日期。 [17511]

一组QoS "策略" 组合在一起形成QoS "配置文件"。考虑到选择给定场景的正确QoS策略的复杂性,ROS 2为常见用例(例如传感器数据)提供了一组预定义的QoS配置文件。同时,开发人员可以灵活控制QoS配置文件的具体策略。 [17512]

可以为发布者、订阅者、服务服务器和客户端指定QoS配置文件。一个QoS配置文件可以独立应用于上述实体的每个实例,但如果使用不同的配置文件,可能会导致不兼容,从而阻止消息的传递。 [17513]

QoS策略 [17514]

基本QoS配置文件当前包括以下策略的设置: [17515]

  • 历史记录 [17516]

    • 保留最近:仅存储最多N个样本,可通过队列深度选项进行配置。 [17517]

    • 全部保留: 将所有样本存储,受基础中间件配置的资源限制约束。 [17518]

  • 深度 [17519]

    • 队列大小:仅在"历史"策略设置为"保留最后"时受到尊重。 [17520]

  • 可靠性 [17521]

    • 尽力而为: 尝试传递样本,但如果网络不稳定,可能会丢失它们。 [17522]

    • 可靠传递: 保证样本被传递,可能会进行多次重试。 [17523]

  • 耐久性 [17524]

    • 瞬态本地:发布者负责为"晚加入"的订阅者持久化样本。 [17525]

    • 易失性:不尝试持久化样本。 [17526]

  • 截止日期 [17527]

    • 持续时间:期望的发布到主题的连续消息之间的最大时间间隔。 [17528]

  • 寿命 [17529]

    • 持续时间:在发布消息和接收消息之间的最大时间间隔,超过此时间则将认为消息已过期或失效(已过期的消息将被静默丢弃,实际上永远不会被接收)。 [17530]

  • 活跃性 [17531]

    • 自动:当任何一个发布者发布消息时,系统将考虑所有节点的发布者在另一个"租约持续时间"内仍然活跃。 [17532]

    • 手动按主题:如果发布者通过调用发布者API手动声明自己仍然活跃,系统将考虑发布者在另一个"租约持续时间"内仍然活跃。 [17533]

  • 租约期 [17534]

    • 持续时间:在系统认为发布者失去活跃性之前,发布者有的最长时间来表明自己仍然存活(失去活跃性可能表明出现故障)。 [17535]

对于不是持续时间的每个策略,还有"系统默认"选项,它使用底层中间件的默认值。对于持续时间的每个策略,还存在一个"默认"选项,表示持续时间未指定,底层中间件通常会将其解释为无限长的持续时间。 [17536]

与ROS 1的比较 [17057]

ROS 2中的"历史"和"深度"策略组合在一起,提供类似于ROS 1中队列大小的功能。 [17537]

ROS 2中的"可靠性"策略类似于使用UDPROS(仅在``roscpp``中)进行"尽力而为"或使用TCPROS(ROS 1默认)进行"可靠"的情况。但请注意,即使在ROS 2中,即使在ROS 2中,可靠性策略也是使用UDP实现的,如果适用,可以进行多播。 [17538]

ROS 2中的"持久性"策略"瞬态本地",与任何深度结合使用,提供了类似于"latching"发布者的功能。ROS 2中的其余策略与ROS 1中可用的任何内容都不相似,这意味着在这方面,ROS 2比ROS 1更具功能性。未来可能会在ROS 2中提供更多的QoS策略。 [17539]

QoS配置文件 [17540]

配置文件允许开发人员专注于应用程序,而不必担心可能的每个QoS设置。QoS配置文件定义了一组预期在特定用例中很好配合的策略。 [17541]

当前定义的QoS配置文件如下: [17542]

  • 发布者和订阅者的默认QoS设置 [17543]

    为了使从ROS 1到ROS 2的过渡更加容易,希望实现类似的网络行为。默认情况下,ROS 2中的发布者和订阅者的"历史"采用"保留最后",队列大小为10,"可靠性"采用"可靠","持久性"采用"volatile","活跃性"采用"系统默认"。截止日期、寿命和租约持续时间也都设置为"默认"。 [17544]

  • 服务 [17192]

    与发布者和订阅者类似,服务也具有可靠性。对于服务来说,使用“volatile”持久性尤为重要,否则重新启动的服务服务器可能会收到过时的请求。虽然客户端受到多个响应的保护,但服务器却没有受到接收过时请求的副作用的保护。 [17545]

  • 传感器数据 [17546]

    对于传感器数据来说,大多数情况下,及时接收读数比确保所有数据到达更为重要。也就是说,开发者希望尽快获取最新的采样数据,即使可能会丢失一些数据。因此,传感器数据配置文件使用尽力而为的可靠性和较小的队列大小。 [17547]

  • 参数 [17022]

    ROS 2 中的参数基于服务,因此具有类似的配置文件。不同之处在于参数使用更大的队列深度,这样当参数客户端无法连接参数服务服务器时,请求不会丢失。 [17548]

  • 系统默认值 [17549]

    这使用RMW实现的默认值来设置所有策略。不同的RMW实现可能具有不同的默认值。 [17550]

点击此处 获取上述配置中使用的具体策略。这些配置文件中的设置可能会根据社区的反馈进行进一步调整。 [17551]

QoS 兼容性 [17552]

**注意:**本部分内容适用于发布者和订阅者,同样适用于服务端和客户端。 [17553]

可以独立为发布者和订阅者配置 QoS 配置文件。仅当发布者和订阅者具有兼容的 QoS 配置文件时,才会建立发布者和订阅者之间的连接。 [17554]

QoS配置文件的兼容性是基于"请求与提供"模型确定的。订阅者*请求*一个QoS配置文件,表示它愿意接受的"最低质量",而发布者*提供*一个QoS配置文件,表示它能够提供的"最高质量"。只有在所请求的QoS配置文件的每个策略都不比提供的QoS配置文件更严格的情况下,才会建立连接。即使所请求的QoS配置文件不同,多个订阅者也可以同时连接到单个发布者。发布者和订阅者之间的兼容性不受其他发布者和订阅者的影响。 [17555]

以下表格显示了不同策略设置的兼容性及其结果: [17556]

可靠性QoS策略的兼容性: [17557]

发布者 [17558]

订阅者 [17559]

兼容 [17560]

尽力而为 [17561]

尽力而为 [17561]

[17562]

尽力而为 [17561]

可靠 [17563]

[17564]

可靠 [17563]

尽力而为 [17561]

[17562]

可靠 [17563]

可靠 [17563]

[17562]

持久性 QoS 策略的兼容性: [17565]

发布者 [17558]

订阅者 [17559]

兼容 [17560]

结果 [17566]

易失性 [17567]

易失性 [17567]

[17562]

仅新消息 [17568]

易失性 [17567]

瞬态本地 [17569]

[17564]

无通信 [17570]

瞬态本地 [17569]

易失性 [17567]

[17562]

仅新消息 [17568]

瞬态本地 [17569]

瞬态本地 [17569]

[17562]

新旧消息均包括 [17571]

要实现"latched"主题,以便向后续订阅者可见,发布者和订阅者必须都同意使用"瞬态本地"。 [17572]

截止期限 QoS 策略的兼容性: [17573]

假设 xy 是任意有效的持续时间值。 [17574]

发布者 [17558]

订阅者 [17559]

兼容 [17560]

默认 [17575]

默认 [17575]

[17562]

默认 [17575]

x [17576]

[17564]

x [17576]

默认 [17575]

[17562]

x [17576]

x [17576]

[17562]

x [17576]

y*(其中 *y > x[17577]

[17562]

x [17576]

y*(其中 *y < x[17578]

[17564]

活跃性 QoS 策略的兼容性: [17579]

发布者 [17558]

订阅者 [17559]

兼容 [17560]

自动 [17580]

自动 [17580]

[17562]

自动 [17580]

按主题手动 [17581]

[17564]

按主题手动 [17581]

自动 [17580]

[17562]

按主题手动 [17581]

按主题手动 [17581]

[17562]

租约持续时间QoS策略的兼容性: [17582]

假设 xy 是任意有效的持续时间值。 [17574]

发布者 [17558]

订阅者 [17559]

兼容 [17560]

默认 [17575]

默认 [17575]

[17562]

默认 [17575]

x [17576]

[17564]

x [17576]

默认 [17575]

[17562]

x [17576]

x [17576]

[17562]

x [17576]

y*(其中 *y > x[17577]

[17562]

x [17576]

y*(其中 *y < x[17578]

[17564]

为了建立连接,必须使所有影响兼容性的策略相互兼容。例如,即使请求和提供的QoS配置文件对可靠性QoS策略是兼容的,但如果它们的持久性QoS策略不兼容,仍然无法建立连接。 [17583]

当无法建立连接时,发布者和订阅者之间将不会传递任何消息。有机制可以检测到这种情况,将在后面的章节中介绍。 [17584]

与ROS 1的比较 [17057]

在ROS 1中,具有相同消息类型和相同主题的任何发布者和订阅者都将建立连接。在使用ROS 2时,需要注意可能存在不兼容的请求和提供的QoS配置文件的情况。 [17585]

QoS 事件 [17586]

一些QoS策略与可能的事件相关联。开发人员可以为每个发布者和订阅者提供与这些QoS事件相关的回调函数,并以他们认为合适的方式处理这些事件,类似于处理在主题上接收到的消息的方式。 [17587]

开发人员可以订阅与发布者相关联的以下QoS事件: [17588]

  • 提供的截止期限未达成 [17589]

    发布者在截止期限QoS策略规定的预期持续时间内未发布消息。 [17590]

  • 活跃性丧失 [17591]

    发布者未在租约期限内指示其活跃性。 [17592]

  • 提供的QoS不兼容 [17593]

    发布者遇到了在相同主题上订阅的请求一个无法满足提供的QoS配置文件的QoS配置文件,导致发布者与该订阅之间没有连接。 [17594]

开发者可以订阅与订阅相关的以下QoS事件: [17595]

  • 请求的截止时间已过 [17596]

    该订阅在预期的持续时间内未收到消息,该持续时间由截止时间的QoS策略设置。 [17597]

  • 可用性发生变化 [17598]

    订阅发现,某个或多个发布者在订阅的主题上在租约期内未能表明其存活状态。 [17599]

  • 请求的QoS不兼容。 [17600]

    订阅遇到了同一主题上提供不符合请求的QoS配置文件的发布者,导致订阅与该发布者之间没有连接。 [17601]