eProsima-fastdds简介

eProsima Fast DDS

eProsima Fast DDS是 DDS(数据分发服务)规范的 C++ 实现,该规范由对象管理组 (OMG)定义。eProsima Fast DDS库提供应用程序编程接口 (API) 和通信协议,用于部署以数据为中心的发布者-订阅者 (DCPS) 模型,目的是在实时系统之间建立高效可靠的信息分发。 eProsima 快速 DDS在资源处理方面是可预测的、可扩展的、灵活的和高效的。为了满足这些要求,它使用类型化接口并依赖于多对多分布式网络范式,该范式巧妙地允许通信的发布方和订阅方分离。 eProsima Fast DDS包括:
1.DDS API实现。
2.Fast DDS-Gen,一种用于将类型化接口与中间件实现桥接的生成工具。
3.底层RTPS有线协议实现。

DDS API

DDS 采用的通信模型是多对多的单向数据交换,其中产生数据的应用程序将其发布到属于使用数据的应用程序的订阅者的本地缓存。信息流由负责数据交换的实体之间建立的服务质量 (QoS) 策略进行管理。
作为以数据为中心的模型,DDS 建立在所有感兴趣的应用程序都可以访问的“全局数据空间”的概念之上。想要提供信息的应用程序声明其意图成为发布者,而想要访问部分数据空间的应用程序则声明其意图成为订阅者。每次发布者向该空间发布新数据时,中间件都会将信息传播给所有感兴趣的订阅者。
通信跨域发生,即连接所有能够相互通信的分布式应用程序的孤立抽象平面。只有属于同一域的实体才能交互,订阅数据的实体与发布数据的实​​体之间的匹配是由主题介导的。主题是明确的标识符,它将在域中唯一的名称与数据类型和一组附加的特定于数据的 QoS 相关联。
DDS 实体被建模为类或类型化接口。后者意味着更有效的资源处理,因为在执行之前了解数据类型允许提前分配内存而不是动态分配内存。
在这里插入图片描述
信息如何在 DDS 域内流动的概念图。只有属于同一域的实体才能通过匹配主题发现彼此,从而在发布者和订阅者之间交换数据

fast DDS-Gen

依赖接口意味着需要一种生成工具,将类型描述转换为适当的实现,以填补接口和中间件之间的空白。此任务由专用生成工具Fast DDS-Gen执行,这是一个 Java 应用程序,它使用接口定义语言 (IDL)文件中定义的数据类型生成源代码

RTPS Wire Protocol

eProsima Fast DDS用于在标准网络上交换消息的协议是实时发布-订阅协议 (RTPS),它是由 OMG 联盟定义和维护的 DDS 互操作性有线协议。该协议通过 TCP/UDP/IP 等传输提供发布者-订阅者通信,并保证不同 DDS 实现之间的兼容性。
鉴于其发布-订阅根及其规范旨在满足 DDS 应用程序域所解决的相同要求,RTPS 协议映射到许多 DDS 概念,因此是 DDS 实现的自然选择。所有 RTPS 核心实体都与一个 RTPS 域相关联,该域代表一个端点匹配的隔离通信平面。RTPS 协议中指定的实体与 DDS 实体一一对应,从而允许进行通信。

特点

