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.mzph.cn/bicheng/4065.shtml

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

相关文章

AutoGPT-Forge使用教程,自行构建agent智能体

本博客给出AutoGPT-forge四个教程的翻译与理解&#xff0c;使用GPT4翻译&#xff0c; 参考官方教程https://aiedge.medium.com/autogpt-forge-a-comprehensive-guide-to-your-first-steps-a1dfdf46e3b4 使用AutoGPT Github代码日期2024/4/22&#xff1b; 博客开始编辑日期20…

C语言项目实战——扫雷

目录 1.前言 2.完整流程 2.1规划书 2.2代码部分 2.2.1文件的结构设计 2.2.2变量的创建 2.2.3菜单的基本实现 2.2.4初始化期棋盘 2.2.5输出完整棋盘 2.2.6埋雷的实现 2.2.7查询周围雷的数量 2.2.8扫雷的实现 2.2.9完整代码 3.总结 1.前言 哈喽大家好吖&#xff0c;今…

深入了解数据结构中的查找算法

目录 前言 1. 查找的基本概念 2. 顺序查找和折半查找 2.1 顺序查找 2.2 折半查找 2.3分块查找 3. 树形查找 3.1 二叉搜索树 (BST) 3.2平衡二叉树 3.3红黑树 4. B 树和 B 树 4.1 B 树 4.2 B 树 5. 哈希表 (Hash Table) 5.1 基本操作 5.2 实现 5.3 复杂性分析 5…

# IntelliJ IDEA 中 springboot 启动类 SpringApplication.run 报红分析

IntelliJ IDEA 中 springboot 启动类 SpringApplication.run 报红分析 一、原因分析&#xff1a;通常 SpringApplication.run 报红&#xff0c;可能是由以下几种原因造成的&#xff1a; 1、项目的主配置文件中 pom.xml 可能没有导入相关依赖。 2、方法参数错误&#xff1a;S…

全量知识系统 程序详细设计 库模式的存储库模型: “三生”(派生衍生自生) (QA SmartChat)

Q1. 请仔细说说 派生和衍生 各自的意思以及关系 派生和衍生是两个近义词&#xff0c;但在语境不同的情况下有着不同的含义。 派生通常指从某种事物或概念中产生出新的东西或概念。它可以用来表示从一个基本的概念或原始的实体中推导或演化出来的新的思想、理论、产品或方法。…

【C++例】虚函数—代码实例

1.虚函数的动态绑定 //虚函数&#xff08;非静态的成员函数&#xff09; //动态绑定&#xff1a;只有通过基类的指针或引用调用虚函数时 #include<iostream> using namespace std; class Base1 { public:virtual void display() const; }; // 如果把某个函数指定为final…

通用型自定义拼接 SQL 脚本,摆脱重复工作量

通用型自定义拼接sql脚本,摆脱重复工作量 在开发 Restful 接口时&#xff0c;我们经常需要根据前端传递的参数动态拼接 SQL 查询语句&#xff0c;以满足不同的查询需求。本文将介绍一个通用的自定义拼接 SQL 脚本的方法&#xff0c;帮助开发人员减少重复工作量。 首先&#x…

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

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

避坑:我找到了Hexo安知鱼的音乐馆配置(目前好像还没有教程)

我发现安知鱼的音乐配置根本就找不到说明就无奈自己逆向了一下&#xff0c;找到了配置文件&#xff0c;写在博客里记录一下也算是给大家避坑 我的版本是1.6.12&#xff0c;如果你和我的不一样可以看后面 配置文件就是Blog\themes\anzhiyu\source\js\utils.js 打开该文件&…

开发环境搭建:Windows 桌面应用程序

文章目录 前言1、开发环境准备2、Hello World !3、发布总结 前言 操作系统&#xff1a;Windows 10 企业版 LTSC 1809 IDE&#xff1a;Microsoft Visual Studio 2022 Community 说明&#xff1a;Windows 10 企业版 LTSC 1809 不支持 .NET 4.8.1 详情请查看官方说明文档 1、开发…

