ROS系统通过类定义实现数据处理并重新发布在另一话题

news2024/11/26 6:24:57

 在实际应用中,经常需要在同一个节点内接受数据,在回调函数中将数据进行处理,再将新数据重新发布在另一个新话题上。

实现步骤:

1. 定义一个数据处理类SubscribeAndPublish,设置2个pub成员对象和1个sub成员对象为public。

 2. 在主函数中发布原始消息;

3. 将callback定义为成员函数,并使用新的pub将消息发布出去。

测试程序代码如下:

#include <ros/ros.h>  
#include"std_msgs/String.h"

    class SubscribeAndPublish  
    {  
    public:  
      SubscribeAndPublish()  
      {  
        //Topic you want to publish  
        pub_ = n_.advertise<std_msgs::String>("/published_topic", 1);  
        pub_callback = n_.advertise<std_msgs::String>("/callback_topic", 1);
        //Topic you want to subscribe  
        sub_ = n_.subscribe("/published_topic", 1, &SubscribeAndPublish::callback, this);  //注意这里,和平时使用回调函数不一样了。
      }  
      
      void callback(const std_msgs::String& input)  
      {  
        std_msgs::String output;  
        output.data = input.data;
        output.data.append(" treated!");
        //.... do something with the input and generate the output...  
        ROS_INFO("callbacked and  published on /callback_topic");
        pub_callback.publish(output);  
        // ROS_INFO("callback published");
      }  
      
    public:  
      ros::NodeHandle n_;   
      ros::Publisher pub_;  
      ros::Publisher pub_callback; 
      ros::Subscriber sub_;  
      
    };//End of class SubscribeAndPublish  
      
    int main(int argc, char **argv)  
    {  
      //Initiate ROS  
      ros::init(argc, argv, "subscribe_and_publish");  
      
      //Create an object of class SubscribeAndPublish that will take care of everything  
      SubscribeAndPublish SAPObject;  
      std_msgs::String msg; 
      msg.data = "from main";
      ros::Rate loop_rate(1);
    while (ros::ok())
    {
      SAPObject.pub_.publish(msg);
      ROS_INFO("main published on /published_topic");
      ros::spinOnce();//处理订阅话题的所有回调函数callback(),
      loop_rate.sleep();
    }
      return 0;  
    }  

打印来原始话题的消息和新话题的消息:

rostopic echo /published_topic
rostopic echo /callback_topic

得到原始数据和处理过后的数据的结果。

         

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

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

相关文章

pip安装报错 RuntimeError:Python version 2.7 or 3.4+ is required——解决办法

使用pip install安装第三方库时报错&#xff0c;错误如下&#xff1a;本机安装的是python3.11&#xff0c;已经大于3.4了&#xff0c;但还是会报错。 1、原因 由于存在字符串比较的一个bug&#xff0c;在检查python版本时&#xff0c;会逐个字符进行比较&#xff08;4>1&a…

新手学PCB画板选什么软件

Protel、AD、PADS与Allegro的比较与选择 1.Protel 早期使用较多&#xff0c;现在已经不在流行&#xff0c;少部分工程师能在使用。 优点&#xff1a;1.对新人友好&#xff0c;容易上手&#xff0c;所以学校教学首选这个。2.对电脑要求配置低&#xff0c;一般的电路设计都能实…

Qt扩展-KDDockWidgets 的使用

KDDockWidgets 的使用 一、概述二、原理说明三、代码实例1. 项目简述2. 布局源码 一、概述 KDDockWidgets 的使用相对比较简单&#xff0c;建议直接参考 其提供的例子。 二、原理说明 在这种多窗口布局显示的使用最常用的就是这两个类&#xff0c; 也就是 MainWindow 和 Doc…

No127.精选前端面试题,享受每天的挑战和学习

🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云课上架的前后端实战课程《Vue.js 和 Egg.js 开发企业级健康管理项目》、《带你从入…

SpringBoot RestControllerAdvice异常处理适配原理

在项目中我们经常通过RestControllerAdviceExceptionHandler一起来实现全局的异常处理。 以下是示例代码&#xff1a; package com.xulu.monitor.test;import org.springframework.web.bind.annotation.ExceptionHandler; import org.springframework.web.bind.annotation.Rest…

【面试题】2023前端面试真题之JS篇

前端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 表妹一键制作自己的五星红旗国庆头像&#xff0c;超好看 世界上只有一种真正的英雄主义&#xff0c;那就是看清生活的真相之后&#xff0c;依然热爱生活。…

Shiro反序列化原理及完整复现流程(Shiro-550/Shiro-721)

一、Shiro简介 Apache Shiro是一个强大且易用的**Java安全框架,**能够用于身份验证、授权、加密和会话管理。Shiro拥有易于理解的API,您可以快速、轻松地获得任何应用程序——从最小的移动应用程序到最大的网络和企业应用程序。 二、环境准备 靶机IP地址&#xff1a;192.168…

