专栏算法工具链Module应用编程接口

Module应用编程接口

TROS.Assist2024-02-27
41
0

1. Module

Module 是逻辑强相关的功能单元,以统一的组织结构提供逻辑处理单元块,其内部主要包含如下信息:

Description
  • a set of Ports:用于传入和传出数据的 endpoint,port 包含如下属性:
    • id:port id, Module 内部唯一, id名只能由下划线、字母和数字组成,且以英文字母或者下划线开头
    • direction:IN/OUT;
    • msg_type: 接受/发送的消息类;
    • serializer:消息通讯使用的序列化/反序列化方式,目前支持 serializer 有:
      • DoNothingSerializer:消息不做任何序列化,此方式只支持进程内通信;dataflow层面的接口为:
      • RawSerializer:对于一些场景,例如数据录制、数据落盘等场景,需要直接获取二进制数据落盘,而不是获取到消息再进行序列化落盘。针对这种场景,可以使用RawSerializer创建input port接收二进制数据;或者同一个pub需要发送多种类型的数据,用户自行将数据序列化好后,通过rawserializer将二进制数据发送出去,接收端收到二进制数据后再自行解析。此方式支持进程间通信;dataflow层面的接口为:
      • ProtobufSerializer:以 PB 方式序列化/反序列化,支持跨进程,用于 pb 工具定义的 msg,支持进程间通信;dataflow层面的接口为:
      • MESSAGE_CLASS##_TypeSupport:Bole IDL 序列化,支持跨进程,用于 Bole IDL 工具生成的msg。 dataflow层面的接口为:
      • SERIALIZER: 用户自定义的serializer,非框架自带,是否支持跨进程由实现决定。dataflow层面的接口为:

  • a set of Procs:逻辑处理的描述,是调度执行的最小单元,默认每个 Proc 占用一个线程,Proc 包含如下属性:
    • id:proc id, Module 内部唯一, id名只能由下划线、字母和数字组成,且以英文字母或者下划线开头
    • Proc type:Dataflow 抽象出的逻辑场景类型,主要有:
      • DF_MSG_TIMER_PROC:周期触发型,用户可以配置 Proc 执行的周期、次数。同时周期性触发型 Proc 也可以接受消息,默认行为是将周内收到的所有消息(包括周期内没有消息到来,也会触发执行),传递给 Proc;用户也可设置只获取周期内部分消息传递给 Proc;
      • DF_MSG_TIME_STAMP_SYNC_PROC:时间戳匹配型,Proc 依赖多路消息,只有多路消息的时间戳正负值符合设置的阈值,则将符合条件的消息传递给 Proc;

      • DF_MSG_COND_PROC:条件触发型,Proc 依赖多路消息,用户可以设置条件,如 Input1 需要有2条消息并且 Input2 需要有3条消息,一旦条件满足,则将相关消息传递给 Proc;默认行为是所有路至少存在1条消息
      • DF_RESIDENT_PROC:常驻任务,Proc 随着 module 启动而启动,此类 Proc 会一直占用一个线程。

    • Input port list: Proc 依赖的 Input Port 列表,Module 中的 Input Port 可以被多个 Proc 依赖;
    • Output port list:Proc 发送消息的 Output Port 列表,Module 中的 Output Port 可以被多个 Proc 依赖;
    • function:Proc 绑定的回调函数,由用户实现逻辑。

2. schedulegroup

Schedulegroup 是调度器资源的分组,不同的分组代表着不同的调度策略,有可能是针对 IO 密集型的任务,亦或是周期型任务等。ScheduleGroup 调度的对象是 Module 中的 Proc,一个进程中可以存在多种调度策略的 Schedulegroup。

Description

如上图所示,一个进程中创建了三个 Schedulegroup(三种不同背景色的椭圆),用户可依据 Proc 的特性绑定到特定的 Schedulegroup 上。

3. 编程范式

3.1 module 设计

Description
Module 设计主要是规划 Module 需实现的功能点以及和外部交互的方式。TROSModule 是 Module 的组织方式,可视为多个Module类的动态库,一个 TROSModule 对应一份.trosmodule 文件,.trosmodule 文件中描述了库中每个 Module 类的属性:
  • 类名

  • Module 类型

  • Input 和 Output Ports

  • Procs

.trosmodule 的内容如下:

可通过 Studio UI 进行 Module 的设计。

3.2 module 生成

Module 的生成包含三部分:

  1. 代码生成工具依据 .trosmodule 文件生成一系列的 c++ .h .cpp 文件,主要包含 Module 的框架代码;

Description
  1. 逻辑代码填充

​ 对于Proc的回调函数,填充具体的逻辑实现,如上图中的相关函数:

  1. TROSModule生成

    Description

3.3 graph构建

graph (顶层 graphlet ) 构建主要是用户依据自己的业务场景,将 port 直接通过连线串联,形成整个业务 graph。其中用户可以通过创建 GraphLet 来分解复杂 Application 以及逻辑子图的复用。整个 graph 构建可通过 Studio UI 进行相关操作。

Description

3.4 部署配置

部署配置主要完成如下工作:

  • graph 进程级别的划分(下图中不同颜色的色块表示不同的进程);

  • 进程资源的分配(ScheduleGroup 属性配置,下图中椭圆表示一个 Schedulegroup);

  • 执行单元和调度资源的绑定(将 Proc 和 Schedulegroup 进行绑定,如果配置文件中未进行绑定,默认行为是 Proc 运行在一个独立的线程上);

  • 执行单元运行时参数配置。

Description

3.5 Application 运行

dataflow 框架提供了 launch2 和 mainboard2 工具,配合 package 以及部署配置文件,将整个 Application 运行起来。

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