CyberRT通信介绍与基于Reader、Writer的通信实践(apollo9.0)

目录

数据通信场景

CyberRT中的通信方式 

​编辑

通信模式

话题通信

服务通信

参数通信

protobuf

protobuf简介

 protobuf文件编写

topic通信实验

实验环境

实验准备

代码编写

定义消息格式

发送消息

接收消息

定义编译规则

程序编译

运行程序


数据通信场景

数据间通信一般分三种情况,分别是

  • 进程内通信
  • 进程间通信
  • 跨主机通信

针对三种不同的通信场景也有不同的通信方式,如

  • 进程内通信方式:对象指针、函数
  • 进程间通信方式:共享内存、管道、消息队列等
  • 跨主机进程间通信方式:RTPS、GRPC等

CyberRT中的通信方式 

以下是CyberRT中针对不同通信场景所使用的通信方式

但是一般情况下我们是不知道通信对方是与我们同一个进程还是不同进程甚至是否一个主机的,而CyberRT对此做出以下判断

  • 判断对端ip与本进程的ip是否相同,如果不同则采用跨主机通信
  • 判断对端进程id与本进程id是否相同,如果不同则采用进程间通信
  • 如果前两者都相同,则采用进程内通信方式

通信模式

CyberRT中的数据通信模式主要有三种:

  • Writer/Reader:发布订阅者模式
  • Service/Client:服务客户通信模式
  • Parameter Server-Client:参数服务客户通信模式

话题通信

模式

以发布订阅的方式实现不同节点之间数据交互的通信模式。

如图所示

  • Listener-Talker通信首先创建了两个Node,分别是Talker Node和 Listener Node。
  • 每个Node实例化Writer类和Reader类对Channel进行消息的读写。
  • Writer和Reader通过Topic连接,对同一块共享内存(Channel)进行读写处理。
  • Talker Node 为了实现其“诉说”的功能,实例化Writer,通过Writer来对Channel进行消息写操作。
  • Listener Node为了实现其“聆听”功能,实例化reader类,通过Reader来对channel进行读操作。

场景

话题通信方式适合于持续性通信的应用场景,比如雷达信号,摄像头图像信息这类数据的传输。

使用:

Listener-Talker通信一方主动送消息,一方被动接收。

我们想要一直获取车的速度,该需求不需要向发送方返回什么消息,也不需要发送方对消息进行进一步处理。所以我们选择了Listener-Talker通信方式实现该功能。

数据定义:

话题通信中用的的数据格式的定义car message 定义在car.proto中。

服务通信

模式

以请求响应的方式实现不同节点之间数据交互的通信模式。

如图所示,Server-Client通信可以在客户端发出消息请求时,服务端才进⾏请求回应,并将客户端所需的数据返回给客户端。

场景

我们想要获得⼩⻋的详细信息,⽐如⻋牌这些,但是⼜不需要⼀直获得该信息,想要在需要知道这些信息的时候请求⼀下就好,于是考虑⽤Server- Client通信实现该功能。

使用:

该通信模式适合临时的消息传输,适⽤于不需要持续性发送数据的场景。

数据定义:

其传输的数据定义依然在对应的proto⽂件中。

参数通信

模式

以共享的方式实现不同节点之间数据交互的通信模式。

参数服务器是基于服务实现的,包含客户端和服务器端,服务端节点可以存储数据,客户端节点可以访问服务端节点操作数据,这个过程虽然基于请求响应的,但是无需自己实现请求与响应,此过程已经被封装,调用者只需要通过比较简单友好的API就可以实现参数操作。

场景

自动驾驶场景中有一些参数比如该车的最高限速、最多乘客以及是否自动驾驶等需要被各个模块使用数据,比如是否自动驾驶这个参数可能同时影响这很多模块,也可能被很多模块运行时所更改。

这些数据如何实现在不同模块之间的共享呢?

使用:

类似于“全局变量”的方式来存储这些参数,并定义一些自定义参数来进行使用。

数据定义:

