专栏算法工具链Communication复合协议配置方法

Communication复合协议配置方法

DR_KAN2023-12-04
49
0

前言

Communication具有可扩展性,可以集成不同的通信协议,目前支持的协议主要有zmq tcp,zmq ipc,zmq epgm,intra,shared memory,PCIe,Fast-DDS等,此外还支持用于服务发现的hybrid,以及用于复合协议的composite。

本教程会对Communication模块的复合协议做具体说明,介绍composite通信协议的组合配置方法,并展示实际运行效果。


概念详解

复合协议

复合协议不是一个具体的通信协议,而是多种协议的组合,用户在构建通信实体时指定composite协议(PROTOCOL_COMPOSITE),即可配置多种协议和多种发现方式。

匹配规则

在复合协议下,无论是静态配置还是动态配置(服务发现),都可以自由组合匹配。

比如,pub端可以配置多种静态配置,sub端也可以配置同样的多种静态配置,两者可以互相连接进行通信。pub端可以配置多种动态配置,sub端也可以配置同样的多种动态配置,两者也可以互相连接进行通信。当复合协议配置中既包含静态配置也包含动态配置时,匹配规则按照静态与静态各自匹配,动态与动态根据自动发现机制和协议优先级匹配的方式来执行。

在复合协议中,动态配置协议优先级从高到低排序如下: PROTOCOL_INTRA > PROTOCOL_SHM > PROTOCOL_IPC > PROTOCOL_TCP > PROTOCOL_EPGM > 用户自定义协议

需要注意的是,DDS和Hybrid这两种协议不支持添加到复合协议中。

关于复合协议匹配规则的详细说明,您还可以参考TROS用户手册的模块介绍-communication-基础教程-特性说明章节了解学习。

配置方法

TROS SDK的communication部分提供了复合协议配置的示例代码,用户可以参考samples/component_samples/communication_ex/example/pub_sub_example路径下的publisher_example.cpp和subscriber_example.cpp了解学习。
在代码的开头,需要使用using hobot::communication::CompositeOption;将CompositeOption引入当前域。CompositeOption是一个结构体,包含两个成员变量protocol_type和participant_id。如果两个都赋值,则属于静态配置,如果第二个不赋值或者值

用户在指定复合协议的时候,需要在CommAttr结构体中存放CompositeOption数组。CommAttr结构体用于构建Communication通信实体传入的通信属性配置。

如果配置静态发现,可以参考以下方式:

如果配置动态发现,可以参考以下方式(不配置participant_id):

如果希望复合协议配置中既包含静态配置也包含动态配置,将以上二者的写法结合即可。

至此就完成了复合协议的相关配置,之后在创建publisher和subscriber通信实体的时候,将CommAttr结构体传入即可。


运行结果

进入TROS SDK的samples/component_samples/communication_ex/example目录,执行python3 build.py --config linux_conan命令,即可编译出可在linux系统运行的可执行文件subcriber和publisher。
以复合协议方式启动sub的命令为./output/communication/bin/subscriber 9
以复合协议方式启动pub的命令为./output/communication/bin/publisher 9

sub端的打印信息如下:

pub端的打印信息如下:

若终端打印上述信息,则说明已经成功使用复合协议建立了pub和sub之间的通信。


规则验证

前文提到,动态配置协议优先级从高到低排序如下: PROTOCOL_INTRA > PROTOCOL_SHM > PROTOCOL_ZMQ_IPC > PROTOCOL_ZMQ_TCP > PROTOCOL_ZMQ_EPGM > 用户自定义协议,这里使用PROTOCOL_SHM和PROTOCOL_ZMQ_IPC做验证,进行linux系统同设备跨进程的对比。

只配置PROTOCOL_ZMQ_IPC

配置方式

打印信息

配置PROTOCOL_SHM和PROTOCOL_ZMQ_IPC

配置方式

打印信息

总结

可以看到,只配置PROTOCOL_ZMQ_IPC时,pub端传输结束后,会有专门的打印信息,而添加了PROTOCOL_SHM后,该打印信息消失,表明此时PROTOCOL_SHM成功替换了PROTOCOL_ZMQ_IPC。

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