【问题标题】:Are always all Data Fields of the Built-In Topics sent according to the DDS/RTPS Specification?是否始终根据 DDS/RTPS 规范发送内置主题的所有数据字段?
【发布时间】:2020-09-21 03:01:14
【问题描述】:

我正在尝试更好地理解 RTPSDDS 规范。

RTPS 规范讨论了“数据更改”以及它们是如何传播的,但并未具体说明传播的“内容”(因为它是否知道传输的内容并仅发送更改,或者它是否将数据视为黑匣子,总是发送整个东西)。现在我假设这是特定于实现的。

但我想知道内置主题专门规定了哪些行为。 DDS 规范定义了几个内置主题的数据类型(即数据字段名称、类型和含义)。我们是否可以假设如果单个 Data 字段发生更改,则所有其他未更改的 Data Field 也会被发送?

【问题讨论】:

    标签: publish-subscribe data-distribution-service


    【解决方案1】:

    规范[s] 定义了内置主题类型的某些字段的默认值。允许发送方省略字段,接收方应采用这些省略字段的默认值。正确处理需要某些字段,即使可能存在隐式默认值。

    例如,Subscription 内置主题的示例可能会省略“deadline”字段,接收者将使用默认的deadline.period 值“infinite”。

    所以,回答你的问题:

    “我们是否可以假设如果单个数据字段被更改,所有其他未更改的数据字段也会被发送?”

    不一定:如果其他(未更改的)字段处于其默认值(并且不是必需的),则它们“可能”不会被发送。发送它们是完全合法的,但实现可能会出于优化目的选择不发送它们。

    【讨论】:

    • 嗨克拉克,你打败了我一分钟,我也在阅读你的答案后扩展了我的答案 :-) 我只是想指出 minimum_separation 的默认值是 0 (等于根据 XTypes 规范的整数类型的默认值,并且确实不必为此进行通信),而不是无限的。
    • 确实,我从 time_based_filter 开始,然后将中间想法更改为截止日期......让答案不一致......将修复。
    【解决方案2】:

    RTPS 规范谈到“数据更改”以及它们是如何变化的 传播,但没有准确指定传播的“什么”

    尽管可能不会立即显现出来,但 RTPS 规范确实在“第 10 章序列化有效负载表示”中明确指定了传播的内容。它提到了不同的标准化表示类型,如 CDR 和 CDR2,它们有多种变体,包括大端和小端版本。这些格式都不是特定于实现的,因为这会妨碍不同 DDS 实现之间所需的互操作性。

    DDS-XTYPES 规范中进一步解释了格式的细节,特别是第 7.4 节,在我提到的第 10 章的多个地方引用了该节。反过来,XTypes 规范引用了一些定义 CDR 的旧规范。

    也就是说,阅读所有这些规范很复杂,所以让我回答你的其他问题

    我们可以假设如果单个数据字段被更改,所有其他字段 未更改的数据字段也被发送?

    这基本上是正确的。对内置类型和用户定义类型的 DDS 数据的更新是通过“原子”通信的所有字段完成的。这意味着更新的接收者不必担心维护某种状态,必须对其应用一些部分更新以确定实际当前状态。

    但是,定义为“可选”的值是一个例外。这样做的原因不是因为这些值自上次更新以来没有改变,而是因为这些字段被认为是非强制性的。 据我所知,内置类型没有定义这样的可选字段。 事实上,XTypes Annex D: DDS Built-in Topic Data Types 已经更新了内置主题定义并包括一些可选的字段。

    此外,如果某些编码等于指定的默认值,则允许省略值。在这种情况下,也不是“未更改”方面导致遗漏,而是它们等于默认值这一事实。

    有时,原子更新的方法会引起关注,通常是当类型中的某些字段比其他字段更新得更频繁时。这通常表明数据模型的设计方式不正确。

    您提到的特定内置主题没有这个问题。如果有的话,它们预计不会经常更新。

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 2020-04-04
      • 1970-01-01
      • 2016-02-05
      • 2013-02-24
      • 2015-04-26
      • 2010-10-24
      • 2018-08-03
      • 2018-09-12
      相关资源
      最近更新 更多