ROS话题通信机制实操C++

ROS话题通信机制实操C++

  • 创建ROS工程
  • 发布方(二狗子)
  • 订阅方(翠花)
  • 编辑配置文件
  • 编译并执行
  • 注意
    • 订阅的第一条数据丢失

ROS话题通信的理论查阅ROS话题通信流程理论

在ROS话题通信机制实现中,ROS master 不需要实现,且连接的建立也已经被封装了,需要关注的关键点有三个:

  • 发布方(二狗子)
  • 订阅方(翠花)
  • 数据(此处为普通文本)

创建ROS工程

创建一个ROS工程包括以下几个步骤:

  • 创建一个topic_ws的ROS工作空间
  • 启动VScode
  • VScode 编译ROS
  • 创建ROS功能包

详细操作可以查阅VScode创建ROS项目 ROS集成开发环境

发布方(二狗子)

  • 基本流程

    • 1.包含头文件
    • 2.初始化 ROS 节点:命名(唯一)
    • 3.实例化 ROS 句柄
    • 4.实例化 发布者 对象
    • 5.组织被发布的数据,并编写逻辑发布数据
  • 代码实现

    #include "ros/ros.h"
    #include "std_msgs/String.h"
    #include "sstream"/*1.包含头文件 2.初始化 ROS 节点:命名(唯一)3.实例化 ROS 句柄4.实例化 发布者 对象5.组织被发布的数据,并编写逻辑发布数据*/int main(int argc, char  *argv[])
    {   //设置编码setlocale(LC_ALL,"");//2.初始化 ROS 节点:命名(唯一)// 参数1和参数2 后期为节点传值会使用// 参数3 是节点名称,是一个标识符,需要保证运行后,在 ROS 网络拓扑中唯一ros::init(argc,argv,"erGouzi");//3.实例化 ROS 句柄ros::NodeHandle nh;//该类封装了 ROS 中的一些常用功能//4.实例化 发布者 对象//泛型: 发布的消息类型//参数1: 要发布到的话题//参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10);//5.组织被发布的数据,并编写逻辑发布数据//数据(动态组织)std_msgs::String msg;// msg.data = "你好啊!!!";int count = 0; //消息计数器//逻辑(一秒1次)ros::Rate rate(1);ros::Duration(3.0).sleep();  //休眠3s等待 publisher 注册完成,不然订阅者读不到第一条消息//节点不死,就一直循环while (ros::ok()){//使用 stringstream 拼接字符串与编号std::stringstream ss;ss << "Hello 你好! --> " << count;msg.data = ss.str();//发布消息pub.publish(msg);//加入调试,打印发送的消息ROS_INFO("发送的消息:%s",msg.data.c_str());//根据前面制定的发送贫频率自动休眠 休眠时间 = 1/频率;rate.sleep();count++;//循环结束前,让 count 自增//暂无应用ros::spinOnce();}return 0;
    }
    
  • 验证是否有问题

    • 编辑配置文件
      修改 plumbing_pub_sub 功能包下的CMakeLists.txt,找到add_executable和target_link_libraries,修改成如图所示
      在这里插入图片描述
    • 按快捷键 ctrl + shift + B 编译
    • 开启一个Terminal,运行 roscore 命令;再开启一个新的Terminal,运行source ./devel/setup.bash rosrun plumbing_pub_sub demo_pub_c ;再开启一个Terminal,运行rostopic echo fang,查看订阅数据
      在这里插入图片描述

订阅方(翠花)

  • 基本流程

    • 1.包含头文件
    • 2.初始化 ROS 节点:命名(唯一)
    • 3.实例化 ROS 句柄
    • 4.实例化 订阅者 对象
    • 5.处理订阅的消息(回调函数)
    • 6.设置循环调用回调函数
  • 代码实现

    // 1.包含头文件 
    #include "ros/ros.h"
    #include "std_msgs/String.h"/*1.包含头文件 2.初始化 ROS 节点:命名(唯一)3.实例化 ROS 句柄4.实例化 订阅者 对象5.处理订阅的消息(回调函数)6.设置循环调用回调函数
    */void doMsg(const std_msgs::String::ConstPtr& msg_p)
    {//通过msg获取并操作订阅到的数据ROS_INFO("我听见:%s",msg_p->data.c_str());// ROS_INFO("我听见:%s",(*msg_p).data.c_str());
    }int main(int argc, char  *argv[])
    {setlocale(LC_ALL,"");//2.初始化 ROS 节点:命名(唯一)ros::init(argc,argv,"cuiHua");//3.实例化 ROS 句柄ros::NodeHandle nh;//4.实例化 订阅者 对象//参数1: 要发布到的话题//参数2: 队列中最大保存的消息数,超出此阀值时,先进的先销毁(时间早的先销毁)ros::Subscriber sub = nh.subscribe<std_msgs::String>("fang",10,doMsg);//5.处理订阅的消息(回调函数)//6.设置循环调用回调函数ros::spin();//循环读取接收的数据,并调用回调函数处理return 0;
    }
    