Cyber中设计了全局参数服务器来实现这个功能,其通信基于RTPS协议。该通信方式服务端和客户端都可以设置参数和更改参数。

protobuf

protobuf简介

Protobuf 是 Google 公司开发的一种跨语言和平台的序列化数据结构的方式,是一个灵活的、高效的用于序列化数据的协议,与 XML 和 JSON 格式相比,Protobuf 更小、更快、更便捷。

Protobuf 是跨语言的,并且自带一个编译器( protoc ),只需要用protoc进行编译,就可以编译成 Java、Python、C++、C#、Go 等多种语言代码,然后可以直接使用,不需要再写其它代码,自带有解析的代码。只需要将要被序列化的结构化数据定义一次(在 .proto 文件定义),便可以使用特别生成的源代码(使用protobuf提供的生成工具)轻松的使用不同的数据流完成对结构数据的读写操作。甚至可以更新 .proto 文件中对数据结构的定义而不会破坏依赖旧格式编译出来的程序。其优点如下:

  • 性能效率高序列化后字节占用空间比 XML 少3-10倍,序列化的时间效率比 XML 快20-100倍。

  • 使用便捷便捷:将对结构化数据的操作封装成一个类,便于使用。

  • 兼容性高:通信两方使用同一数据协议,当有一方修改了数据结构,不会影响另一方的使用。

  • 跨语言:支持 Java,C++,Python、Go、Ruby 等多种语言。

 protobuf文件编写示例

Protobuf有几个部分构成:

  • syntax :表示使用Protobuf的版本,目前Protobuf支持proto3,但在Apollo中使用的是proto2;

  • package: 表示该文件的路径

  • message:表示一种数据结构,message后面跟的是数据结构名字,括号里的字段定义格式为:字段规则 数据类型 字段名称 字段编号。

字段规则主要有三种

  • required:调用时必须提供该字段的值,否则该消息被视为“未初始化”,官方不建议使用,当把字段规则改为其他规则会存在兼容性问题。

  • optional:该字段的值可以设置也可以不设置,会根据数据类型生成一个默认的值

  • repeated类似于动态数组,可以存储多个同类型的数据

如下示例

# examples.proto
syntax = "proto2";
package apollo.cyber.examples.proto;
message SamplesTest1 {optional string class_name = 1;optional string case_name = 2;
};
message Chatter {optional uint64 timestamp = 1;optional uint64 lidar_timestamp = 2;optional uint64 seq = 3;optional bytes content = 4;
};
message Driver {optional string content = 1;optional uint64 msg_id = 2;optional uint64 timestamp = 3;
};

topic通信实验

实验环境

apollo9.0,安装见官网说明,安装完成后进入容器即可

apollo.baidu.com/community/Apollo-Homepage-Document?doc=BYFxAcGcC4HpYIbgPYBtXIHQCMEEsATAV0wGNkBbWA5UyRFdZWVBEAU0hFgoIH0adPgCY%2BADwCiAVnEBBCeIAcATnETFcgMxKZkgGxKAwkoDsa3YoAi45WdGSLxsYt0SzY%2BXICMa98oAMSgYALF7%2B2NhemsLBJsrCYZqKwors7AikBIp6miYmpFJSXpigFKhAA

实验准备

创建代码结构目录

buildtool create --template component communication
touch /apollo_workspace/communication/listener.cc
touch /apollo_workspace/communication/talker.cc

 最终的实验目录结构如下

communication├── BUILD├── communication.cc├── communication.h├── conf│   ├── communication.conf│   └── communication.pb.txt├── cyberfile.xml├── dag│   └── communication.dag├── launch│   └── communication.launch├── listener.cc <必须有>├── proto <必须有>│   ├── BUILD <必须有>│   └── communication.proto <必须有>└── talker.cc <必须有>

代码编写

定义消息格式

编写proto/communication.proto文件

syntax = "proto2";package apollo.communication.proto;//定义一个车的消息,车的型号,车主,车的车牌号,已跑公里数,车速message Car{optional string plate = 1;optional string type = 2;optional string owner = 3;optional uint64 kilometers = 4;optional uint64 speed = 5;};

