是否始终根据 DDS/RTPS 规范发送内置主题的所有数据字段?
Are always all Data Fields of the Built-In Topics sent according to the DDS/RTPS Specification?
RTPS 规范讨论了 "data changes" 以及它们是如何传播的,但没有具体说明 "what" 是传播的(因为它知道传输的是什么并且只发送更改,还是它将数据视为黑盒并始终发送整个数据)。现在我假设这是特定于实现的。
但我想知道内置主题专门规定了哪些行为。
DDS 规范定义了几个内置主题的数据类型(即数据字段名称、类型和含义)。我们是否可以假设如果单个数据字段发生更改,所有其他未更改的数据字段也将被发送?
规范[s]为内置主题类型的某些字段定义了默认值。允许发送方省略字段,接收方应假定这些省略字段的默认值。某些字段是正确处理所必需的,即使可能存在隐式默认值。
例如,订阅内置主题的示例可能会省略 'deadline' 字段,并且接收者[s] 将使用 'infinite' 的默认 deadline.period 值。
所以,回答你的问题:
"Can we assume that if a single Data field is changed, all other unchanged Data Fields are also sent?"
不一定:如果其他(未更改的)字段处于默认值(并且不是必需的),则不会发送它们 "may"。发送它们是完全合法的,但出于优化目的,实现可能会选择不发送它们。
The RTPS Specification talks about "data changes" and how they are
propagated, but does not exactly specify "what" is propagated
虽然可能不是很明显,但 RTPS 规范确实在 "Chapter 10 Serialized Payload Representation" 中明确指定了传播的内容。它提到了不同的标准化表示类型,如 CDR 和 CDR2,它们有多种变体,包括大端和小端版本。 None 这些格式是特定于实现的,因为这会妨碍不同 DDS 实现之间所需的互操作性。
DDS-XTYPES 规范中进一步解释了格式的详细信息,特别是我提到的第 10 章中多处引用的第 7.4 节。反过来,XTypes 规范引用了一些定义 CDR 的旧规范。
也就是说,通读所有这些规范很复杂,所以让我回答你的另一个问题
Can we assume that if a single Data field is changed, all other
unchanged Data Fields are also sent?
大部分是正确的。对于内置类型和用户定义类型,对 DDS 数据的更新是通过所有通信字段完成的 "atomically"。这意味着更新的接收者不必担心维护某种必须应用某些部分更新以确定实际当前状态的状态。
但是,定义为 "optional" 的值是一个例外。这样做的原因并不是因为这些值自上次更新以来没有改变,而是因为这些字段被认为是非强制性的。 据我所知,内置类型没有定义这样的可选字段。确实 XTypes Annex D: DDS Built-in Topic Data Types 已经更新了内置主题定义和包括一些可选字段。
此外,如果某些编码等于指定的默认值,则允许省略值。同样在这种情况下,导致遗漏的不是 "unchanged" 方面,而是它们等于默认值的事实。
有时原子更新的方法会引起关注,通常是当类型中的某些字段比其他字段更新得更频繁时。这通常表明数据模型的设计方式不正确。
但是你提到的内置主题没有这个问题。他们预计不会经常更新,如果有的话。
RTPS 规范讨论了 "data changes" 以及它们是如何传播的,但没有具体说明 "what" 是传播的(因为它知道传输的是什么并且只发送更改,还是它将数据视为黑盒并始终发送整个数据)。现在我假设这是特定于实现的。
但我想知道内置主题专门规定了哪些行为。 DDS 规范定义了几个内置主题的数据类型(即数据字段名称、类型和含义)。我们是否可以假设如果单个数据字段发生更改,所有其他未更改的数据字段也将被发送?
规范[s]为内置主题类型的某些字段定义了默认值。允许发送方省略字段,接收方应假定这些省略字段的默认值。某些字段是正确处理所必需的,即使可能存在隐式默认值。
例如,订阅内置主题的示例可能会省略 'deadline' 字段,并且接收者[s] 将使用 'infinite' 的默认 deadline.period 值。
所以,回答你的问题:
"Can we assume that if a single Data field is changed, all other unchanged Data Fields are also sent?"
不一定:如果其他(未更改的)字段处于默认值(并且不是必需的),则不会发送它们 "may"。发送它们是完全合法的,但出于优化目的,实现可能会选择不发送它们。
The RTPS Specification talks about "data changes" and how they are propagated, but does not exactly specify "what" is propagated
虽然可能不是很明显,但 RTPS 规范确实在 "Chapter 10 Serialized Payload Representation" 中明确指定了传播的内容。它提到了不同的标准化表示类型,如 CDR 和 CDR2,它们有多种变体,包括大端和小端版本。 None 这些格式是特定于实现的,因为这会妨碍不同 DDS 实现之间所需的互操作性。
DDS-XTYPES 规范中进一步解释了格式的详细信息,特别是我提到的第 10 章中多处引用的第 7.4 节。反过来,XTypes 规范引用了一些定义 CDR 的旧规范。
也就是说,通读所有这些规范很复杂,所以让我回答你的另一个问题
Can we assume that if a single Data field is changed, all other unchanged Data Fields are also sent?
大部分是正确的。对于内置类型和用户定义类型,对 DDS 数据的更新是通过所有通信字段完成的 "atomically"。这意味着更新的接收者不必担心维护某种必须应用某些部分更新以确定实际当前状态的状态。
但是,定义为 "optional" 的值是一个例外。这样做的原因并不是因为这些值自上次更新以来没有改变,而是因为这些字段被认为是非强制性的。 据我所知,内置类型没有定义这样的可选字段。确实 XTypes Annex D: DDS Built-in Topic Data Types 已经更新了内置主题定义和包括一些可选字段。
此外,如果某些编码等于指定的默认值,则允许省略值。同样在这种情况下,导致遗漏的不是 "unchanged" 方面,而是它们等于默认值的事实。
有时原子更新的方法会引起关注,通常是当类型中的某些字段比其他字段更新得更频繁时。这通常表明数据模型的设计方式不正确。
但是你提到的内置主题没有这个问题。他们预计不会经常更新,如果有的话。