专栏算法工具链基于communication的进程间/跨设备通信方案

基于communication的进程间/跨设备通信方案

DR_KAN2023-11-09
98
0

前言

TROS的communication模块支持进程间的的通信协议,如zmq ipc(基于zmq的ipc socket通信),也支持跨设备的通信协议,如zmq tcp(基于zmq的tcp socket通信),Fast-DDS(基于eProsima Fast DDS通信)等。

本文首先会对TROS手册的communication使用示例做补充说明,基于zmq ipc通信协议,介绍相对简单的使用pub-sub的单设备内部跨进程通信方法。之后会重点讲解基于zmq tcp通信协议,并以pub-sub方式实现Linux和J5的跨设备通信方法。


Linux进程间通信

pub-sub的示例代码位于TROS SDK的samples/component_samples/communication_ex/example/pub_sub_example文件夹,publisher_example.cpp代表pub端的源码,subscriber_example.cpp代表sub端的源码,示例提供的代码实现较为复杂,这里提供一个简化的实现供参考。

配置文件

这里节选communication.json配置文件中的participants id部分展示,该配置文件位于samples/component_samples/communication_ex/config。

pub端

其中,ParticipantAttr{5}对应了communication.json里participants的id为5的配置,即protocol为zmq_ipc,即同设备内的跨进程通信。创建pub时(auto publisher),第四个参数需要设置为PROTOCOL_ZMQ_IPC。之后设置消息内容,再使用Pub接口将消息发出。

更多的配置/API介绍,可以查看TROS用户手册communication模块基础教程以及接口文档。

sub端

sub端的代码写法与pub端相近,主要多了个回调函数,用于打印pub端传来的信息。ParticipantAttr设置为5。创建sub时,需要在第五个参数写上PROTOCOL_ZMQ_IPC,表明是跨进程通信。

编译

在samples/component_samples/communication_ex/example文件夹中,运行以下命令即可编译生成可执行文件:

其中,--config参数用于指定编译目标平台及编译工具,可选值:[linux_conan, linux_cmake, j5_conan, j5_cmake, …],这里使用conan编译工具编译可以在Linux平台上运行的程序。

编译结束后,会在example文件夹下生成output/communication/bin文件夹,包含两个可执行文件publisher和subsciber,以及从config目录复制来的communication.json配置文件。

运行

开启一个进程,运行./subsciber,之后再开启另一个进程,运行./publisher,即可打印以下运行结果:

可以看到,现在已经成功实现了Linux内部跨进程的信息通信。


J5进程间通信

这里以J5开发板为例,讲解如何实现板端的跨进程通信。

编译

代码和communication.json文件均无需变动,只需调整编译命令即可:

运行

在运行前,需要确保板端环境已经配置好,否则会运行失败。

板端环境配置方法如下:

1、参考TROS手册的搭建Docker开发环境章节,在开发机端(Linux)以cmake方式安装TROS.A应用开发SDK

2、进入~/.tros/x.y.z/目录(x.y.z为TROS SDK版本号),将J5文件夹复制或映射到开发板

3、在开发板上执行 bash install_platform.sh,如果添加-d参数可以配置debug版本,默认为release

完成上述操作后,开发板会自动将TROS.A板端的动态库路径,设置到LD_LIBRARY_PATH系统变量中,同时将命令行工具路径设置到PATH系统变量,无需用户再手动配置。

之后,再将Linux端编译生成的output/communication/bin文件夹复制到板端,启用两个进程,分别运行./subsciber和./publisher即可,打印信息和Linux相同。

Linux-J5跨设备通信

若想实现Linux和开发板之间的跨设备通信,需要进行以下几处修改。

communication.json

修改participants的id 2的link_info,此处填写的IP:Port,无论是pub端还是sub端,都需要填写pub端的。这里以开发板作为pub端,linux作为sub端为例,如果开发板的ip为10.64.61.57,端口使用20,那么这里的IP:Port就需要修改为10.64.61.57:20。

pub端

代码修改成以下内容:

主要有两处修改,第一处是将ParticipantAttr从5改成2,对应了communication.json中,id为2的配置,即protocol为zmq_tcp。并且,需要在创建pub时,将第四个参数修改为PROTOCOL_ZMQ_TCP,对应跨设备通信方式。

sub端

代码修改成以下内容:

修改方式与pub端相似,这里不再赘述。

编译

实现跨设备通信,需要编译两次,分别编译linux端和板端的可执行程序,命令如下:

运行

在linux端运行./subsciber,在板端运行./publisher,即可成功实现linux和板端的跨设备通信。

板端/pub端打印信息:

linux端/sub端打印信息:

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