两个 API 层。 eProsima Fast DDS包括一个专注于可用性的高级 DDS 兼容层和一个较低级别的 RTPS 兼容层,该层提供对 RTPS 协议的更精细访问。
实时行为。 eProsima Fast DDS可以配置为提供实时功能,保证在指定的时间限制内做出响应。
内置发现服务器。 eProsima Fast DDS基于对现有发布者和订阅者的动态发现,并持续执行此任务,无需联系或设置任何服务器。但是,也可以配置客户端-服务器发现以及其他发现范例。
同步和异步发布模式。 eProsima Fast DDS支持同步和异步数据发布。
尽最大努力和可靠的沟通。 eProsima Fast DDS支持基于尽力而为通信协议(如 UDP)的可选可靠通信范例。此外,另一种设置可靠通信的方法是使用我们的 TCP 传输。
传输层。 eProsima Fast DDS实现了一种可插拔传输的架构。当前版本实现了五种传输:UDPv4、UDPv6、TCPv4、TCPv6 和 SHM(共享内存)。
安全。 eProsima Fast DDS可以配置为提供安全通信。为此,它在三个级别实现了可插拔安全性:远程参与者的身份验证、实体的访问控制和数据的加密。
统计模块。 eProsima Fast DDS可以配置为收集和提供有关用户应用程序正在交换的数据的信息。
吞吐量控制器。我们支持用户可配置的吞吐量控制器,可用于限制在特定条件下要发送的数据量。
即插即用连接。新的应用程序和服务会自动发现,并且可以随时加入和离开网络,无需重新配置。
可扩展性和灵活性。DDS 建立在全局数据空间的概念之上。中间件负责在发布者和订阅者之间传播信息。这保证了分布式网络能够适应重新配置并扩展到大量实体。
应用程序可移植性。DDS 规范包括到 IDL 的特定平台映射,允许使用 DDS 的应用程序在 DDS 实现之间切换,只需重新编译。
可扩展性。 eProsima Fast DDS允许使用新服务扩展和增强协议,而不会破坏向后兼容性和互操作性。
可配置性和模块化。 eProsima Fast DDS通过代码或 XML 配置文件提供了一种直观的配置方式。模块化允许简单的设备实现协议的子集并仍然参与网络。
高性能。 eProsima Fast DDS使用静态低级序列化库 Fast CDR ,这是一个 C++ 库,根据RTPS 规范中定义的标准 CDR 序列化机制进行序列化(请参阅数据封装章节作为参考)。
便于使用。该项目带有一个开箱即用的示例,即DDSHelloWorld (请参阅入门),它将发布者和订阅者进行通信,展示了如何部署eProsima Fast DDS。此外,交互式演示ShapesDemo可供用户深入了解 DDS 世界。DDS 层和 RTPS 层在DDS 层和 RTPS 层部分进行了详细说明。
资源消耗低。 eProsima 快速 DDS:
允许预先分配资源,以最小化动态资源分配。
避免使用无限资源。
最大限度地减少复制数据的需要。
多平台。操作系统依赖项被视为可插入模块。用户可以在其目标平台上使用eProsima Fast DDS库轻松实现平台模块。默认情况下,该项目可以在 Linux、Windows 和 MacOS 上运行。

以下是一个基本的FastDDS调用类的封装示例: ``` #include <fastdds/dds/domain/DomainParticipant.hpp> #include <fastdds/dds/topic/Topic.hpp> #include <fastdds/dds/publisher/DataWriter.hpp> #include <fastdds/dds/subscriber/DataReader.hpp> class FastDDSWrapper { public: FastDDSWrapper() { // Initialize the DomainParticipant eprosima::fastdds::dds::DomainParticipantQos participant_qos; participant_ = eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->create_participant(0, participant_qos); // Initialize the Publisher and Subscriber publisher_ = participant_->create_publisher(); subscriber_ = participant_->create_subscriber(); } ~FastDDSWrapper() { // Delete the Publisher, Subscriber, and DomainParticipant participant_->delete_publisher(publisher_); participant_->delete_subscriber(subscriber_); eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->delete_participant(participant_); } // Create a Topic and return a pointer to it eprosima::fastdds::dds::Topic* create_topic(const std::string& topic_name, const std::string& type_name) { return eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->create_topic(topic_name, type_name, eprosima::fastdds::dds::TOPIC_QOS_DEFAULT); } // Delete a Topic void delete_topic(eprosima::fastdds::dds::Topic* topic) { eprosima::fastdds::dds::DomainParticipantFactory::get_instance()->delete_topic(topic); } // Create a DataWriter and return a pointer to it eprosima::fastdds::dds::DataWriter* create_datawriter(eprosima::fastdds::dds::Topic* topic) { eprosima::fastdds::dds::DataWriterQos writer_qos; writer_ = publisher_->create_datawriter(topic, writer_qos); return writer_; } // Delete a DataWriter void delete_datawriter(eprosima::fastdds::dds::DataWriter* writer) { publisher_->delete_datawriter(writer); } // Create a DataReader and return a pointer to it eprosima::fastdds::dds::DataReader* create_datareader(eprosima::fastdds::dds::Topic* topic) { eprosima::fastdds::dds::DataReaderQos reader_qos; reader_ = subscriber_->create_datareader(topic, reader_qos); return reader_; } // Delete a DataReader void delete_datareader(eprosima::fastdds::dds::DataReader* reader) { subscriber_->delete_datareader(reader); } private: eprosima::fastdds::dds::DomainParticipant* participant_; eprosima::fastdds::dds::Publisher* publisher_; eprosima::fastdds::dds::Subscriber* subscriber_; eprosima::fastdds::dds::DataWriter* writer_; eprosima::fastdds::dds::DataReader* reader_; }; ``` 这个FastDDS调用类有以下几个方法: - 构造函数:初始化DomainParticipant、Publisher和Subscriber。 - 析构函数:删除Publisher、Subscriber和DomainParticipant。 - create_topic():创建一个Topic并返回指向它的指针。 - delete_topic():删除一个Topic。 - create_datawriter():创建一个DataWriter并返回指向它的指针。 - delete_datawriter():删除一个DataWriter。 - create_datareader():创建一个DataReader并返回指向它的指针。 - delete_datareader():删除一个DataReader。 这个类还有一些可以改进的地方,例如添加一些QoS设置方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值