发送消息

编写发送方 talker 代码,talker.cc 代码如下

#include "communication/proto/communication.pb.h"#include "cyber/cyber.h"#include "cyber/time/rate.h"//car数据定义的引用,可以看出其定义来源于一个protousing apollo::communication::proto::Car;int main(int argc, char *argv[]) {// 初始化一个cyber框架apollo::cyber::Init(argv[0]);// 创建talker节点auto talker_node = apollo::cyber::CreateNode("talker");// 从节点创建一个Topic,来实现对车速的查看auto talker = talker_node->CreateWriter<Car>("car_speed");AINFO << "I'll start telling you the current speed of the car.";//设置初始速度为0,然后速度每秒增加5km/huint64_t speed = 0;while (apollo::cyber::OK()) {auto msg = std::make_shared<Car>();msg->set_speed(speed);//假设车速持续增加speed += 5;talker->Write(msg);sleep(1);}return 0;}

接收消息

编写接受方 listener 代码,listener.cc 代码如下

#include "communication/proto/communication.pb.h"#include "cyber/cyber.h"using apollo::communication::proto::Car;//接收到消息后的响应函数void message_callback(const std::shared_ptr<Car>& msg) {AINFO << "now speed is: " << msg->speed();}int main(int argc, char* argv[]) {//初始化cyber框架apollo::cyber::Init(argv[0]);//创建监听节点auto listener_node = apollo::cyber::CreateNode("listener");//创建监听响应进行消息读取auto listener = listener_node->CreateReader<Car>("car_speed", message_callback);apollo::cyber::WaitForShutdown();return 0;}

定义编译规则

修改 BUILD 文件,将新写的代码加入到编译中,communication/BUILD文件修改如下

load("//tools:apollo_package.bzl", "apollo_cc_library", "apollo_cc_binary", "apollo_package", "apollo_component")
load("//tools:cpplint.bzl", "cpplint")package(default_visibility = ["//visibility:public"])apollo_cc_binary(name = "talker",srcs = ["talker.cc"],deps = ["//cyber","//communication/proto:communication_proto",],linkstatic = True,
)
apollo_cc_binary(name = "listener",srcs = ["listener.cc"],deps = ["//cyber","//communication/proto:communication_proto",],linkstatic = True,
)apollo_package()cpplint()

程序编译

//回到 /apollo_workspace目录下编译
cd /apollo_workspace
buildtool build -p communication

 编译成功显示如下:

运行程序

打开一个终端,运行talker程序

// 设置将输出结果到控制台
export GLOG_alsologtostderr=1
// 编译产生的可执行文件在 /opt/apollo/neo/bin/
cd /opt/apollo/neo/bin/
// 执行talker
./talker

 重新打开一个终端,运行listener程序

// 设置将输出结果到控制台
export GLOG_alsologtostderr=1
// 编译产生的可执行文件在 /opt/apollo/neo/bin/
cd /opt/apollo/neo/bin/
// 执行listener
./listener

运行结果如下图所示,左侧是talker发送消息,右侧是listener接收消息

参考

apollo.baidu.com/community/Apollo-Homepage-Document?doc=BYFxAcGcC4HpYIbgPYBtXIHQCMEEsATAV0wGNkBbWA5UyRFdZWVBEAU0hFgoIH0adPgCY%2BADwCiAVnEBBCeIAcATnETFcgMxKZkgGxKAwkoDsa3YoAi45WdGSLxsYt0SzY%2BXICMa98oAMSgYALF7%2B2NhemsLBJsrCYZqKwors7AikBIp6miYmpFJSXpigFKhAA 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/55629.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

fabric-sdk-go

Fabric-SDK-go 区块链网络搭建fabric-sdk代码代码结构&#xff1a;代码eg&#xff1a; 区块链网络搭建 使用fabric-sample的网络结构用容器搭建起测试网络即可。 fabric-sdk代码 代码很简易&#xff0c;主要为了了解怎么使用fabric为编程人员提供的sdk从而提供HTTP接口的情况…

