关键字:OMG,RTPS,DDS
The Real-time Publish-Subscribe Protocol (RTPS) DDS Interoperability Wire Protocol Specification,Version 2.2,September 2014
8.2.5. RTPS 参与者(Participant)
RTPS参与者(Participant)是RTPS端点(Endpoint)实体的容器,并映射到DDS DomainParticipant。 此外RTPS参与者(Participant)促进了单个RTPS参与者(Participant)中的RTPS端点(Endpoint)实体共享共同属性。
图 8.5 RTPS Participant
RTPS参与者(Participant)包含表2.8中显示的属性。
表 8.8 RTPS Participant属性
8.2.6. RTPS 端点(Endpoint)
从RTPS协议的角度来看,RTPS端点(Endpoint)表示可能的通信端点。有两种RTPS端点(Endpoint)实体:Writer端点和Reader端点。
RTPS Writer端点将CacheChange消息发送到RTPS Reader端点,并可能接收它们发送的更改的确认。RTPS Reader端点从Writer端点接收CacheChange和更改可用性声明,并可能确认更改和/或请求丢失的更改。
RTPS端点(Endpoint)包含表8.9中显示的属性。
表 8-9 RTPS Endpoint配置属性
8.2.7. RTPS 写入者(Writer)
RTPS Writer是RTPS端点(Endpoint)的特殊实例,负责将CacheChange消息发送到匹配的RTPS Reader端点。它的作用是将其HistoryCache中的所有CacheChange更改传输到匹配的远程RTPS Reader的HistoryCache。
配置RTPS Writer的属性与协议行为密切相关,将在行为模块(8.4)中介绍。
8.2.8. RTPS 读取者(Reader)
RTPS Reader是RTPS端点(Endpoint)的特殊实例,负责从匹配的RTPS Writer端点接收CacheChange消息。
配置RTPS Reader的属性与协议行为密切相关,将在行为模块(8.4)中介绍。
8.2.9. 与DDS实体的关系
如8.2.2中所述,HistoryCache构成DDS实体与其对应的RTPS实体之间的接口。例如DDS DataWriter通过公共HistoryCache将数据传递给匹配的RTPS Writer。
DDS实体与HistoryCache的确切交互方式是特定于实现的,而不是由RTPS协议建模。相反RTPS协议的行为模块仅指定如何将CacheChange更改从RTPS Writer的HistoryCache传输到每个匹配的RTPS Reader的HistoryCache。
尽管它不是RTPS协议的一部分,但了解DDS实体如何与HistoryCache交互以获得对协议的完整理解非常重要。本主题构成本小节的主题。
使用UML状态图描述上述交互。用于指代DDS和RTPS实体的缩写列于下表8.10中。
表 8.10序列图和状态图中使用的缩写
8.2.9.1. DDS数据写入者(DataWriter)
DDS DataWriter上的write方法作将CacheChange更改添加到其关联的RTPS Writer的HistoryCache中。因此HistoryCache包含最新写入的更改的历史记录。更改数量由DDS DataWriter上的QoS设置确定,如HISTORY和RESOURCE_LIMITS QoS。
默认情况下,HistoryCache中的所有更改都被认为与每个匹配的远程RTPS Reader相关。也就是说,Writer应该尝试将HistoryCache中的所有更改发送到匹配的远程Readers。如何做到这一点是RTPS协议行为模块的主题。
由于以下两个原因,可能无法将更改发送到远程Reader:
- 这些更改已被DDS DataWriter从HistoryCache中删除,不再可用。
- 这些更改被认为与此Reader无关。
由于多种原因,DDS DataWriter可能决定从HistoryCache中删除更改。如可能需要根据HISTORY QoS设置存储有限数量的更改。或者由于LIFESPAN QoS的配置,数据样本可能已过期。使用严格的可靠通信时,只有在所有读取者都已确认收到更改且DDS DataWriter仍处于活动和存活状态时,才能删除更改。
并非所有更改都可能与每个匹配的远程Reader相关,例如通过TIME_BASED_FILTER QoS或通过使用DDS内容过滤主题进行确定。在这种情况下,必须由每个读取者确定更改是否相关。可能的话在Writer端进行过滤,DDS实现可以优化带宽和/或CPU使用。这是否可行取决于DDS实现是否追踪每个远程读取者的状态以及适用于此Reader的QoS和过滤器。Reader本身将始终过滤。
本文档使用DDS_FILTER(reader,change)表示基于QoS或内容的过滤,这是一种反映过滤依赖于读取者的符号。根据写入者存储的特定读取者信息,DDS_FILTER可能是空的。对于基于内容的过滤,RTPS规范允许在每次更改时发送信息,列出已应用于更改的过滤器以及它传递的过滤器。如果可用,读取者可以使用此信息过滤更改,而无需调用DDS_FILTER。这种方法通过在Writer端过滤样本来节省CPU周期,而不是在每个Reader上过滤。
以下状态图说明了DDS DataWriter如何向HistoryCache添加更改。
图 8.6 DDS DataWriter向HistoryCache添加更改状态图
表 8.11 DDS DataWriter向HistoryCache添加更改转换表
8.2.9.1.1. 转换 T1
通过创建DDS DataWriter“the_dds_writer”来触发此转换。
转换在虚拟机中执行以下逻辑动作:
the_rtps_writer = new RTPS::Writer;
the_dds_writer.related_rtps_writer := the_rtps_writer;
8.2.9.1.2. 转换 T2
这种转换是由使用DDS DataWriter“the_dds_writer”写入数据的行为触发的。DataWriter :: write()方法将数据“data”和用于区分不同的数据对象的InstanceHandle_t类型的“handle”作为参数。
转换在虚拟机中执行以下逻辑动作:
the_rtps_writer := the_dds_writer.related_rtps_writer;
a_change := the_rtps_writer.new_change(ALIVE, data, handle);
the_rtps_writer.writer_cache.add_change(a_change);
转换后,以下后置条件成立:
the_rtps_writer.writer_cache.get_seq_num_max() == a_change.sequenceNumber
8.2.9.1.3. 转换 T3
这种转换是由处理先前使用DDS DataWriter“the_dds_writer”写入的数据对象的行为触发的。DataWriter :: dispose()方法将用于区分不同的数据对象的InstanceHandle_t类型的“handle”作为参数。
如果topicKind = = NO_KEY,则此方法无效。
转换在虚拟机中执行以下逻辑动作:
the_rtps_writer := the_dds_writer.related_rtps_writer;
if (the_rtps_writer.topicKind == WITH_KEY)
{
a_change := the_rtps_writer.new_change(NOT_ALIVE_DISPOSED, <nil>, handle);
the_rtps_writer.writer_cache.add_change(a_change);
}
转换后,以下后置条件成立:
if (the_rtps_writer.topicKind = = WITH_KEY) then
the_rtps_writer.writer_cache.get_seq_num_max() == a_change.sequenceNumber
8.2.9.1.4. 转换 T4
这种转换是通过取消注册先前使用DDS DataWriter“the_dds_writer”写入的数据对象的行为触发的。DataWriter :: unregister()方法将用于区分不同的数据对象的InstanceHandle_t类型的“handle”作为参数。
如果topicKind = = NO_KEY,则此方法无效。
转换在虚拟机中执行以下逻辑动作:
the_rtps_writer := the_dds_writer.related_rtps_writer;
if (the_rtps_writer.topicKind == WITH_KEY)
{
a_change := the_rtps_writer.new_change(NOT_ALIVE_UNREGISTERED,<nil>, handle);
the_rtps_writer.writer_cache.add_change(a_change);
}
转换后,以下后置条件成立:
if (the_rtps_writer.topicKind = = WITH_KEY) then
the_rtps_writer.writer_cache.get_seq_num_max() == a_change.sequenceNumber
8.2.9.1.5. 转换 T5
这种转换是由DDS DataWriter“the_dds_writer”的析构引发的。
转换在虚拟机中执行以下逻辑动作:
delete the_dds_writer.related_rtps_writer;