Fast DDS入门五、在Windows平台创建一个简单的Fast DDS示例程序
1 Fast DDS动态库的编译安装
本节提供了在Windows环境中从源代码安装Fast DDS的说明。将安装以下软件包:
foonathan_memory_uvendor,一个STL兼容的C++内存分配器库。
fastcdr,一个根据标准CDR序列化机制进行序列化的C++库。
fastrtps,eProsimaFast DDS库的核心库。
首先,需要满足下面详述的环境要求和依赖性。之后,用户可以选择是否遵循colcon或CMake安装说明,本文介绍采用CMake在Windows平台编译安装FastDDS的方法。
1.1环境要求
在Windows环境中从源安装FastDDS需要在系统中安装以下工具:
Visual Studio
Chocolatey
CMake、pip3、wget和git
Gtest[可选]
1.1.1 Visual Studio
Visual Studio需要在系统中具有C++编译器。为此,请确保在Visual Studio安装过程中检查“使用C++进行桌面开发”选项。
如果已安装Visual Studio,但未安装Visual C++可再发行软件包,请打开Visual Studio并转到“工具”->“获取工具和功能”,然后在“工作负载”选项卡中启用C++桌面开发。最后,单击右下角的“修改”。
1.1.2 Chocolatey
Chocolatey是一个Windows软件包管理器。需要安装eProsima Fast DDS的一些依赖项。直接从网站下载并安装。
1.1.3 CMake、pip3、wget和git
这些软件包提供了从命令行安装Fast DDS及其依赖项所需的工具。按照各自网站中的详细说明下载并安装CMake、pip3、wget和git。安装后,从“编辑系统环境变量”控制面板将可执行文件的路径添加到path。
它们的下载地址:
1.1.4 GTest
GTest是C++的单元测试库。默认情况下,Fast DDS不编译测试。调用CMake时,可以使用适当的CMake配置选项激活它们。有关详细信息,请参阅CMake选项部分。这里也将Gtest存储库添加到工作区目录中。
git clone https://github.com/google/googletest src/googletest-distribution
1.2 Fast DDS动态库相关依赖
Fast RTPS在Windows环境中从源安装时具有以下依赖关系:
Asio和TinyXML2库
OpenSSL
1.2.1 Asio和TinyXML2库
Asio是一个用于网络和低级I/O编程的跨平台C++库,它提供了一致的异步模型。TinyXML2是一个简单、小巧、高效的C++XML解析器。可以直接从以下链接下载:
下载这些包后,使用PowerShell打开管理shell并执行以下命令:
choco install -y -s <PATH_TO_DOWNLOADS>asio tinyxml2
其中<PATH_TO_DOWNLOADS>是这些包已下载到的文件夹。
1.2.2 OpenSSL
OpenSSL是一个用于TLS和SSL协议的强大工具包,也是一个通用密码库。通过此链接下载并安装最新的WindowsOpenSSL版本。安装后,添加指向安装根目录的环境变量OPENSSL_ROOT_DIR。
例如:
OPENSSL_ROOT_DIR=C:\Program Files\OpenSSL-Win64
1.3 Cmake方式编译安装FastDDS动态库
本节介绍如何在本地或全局使用CMake编译eProsima Fast DDS。
(1)打开命令提示符,创建一个FastDDS目录,在其中下载和构建Fast DDS及其依赖项:
mkdir %USERPROFILE%\Fast DDS
注意:%USERPROFILE%是指你要自定义创建的FastDDS根目录,所有文件及文件夹都在该目录下,便于管理。
(2)克隆以下依赖项并使用CMake编译它们。
Fast DDS依赖于Foonathanmemory。为了简化依赖性管理,eProsima提供了一个Foonathan memory vendor,如果在系统中找不到库,可以下载并构建特定版本的Foonathan memory。以下为CMake编译安装过程:
cd %USERPROFILE%\Fast-DDS
git clone https://github.com/eProsima/foonathan_memory_vendor.git
cd foonathan_memory_vendor
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=%USERPROFILE%/Fast-DDS/install ..
cmake --build . --target install
Fast CDR是Fast DDS以来的序列化库,以下为CMake编译安装过程:
cd %USERPROFILE%\Fast-DDS
git clone https://github.com/eProsima/Fast-CDR.git
cd Fast-CDR
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=%USERPROFILE%/Fast-DDS/install ..
cmake --build . --target install
(3)安装所有依赖项后,安装eProsima Fast DDS:
cd %USERPROFILE%\Fast-DDS
git clone https://github.com/eProsima/Fast-DDS.git
cd Fast-DDS
mkdir build && cd build
cmake -DCMAKE_INSTALL_PREFIX=%USERPROFILE%/Fast-DDS/install ..
cmake --build . --target install
注意:CMAKE_INSTALL_PREFIX为编译后,默认要安装的路径。
Foonathan memory和Fast-CDR直接采用上述命令行就可以编译安装成功。命令行下编译,最好选择好是执行Debug编译还是Release编译,以便所有互相依赖的动态库能够保持一致,不会发生调用冲突。不太了解CMake的,需要先学习一下CMake。
Fast DDS,以上命令行不能成功编译Fast DDS,因为需要配置其依赖的很多库路径(上述已经下载的库等)。因此需要启动CMake-GUI界面程序,图形界面配置这些依赖库路径。CMake-GUI界面程序启动后选择好Fast-DDS源码目录和Build目录后,先Configure,后Generate。Configure过程中,会弹出缺少相关依赖库提示,人工选择前面已经下载安装的依赖库路径,Configure成功后,就可以Generate生成完整的Fast RTPS的vs解决方案(sln文件)。最后,打开sln解决方案,在vs编译界面下,选择Build项目生成将编译生成所有项目,编译生成动态库、应用程序成功后,选择Install项目生成将安装FastDDS头文件、lib、dll、exe到默认安装的路径下,这些文件就可以给其他工程导入使用FastDDS进行开发了。
Fast DDS的CMake-GUI配置如下所示:
Fast DDS的CMake选项很多,一般选择默认选择进行编译,就够用了。如果定制化编译生成,读者可以有选择的配置,以下是详细介绍。
(4)Fast DDS的CMake选项
Fast DDS提供了许多CMake选项,用于更改Fast DDS的行为和配置。这些选项允许用户通过在CMake执行时将这些选项定义为ON/OFF来启用/禁用某些FastDDS设置。这里介绍一些主要的配置选项:
EPROSIMA_INSTALLER选项:
为Fast DDS创建Windows二进制installer安装程序,默认为OFF。具体来说,它将添加到要安装的组件(CPACK_components_ALL)对应的库到Microsoft VisualC++编译器(MSVC)。设置EPROSIMA_INSTALLER设置为ON对其他选项有以下影响:
EPROSIMA_BUILD is set to ON.
BUILD_DOCUMENTATION is set to ON.
INSTALL_EXAMPLES is set to ON.
EPROSIMA_BUILD选项:
激活内部Fast DDS构建。如果EPROSIMA_INSTALLER为ON,则EPROSIMA_BUILD也被设置为on。将EPROSIMA_BUILD设置为ON对其他选项的影响:
INTERNAL_DEBUG is set to ON.
COMPILE_EXAMPLES is set to ON if EPROSIMA_INSTALLER is OFF.
THIRDPARTY_fastcdr is set to ON if it wasnot set to FORCE.
THIRDPARTY_Asio is set to ON if it wasnot set to FORCE.
THIRDPARTY_TinyXML2 is set to ON if it wasnot set to FORCE.
THIRDPARTY_android-ifaddrs is set to ON if it wasnot set to FORCE.
EPROSIMA_BUILD_TESTS is set to ON if EPROSIMA_INSTALLER is OFF.
BUILD_SHARED_LIBS选项:
将内部库构建为共享库,即导致CMake函数add_library()来创建共享库。除非库被显式添加为静态库。
SECURITY选择:
激活Fast DDS安全模块。安全模块比较复杂,默认设置为OFF。
NO_TLS选项:
禁用传输层安全性(TLS)支持。可参阅TLSover TCP有关Fast DDS TLS配置的更多信息。
SHM_TRANSPORT_DEFAULT选项:
将共享内存传输(SHM)添加到默认传输。
FASTDDS_STATISTICS选项:
启用快速DDS统计模块,该模块目前还不成熟。
COMPILE_EXAMPLES选项:
构建Fast DDS示例。这些示例可以在Fast DDS GitHub存储库找到。
INSTALL_EXAMPLES选项:
安装Fast DDS示例,即将FastDDS示例添加到要安装的组件(CPACK_components_ALL)。
STRICT_REALTIME选项:
启用严格的实时行为。
SQLITE3_SUPPORT选项:
构建SQLITE3插件,该插件启用TRANSIENT_DURABILITY_QOS和DurabilityQosPolicyKind的PERSISENT_DURABILITY_QOS选项,因此能够提供持久性服务。
THIRDPARTY_fastcdr选项:
如果在系统的其他地方未找到Fast CDR,ON将激活该内部库的使用。FORCE激活内部Fast CDR第三方库的使用而不管它是否可以在系统中的其他地方找到。OFF禁用内部Fast CDR第三方库的使用。如果未设置为FORCE,则如果EPROSIMA_BUILD为ON,则设置为ON。
THIRDPARTY_Asio选项:
如果在系统的其他地方未找到Asio,ON将激活该内部库的使用。FORCE激活内部Asio第三方库的使用而不管它是否可以在系统中的其他地方找到。OFF禁用内部Asio第三方库的使用。如果未设置为FORCE,则如果EPROSIMA_BUILD为ON,则设置为ON。
THIRDPARTY_TinyXML2选项:
如果在系统的其他地方未找到TinyXML2,ON将激活该内部库的使用。FORCE激活内部TinyXML2第三方库的使用而不管它是否可以在系统中的其他地方找到。OFF禁用内部TinyXML2第三方库的使用。如果未设置为FORCE,则如果EPROSIMA_BUILD为ON,则设置为ON。
THIRDPARTY选项:
除非另有规定,否则就是设置所有第三方的子模块THIRPARTY_fastcdr、THIRPARTEY_Asio,
THIRPARTY_TinyXML2和THIRPARty_android-ifaddrs。
LOG_CONSUMER_DEFAULT选项:
选择日志记录模块的默认日志使用者。AUTO的行为与STDOUT相同。
LOG_NO_INFO选项:
停用信息日志级别。
FASTDDS_ENFORCE_LOG_INFO选项:
即使在非调试配置上也启用信息日志级别。此选项仅在LOG_NO_INFO设置为OFF时生效,这可能会对性能造成重大影响。
GTEST_INDIVIDUAL选项:
激活GoogleTest测试的单独构建,因为FastDDS测试是使用GoogleTest框架实现的。但是,如果EPROSIMA_BUILD设置为ON,则编译测试。因此,如果GTEST_INDIVIDUAL为OFF,而EPROSIMA-BUILD为ON,测试将作为单个主要测试进行处理。
FASTRTPS_API_TESTS选项:
支持使用Fast DDS RTPS层API构建用于验证RTPS通信的黑盒测试。
PERFORMANCE_TESTS选项:
激活性能测试的构建,视频测试除外,视频测试需要将performance_tests和video_tests设置为ON。
2 Fast DDS-Gen编译安装
eProsimaFast DDS Gen是一个Java应用程序,它使用IDL(接口定义语言)文件中定义的数据类型生成Fast DDS源代码。生成的源代码可以用于任何Fast DDS应用程序中,以定义主题的数据类型,稍后将用于发布或订阅。Fast DDS通过两个类定义Topic中交换的数据类型:TypeSupport和TopicDataType。TopicDataType描述发布和订阅之间交换的数据类型,即与Topic对应的数据;而TypeSupport封装TopicDataType的一个实例,提供注册该类型以及与发布和订阅交互所需的功能。
要声明结构化数据,必须使用IDL格式。IDL是一种规范语言,由OMG(对象管理组)制定,它以独立于语言的方式描述接口,允许不同语言的软件组件之间进行通信。Fast DDS Gen工具读取IDL文件并解析OMG IDL规范的子集,以生成数据序列化的源代码。此子集包括通过IDL定义数据类型中包含的数据类型描述。其余的文件内容将被忽略。
Fast DDS Gen生成的源代码使用Fast CDR,这是一个C++11库,提供数据序列化和编码机制。因此,如RTPS标准中所述,当发送数据时,使用相应的公共数据表示(CDR)对数据进行序列化和编码。CDR传输语法是代理间传输的低级表示,从OMGIDL数据类型映射到字节流。
Fast DDS Gen的主要功能是在不了解串行化或反序列化机制的情况下促进DDS应用程序的实现。使用Fast DDS Gen,还可以与使用Fast DDS库的发布者和订阅者一起生成DDS应用程序的C++源代码(请参阅构建发布/订阅应用程序)。Fast DDS Gen还可以为数据类型生成Python绑定,以便在基于Python的Fast DDS应用程序中使用它们(请参见构建Python辅助库)。
2.1环境要求
为了编译Fast DDS Gen,需要在系统中安装以下软件包:
Java JDK
Gradle
JDK是一个使用Java语言构建应用程序和组件的开发环境。按照Oracle网站中给出的步骤下载并安装它。
Gradle是一个开源的自动化构建工具,首选下载并安装Gradle的最新的稳定版本。
Java JDK和Gradle可去对应官方网站下载。
2.2编译安装Fast DDS-Gen
满足上述要求后,按照以下步骤安装Fast DDS Gen:
cd ~
git clone --recursive https://github.com/eProsima/Fast-DDS-Gen.git
cd Fast-DDS-Gen
gradle assemble
编译成功后Fast DDS Gen文件夹包含以下软件包:
share/fastddsgen,生成的Java应用程序所在的位置。
scripts,包含一些用户友好的脚本。注意:要使这些脚本可以从任何目录访问,请将脚本文件夹路径添加到path环境变量。
CSDN下载:免费下载Fast DDS编译后的动态库
github下载:git clone https://github.com/FantasticSaltedFish/Fast-DDS.git