FastDDs学习

@FastDDs 学习记录一

这次所有的例程都是在Linux ubantu 20.04.1上实现的
学习 FastDDS 中间件

什么是DDs

是一个以数据为中心的发布订阅 (DCPS) 模型,因此在其实现中定义了三个关键的应用实体:发布实体,它定义了信息生成对象及其属性;订阅实体,定义信息消费对象及其属性;以及定义作为主题传输的信息类型的配置实体,并使用其服务质量 (QoS) 属性创建发布者和订阅者,确保上述实体的正确性能。

DDS 使用 QoS 来定义 DDS 实体的行为特征。QoS 由单独的 QoS 策略(从 QoSPolicy 派生的类型对象)组成

实时发布订阅:RTPS 发展到支持DDS的应用,是一种出版物订阅通信中间件在尽力而为的

RTPSWriter:能够发送数据的端点

RTPSReader:端点能够接收数据

一个 RTPSParticipant 可以有任意数量的写入器和读取器端点
FastDDs学习_第1张图片
在 fastDDS官网 官网有详细的介绍和例程
本次就是实现一个HelloWorld 订阅者/发布者例程

HelloWorld例程

首先需要安装一些工具 ,在官网上也有一些描述
在这里插入图片描述
安装大佬README.md 是这样的
FastDDs学习_第2张图片
全部安装就完事了

一 、安装依赖
在 Linux 环境中从二进制文件安装时,eProsima Fast DDS具有以下依赖项:
1、Asio and TinyXML2 libraries
2、OpenSSL
Asio 和 TinyXML2 库

Asio 是一个用于网络和低级 I/O 编程的跨平台 C++ 库,它提供了一致的异步模型。TinyXML2 是一个简单、小巧且高效的 C++ XML 解析器。使用相应 Linux 发行版的包管理器安装这些库。例如,在 Ubuntu 上使用命令:

sudo apt install libasio-dev libtinyxml2-dev

OpenSSL 是用于 TLS 和 SSL 协议的强大工具包和通用加密库。使用相应 Linux 发行版的包管理器安装OpenSSL。例如,在 Ubuntu 上使用命令:

sudo apt install libssl-dev

colcon是一个基于CMake的命令行工具,旨在构建软件包集。本节说明如何使用它来编译eProsima Fast DDS及其依赖项

通过执行以下命令安装 ROS 2 开发工具(colcon和vcstool):

pip3 install -U colcon-common-extensions vcstool

如果这由于环境错误而失败,请将该–user标志添加到pip3安装命令中。

创建一个Fast-DDS目录并下载将用于安装eProsima Fast DDS及其依赖项的 repos 文件 :

mkdir ~/Fast-DDS
cd ~/Fast-DDS
wget https://raw.githubusercontent.com/eProsima/Fast-DDS/master/fastrtps.repos
mkdir src
vcs import src < fastrtps.repos

构建包

colcon build

二、编译安装 Foonathan memory ,提供了经过优化的分配器

git clone https://github.com/foonathan/memory.git
cd memory
mkdir build && cd build
# 默认安装路径:/usr/local
cmake ..
make
sudo make install

三、编译安装 Fast CDR 提供了两种序列化机制

git clone https://github.com/eProsima/Fast-CDR.git
mkdir Fast-CDR/build && cd Fast-CDR/build
cmake ..
make
sudo make install

接着就是安装编译 Fast-DDS和 Fast-DDS-gen

HelloWorld 例程实现

DDS 是一个以数据为中心的通信中间件,它实现了 DCPS 模型。该模型基于发布者的开发,数据生成元素;和一个订阅者,一个数据消费元素。这些实体通过主题进行通信,主题是绑定两个 DDS 实体的元素。发布者在一个主题下生成信息,订阅者订阅同一主题以接收信息。

首先需要按照官网 安装好所有的依赖包

创建应用程序工作区

在项目结束时,应用程序工作区将具有以下结构。Filesbuild/DDSHelloWorldPublisher和build/DDSHelloWorldSubscriber分别是发布者应用程序和订阅者应用程序。

我们先创建目录

mkdir workspace_DDSHelloWorld && cd workspace_DDSHelloWorld
mkdir src build

再要看看Fast DDS 和 Fast CDR的头文件分别位于目录/usr/include/fastrtps/和 /usr/include/fastcdr/中。两者的编译库都可以在目录/usr/lib/ 中找到。

一、配置CMake项目
我们将使用 CMake 工具来管理项目的构建。使用您喜欢的文本编辑器,创建一个名为 CMakeLists.txt 的新文件,然后复制并粘贴以下代码片段。将此文件保存在工作区的根目录中。如果您已遵循这些步骤,则它应该是workspace_DDSHelloWorld

cmake_minimum_required(VERSION 3.12.4)

