【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 发送消息的步骤…...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
React 第五十五节 Router 中 useAsyncError的使用详解
前言 useAsyncError 是 React Router v6.4 引入的一个钩子,用于处理异步操作(如数据加载)中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误:捕获在 loader 或 action 中发生的异步错误替…...
SciencePlots——绘制论文中的图片
文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了:一行…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...
测试markdown--肇兴
day1: 1、去程:7:04 --11:32高铁 高铁右转上售票大厅2楼,穿过候车厅下一楼,上大巴车 ¥10/人 **2、到达:**12点多到达寨子,买门票,美团/抖音:¥78人 3、中饭&a…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()
操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 在 GPU 上对图像执行 均值漂移滤波(Mean Shift Filtering),用于图像分割或平滑处理。 该函数将输入图像中的…...