【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 发送消息的步骤…...
《Playwright:微软的自动化测试工具详解》
Playwright 简介:声明内容来自网络,将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具,支持 Chrome、Firefox、Safari 等主流浏览器,提供多语言 API(Python、JavaScript、Java、.NET)。它的特点包括&a…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
【算法训练营Day07】字符串part1
文章目录 反转字符串反转字符串II替换数字 反转字符串 题目链接:344. 反转字符串 双指针法,两个指针的元素直接调转即可 class Solution {public void reverseString(char[] s) {int head 0;int end s.length - 1;while(head < end) {char temp …...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...

Python 实现 Web 静态服务器(HTTP 协议)
目录 一、在本地启动 HTTP 服务器1. Windows 下安装 node.js1)下载安装包2)配置环境变量3)安装镜像4)node.js 的常用命令 2. 安装 http-server 服务3. 使用 http-server 开启服务1)使用 http-server2)详解 …...

嵌入式学习之系统编程(九)OSI模型、TCP/IP模型、UDP协议网络相关编程(6.3)
目录 一、网络编程--OSI模型 二、网络编程--TCP/IP模型 三、网络接口 四、UDP网络相关编程及主要函数 编辑编辑 UDP的特征 socke函数 bind函数 recvfrom函数(接收函数) sendto函数(发送函数) 五、网络编程之 UDP 用…...
人工智能 - 在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型
在Dify、Coze、n8n、FastGPT和RAGFlow之间做出技术选型。这些平台各有侧重,适用场景差异显著。下面我将从核心功能定位、典型应用场景、真实体验痛点、选型决策关键点进行拆解,并提供具体场景下的推荐方案。 一、核心功能定位速览 平台核心定位技术栈亮…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...

Linux基础开发工具——vim工具
文章目录 vim工具什么是vimvim的多模式和使用vim的基础模式vim的三种基础模式三种模式的初步了解 常用模式的详细讲解插入模式命令模式模式转化光标的移动文本的编辑 底行模式替换模式视图模式总结 使用vim的小技巧vim的配置(了解) vim工具 本文章仍然是继续讲解Linux系统下的…...