浅谈华为 HarmonyOS Next

1. 万物互联时代的新机遇 随着万物互联时代的到来&#xff0c;智能应用从几十亿部手机扩展到数百亿个IoT设备&#xff0c;深刻改变了人们的生活方式。这为我们应用开发者带来了新的机遇和挑战。 机遇 : 目前正处于万物互联时代的前夕&#xff0c;正在经历手机单设备到全场景多…

技术分享:A-23OH型树脂在汽车涂装废溶剂回收中的应用

在当今汽车制造业竞争激烈的环境下&#xff0c;提高生产效率、降低成本的同时&#xff0c;满足环保要求已成为各制造商追求的核心目标。水性涂料因其环保、节能等多重优势&#xff0c;在汽车涂装领域的应用日益广泛。然而&#xff0c;随之而来的喷涂废溶剂处理问题也日益凸显。…

从 Hadoop 迁移到数据 Lakehouse 的架构师指南

从 Hadoop 到数据湖仓一体架构的演变代表了数据基础架构的重大飞跃。虽然 Hadoop 曾经以其强大的批处理能力统治着大数据领域&#xff0c;但如今的组织正在寻求更敏捷、更具成本效益和现代化的解决方案。尤其是当他们越来越多地开始实施 AI 计划时。根本没有办法让 Hadoop 为 A…

三周精通FastAPI:1 第一步入门

FastAPI是一个非常棒的python web和api框架&#xff0c;准备用三周的时间“精通它” 学习流程参考FastAPI官网的用户教程&#xff1a;教程 - 用户指南 - FastAPI 学前提示 运行代码 所有代码片段都可以复制后直接使用&#xff08;它们实际上是经过测试的 Python 文件&#x…

UG NX12.0建模入门笔记:1.0 UG NX12.0安装教程

一、如何关闭防火墙&#xff1f; 提示&#xff1a;安装软件之前&#xff0c;建议先 关闭防火墙和杀毒软件&#xff01;&#xff01;&#xff01; 文章目录 一、如何关闭防火墙&#xff1f;二、UG NX12.0安装包三、UG NX12.0安装教程1.新建文件夹2.安装JAVA环境3.安装许可证管理…

LeetCode_2235. 两整数相加_java

1、问题 2235. 两整数相加https://leetcode.cn/problems/add-two-integers/ 给你两个整数 num1 和 num2&#xff0c;返回这两个整数的和。 示例 1&#xff1a; 输入&#xff1a;num1 12, num2 5 输出&#xff1a;17 解释&#xff1a;num1 是 12&#xff0c;num2 是 5 &am…

智慧监管:EasyCVR视频汇聚智能分析平台助力有限空间作业实现全天候可视化监控

随着工业化和城市化进程的加快&#xff0c;有限空间作业&#xff08;如地下管道、储罐、隧道等&#xff09;在各类企事业单位中日益频繁。然而&#xff0c;这类作业环境复杂、危险系数高&#xff0c;对作业人员的安全管理和实时监控提出了严峻挑战。为了保障有限空间作业的安全…

021_Thermal_Transient_in_Matlab统一偏微分框架之热传导问题

Matlab求解有限元专题系列 固体热传导方程 固体热传导的方程为&#xff1a; ρ C p ( ∂ T ∂ t u t r a n s ⋅ ∇ T ) ∇ ⋅ ( q q r ) − α T d S d t Q \rho C_p \left( \frac{\partial T}{\partial t} \mathbf{u}_{\mathtt{trans}} \cdot \nabla T \right) \nab…

开发一个微信小程序要多少钱?

在当今数字化时代&#xff0c;微信小程序成为众多企业和个人拓展业务、提供服务的热门选择。那么&#xff0c;开发一个微信小程序究竟需要多少钱呢&#xff1f; 开发成本主要取决于多个因素。首先是功能需求的复杂程度。如果只是一个简单的信息展示小程序&#xff0c;功能仅限…

Hadoop集群基础搭建

