Fast-RTPS

Fast-RTPS是eprosima对于RTPS的C++实现,是一个免费开源软件,遵循Apache License 2.0

Fast-RTPS现在被称为Fast-DDS,作为ROS2的默认中间件

具有以下优点:

  • 对于实时应用程序来说,可以在best-effort和reliable两种策略上进行配置
  • 即插即用的连接性,使网络的所有成员自动发现其他新成员
  • 模块化和可扩展性允许网络中设备不断增长
  • 可配置的网络行为和可互换的传输层:为每个部署选择最佳协议和系统输入/输出通道组合
  • 两个API层:一个简单易用的发布者--订阅者层;一个提供对RTPS协议内部更好控制的Writer--Reader层

Fast-RTPS提供了两个层次的API

  • Publisher-Subscriber层:RTPS上的简化抽象
  • Writer-Reader层:对于RTPS端点的直接控制 (更底层)

Publisher-Subscriber层为大多数开发者提供了一个方便的抽象。允许定义与topic关联的发布者和订阅者,以及传输topic数据的简单方法。

Writer-Reader层更接近于RTPS标准中定义的概念,并且可以进行更精准的控制,但是要求开发者直接与每个端点的历史记录缓存进行交互。

Fast-RTPS是并发且基于事件的。每个参与者都会生成一组线程来处理后台任务,例如:日志记录,消息接收和异步通信

事件系统使得Fast-RTPS能够响应某些条件并安排定期活动。用户中几乎不用感知它们,因为这些事件大多数仅仅与元数据有关

Fast-RTPS实现的核心结构

Publisher-Subscriber模块

RTPS标准的高层类型

  • Domain(域):用来创建,管理和销毁Participants(参与者)
  • Participants(参与者):包括Publisher和Subscriber,并管理他们的配置
    • ParticipantsAttributes:创建Participants的配置参数
    • ParticipantsListener:可以让开发者实现Participants的回调函数
  • Publisher:在topic上发布数据的对象
    • PublisherAttributes:创建Publisher的配置参数
    • PublisherListener:可以让开发者实现Publisher的回调函数
  • Subscriber:在topic上接收数据的对象
    • SubscriberAttributes:创建Subscriber的配置参数
    • SubscriberListener:可以让开发者实现Subscriber的回调函数

RTSP模块

RTPS的底层模型,包含以下模块:

  • RTPS Common
    • CacheChange_t:描述topic上的变更,储存在历史Cache(高速缓冲存储器)中
    • Data:Cache变化的负载
    • Message:RTPS消息
    • Sub-Message Header:标识RTPS的订阅消息
    • MessageReceiver:反序列化和处理接收到的RTPS消息
    • RTPSMessageCreator:构建RTPS消息
  • RTPS Domain
    • RTPSDomain:用来创建,管理和销毁底层的RTPSParticipants
    • RTPSParticipant:包括Writer和Reader
  • RTPS Reader
    • RTPSReader:读者的基类
    • ReaderAttributes:包含RTPS读者的配置参数
    • ReaderHistory:存储topic变化的历史数据
    • ReaderListener:读者的回调类型
  • RTPS Writer
    • RTPSWriter:写者的基类
    • WriterAttributes:包含RTPS写者的配置参数
    • WriterHistory:存储写者的历史数据

配置Attributes

上面的数据结构中,有很多Attributes后缀的类名。这些类包含了对协议或者对象的配置参数。很多特性需要设置这些属性来完成.

可通过XML文件的方式来进行配置

Domain

RTPS中通信参数者之间,通过Domain隔离

同一时刻可能有多个Domain同时存在,一个Domain中可以包含任意数目的消息发送者和接收者。

开发者可以通过DomainID指定参与者所属的Domain,默认为80

发现

作为DDS的实现,Fast-RTPS提供了Publisher和Subscriber自动发现和匹配的功能。实现上分为两个步骤完成:

  • PDP (Participant Discovery Phase)参与者发现阶段:在这个阶段,参与者互相通知彼此的存在。为了达到这个目的,每个参与者需要定时发送给公告信息。公告信息通过周知的多播地址和端口发送。对应的独立协议为Simple Participant Discovery Protocol:指定参与者如何在网络中发现彼此
  • EDP(Endpoint Discovery Phase) 端点发现阶段:在这个阶段,Publisher和Subscriber互相确认。为此,参与者使用在PDP阶段建立的通信通道,彼此共享有关其发布者和订阅者的信息。该信息包含了topic和数据类型。为了使两个端点匹配,他们的topic和数据类型必须一致。一旦发布者和订阅者匹配,就数据交互了。对应的独立协议为Simple Endpoint Discovery Protocol:定义了已经互相发现的参与者交换信息的协议

