ros2 node 之间的通信方式之 —— Topic通信案例

文章目录

  • ros2 node 之间的通信方式之 Topic通信
  • Topic 通信案例
    • 1、创建工作空间
    • 2、创建功能包
    • 3、编写发布者和订阅者代码
      • 3.1 topic_helloworld_pub.cpp
      • 3.2 topic_helloworld_sub.cpp
    • 4、编写CMakeLists.txt
    • 5、编译工作空间下的功能包
    • 6、运行结果

ros2 node 之间的通信方式之 Topic通信

ROS 2 将复杂系统分解为许多模块化node。Topic是ROS的重要组成部分,充当node交换消息的总线。
请添加图片描述
一个节点可以将数据发布到任意数量的主题,并同时订阅任意数量的主题。

请添加图片描述
Topic是在node之间移动数据的主要方式之一,因此也是在系统的不同部分之间移动数据的主要方式之一。

Topic 通信案例

1、创建工作空间

如果没有创建工作空间,创建工作空间,反之则不用,进入目录src/下

$ mkdir -p ~/devnode_ws/src
$ cd ~/devnode_ws/src

2、创建功能包

$ ros2 pkg create --build-type ament_cmake topic_helloworld_cpp

在这里插入图片描述

3、编写发布者和订阅者代码

进入topic_helloworld_cpp功能包路径下的src文件,新键topic_helloworld_pub.cpp和topic_helloworld_sub.cpp

$ cd topic_helloworld_cpp/src
$ vim topic_helloworld_pub.cpp
$ vim topic_helloworld_sub.cpp

3.1 topic_helloworld_pub.cpp

#include<chrono>
#include<functional>
#include<memory>
#include<string>#include"rclcpp/rclcpp.hpp"        //ROS2C++接口
#include"std_msgs/msg/string.hpp"  //字符串消息类型using namespace std::chrono_literals;class PublisherNode:public rclcpp::Node
{
public:PublisherNode():Node("topic_helloword_pub") //构造函数初始化{//创建发布者对象publisher_ = this->create_publisher<std_msgs::msg::String>("chatter",10);//创建一个定时器,执行回调函数timer_ = this->create_wall_timer(500ms,std::bind(&PublisherNode::timer_callback,this));}
private://创建定时器周期执行回调函数void timer_callback(){auto msg = std_msgs::msg::String();//创建一个String类型的对象msg.data = "Hello World ROS2";     //添加消息对象中的数据//发布Topic信息RCLCPP_INFO(this->get_logger(),"Publishing: '%s'" ,msg.data.c_str());publisher_->publish(msg);}rclcpp::TimerBase::SharedPtr timer_;rclcpp::Publisher<std_msgs::msg::String>::SharedPtr publisher_;
};int main(int argc,char* argv[])
{rclcpp::init(argc,argv);rclcpp::spin(std::make_shared<PublisherNode>());rclcpp::shutdown();return 0;
}

3.2 topic_helloworld_sub.cpp

#include<memory>
#include "rclcpp/rclcpp.hpp"
#include "std_msgs/msg/string.hpp"using std::placeholders::_1;class SubscriberNode:public rclcpp::Node
{
public:SubscriberNode():Node("topic_helloworld_sub"){subscription_ = this->create_subscription<std_msgs::msg::String>("chatter",10,std::bind(&SubscriberNode::topic_callback,this,_1));}
private:void topic_callback(const std_msgs::msg::String::SharedPtr msg)const{RCLCPP_INFO(this->get_logger(),"I heard : '%s'",msg->data.c_str());}rclcpp::Subscription<std_msgs::msg::String>::SharedPtr subscription_; //订阅者指针
};int main(int argc,char*argv[])
{rclcpp::init(argc,argv);rclcpp::spin(std::make_shared<SubscriberNode>());rclcpp::shutdown();return 0;
}

4、编写CMakeLists.txt

在# find_package( REQUIRED)行后加入

find_package(rclcpp REQUIRED)
find_package(std_msgs REQUIRED)add_executable(topic_helloworld_pub src/topic_helloworld_pub.cpp)
ament_target_dependencies(topic_helloworld_pub rclcpp std_msgs)add_executable(topic_helloworld_sub src/topic_helloworld_sub.cpp)
ament_target_dependencies(topic_helloworld_sub rclcpp std_msgs)install(TARGETS topic_helloworld_pub topic_helloworld_sub DESTINATION lib/${PROJECT_NAME})

