TROS.A 同时支持两种方式定义 Message。第一种 Message 需要按照下述章节自己实现消息及序列化类的定义。第二种 Message 支持用工具将 IDL 消息定义生成 C++ Message,简化了用户操作。
1. 第一种Message消息定义示例(用户自定义)
1.1 简介
1.2 使用示例
1.2.1要传输的Message和对应序列化定义
首先我们要说明的是,communication 并不规定和限制用户使用何种序列化方法,但是由于 protobuf 的使用广泛性,我们此处就以 protobuf 格式来作为 example 进行说明,用 protobuf 定义我们想要处理和通信的图片信息,图片的元信息使用 protobuf,但图片的数据本身由于比较大,此处不放到 protobuf 中,而是作为 ref data 来通信。
1.2.2 Fast-DDS 传输的 Message 和对应序列化定义¶
idl 中的数据类型是有规范的,不能直接用 C/C++ 的类型去定义 idl 的数据类型。请参考官网的相关教程。
定义 DDS 的 idl 文件。DDS 的 idl 支持不同数据 type 的定义以及包含。文件扩展名为 .idl, 内容规范请参考 Fast-DDS 官网教程说明 : Defining a data type via IDL。example:SimpleDDSMsg.idl指令参考如下:
idl 中的数据类型是有规范的,不能直接用 C/C++ 的类型去定义 idl 的数据类型。请参考官网的相关教程。
- 使用 fastddsgen 工具,将 idl 文件转换成 C++ 文件。 工具目录: tool/dds/fastrtpsgen/scripts/fastddsgen。
example 指令参考如下:
- 将生成的 C++ 文件移动到用户指定的数据定义目录下,使用时需要利用 message/dds/dds_serializer.hpp 中的 DDSDataSerializer 模板类进行包裹 。
example 参考指令如下:
由于采用 Fastdds 直接传输数据,因此 DDSMsg 对象中的 Message 基类成员变量都是初始状态,暂未赋值。
2. 第二种Message消息定义示例(转换工具自动实现)
2.1 简介
2.2 使用示例
2.2.1 创建消息定义文件
BoleIDL 的消息定义采用了 protobuf 定义的子集。
2.2.2 转换为C++代码
采用 boleidlc 工具将 BoleIDL 转换为 C++ 代码。
编译 communication 后,boleidlc 位于 communication/build/build_subfolder/tool/boleidlc/ 这个目录。 在当前目录下可以看到生成如下文件,demo.bolemsg.[h|cpp] 中时 BoleMsg 的类定义,demo.boletype.[h|cpp] 中时关于 TypeSupport 类的定义。
BoleMsg 类定义有两种,针对上面的例子,具体为:
先描述一下后者,携带后缀Bolemsg的类是可以传递给communication的 Pub() 这样的发送接口的,主要是用来进行通讯;而前者主要是用来在业务中读写数据的。
以一个简明的example来说明一下:
2.2.3 创建pub、sub、
创建Sub
创建pub,并发送BoleMsg
2.2.4 命名规则说明
namespace
生成的 BoleMsg 和 TypeSupport 类的 namespace 命名规则为 bolemsg::${package}::${BoleMsg} packge:基于 BoleIDL 文件中的 package 字段转换得到的C++规范的namespace,具体规则是 包名中的 . 号转换成 _ 。
类名
BoleMsg 的类名与在 BoleIDL 文件中定义的消息名字相同。
TypeSupport 的类名为”消息名字+_TypeSupport”。