目录 一.虚拟机安装 1.配置虚拟机的ip 2.配置本机的ip 3.新建虚拟机 4.克隆三台虚拟机 二.虚拟机网络配置 1.修改ip配置 2.配置主机名和主机映射 3.配置SSH免密登陆 三.安装JDK 1.tar命令解压JDK安装包 2.配置JDK的环境变量 四.安装Hadoop 1.tar命令解压Hadoop安…

快速了解kubernetes中的存储管理

目录 一 configmap 1.1 configmap的功能 1.2 configmap的使用场景 1.3 configmap创建方式 1.3.1 字面值创建 1.3.2 通过文件创建 1.3.3 通过目录创建 1.3.4 通过yaml文件创建 1.3.5 configmap的使用方式 1.3.5.1 使用configmap填充环境变量 1.3.5.2 通过数据卷使用c…

RestTemplate 学习笔记

简介 RestTemplate是一个执行HTTP请求的同步阻塞式工具类&#xff0c;它仅仅只是在 HTTP 客户端库&#xff08;例如 JDK HttpURLConnection&#xff0c;Apache HttpComponents&#xff0c;okHttp 等&#xff09;基础上&#xff0c;封装了更加简单易用的模板方法 API&#xff0c…

Renesas R7FA8D1BH (Cortex®-M85) 上光电编码器测速功能

目录 概述 1 软硬件 1.1 软硬件环境信息 1.2 开发板信息 1.3 调试器信息 2 硬件架构 2.1 硬件框架结构 2.2 测速功能原理介绍 2.2.1 理论描述 2.2.2 实现原理 2.2.3 系统硬件结构 3 软件实现 3.1 FSP配置项目 3.2 代码实现 3.2.1 初始化函数 3.2.2 功能函数 3.…

论文学习——基于Whisper迁移学习的阿尔兹海默症检测方法——音频特征和语义特征的结合

文章目录 引言正文——基于Whisper迁移学习的阿尔茨海默病检测方法&#xff08;使用转述文本作为提示&#xff0c;利用音频段落进行分类&#xff09;摘要1 Introduction介绍ADReSSo 数据集Whisper模型 2 Methods方法Audio Processing音频预处理Transfer Learning&#xff08;TL…

利用移动式三维扫描技术创建考古文物的彩色纹理网格【上海沪敖3D】

文章来源于蔡司工业质量解决方案&#xff0c;作者蔡司工业质量 在考古环境中&#xff0c;三维扫描技术应用广泛&#xff0c;如存档、保存、复制和分享&#xff08;包括实体和虚拟形式&#xff09;。 文中&#xff0c;通过真实的扫描案例&#xff0c;您将了解到三维光学解决方案…

WordPress任推帮网盘拉新数据统计插件

任推邦是国内一线的APP推广项目分发和流量变现平台&#xff0c;隶属聚名科技集团&#xff08;国家级高新技术企业、AAA重合同守信用企业&#xff0c;安徽百强企业&#xff09;,任推邦目前是阿里、字节、百度、迅雷、美团等品牌一级用户增长服务商&#xff0c;已入驻各类自媒体达…

如何安装MySql

一.卸载MySql 1.1安装版 进入“控制面板”&#xff0c;将有关“mysql”的一切都删除&#xff0c;再到“C:\ProgramData”中&#xff0c;将“mysql”文件夹删除。 1.2压缩版 先在cmd中停止mysql服务 net stop mysql8 再删除解压“mysql”文件夹即可 二.安装MySql 2.2安装版…

Vant 日期时间组件拓展

基于 "vant": "^4.8.3", 效果图 <template><!-- 弹出层 --><van-popupv-model:show"isPicker"position"bottom"><van-pickerref"picker":title"title"v-model"selectedValues"…

软考24.10.15每日一练打卡 - 错题笔记

题目来源&#xff1a;https://ruankaodaren.com/ ##1. M公司将其开发的某软件产品注册商标为S&#xff0c;为确保公司在市场竞争中占据地位&#xff0c;M公司对员工进行了保密约束&#xff0c;此情形下&#xff0c;该公司不享有&#xff08; 商标权&#xff09;。 本题题干中提…