RTPS规范谈到了 "数据变化 "以及如何传播它们,但并没有确切地规定 "传播什么"(比如它是否知道传输了什么,只发送变化,还是它把数据看作是黑盒子,总是发送整个数据)。现在我假设这是特定的实现。
但我想知道,对于内置的Topic来说,具体规定了什么行为.DDS规范定义了几个内置Topic的数据类型(即数据字段名称、类型和意义)。我们是否可以假设,如果一个Data字段被改变,其他未改变的Data字段也都会被发送?
RTPS规范中谈到了 "数据变化 "和它们如何被传播,但并没有确切地指定 "传播什么"。
虽然可能不是一目了然,但RTPS规范在 "第10章序列化有效载荷表示法 "中确切规定了传播的内容。它提到了不同的标准化类型的表示,如CDR和CDR2,它们有几种变化,包括大恩迪安和小恩迪安版本。这些格式都不是特定的实现,因为那会妨碍不同DDS实现之间的预期互操作性。
这些格式的细节将在《DDS》中进一步解释。DDS-XTYPES 规范,特别是第7.4节,在我提到的第10章中,有好几处都提到了它。XTypes规范则引用了一些定义CDR的旧规范。
话说回来,要读完所有这些规范是很复杂的,所以让我来回答你的另一个问题吧。
我们是否可以假设,如果一个Data字段发生了变化,其他所有没有变化的Data字段也会被发送?
这基本上是正确的。对DDS数据的更新,无论是内置类型还是用户定义类型,都是以 "原子式 "的方式与所有字段进行通信的。这意味着更新的接收者将不必担心维持某种状态,在这种状态下,必须应用一些部分更新来确定 实际 当前状态。
但是,被定义为 "可选 "的值是一个例外。这样做的原因并不是因为这些值在上次更新后没有改变,而是因为这些字段被认为是非强制性的。据我所知,内置类型没有定义这样的可选字段。 事实上XTypes附件D: DDS内置主题数据类型已经更新了内置主题的定义,并包含了一些可选的字段。
此外,一些编码允许省略值,如果它们等于指定的默认值。在这种情况下,也不是 "不变 "的方面导致了省略,而是它们等于默认值的事实。
有时,原子更新的方法会引起关注,通常是当一个类型中的某些字段比其他字段更新得更频繁时。这通常是数据模型设计方式不正确的标志。
不过,你提到的内置Topic并没有这个问题。如果有的话,也不希望它们频繁更新。
规范[s]为内置Topic类型的一些字段定义了默认值。 发送者可以省略字段,而接收者应采用这些省略字段的默认值。 有些字段是正确处理所必需的,即使可能有一个隐含的默认值。
例如,一个关于订阅内置主题的样本可能会省略'deadline'字段,而接收方将使用默认的deadline.period值'infinite'。
所以,回答你的问题。
"我们是否可以假设,如果一个数据字段发生了变化, 其他所有没有变化的数据字段也会被发送?"
不一定:如果其他(未改变的)字段处于其默认值(并且不是必需的),它们 "可能 "不会被发送。 发送它们是完全合法的,但一个实现可以为了优化目的选择不发送它们。