优雅的玩转Fast-DDS

优雅的玩转Fast-DDS

安装依赖

sudo apt install cmake g++ python3-pip wget git

pip3 install -U colcon-common-extensions vcstool

Fast DDS for Linux

最新版本的 eProsima Fast DDS for Linux 可在 eProsima 网站的下载 (eprosima.com)网页,下载eProsima_Fast-DDS-v2.10.0-Linux.tgz

在系统中安装 eProsima 快速 DDS 及其所有依赖项,请执行 具有管理权限的脚本:install.sh

cd <extraction_directory>
sudo ./install.sh

内容

该文件夹包含以下包:src

  • foonathan_memory_vendor,一个与 STL 兼容的C++内存分配器
  • fastcdr,一个根据 CDR 标准OMG CDR 第 10.2.1.2 节)进行数据序列化的C++库。
  • fastrtps,_易普罗西玛快速DDS_库的核心库。
  • fastddsgen,一个使用 IDL 文件中定义的数据类型生成源代码的 Java 应用程序。

如果不需要这些组件中的任何一个,可以简单地重命名或将其从目录中删除。src

使用 eProsima Fast DDS 运行应用程序实例时,必须将其与库链接,其中 已安装软件包,.有两种可能性:/usr/local/lib/

  • 通过在用于运行_eProsima快速DDS_实例的控制台中键入内容在本地准备环境 命令:

    export LD_LIBRARY_PATH=/usr/local/lib/

  • 通过执行以下命令将其永久添加到 中:PATH

    echo ‘export LD_LIBRARY_PATH=/usr/local/lib/’ >> ~/.bashrc

编译

cd <extraction_directory>
colcon build

编写应用程序

背景

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

创建应用工作目录区

应用程序工作区在项目结束时将具有以下结构。 文件,并且是发布服务器应用程序和 分别是订户应用程序。build/DDSHelloWorldPublisher``build/DDSHelloWorldSubscriber

.
└── workspace_DDSHelloWorld
    ├── build
    │   ├── CMakeCache.txt
    │   ├── CMakeFiles
    │   ├── cmake_install.cmake
    │   ├── DDSHelloWorldPublisher
    │   ├── DDSHelloWorldSubscriber
    │   └── Makefile
    ├── CMakeLists.txt
    └── src
        ├── HelloWorld.cxx
        ├── HelloWorld.h
        ├── HelloWorld.idl
        ├── HelloWorldPublisher.cpp
        ├── HelloWorldPubSubTypes.cxx
        ├── HelloWorldPubSubTypes.h
        └── HelloWorldSubscriber.cpp
创建目录
mkdir workspace_DDSHelloWorld && cd workspace_DDSHelloWorld
mkdir src build
配置 CMake 项目
cd workspace_DDSHelloWorld
touch CMakeLists.txt 
vi CMakeLists.txt 

添加以下内容

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()

构建主题数据类型

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

cd src && touch HelloWorld.idl

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

struct HelloWorld

{

  unsigned long index;

  string message;

};

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

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

这必须生成以下文件:

  • HelloWorld.cxx:HelloWorld 类型定义。
  • HelloWorld.h:HelloWorld.cxx 的头文件。

  • HelloWorldPubSubTypes.cxx:HelloWorld 类型的序列化和反序列化代码。

  • HelloWorldPubSubTypes.h:HelloWorldPubSubTypes.cxx的头文件。

CMakeLists.txt

CMakeLists.txt文件下添加入

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

添加文件示例

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

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

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

CMakeLists.txt

在之前创建的 CMakeList.txt 文件的末尾包含以下代码段

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

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

编译、运行

cd build
cmake ..
cmake --build .

./DDSHelloWorldPublisher
./DDSHelloWorldSubscriber

卸载

要卸载所有已安装的组件,请执行 uninstall.sh 脚本(具有管理权限):

cd <extraction_directory>
sudo ./uninstall.sh

猜你喜欢

转载自blog.csdn.net/yiyu20180729/article/details/130266652
dds
今日推荐