在这里插入图片描述

5、编译工作空间下的功能包

$ cd ~/devnode_ws/
$ colcon build

sour

6、运行结果

启动第一个终端运行Topic 发布者node

$ source install/local_setup.bash
$ ros2 run topic_helloworld_cpp  topic_helloworld_pub

在这里插入图片描述

启动第二个终端运行Topic 订阅者node

$ source install/local_setup.bash
$ ros2 run topic_helloworld_cpp  topic_helloworld_sub

在这里插入图片描述

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

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

相关文章

attempt to compare nil with number -- 黑马点评出现问题

问题情况 : 主要问题 : 调用lua执行redis时&#xff0c;有一个值会接受nil&#xff08;因为redis中没有该数据&#xff09;或者数值&#xff0c;当该值为nil时执行报错&#xff0c;因为会用到将该值与其他数字比较&#xff0c;故报错attempt to compare nil with number 当然…

opencv图像处理

1、图像滤波处理 通过滤波来提取图像特征&#xff0c;消除噪声。 常用滤波方式有&#xff1a;均值滤波、高斯滤波、中值滤波、双边滤波。 高斯滤波&#xff1a; blur_gray cv2.GaussianBlur(orgGray, (kernel_size, kernel_size), 0) orgGray&#xff1a;灰度图像&#xf…

Amazon云计算AWS之[2]弹性计算云EC2

文章目录 说明EC2基本架构Amazon机器映象&#xff08;AMI&#xff09;实例&#xff08;Instance&#xff09;弹性块存储&#xff08;EBS&#xff09; EC2关键技术地理区域和可用区域EC2通信机制弹性负载均衡监控服务自动缩放服务管理控制台 EC2安全及容错机制EC2弹性IP地址 说明…

STM32 HAL库F103系列之IIC实验

IIC总线协议 IIC总线协议介绍 IIC&#xff1a;Inter Integrated Circuit&#xff0c;集成电路总线&#xff0c;是一种同步 串行 半双工通信总线。 总线就是传输数据通道 协议就是传输数据的规则 IIC总线结构图 ① 由时钟线SCL和数据线SDA组成&#xff0c;并且都接上拉电阻…

线性代数基础3 行列式

行列式 行列式其实在机器学习中用的并不多&#xff0c;一个矩阵必须是方阵&#xff0c;才能计算它的行列式 行列式是把矩阵变成一个标量 import numpy as np A np.array([[1,3],[2,5]]) display(A) print(矩阵A的行列式是&#xff1a;\n,np.linalg.det(A))array([[1, 3],[2, …

【C++打怪之路Lv3】-- 类和对象(上)

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

C++链表操作入门

数据结构基础&#xff1a;链表操作入门 数据结构基础&#xff1a;链表操作入门链表的基本概念链表的基本操作输出链表插入节点删除节点查找值 完整的链表操作示例结语 数据结构基础&#xff1a;链表操作入门 在计算机科学中&#xff0c;数据结构是组织和存储数据的方式&#x…

论文解读:(CAVPT)Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model

v1文章名字&#xff1a;Dual Modality Prompt Tuning for Vision-Language Pre-Trained Model v2文章名字&#xff1a;Class-Aware Visual Prompt Tuning for Vision-Language Pre-Trained Model 文章汇总 对该文的改进&#xff1a;论文解读&#xff1a;(VPT)Visual Prompt …

ClickHouse 数据类型、表引擎与TTL

文章目录 数据类型注意事项 表引擎1.TinyLog 引擎2.MergeTree 引擎3.ReplacingMergeTree 引擎4.AggregatingMergeTree 引擎5.SummingMergeTree 引擎6.CollapsingMergeTree 引擎7.Distributed 引擎 TTL列级 TTL表级TTL 数据类型 ClickHouse 数据类型Java 数据类型数据范围UInt8…

在控制台实现贪吃蛇

