专栏算法工具链Message消息定义

Message消息定义

TROS.Assist2024-03-14
80
0

TROS.A 同时支持两种方式定义 Message。第一种 Message 需要按照下述章节自己实现消息及序列化类的定义。第二种 Message 支持用工具将 IDL 消息定义生成 C++ Message,简化了用户操作。

1. 第一种Message消息定义示例(用户自定义)

1.1 简介

为了使用 communication,必须定义 message 和对应序列化类。 用户的 message 必须继承自基础的 Message 类,如下:
序列化类必须继承自基础的序列化类 SerializerPolicy,如下:
特别注意一点,序列化类中必须定义 MsgType 为对应的 message 类型,比如 MessageA 的序列化类为 SerializerA,那么在定义 SerializeA 的时候,必须如下:
对于进程内通信,为了接口的统一,也需要序列化类,但 communication 是不对进程内通信做序列化和反序列化的。因此我们提供了一个便利的序列化类 DoNothingSerializer,专门用于进程内通信,如下:
如果用户的消息不包含 meta,只是传输 data,那么也可以直接使用 DoNothingSerializer 作为序列化类,用于进程间和设备间通信。

1.2 使用示例

1.2.1要传输的Message和对应序列化定义

首先我们要说明的是,communication 并不规定和限制用户使用何种序列化方法,但是由于 protobuf 的使用广泛性,我们此处就以 protobuf 格式来作为 example 进行说明,用 protobuf 定义我们想要处理和通信的图片信息,图片的元信息使用 protobuf,但图片的数据本身由于比较大,此处不放到 protobuf 中,而是作为 ref data 来通信。

使用 protoc 生成 SimpleImage 的消息定义和序列化功能:simple_image.pb.h 和 simple_image.pb.cc,然后我们基于这些,来详细看如何使用 communication 来 SimpleImage 进行通信。 首先,我们按照前面说的,要定义一个 message 和序列化类,包裹 SimpleImage,指令参考如下:
其中 ImgProtoMsg 就是我们要传输的 message 定义,通过使用 communication 预先定义的 ProtoMsg 模板类,包裹了 SimpleImage,而序列化直接使用了 ProtobufSerializer 模板类,这个模板类是 communication 专门为了 protobuf 的序列化提前定义好的,便于使用。

1.2.2 Fast-DDS 传输的 Message 和对应序列化定义

Fast-DDS 传输的方式下,数据类型要符合 DDS 自身的 idl 定义,还需要和 communication 的 Message 定义统一,需要完成以下几个步骤:
  1. 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 的数据类型。请参考官网的相关教程。

  2. 使用 fastddsgen 工具,将 idl 文件转换成 C++ 文件。 工具目录: tool/dds/fastrtpsgen/scripts/fastddsgen。

    example 指令参考如下:

  3. 将生成的 C++ 文件移动到用户指定的数据定义目录下,使用时需要利用 message/dds/dds_serializer.hpp 中的 DDSDataSerializer 模板类进行包裹 。

    example 参考指令如下:

  • 由于采用 Fastdds 直接传输数据,因此 DDSMsg 对象中的 Message 基类成员变量都是初始状态,暂未赋值。

2. 第二种Message消息定义示例(转换工具自动实现)

2.1 简介

TROS.A 支持 Horizon 自定义的IDL消息定义格式(文件名后缀为.boleidl),简称 BoleIDL,并提供 boleidlc 转换工具。使用 boleidlc 工具可以将 BoleIDL 直接转为 C的代码,生成的 C 消息简称为 BoleMsg,对应序列化和消息转换类为 TypeSupport 类。然后用户只需将生成的代码中对应的 TypeSupport 类作为模板参数即可构建 pub、sub、client 或 service 对象。

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、

  1. 创建Sub

  2. 创建pub,并发送BoleMsg

2.2.4 命名规则说明

  • namespace

    生成的 BoleMsg 和 TypeSupport 类的 namespace 命名规则为 bolemsg::${package}::${BoleMsg} packge:基于 BoleIDL 文件中的 package 字段转换得到的C++规范的namespace,具体规则是 包名中的 . 号转换成 _ 。

  • 类名

    BoleMsg 的类名与在 BoleIDL 文件中定义的消息名字相同。

    TypeSupport 的类名为”消息名字+_TypeSupport”。

算法工具链
杂谈
评论0
0/1000