发布方的订阅方声明的话题必须一直,案例中的话题是 fang

编辑配置文件

修改 plumbing_pub_sub 功能包下的CMakeLists.txt,找到add_executable和target_link_libraries,修改成如图所示,
在这里插入图片描述

编译并执行

  • 编译代码
    按快捷键 ctrl + shift + B 编译
    在这里插入图片描述

  • 执行代码

    • 1.启动 roscore;
      开启一个Terminal,启动 roscore
      在这里插入图片描述

    • 2.启动发布节点;
      开启一个新的Terminal

      cd topic_ws/
      source ./devel/setup.bash 
      rosrun plumbing_pub_sub demo_pub_c 
      

      在这里插入图片描述

    • 3.启动订阅节点。

      cd topic_ws/
      source ./devel/setup.bash 
      rosrun plumbing_pub_sub demo_sub_c 

      在这里插入图片描述

注意

订阅的第一条数据丢失

  • 原因:
    发送第一条数据时, publisher 还未在 roscore 注册完毕,但是数据已经再发送
  • 解决方法:
    注册后,加入休眠 ros::Duration(3.0).sleep(); 延迟第一条数据的发送。

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

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

相关文章

JDK17新增语法特征

1、引言 Spring Boot 3.0 开始不再支持 JDK 8&#xff0c;转而支持 JDK 17。 这篇博客我会列举较常用的新语法特性。 2、新增语法特征 2.1 yield关键字 从Java13开始引⼊yield关键字&#xff0c;yield关键字应用于switch语句中&#xff0c;我们可以使用yield来简化代码。 正常的…

2024.06.22【读书笔记】丨生物信息学与功能基因组学(第十七章 人类基因组 第一部分)【AI测试版】

第一部分:人类基因组概述与测序历史(详细版) 摘要: 第十七章深入探讨了人类基因组的复杂性、测序历程以及其对现代科学的意义。人类基因组由约30,000至40,000个蛋白质编码基因组成,这些基因的表达和变异构成了我们生物学特征和疾病倾向的基础。本章节详细回顾了人类基因…

前端算法题----三数求和问题

算法题讲解 真题描述&#xff1a; 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 注意&#xff1a;答案…

Applied Spatial Statistics(七):Python 中的空间回归

Applied Spatial Statistics&#xff08;七&#xff09;&#xff1a;Python 中的空间回归 本笔记本演示了如何使用 pysal 的 spreg 库拟合空间滞后模型和空间误差模型。 OLS空间误差模型空间滞后模型三种模型的比较探索滞后模型中的直接和间接影响 import numpy as np impor…

【html】用html写一个博物馆首页

效果图&#xff1a; 二级导航&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><l…

江协科技51单片机学习- p14 调试LCD1602显示屏

前言&#xff1a; 本文是根据哔哩哔哩网站上“江协科技51单片机”视频的学习笔记&#xff0c;在这里会记录下江协科技51单片机开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了江协科技51单片机教学视频和链接中的内容。 引用&#xff1a; 51单片机入门教程-2…

算法框架:冷部署实现优雅退出

冷部署实现优雅退出&#xff1a;背景与解决方案 在微服务架构中&#xff0c;服务的更新和部署是日常运维中不可避免的任务。然而&#xff0c;传统的冷部署方法往往会直接停止旧服务并启动新服务&#xff0c;这样会导致正在处理的请求被中断&#xff0c;进而影响用户体验。为了…

RabbitMQ消息队列 安装及基本介绍

一.MQ介绍 Message Queue &#xff08;MQ&#xff09;是一种跨进程的通信机制&#xff0c;用于在系统之间进行传递消息。MQ作为消息中间件&#xff0c;可以进行异步处理请求&#xff0c;从而减少请求响应时间和解耦 1.1 应用场景 1.1.1 系统之间通过MQ进行消息通信&#xff0…

leetcode 二分查找·系统掌握 x的平方根

题目&#xff1a; 题解 这题可以使用~01~泛型查找在0~x/2的范围内查找答案。 int mySqrt(int x) {long l0,rx,mid;while(l<r){mid(lr1)>>1;if(mid*mid>x)rmid-1;else lmid;}//因为一定有答案所以不用判定是否查找失败return l;}