Fast-RTPS提供了四种发现机制

  • Simple:默认机制。在PDP和EDP阶段均使用RTPS标准,因此可与任何其他DDS和RTPS实现兼容。
  • Static:此机制在PDP阶段使用Simple Participant Discovery Protocol。如果所有发布者和订阅者的地址及端口和主题信息是事先知道的,则允许跳过EDP阶段。
  • Server--Client:这种发现机制使用集中式发现结构,由服务器充当发现机制的Hub
  • Manual:此机制仅与RTPSDomain层兼容。禁用了PDP阶段,使用户可以使用其选择的任何外部元信息通道手动匹配和取消匹配RTPS参与者,读者和写者。

不同发现机制具有一些相同配置

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Fast-RTPS 是一个高性能的实时通信协议,用于在分布式系统中传输实时数据。在 Fast-RTPS 中,每个消息都由头部和数据组成。在本示例中,我们将展示如何解析 Fast-RTPS 消息的头部字段以及 topic name。 首先,我们需要了解 Fast-RTPS 消息头部字段的含义。Fast-RTPS 消息头部包括以下字段: - `protocolId`:Fast-RTPS 协议的版本号。 - `vendorId`:Fast-RTPS 实现的厂商 ID。 - `guidPrefix`:全局唯一标识符的前缀,用于识别 Fast-RTPS 实例。 - `guidEntityId`:Fast-RTPS 实体的唯一标识符。 - `sequenceNumber`:消息的序列号。 - `sourceTimestamp`:消息的时间戳。 - `destinationGuidPrefix`:消息的目标实体的 GUID 前缀。 其中,`guidPrefix` 和 `guidEntityId` 组成了消息的唯一标识符 GUID,用于在 Fast-RTPS 网络中识别消息。 接下来,我们可以通过以下代码示例解析 Fast-RTPS 消息的头部字段和 topic name: ```c++ #include <fastrtps/fastrtps.h> #include <fastrtps/attributes/TopicAttributes.h> void parseFastRTPSMessageHeader(const void* buffer, size_t size) { // Deserialize the message header using Fast-RTPS library eprosima::fastcdr::FastBuffer cdrbuffer(reinterpret_cast<char*>(const_cast<void*>(buffer)), size); eprosima::fastrtps::rtps::CDRMessage_t cdrm(cdrbuffer); eprosima::fastcdr::Cdr cdr_des(cdrm, eprosima::fastcdr::Cdr::DEFAULT_ENDIAN, eprosima::fastcdr::Cdr::DDS_CDR); // Parse the fields in the header eprosima::fastrtps::rtps::Header_t header; header.readFromCDRMessage(cdrm); std::cout << "protocolId: " << std::to_string(header.protocolId) << std::endl; std::cout << "vendorId: " << std::to_string(header.vendorId) << std::endl; std::cout << "guidPrefix: " << header.guidPrefix << std::endl; std::cout << "guidEntityId: " << header.guidEntityId << std::endl; std::cout << "sequenceNumber: " << std::to_string(header.sequenceNumber.to64long()) << std::endl; std::cout << "sourceTimestamp: " << header.sourceTimestamp.to_string() << std::endl; std::cout << "destinationGuidPrefix: " << header.destinationGuidPrefix << std::endl; // Deserialize the topic name from the message payload eprosima::fastrtps::TopicAttributes topic_attr; topic_attr.deserialize(&cdr_des); std::cout << "topic name: " << topic_attr.getTopicName() << std::endl; } ``` 在上述示例中,我们使用了 Fast-RTPS 库中的 `Header_t` 类和 `TopicAttributes` 类来解析消息头部和 topic name。首先,我们将消息头部反序列化为 `Header_t` 类型,并读取其中的各个字段。然后,我们从消息负载中反序列化出 `TopicAttributes` 类型,以获取 topic name。 该示例代码可以在 Fast-RTPS 库提供的各种平台和语言中使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值