【新版】系统架构设计师 - 未来信息综合技术

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 文章目录 架构 - 未来信息综合技术考点摘要信息物理系统CPS的体系架构CPS 的技术体系CPS应用场景 人工智能分类关键技术机器学习 机器人发展分类机器人4.0 边缘计算概念与特点边云协同安全应用场景 数字孪生关键技…

Facebook耐用号养成攻略!如何实现自动化高效养号

在跨境电商领域&#xff0c;Facebook 已经成为一个不可或缺的推广和营销平台。然而&#xff0c;想要在 Facebook 上取得成功&#xff0c;有一批耐用的 Facebook 账号是必不可少的。养出一批 Facebook 耐用号可以不仅可以大幅度提高推广效率&#xff0c;更能有效降低营销成本&am…

ISP图像信号处理——平场校正介绍以及C++实现

参考文章1&#xff1a;http://t.csdn.cn/h8TBy 参考文章2&#xff1a;http://t.csdn.cn/6nmsT 参考网址3&#xff1a;opencv平场定标 - CSDN文库 平场校正一般先用FPN(Fixed Pattern Noise)固定图像噪声校正,即暗场校正&#xff1b;再用PRNU(Photo Response Non Uniformity)…

c++颜色空间转换

c颜色空间转换 cvtColor函数标识符颜色空间转换的类型 cvtColor函数使用不同的标识符来表示颜色空间转换的类型。这些标识符通常位于OpenCV的cv命名空间中&#xff0c;并以cv::COLOR_作为前缀。以下是一些常用的cvtColor函数标识符&#xff1a; BGR到灰度&#xff1a; cv::CO…

JEP290深入学习

关键类的学习 ObjectInputFilter serialFilter字段的类型就是ObjectInputFilter&#xff0c;这个接口是一个函数接口&#xff08;可以对方法进行赋值&#xff09;&#xff0c;其中定义的抽象方法是&#xff1a; Status checkInput(FilterInfo filterInfo); 接受的参数类型F…

JavaSE 栈和队列

目录 1 栈 Stack1.1 概念1.2 实现1.3 Stack常见方法的使用1.4 前、中、后缀表达式 2 队列 Queue2.1 概念2.2 实现2.3 循环队列2.4 双端队列 3 Java中的栈和队列4 练习题4.1 括号匹配问题4.2 用队列实现栈4.3 用栈实现队列4.4 实现一个最小栈4.5 设计循环队列 1 栈 Stack 1.1 概…

LIMS实验室信息管理系统源码 基于计算机的数据处理技术、数据存储技术、网络传输技术、自动化仪器分析技术于一体

LIMS 是一个集现代化管理思想与基于计算机的数据处理技术、数据存储技术、网络传输技术、自动化仪器分析技术于一体&#xff0c;以实验室业务和管理工作为核心&#xff0c;遵循实验室管理国际规范&#xff0c;实现对实验室全方位管理的信息管理系统。 LIMS将样品管理、数据管理…

前端利用策略模式优化if else

策略模式 策略模式定义了一系列算法,并将每种算法封装起来,使它们可以相互替换,且算法的变化不会影响使用算法的客户。 策略模式优化if else 策略模式可以用来代替多重if else语句。 Vue中使用策略模式 我们以一个表单验证的例子来看看如何使用策略模式优化if else。 methods:…

一文让你搞懂async/await存在时的执行顺序

最近在写项目&#xff0c;发现代码中总出现这样的内容&#xff0c;一直百思不得其解&#xff0c;后来同事说这段代码的意义是把后边的任务变成宏任务执行&#xff0c;这我更迷惑了&#xff0c;我发现自己的Promise基础还是很差&#xff0c;因此在摸索了几天后&#xff0c;感觉好…

SAP ABAP内部单位外部单位转换问题

之前没有留意&#xff0c;用户用了那么久也没有发现&#xff0c;今天用户找过来说他在前台维护的是PC&#xff0c;但是报表里面显示是ST。 看了一下原来这里的“内部度量单位”就是内部的、与语言无关的计量单位格式&#xff08;ST&#xff09;。该内部格式在输出到屏幕之前&a…

完整指南:如何使用 Node.js 复制文件

文件拷贝指的是将一个文件的数据复制到另一个文件中&#xff0c;使目标文件与源文件内容一致。Node.js 提供了文件系统模块 fs&#xff0c;通过该模块可以访问文件系统&#xff0c;实现文件操作&#xff0c;包括拷贝文件。 Node.js 中文件拷贝方法 在 Node.js 中&#xff0c;有…

竞赛选题 大数据商城人流数据分析与可视化 - python 大数据分析

0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; 基于大数据的基站数据分析与可视化 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐&#xff01; &#x1f947;学长这里给一个题目综合评分(每项满分5分) 难度…

Postgresql源码(114)视图权限授予逻辑

0 速查 被授权的对象在系统表中记录授权信息&#xff0c;例如pg_namespace中的nspacl列&#xff1a; {mingjieUC/mingjie,UC/mingjie,pusr1UC/mingjie}pusr1UC/mingjie的含义&#xff1a; mingjie是赋予者pusr1是被赋予者UC是权限&#xff0c;表示USAGE和CREATE 1 视图权限…