if(NOT CMAKE_VERSION VERSION_LESS 3.0)
    cmake_policy(SET CMP0048 NEW)
endif()

project(DDSHelloWorld)

# Find requirements
if(NOT fastcdr_FOUND)
    find_package(fastcdr REQUIRED)
endif()

if(NOT fastrtps_FOUND)
    find_package(fastrtps REQUIRED)
endif()

# Set C++11
include(CheckCXXCompilerFlag)
if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_COMPILER_IS_CLANG OR
        CMAKE_CXX_COMPILER_ID MATCHES "Clang")
    check_cxx_compiler_flag(-std=c++11 SUPPORTS_CXX11)
    if(SUPPORTS_CXX11)
        add_compile_options(-std=c++11)
    else()
        message(FATAL_ERROR "Compiler doesn't support C++11")
    endif()
endif()

在每个部分中,我们将完成此文件以包含特定生成的文件

二、构建主题数据
eProsima Fast DDS-Gen是一个 Java 应用程序,它使用接口描述语言 (IDL) 文件中定义的数据类型生成源代码。这个应用程序可以做两种不同的事情:

为您的自定义主题生成 C++ 定义。

生成使用您的主题数据的功能示例。

本教程将遵循前者。要查看后者的应用示例,您可以查看其他示例。有关更多详细信息,请参阅简介。对于这个项目,我们将使用 Fast DDS-Gen 应用程序来定义将由发布者发送并由订阅者接收的消息的数据类型。

在工作空间目录中,执行以下命令:

cd src && touch HelloWorld.idl

这将在src目录中创建 HelloWorld.idl 文件。在您喜欢的文本编辑器中打开该文件,然后复制并粘贴以下代码片段。

struct HelloWorld
{
    unsigned long index;
    string message;
};

通过这样做,我们已经定义了HelloWorld数据类型,它具有两个元件:一个索引类型的uint32_t 和消息类型的std::string。剩下的就是生成在 C++11 中实现此数据类型的源代码。为此,请从src目录运行以下命令。

<path/to/Fast DDS-Gen>/scripts/fastddsgen HelloWorld.idl

如果找不到 fastddsgen 在哪个位置,可以用命令

find / -name fastddsgen

进行查找 一般在 fastrtpsgen/scripts/fastddsgen
这句命令之后会生成
FastDDs学习_第3张图片
接下来在之前创建的 CMakeList.txt 文件的末尾包含以下代码片段

message(STATUS "Configuring HelloWorld publisher/subscriber example...")
file(GLOB DDS_HELLOWORLD_SOURCES_CXX "src/*.cxx")

三、发布者代码

从工作区的src目录中,运行以下命令以下载 HelloWorldPublisher.cpp 文件

wget -O HelloWorldPublisher.cpp \
    https://raw.githubusercontent.com/eProsima/Fast-RTPS-docs/master/code/Examples/C++/DDSHelloWorld/src/HelloWorldPublisher.cpp

FastDDs学习_第4张图片
在您之前创建的 CMakeList.txt 文件的末尾包含以下代码片段

add_executable(DDSHelloWorldPublisher src/HelloWorldPublisher.cpp ${DDS_HELLOWORLD_SOURCES_CXX})
target_link_libraries(DDSHelloWorldPublisher fastrtps fastcdr)

此时,您可以构建、编译和运行发布者应用程序。从工作区的构建目录中,运行以下命令

cmake ..
make
./DDSHelloWorldPublisher

四、订阅者代码

wget -O HelloWorldSubscriber.cpp \
    https://raw.githubusercontent.com/eProsima/Fast-RTPS-docs/master/code/Examples/C++/DDSHelloWorld/src/HelloWorldSubscriber.cpp

遵循与发布者解释相同的结构,我们从 C++ 头文件的包含开始。在这些文件中,包含发布者类的文件被订阅者类替换,数据写入者类被数据读取者类替换
FastDDs学习_第5张图片
在您之前创建的 CMakeList.txt 文件的末尾包含以下代码片段。这会添加构建可执行文件所需的所有源文件,并将可执行文件和库链接在一起。

add_executable(DDSHelloWorldSubscriber src/HelloWorldSubscriber.cpp ${DDS_HELLOWORLD_SOURCES_CXX})
target_link_libraries(DDSHelloWorldSubscriber fastrtps fastcdr)

此时,您可以构建、编译和运行订阅者应用程序。从工作区的构建目录中,运行以下命令。

cmake ..
make clean && make
./DDSHelloWorldSubscriber

最后,从构建目录,从两个终端运行发布者和订阅者应用程序。

./DDSHelloWorldPublisher
./DDSHelloWorldSubscriber

FastDDs学习_第6张图片
最后的效果
FastDDs学习_第7张图片

你可能感兴趣的:(中间件学习,linux,中间件,分布式)