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

news2024/11/16 4:40:14

文章目录

  • 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.coloradmin.cn/o/1620305.html

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

相关文章

​「Python绘图」绘制小猪佩奇

python 绘制小猪佩奇 一、预期结果 二、核心代码 import turtle print("开始绘制小猪佩奇") pen turtle.Turtle() pen.pensize(4) #pen.hideturtle()pen.speed(1000)pen.color("#ff9bc0","pink") pen.setheading(-30) pen.pu() pen.goto(-100,…

c++ - 空间申请和释放 new/delete

文章目录 一、c/c内存分布二、new/delete 的使用三、malloc/free 和 new/delete 的对比四、new/delete 的实现原理五、匹配问题 一、c/c内存分布 求下面各个变量的位置 // c/c内存分布int globalVar 1; static int staticGlobalVar 1; void Test() {static int staticVar …

Paddle 1.8 与 Paddle 2.0 API 映射表

安装2.6的paddlepaddle之后总是报fluid的错误&#xff0c;查询得知这个接口已经弃用了&#xff0c;但是一直找不到替换接口&#xff0c;偶然查询报错信息的时候找到了映射表&#xff0c;转存一下。 Paddle 1.8 与 Paddle 2.0 API 映射表

打开IIS网站网页错误提示Argument ‘Key must not be null‘ cannot be null.解决方案 Oracle数据库监听

打开网页异常如下&#xff1a; /“应用程序中的服务器错误。 Argument Key must not be null cannot be null.参数名:Key must not be null 客户端 连接oracle 提示&#xff1a;ORA-12541:TNS:无监听程序 按组合键WindowsR&#xff0c;打开运行 输入命令&#xff1a;lsnrctl s…

道一云与畅捷通T+对接集成获取报销信息列表连通凭证创建(报销差旅费(天水))

