【SY2】Apollo10.0 Cyber基于Writer/Reader的通信方式
实验前提
- Apollo10.0已经安装完毕
- Vscode及相关插件安装完成
- 启动容器并进入
- 在Vscode连接进入到Apollo工作空间下学习资料
部分配置如实验一
https://blog.csdn.net/weixin_60062799/article/details/145029669?spm=1001.2014.3001.5501
学习资料
- Apollo7.0或其他版本可以参考B站赵虚左老师的教学视频
- Apollo9.0或Apollo10.0可以参考Apollo的在线学堂
Cyber专项课(9.0)
https://apollo.baidu.com/community/online-course/839
基础知识
和ROS中的订阅/发布模式相同,不同的是定义的消息步骤,以及通信过程中双方的称呼发生了改变。

实验步骤
- 在Vscode中已经进入到Apollo的工作空间
- 在Vscode中打开终端,执行下面命令
## 生成component模板 # 其中communication是生成的目录, # 要想生成的目录在指定文件夹下,比如为cyber文件夹下可以写成 cyber/communication # 注意注意注意!使用该命令生成的目录下的文件不可以直接在Vscode中拖动到其他文件夹下使用,否则会出现路径不匹配问题 buildtool create --template component communication - 找到自己创建的文件夹,创建两个文件,如下红框所示

- 编写发布的消息格式和内容,打开communication/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.cc,为自己创建的源文件
//注意这里如果要在其他目录下,#include包含的头文件目录也需要进行修改#include "communication/proto/communication.pb.h" #include "cyber/cyber.h" #include "cyber/time/rate.h"// Car数据定义的引用 using apollo::communication::proto::Car;int main(int argc, char* argv[]) {// 初始化一个cyber框架apollo::cyber::Init(argv[0]);// 创建talker节点auto talker_node = apollo::cyber::CreateNode("talker");// 从节点创建一个Topicauto talker = talker_node->CreateWriter<Car>("car_speed");AINFO << "I'll start telling you the current speed of the car.";// 设置速度为0,之后速度每次增加5uint64_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.cc,为自己创建的源文件
//注意这里如果要在其他目录下,#include包含的头文件目录也需要进行修改#include "communication/proto/communication.pb.h" #include "cyber/cyber.h"// Car数据定义的引用 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]);// 创建listener节点auto listener_node = apollo::cyber::CreateNode("listener");// 监听响应读取消息auto listener = listener_node->CreateReader<Car>("car_speed", message_callback);apollo::cyber::WaitForShutdown();return 0; } - 修改 communication目录下的BUILD文件,内容如下(注意要和自己的源文件名字对应),使用源码构建在apollo_cc_binary中的name不是使用talker和listener,因为会和给出的示例文件名发生冲突。如果在其他目录下创建,deps依赖中的communication路径也要进行修改:
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_demo",srcs = ["talker.cc"],deps = ["//cyber","//communication/proto:communication_proto",],linkstatic = True, ) apollo_cc_binary(name = "listener_demo",srcs = ["listener.cc"],deps = ["//cyber","//communication/proto:communication_proto",],linkstatic = True, )apollo_package()cpplint() - 做完上述工作之后,在终端中使用buildtool工具进行编译
# -p 后面跟着需要进行编译的文件目录 buildtool build -p communication/# 注意这一步可能因为没有切换到用户下报错 先su 用户名 然后 buildtool build -p communication/ - 编译完成后,打开两个终端
# 执行下面命令,能够在终端中打印消息 export GLOG_alsologtostderr=1 - 分别运行可执行文件
# 第一个终端执行 # 生成的可执行文件在bazel-bin目录下,对着自己创建的目录找就行 bazel-bin/communication/talker_demo# 第二个终端执行 # 生成的可执行文件在bazel-bin目录下,对着自己创建的目录找就行 bazel-bin/communication/listener_demo
至此实验结束