【华为OD机试】手机App防沉迷系统【C卷|100分】

【华为OD机试】-真题 !!点这里!! 【华为OD机试】真题考点分类 !!点这里 !! 题目描述 智能手机方便了我们生活的同时,也侵占了我们不少的时间。 “手机App防沉迷系统”能够让我们每天合理地规划手机App使用时间,在正确的时间做正确的事。 它的大概原理是这样的: 在一天24小…

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等人开发…

基于streamlit快速部署机器学习项目(Public URL)

基于streamlit的AIGC项目前端展示 1.Streamlit 简介与入门1.1 安装 Streamlit1.2 开发Streamlit应用程序1.3 启动并运行1.3.1 本地运行1.3.2 部署 现在LLM技术发展迅速&#xff0c;很多人在学习的时候&#xff0c;都想展示效果&#xff0c;并且想部署在服务器上&#xff0c;但是…

SpringBoot的核心内容之自动装配

不面试不知道&#xff0c;现在面试的问题真的是五花八门的&#xff0c;最近就有读者说&#xff0c;在面试的过程中&#xff0c;面试官还提到了关于最初版本的 Spring 还有 SpringMVC 以及现在的 SpringBoot 中的一些相关问题&#xff0c;比如他提到了这个 SpringBoot 的自动装配…

【人工智能基础】线性回归实验分析

实验使用到的库&#xff1a;numpy、matplotlib、scikit-learn 实验使用的开发环境&#xff1a;anaconda、jupyter 一、线性回归 线性回归就是使用一个线性函数&#xff08;多项式回归可以是曲线&#xff09;去拟合给定的训练集&#xff0c;测试时&#xff0c;对输入的x值&#…

Selenium一本通

Selenium中文官方文档 从一个测试脚本说起 from selenium import webdriver #引入selenium webdriver模块 driver webdriver.Firefox() #初始化Firefox浏览器的webdriver对象&#xff0c;启动浏览器 driver.get("http://cn.bing.com/") #跳转到对应页面 assert Bi…

Jammy@Jetson Orin - Tensorflow Keras Get Started: Concept

JammyJetson Orin - Tensorflow & Keras Get Started: Concept 1. 源由2. 模型2.1 推理流程2.1.1 获取图像2.1.2 算法识别2.1.3 判断决策 2.2 理想情况2.2.1 多因素输入2.2.2 理想识别概率 2.3 学习过程2.3.1 标记训练集2.3.2 损失函数2.3.3 训练网络2.3.4 渐进方法 3. 总…

jvm(JVM快速入门、stack栈、堆、GC垃圾回收、Arthas)

文章目录 1. JVM快速入门1.1. 结构图1.2. 类加载器ClassLoader1.3. 执行引擎Execution Engine1.4. 本地接口Native Interface1.5. Native Method Stack1.6. PC寄存器(程序计数器)1.7. Method Area方法区 2. stack栈3. 堆3.1. 堆体系概述3.1.1. 新生区3.1.2. 老年代3.1.3. 永久代…

Python 打包:pyinstaller

目录 为什么选择它用法详解所有命令常规-h-v、 --version--distpath DIR--workpath Workpath-y、 --noconfirm--upx dir upx_dir Upx-a、 --ascii--clean--log-level LEVEL 生成内容-D、 --onedir-F、 --onefile--specpath DIR-n NAME&#xff0c;--NAME NAME-w 执行程序 为什么…

python基础知识点(蓝桥杯python科目个人复习计划66)

今日复习内容&#xff1a;算法双周赛 第一题&#xff1a;疯狂星期六 题目描述&#xff1a; 麦肯鸡是一家名声在外的汉堡店&#xff0c;他们最近推出了一份名为vivo50的套餐&#xff0c;只需要在门口大声喊出vivo50&#xff0c;就可以获得这个套餐。 现在&#xff0c;请你打…