道一云与畅捷通T对接集成获取报销信息列表连通凭证创建(报销差旅费&#xff08;天水&#xff09;) 对接源平台:道一云 在道一云坚实的技术基础上&#xff0c;道一云推出全新升级的2.0产品矩阵&#xff0c;分别是低码平台、智能门户、场景应用。基于云原生底座&#xff0c;为企业…

解决DataGrip连接MySQL8时出现时区错误问题

解决办法&#xff1a;在url后面拼接时区参数 ?serverTimezoneAsia/Shanghai

虚拟仿真实训室+实时云渲染,便捷高效的教学新体验

一、VR虚拟仿真实训室的优势和缺点 信息技术的发展在教育方面的应用也逐渐广泛起来&#xff0c;一种新兴的教学手段正以其独特的魅力打破传统教育的壁垒——这就是虚拟仿真教学。一些高校中会建立vr仿真实训室来供学生进行学习。这种形式有哪些优势和缺点呢&#xff1f; 优势…

手撕sql面试题:计算出在校人数,字段中含有学生的学制

今天分享一道面试题!如下&#xff1a; 有一个录取学生人数表&#xff0c;记录的是每年录取学生人数和入学学生的学制 以下是表结构&#xff1a; CREATE TABLE admit ( id int(11) NOT NULL AUTO_INCREMENT, year int(255) DEFAULT NULL COMMENT 入学年度, num int(255) …

前端css中filter(滤镜)的使用

前端css中filter的使用 一、前言二、补充内容说明三、模糊&#xff08;一&#xff09;、模糊效果&#xff0c;源码1&#xff08;二&#xff09;、源码1运行效果1.视频演示2.截图演示 四、阴影&#xff08;一&#xff09;、阴影效果&#xff0c;源码2&#xff08;二&#xff09;…

后端-MySQL-week11 事务

事务 简介 操作 有两种方式&#xff0c;一种是设置为手动提交——不执行“commit”不进行变更&#xff1b;另一种是手动开启一个事务&#xff0c;用开启事务的代码&#xff08;SQL语句&#xff09;来创建一个需要“commit”才能进行变更的事务 1.第一种方式 2.第二种方式 四…

C++ | Leetcode C++题解之第46题全排列

题目&#xff1a; 题解&#xff1a; class Solution { public:void backtrack(vector<vector<int>>& res, vector<int>& output, int first, int len){// 所有数都填完了if (first len) {res.emplace_back(output);return;}for (int i first; i &…

如何使用 Vercel 托管静态网站

今天向大家介绍 Vercel 托管静态网站的几种方式&#xff0c;不熟悉 Vercel 的伙伴可以看一下之前的文章&#xff1a;Vercel: 开发者免费的网站托管平台 Github 部署 打开 Vercel 登录界面&#xff0c;推荐使用 GitHub账号 授权登录。 来到控制台界面&#xff0c;点击 Add New …

Docker 命令 镜像操作 容器操作 备份与迁移 DockerFile

什么是Docker&#xff1f; Docker是一种开源应用容器引擎&#xff0c;开发者可以打包自己的应 用以及依赖包到可移植的容器中&#xff0c;然后发布到任何linux机器上。 Docker客居在操作系统内核上的用户空间&#xff0c;只能运行与底层宿主 机相同的操作系统之上。主要目标是…

线性代数-知识点复习(面试用)

整理&#xff1a;Peter1146717850 一、向量与线性组合 向量&#xff1a;往什么方向走多么远 e.g. ( 1 2 ) \begin{pmatrix} 1 \\ 2\end{pmatrix} (12​) 向量的模&#xff1a;向量的长度 向量的加减法&#xff1a;向量对应元素相加减&#xff08;前提&#xff1a;维度相同…

免费SSL证书和付费SSL证书区别在哪

免费SSL证书与付费SSL证书在多个方面存在差异&#xff0c;这些差异主要体现在认证级别、保障金额以及服务范围上。在以下几个方面存在显著区别&#xff1a; 1、验证类型和信任级别&#xff1a; 免费SSL证书&#xff1a;通常只提供域名验证&#xff08;DV&#xff09;级别的证…

【Linux】日志分析与管理

作为一个运维&#xff0c;如果不会看日志&#xff0c;就好比是冬天刚刚用热水泡完了脚&#xff0c;接着就立马让人把水喝掉。 目录 一、Inode介绍 1.1 什么是inode 1.2 inode表内容 1.3 查看inode号的方式 二、日志分析 2.1 日志的用途 2.2 日志的分类 2.3 日志级别 2…

电力调度自动化系统由什么构成?

电力调度自动化系统由什么构成&#xff1f; 电力调度自动化系统通过数据采集与传输、数据处理与存储、监视与控制、优化与决策、通信网络和系统应用软件等构成&#xff0c;实现对电力系统的监控、控制和优化。 电力调度自动化系统是一种集成了计算机技术、通信技术、自动化技术…

从阿里云OSS迁移到AWS S3的步骤

随着企业数字化转型的加速,云计算成为企业IT基础设施不可或缺的部分。对象存储作为云计算的重要组成部分,为企业提供了可靠、安全、低成本的数据存储和管理解决方案。在选择对象存储服务时,企业需要根据自身需求和发展战略来进行全面评估。我们九河云&#xff0c;获得AWS官方认…

vue3 修改路由中的meta属性

有些时候可能需要在路由跳转前后修改meta里面的相关属性值&#xff0c;这个时候就需要使用钩子函数&#xff08;路由守卫&#xff09;&#xff0c;钩子函数有全局钩子&#xff0c;局部组件钩子函数以及路由配置里面的钩子函数 &#xff08;这些也叫路由守卫&#xff09; 1.全局…

Windows 10 安装配置WSL2(Ubuntu 20.04)教程

Windows 10 安装配置WSL2&#xff08;Ubuntu 20.04&#xff09;教程 一、WSL简介 WSL&#xff08;Windows Subsystem for Linux&#xff09;是一个兼容层&#xff0c;允许在Windows 10上原生运行Linux二进制可执行文件。 二、安装WSL2 3.1 传统手动安装 更新系统&#xff…