相关文章:
【SY2】Apollo10.0 Cyber基于Writer/Reader的通信方式
实验前提 Apollo10.0已经安装完毕Vscode及相关插件安装完成启动容器并进入在Vscode连接进入到Apollo工作空间下学习资料 部分配置如实验一https://blog.csdn.net/weixin_60062799/article/details/145029669?spm1001.2014.3001.5501 学习资料 Apollo7.0或其他版本可以参…...
【YOLOv8杂草作物目标检测】
YOLOv8杂草目标检测 算法介绍模型和数据集下载 算法介绍 YOLOv8在禾本科杂草目标检测方面有显著的应用和效果。以下是一些关键信息的总结: 农作物幼苗与杂草检测系统:基于YOLOv8深度学习框架,通过2822张图片训练了一个目标检测模型ÿ…...
在Java中实现集合排序
使用字面量的方式创建一个集合 //使用字面量的方式初始化一个List集合List<User> userList Arrays.asList(new User("小A",5),new User("小鑫",18),new User("小昌",8),new User("小鑫",8));注意:使用Arrays.asLis…...
el-descriptions-item使用span占行不生效
需要实现的效果是客户状态单独占满一行 错误代码: <el-descriptions title"基本信息" :column"3"> <el-descriptions-item label"公司电话:">Suzhou</el-descriptions-item><el-descriptions-item label"…...
Android 绘制学习总结
1、刷新率介绍 我们先来理一下基本的概念: 1、60 fps 的意思是说,画面每秒更新 60 次 2、这 60 次更新,是要均匀更新的,不是说一会快,一会慢,那样视觉上也会觉得不流畅 3、每秒 60 次,也就是 1…...
Linux下部署SSM项目
作者主页:舒克日记 简介:Java领域优质创作者、Java项目、学习资料、技术互助 文中获取源码 Linux部署SSM项目 打包项目 1、修改pom.xml文件,打包方式改为war <packaging>war</packaging>2、idea 通过maven的clean,…...
计算机网络 笔记 数据链路层 2
1,信道划分: (1)时分复用TDM 将时间等分为“TDM帧”,每个TDM帧内部等分为m个时隙,m个用户对应m个时隙 缺点:每个节点只分到了总带宽的1/m,如果有部分的1节点不发出数据,那么就会在这个时间信道被闲置,利用…...
xml简介
目录 基本语法特点及应用场景一个简单示例 xml(全称eXtensible Markup Language)是一种用于存储和传输数据的标记语言,跨平台并且跨语言,xml内容较多,这篇文章会介绍一些基础的内容。 基本语法 xml文档通常以xml声明开…...
透明部署、旁路逻辑串联的区别
背景 需讨论防火墙到底是串联,还是旁挂。 通常串联指的就是“透明部署”,旁挂指的就是“逻辑串联”。 透明部署(串联) 也称为透明模式或桥接模式,是一种安全设备的部署方式。在这种模式下,安全设备被串联…...
【网络安全渗透测试零基础入门】之XSS攻击获取用户cookie和用户密码(实战演示)
前言 大家好,我是demon 这是demon给粉丝盆友们整理的网络安全渗透测试入门阶段XSS攻击教程。 本阶段主要讲解XSS攻击获取用户cookie和用户密码。 喜欢的朋友们,记得给晓晓点赞支持和收藏一下,关注我,学习黑客技术。 简介 该…...
c#版本、.net版本、visual studio版本之间的对应关系
最近这几年一直没用过c#开发,都是从事Qt c开发工作,回想一下之前c#还要追溯到2019年,算算时间大概都已过去4,5年了,时间飞快。 2019真是个神奇的数字,vs2019是我用的时间最长的一个IDE,新冠起始…...
熵与交叉熵:从不确定性角度理解 KL 散度
从不确定性减少视角理解KL散度 【 Transformer 系列,故事从 d k \sqrt{d_k} dk 说起】 LLM这么火,Transformer厥功甚伟,某天心血来潮~,再去看看! 它长这个样子: 深入浅出 Transformer 看完后ÿ…...
Redis:数据类型
1. 字符串(String) 简介 概念:这是最简单的数据类型,可以存储字符串、整数或浮点数。特点:支持原子操作,如递增和递减数值。 示例 # 设置一个键值对 SET mykey "Hello, Redis!"# 获取该键的值…...
搭建Node.js后端
从头开始搭建一个Node.js后端,并实现查询历史数据的功能,下面是详细的步骤说明,包括环境配置、项目初始化、代码编写、以及服务器启动。 1. 环境配置 1.1 安装 Node.js 和 npm 首先,你需要在你的电脑上安装 Node.js 和 npm&…...
集合——数据结构
数据结构 就是计算机存储数据的方式。 不同情况下采取不同数据结构会让数据查找,存储更加有效率。 栈...
从CentOS到龙蜥:企业级Linux迁移实践记录(系统安装)
引言: 随着CentOS项目宣布停止维护CentOS 8并转向CentOS Stream,许多企业和组织面临着寻找可靠替代方案的挑战。在这个背景下,龙蜥操作系统(OpenAnolis)作为一个稳定、高性能且完全兼容的企业级Linux发行版࿰…...
《机器学习》——支持向量机(SVM)
文章目录 什么是支持向量机?基本原理数学模型 支持向量机模型模型参数属性信息 支持向量机实例(1)实例步骤读取数据可视化原始数据使用支持向量机训练可视化支持向量机结果完整代码 支持向量机实例(2)实例步骤导入数据…...
【PPTist】公式编辑、插入音视频、添加动画
一、插入公式 点击公式的时候 latexEditorVisible 会变成 true src/views/Editor/CanvasTool/index.vue <Modalv-model:visible"latexEditorVisible" :width"880" ><LaTeXEditor close"latexEditorVisible false"update"data &…...
LeetCode - #186 翻转字符串里的单词 II(会员题)
网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...
Kafka核心参数与使用02
一、从基础的客户端说起 Kafka 提供了非常简单的生产者(Producer)和消费者(Consumer)API。通过引入相应依赖后,可以快速上手编写生产者和消费者的示例。 1. 消息发送者主流程 一个最基础的 Producer 发送消息的步骤…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1
每日一言 生活的美好,总是藏在那些你咬牙坚持的日子里。 硬件:OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写,"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...
WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
NFT模式:数字资产确权与链游经济系统构建
NFT模式:数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新:构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议:基于LayerZero协议实现以太坊、Solana等公链资产互通,通过零知…...
蓝桥杯3498 01串的熵
问题描述 对于一个长度为 23333333的 01 串, 如果其信息熵为 11625907.5798, 且 0 出现次数比 1 少, 那么这个 01 串中 0 出现了多少次? #include<iostream> #include<cmath> using namespace std;int n 23333333;int main() {//枚举 0 出现的次数//因…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
CSS设置元素的宽度根据其内容自动调整
width: fit-content 是 CSS 中的一个属性值,用于设置元素的宽度根据其内容自动调整,确保宽度刚好容纳内容而不会超出。 效果对比 默认情况(width: auto): 块级元素(如 <div>)会占满父容器…...