Docker构建多平台镜像

docker的多架构镜像构建 目前很多服务器都是基于arm架构的&#xff0c;而现在大多数的docker镜像都是基于x86架构的。一种情况就是同样的代码编译成业务包做成镜像需要部署在不同架构的服务器上&#xff0c;这个时候我们就可以使用docker的多平台构建了。 以下操作是在centos7.…

数组、正则表达式、排序

数组 定义&#xff1a;在集合当中指定多个元素&#xff0c;元素的类型可以是整数也可以是字符串&#xff0c;也可以是浮点。 作用&#xff1a;可以一次性定义多个元素&#xff0c;可以为变量赋值提供便利。 数组的定义方法&#xff1a; 数组名 &#xff08;a b c&#xff0…

深入探索 Nuxt3 Composables:掌握目录架构与内置API的高效应用

title: 深入探索 Nuxt3 Composables&#xff1a;掌握目录架构与内置API的高效应用 date: 2024/6/23 updated: 2024/6/23 author: cmdragon excerpt: 摘要&#xff1a;“本文深入探讨了Nuxt3 Composables&#xff0c;重点介绍了其目录架构和内置API的高效应用。通过学习本文&…

pcl::PointXYZRGBA造成点云无法显示

如果pcd文件没有rgba信息&#xff0c;使用pcl::PointXYZRGBA类型打开会提示以下信息&#xff1a; Failed to find match for field rgba另外&#xff0c;显示出来的点云是黑色&#xff0c;如果使用默认背景色为黑色&#xff0c;就无法显示点云了。 如果设置其它背景色&#xf…

服务器防御ddos攻击

硬件层面&#xff1a; 1、高性能防火墙能有效过滤ddos攻击&#xff0c;可以有效的提高网络的抗攻击能力 2、使用流量清洗设备&#xff08;或者ddos防护设备&#xff09;可以过滤攻击流量&#xff0c;可以保护网站和服务器正常运行 软件层面&#xff1a; 1、 隐藏服务器真实IP 2…

命名冲突常见的领域

命名冲突确实是指在不同的来源或上下文中&#xff0c;同一实体&#xff08;可以是对象、变量、函数、类、文件等&#xff09;具有不同的名称。 在编程中&#xff0c;命名冲突可能发生在以下情况&#xff1a; 变量和函数重名&#xff1a;在不同的作用域或模块中&#xff0c;变量…

视频监控平台:支持交通部行业标准JT/T905协议(即:出租汽车服务管理信息系统)的源代码的函数和功能介绍及分享

目录 一、视频监控平台介绍 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;视频接入能力介绍 &#xff08;三&#xff09;功能介绍 二、JT/T905协议介绍 &#xff08;一&#xff09;概述 &#xff08;二&#xff09;主要内容 1、设备要求 2、业务功能要求…

[最全]设计模式实战(一)UML六大原则

UML类图 UML类图是学习设计模式的基础,学习设计模式,主要关注六种关系。即:继承、实现、组合、聚合、依赖和关联。 UML类图基本用法 继承关系用空心三角形+实线来表示。实现接口用空心三角形+虚线来表示。eg:大雁是最能飞的,它实现了飞翔接口。 关联关系用实线箭头来表示…

OOM日志分析

目录 1. 日志分析2. MAT 工具2.1 日志打印方式2.1.1 HeapDumpOnOutOfMemoryError&#xff08;推荐&#xff09;2.1.2 jmp 命令 2.2 MAT分析方式2.2.1 饼图分析2.2.2 树形图分析2.2.2 泄漏疑点 3. 优化 首先说一下结论&#xff1a;通过MAT工具分析才是最精准的&#xff0c;直接通…

2025秋招NLP算法面试真题(二)-史上最全Transformer面试题:灵魂20问帮你彻底搞定Transformer

简单介绍 之前的20个问题的文章在这里&#xff1a; https://zhuanlan.zhihu.com/p/148656446 其实这20个问题不是让大家背答案&#xff0c;而是为了帮助大家梳理 transformer的相关知识点&#xff0c;所以你注意看会发现我的问题也是有某种顺序的。 本文涉及到的代码可以在…

微信小程序建议录音机

在小程序中实现录音机功能&#xff0c;可以通过使用小程序提供的wx.getRecorderManager() API来获取录音管理对象&#xff0c;然后使用这个对象的start()方法来开始录音&#xff0c;使用stop()方法来停止录音&#xff0c;并使用onStop()方法来监听录音的结束。以下是一个简单的…