ROS话题发布与订阅

续上一篇文章。

我们现在在VScode里面加入订阅方的实现。

demo02_sub.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"/*订阅方实现:1、包含头文件ROS中文本类型 ---> std_msgs/String.h2、初始化ROS节点3、创建节点句柄4、创建订阅者对象5、处理订阅到的数据
*/
void doMsg(const std_msgs::String::ConstPtr &msg)
{//通过msg获取并操作订阅到的数据ROS_INFO("翠花订阅到的数据:%s",msg->data.c_str());
}int main(int argc, char *argv[])
{setlocale(LC_ALL,"");// 初始化 ROS 节点(节点不能重名,不然把别的节点给干掉了,要具有唯一性)ros::init(argc,argv,"cuiHua");// 创建节点句柄ros::NodeHandle nh;// 创建订阅者对象ros::Subscriber sub = nh.subscribe("fang",10,doMsg);//处理订阅到的数据//循环ros::spin();return 0;
}

demo01_pub.cpp

#include "ros/ros.h"
#include "std_msgs/String.h"
#include <sstream>
/*发布方实现:1、包含头文件ROS中文本类型 ---> std_msgs/String.h2、初始化ROS节点3、创建节点句柄4、创建发布者对象5、编写发布逻辑并发布数据
*/int main(int argc, char *argv[])
{setlocale(LC_ALL,"");// 2、初始化 ROS 节点;ros::init(argc,argv,"erGouZi");// 3、创建节点句柄 ;ros::NodeHandle nh;// 4、茶ungjian发布者对象ros::Publisher pub = nh.advertise<std_msgs::String>("fang",10);// 5、编写发布逻辑并发布数据//要求以 10HZ 的频率发布数据,并且文本后添加编码//先创建被发布的消息 std_msgs::String msg;//发布频率ros::Rate rate(0.5);//编写循环,循环中发布数据//设置编号、int count = 0;while (ros::ok()){count++;// msg.data = "hello";//实现字符串拼接数字std::stringstream ss;ss << "hello ---> " << count;msg.data = ss.str();pub.publish(msg);//添加日志ROS_INFO("发布的数据是:%s",ss.str().c_str());rate.sleep();ros::spinOnce(); //官方建议,处理回调函数}return 0;}

每次编写完后记得catkin_make一下。

可能遇到的问题

如果出现乱码,那么需要在代码里面加入这句话

讲一些代码里的知识

在ROS中,ros::spinOnce() 函数用于处理回调队列。这个函数告诉ROS节点,它需要检查回调队列并调用任何等待的回调函数。这是非常重要的,因为它允许节点响应事件,如接收到新的消息或服务请求。

回调函数

在ROS中,回调函数是当某个事件发生时自动执行的函数。最常见的回调是消息回调,它们是由节点订阅的话题上接收到新消息时触发的。例如,如果你的节点订阅了一个std_msgs::String类型的消息,当新的消息到达时,就会调用相应的回调函数。

ros::spinOnce() 的作用

  • 处理回调ros::spinOnce() 调用等待在回调队列中的所有回调函数。
  • 非阻塞:这个函数是非阻塞的,它只处理一次回调队列,然后立即返回。
  • 频率控制:在循环中调用ros::spinOnce()可以控制回调函数的处理频率。

使用场景

通常,你会在ROS节点的主循环中调用ros::spinOnce(),以确保节点能够响应所有传入的消息和事件。以下是一个典型的使用示例:

#include "ros/ros.h"
#include "std_msgs/String.h"void messageCallback(const std_msgs::String::ConstPtr& msg)
{ROS_INFO("I heard: [%s]", msg->data.c_str());
}int main(int argc, char **argv)
{ros::init(argc, argv, "subscriber_node");ros::NodeHandle nh;ros::Subscriber sub = nh.subscribe("topic", 10, messageCallback);ros::Rate loop_rate(1); // 1 Hzwhile (ros::ok()){ros::spinOnce();  // 处理回调队列loop_rate.sleep(); // 等待下一次循环}return 0;
}

在这个例子中,ros::spinOnce() 被调用以确保当有新消息到达时,messageCallback 函数会被执行。然后,loop_rate.sleep() 用于控制循环的频率,这里是每秒一次。

官方建议

ROS官方建议在主循环中使用ros::spinOnce(),因为它提供了更好的控制和灵活性。如果你不调用ros::spinOnce(),节点可能无法响应某些事件,特别是当这些事件不是由ROS的内部定时器触发的时候。此外,ros::spin()(一个阻塞调用,会一直运行直到节点关闭)已被弃用,因为它可能导致节点在处理大量消息时变得不够响应。

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

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

相关文章

中国篆刻艺术孙溟㠭作品《活着》

活着只是一吸一呼之间&#xff0c;在意觉醒之间&#xff0c;在血液流动之间&#xff0c;抛却灵与肉生死&#xff0c;一切都是惘然。妻吴晓蕾题款&#xff0c;甲辰夏月溟㠭于寒舍小窗下刊石。

力扣高频SQL 50题(基础版)第七题

文章目录 力扣高频SQL 50题&#xff08;基础版&#xff09;第七题1068. 产品销售分析 I题目说明思路分析实现过程准备数据&#xff1a;实现方式&#xff1a;结果截图:总结&#xff1a; 力扣高频SQL 50题&#xff08;基础版&#xff09;第七题 1068. 产品销售分析 I 题目说明 …

PCIe 以太网芯片 RTL8125B 的 spec 和 Linux driver 分析备忘

1,下载 RTL8125B driver 下载页&#xff1a; https://www.realtek.com/Download/List?cate_id584 2,RTL8125B datasheet下载 下载页&#xff1a; https://file.elecfans.com/web2/M00/44/D8/poYBAGKHVriAHnfWADAT6T6hjVk715.pdf3, 编译driver 解压&#xff1a; $ tar xj…

【案例】使用React+redux实现一个Todomvc

About 大家好&#xff0c;我是且陶陶&#xff0c;今天跟大家分享一个redux的todoList案例&#xff0c;通过这个案例能够快速掌握redux的基本知识点&#x1f339; ❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…❤️…

Helm部署k8s应用

文章目录 一、概述1、什么是Helm2、特点3、工作流程4、核心概念 二、安装Helm1、二进制版本安装1.1、下载需要的版本1.2、解压1.3、将helm移动到指定路径1.4、验证 三、Helm安装资源顺序四、--set 的格式和限制1、最简单的name/value对2、多个name/value对3、更复杂的表达式4、…

Java语言程序设计基础篇_编程练习题*15.3 (移动小球)

*15.3 (移动小球) 编写一个程序&#xff0c;在面板上移动小球。应该定义一个面板类来显示小球&#xff0c;并提供向左、 向右 、向上和向下移动小球的方法&#xff0c;如图15-24c所示。请进行边界检査以防止球完全移到视线之外 代码展示&#xff1a;编程练习题15_3MoveBall.ja…

鸿蒙OpenHarmony Native API【drawing_pen.h】 头文件

drawing_pen.h Overview Related Modules: [Drawing] Description: 文件中定义了与画笔相关的功能函数 Since: 8 Version: 1.0 Summary Enumerations Enumeration NameDescription[OH_Drawing_PenLineCapStyle] { [LINE_FLAT_CAP], [LINE_SQUARE_CAP], [LINE_ROUND_…

Redis核心技术与实战学习笔记

Redis核心技术与实战学习笔记 最近想沉下心来看下redis&#xff0c;买了蒋德钧老师的《Redis 核心技术与实战》,这里记录一些学习笔记 希望能够坚持下去有想一起学习的童鞋&#xff0c;可以点击跳转到文章尾部获取学习资源,仅供学习不要用于任何商业用途!!! redis知识全景图 …

ROS2入门到精通—— 2-8 ROS2实战:机器人安全通过狭窄区域的方案

0 前言 室内机器人需要具备适应性和灵活性&#xff0c;以便在狭窄的空间中进行安全、高效的导航。本文提供一些让机器人在狭窄区域安全通过的思路&#xff0c;希望帮助读者根据实际开发适当调整和扩展 1 Voronoi图 Voronoi图&#xff1a;根据给定的一组“种子点”&#xff0…

Ubuntu22.04系统安装nodejs 14 保姆级教程

下载软件包 从NodeSource 的官方源下载并安装 Node.js 14.x 版本的软件包&#xff0c;适用于 Debian 和 Ubuntu 系统&#xff1a; curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash - 更新软件源 更新软件源 sudo apt-get update 下载bodejs14 下载nodejs14 sud…

Jenkins卡在等待界面解决方法

一、问题 部署jenkins服务器出现Please wait while Jenkins is getting ready to work。 二、原因分析 jenkins里面文件指向国外的官网&#xff0c;因为防火墙的原因连不上。 三、解决方法 将配置文件里面的url换成国内镜像&#xff1a; &#xff08;1&#xff09;修改配…

WEB攻防-通用漏洞-SQL 读写注入-MYSQLMSSQLPostgreSQL

什么是高权限注入 高权限注入指的是攻击者通过SQL注入漏洞&#xff0c;利用具有高级权限的数据库账户&#xff08;如MYSQL的root用户、MSSQL的sa用户、PostgreSQL的dba用户&#xff09;执行恶意SQL语句。这些高级权限账户能够访问和修改数据库中的所有数据&#xff0c;甚至执行…

2024/7/23 英语每日一段

As malware has improved and evolved, it has pushed defense software to require constant connection and more extensive control. That deeper access also introduces a far higher possibility that security software—and updates to that software—will crash the …

RabbitMQ入门详解

前言 本篇文章将详细介绍rabbitmq的基本概念知识&#xff0c;以及rabbitmq各个工作模式在springboot中如何使用。 文章目录 介绍 简介 RabbitMQ 核心 生产者与消费者 Exchange Queue 工作模式 简单模式 工作队列模式 发布订阅模式 路由模式 主题模式 SpringBoot中…

java算法day21

java算法day21 77 组合216 组合总和Ⅲ17 电话号码的数字组合39 组合总和 这个阶段所要解决的问题都是有关回溯算法。 所以说解法基本上都是围绕回溯算法模板来完成。回溯算法可以这样总结&#xff0c;树形结构&#xff0c;横向遍历&#xff0c;纵向递归。递归出口收货结果并终…

(十九)原生js案例之h5地里位置信息与高德地图的初使用

h5 地里位置信息 1. 获取当前位置信息 window.onload function () {const oBtn document.querySelector("#btn");const oBox document.querySelector("#box");oBtn.onclick function () {window.navigator.geolocation.getCurrentPosition(function (…

c++----模版进阶

c----模版初阶&#xff1a;http://t.csdnimg.cn/PiYoD 一.非类型模版参数 模板参数除了可以是类型&#xff0c;还可以是常量。 例如&#xff1a; 这样就可以在类中使用这个n常量。 -------------------------------------------------------------------------------------…

鸿蒙OS物联网创新应用实训解决方案

摘要&#xff1a; 随着物联网技术的飞速发展&#xff0c;各种智能设备和传感器正在以前所未有的速度融入我们的日常生活。华为推出的鸿蒙操作系统&#xff08;HarmonyOS&#xff09;作为一款面向全场景、多设备、无缝连接的分布式操作系统&#xff0c;为物联网领域带来了全新的…

机器学习 | 回归算法原理——最小二乘法

Hi&#xff0c;大家好&#xff0c;我是半亩花海。很早便想学习并总结一本很喜欢的机器学习图书——立石贤吾的《白话机器学习的数学》&#xff0c;可谓通俗易懂&#xff0c;清晰形象。那就在此分享并作为学习笔记来记录我的学习过程吧&#xff01;本章的回归算法原理基于《基于…

【时序约束】读懂用好Timing_report

一、静态时序分析&#xff1a; 静态时序分析&#xff08;Static Timing Analysis&#xff09;简称 STA&#xff0c;采用穷尽的分析方法来提取出整个电路存在的所有时序路径&#xff0c;计算信号在这些路径上的传播延时&#xff0c;检查信号的建立和保持时间是否满足时序要求&a…