在控制台实现贪吃蛇 前备知识Win32APICOORD这个结构体的声明如下&#xff1a;GetStdHandle 函数GetConsoleCursorInfo 函数SetConsoleCursorInfo 函数 SetConsoleCursorPosition 函数getAsyncKeyState 函数 控制台窗口的大小以及字符打印介绍控制台中的坐标宽字符及本地化介绍s…

使用 Gradio 的“热重载”模式快速开发 AI 应用

在这篇文章中&#xff0c;我将展示如何利用 Gradio 的热重载模式快速构建一个功能齐全的 AI 应用。但在进入正题之前&#xff0c;让我们先了解一下什么是重载模式以及 Gradio 为什么要采用自定义的自动重载逻辑。如果你已熟悉 Gradio 并急于开始构建&#xff0c;请直接跳转到第…

UE4 拍摄、保存并浏览相册

效果&#xff1a; 1.新建CameraActor类 2.修改截图保存路径 3.编写BP_Camera蓝图 注意路径 Save Image函数要在执行拍照和BeginPlay事件执行一次 按钮执行拍摄事件 3.编写UMG蓝图 技巧&#xff1a;让Index加1、减1循环赋值 4.把BP_Camera挂在玩家上

SVN--基本原理与使用(超详细)

目录 一、SVN概述二、SVN服务端软件安装三、SVN服务端配置四、SVN客户端软件安装与使用五、SVN三大指令六、SVN图标集与忽略功能6.1 图标集6.2 忽略功能 七、SVN版本回退八、SVN版本冲突九、SVN配置多仓库与权限控制9.1 配置多仓库9.2 权限控制 十、服务配置与管理十一、模拟真…

新建云仓库

1.GitHub新建云仓库&#xff1a; LICENSE:开源许可证&#xff1b;README.md:仓库说明文件&#xff1b;开源项目&#xff1b;cocoaPodsName.podspec: CocoaPods项目的属性描述文件。 2.Coding新建云仓库&#xff1a; 备注&#xff1a; Coding新建项目&#xff1a;

每日一题(力扣45):跳跃游戏2--贪心

由于题目已经告诉了我们一定可以跳到&#xff0c;所以我们只需去考虑前进最快的方法。即 判断当前下一步能跳的各个位置中&#xff0c;哪个能带你去去向最远的地方&#xff08;why&#xff1f; 因为其他位置所能提供的最大范围都没最远那个大&#xff0c;所以最远的那个已经可以…

The Log-Structured Merge-Tree (LSM-Tree) 论文阅读笔记

原论文&#xff1a;The Log-Structured Merge-Tree (LSM-Tree) LSM-Tree的简介和关键技术要点 LSM-Tree&#xff08;Log-Structured Merge-Tree&#xff09;是一种为高吞吐量读写操作优化的数据结构&#xff0c;特别适用于写入密集型的应用场景。它由Patrick O’Neil等人开发…

Vue 组件分类、局部注册和全局注册

文章目录 背景知识组件分类安装 vue-cli示例设置组件局部注册设置组件全局注册 背景知识 开发 Vue 的两种方式&#xff1a; 核心包传统开发模式&#xff1a;基于 html / css / js 文件&#xff0c;直接引入核心包&#xff0c;开发 Vue。工程化开发模式&#xff1a;基于构建工…

国产麒麟系统下打包electron+vue项目(AppImage、deb)

需要用到的一些依赖包、安装包以及更详细的打包方法word以及麒麟官网给出的文档都已放网盘&#xff0c;链接在文章最后&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&a…

13 c++版本的五子棋

前言 呵呵 这大概是 大学里面的 c 五子棋了吧 有一些 面向对象的理解, 但是不多 这里 具体的实现 就不赘述, 仅仅是 发一下代码 以及 具体的使用 然后 貌似 放在 win10 上面执行 还有一些问题, 渲染的, 应该很好调整 五子棋 #include<Windows.h> #include<io…

elaticsearch windows安装

es下载地址 https://www.elastic.co/cn/downloads/elasticsearch https://www.elastic.co/cn/downloads/past-releases#elasticsearch 在这里插入图片描述 下载直接解压&#xff0c;解压后目录 双击bin目录下的elasticsearch.bat开启服务 注意&#xff1a;9300 端口为 Elas…