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

news2024/11/25 14:58:12

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);
    
        //节点不死,就一直循环
        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.coloradmin.cn/o/1852536.html

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

相关文章

反馈时延与端到端拥塞控制

先从 越来越无效的拥塞控制 获得一个直感。 开局一张图&#xff0c;剩下全靠编。这是一道习题&#xff1a; 这图来自《高性能通信网络(第二版)》&#xff0c;2002 年的书&#xff0c;很好很高尚&#xff0c;目前这种书不多了。不准备做这道题&#xff0c;但意思要明白&#x…

Redis学习|Redis基础知识、Redis五大数据类型、Redis三种特殊数据类型、Redis事务

Redis基础知识 redis默认有16个数据库&#xff0c;并且这个数量可以在conf配置文件中更改 默认使用的是第0个 可以使用 select 进行切换数据库! key *查看数据库所有的key 清除当前数据库 flushdb 清除全部数据库的内容FLUSHALL 为什么redis是6379!(了解一下即可!) Redis 是…

关于笔记本电脑连接电源时触摸板失灵、卡顿、乱飘的问题

目录 前言 问题原因 解决方法 前言 我查阅了相关的资料和方法如下&#xff08;很感谢这位楼主大佬提供的问题所在&#xff09;&#xff1a; 问题原因 解决方法 那么解决方法无非就是几种&#xff08;方法仅供参考&#xff0c;不排除一些危险性&#xff09;&#xff1a; 1…

微信公众号 H5授权登录实现(最详细)

一、微信公众号 &#xff08;一&#xff09;基础信息 微信授权类型 自己的网站、APP等第三方&#xff0c;要实现接入微信授权登录&#xff0c;有多种方式&#xff1a;微信公众号&#xff08;网页&#xff09;、微信小程序、微信开放平台&#xff08;APP&#xff09;等等。 【…

什么是标准差和方差

标准差是用于衡量数字是如何分布的指标。用σ &#xff08;sigma&#xff09;表示。 标准差方差的平方根。 什么是方差 方差就是与均值的平方差的平均值。方差的计算过程&#xff1a; 计算平均值&#xff08;mean&#xff09;用μ /读mu/表示。用每一个数减去平均值&#xf…

Java基础的重点知识-04-封装

文章目录 面向对象思想封装 面向对象思想 在计算机程序设计过程中&#xff0c;参照现实中事物&#xff0c;将事物的属性特征、行为特征抽象出来&#xff0c;描述成计算机事件的设计思想。 面向对象思想的三大基本特征: 封装、继承、多态 1.类和对象 类是对象的抽象&#xff…

FreeCAD中类型机制研究

了解FreeCAD类型机制实现原理&#xff0c;为后续FreeCAD相关工作提供参考。 1.实现原理 FreeCAD系统提供一个最上层的基类BaseClass&#xff0c;该类主要处理类型相关工作&#xff0c;几乎所有的FreeCAD的类直接或间接继承于该类。该类只有唯一个属性Type&#xff0c;Type里面…

如何提升外链网站的收录率?

要提高外链网站的收录率&#xff0c;要明确的一点是&#xff0c;被收录的外链才能发挥最大的作用&#xff0c;因此&#xff0c;提升收录率是首要任务。一个有效的方法是使用GPC爬虫池&#xff0c;这样可以大幅度提高谷歌蜘蛛对众多外链网站页面的抓取频率 通过GPC爬虫池的引导…

OpenSSL命令手册

正文共&#xff1a;999 字 10 图&#xff0c;预估阅读时间&#xff1a;1 分钟 我们前面编译安装了OpenSSL命令工具&#xff08;CentOS编译安装OpenSSL 3.3.1&#xff09;&#xff0c;这是一个强大的安全套接字层密码库&#xff0c;可以用于实现各种加密和认证协议&#xff0c;如…

福州大学 2022~2023 学年第 1 学期考试 A 卷压轴题参考答案

题目&#xff1a; 定义一个抽象类Structure&#xff08;含有纯虚函数type函数&#xff0c;用以显示当前结构的类型&#xff1b; 含有show函数&#xff09;&#xff0c; 在此基础上派生出Building类, 用来存储一座楼房的层数、房间数以及它的总平方米数。 建立派生 类House&am…

QML 实现上浮后消失的提示框

基本效果&#xff1a;上浮逐渐显示&#xff0c;短暂停留后上浮逐渐消失 为了能同时显示多个提示框&#xff0c;一是需要动态创建每个弹框 Item&#xff0c;二是弹出位置问题&#xff0c;如果是底部为基准位置就把已经弹出的往上移动。 效果展示&#xff1a; 主要实现代码&…

路由模式--哈希模式下使用a标签跳转会有问题

路由模式分为 history 和 hash 两种模式&#xff0c;在 hash 模式下&#xff0c;使用 a 标签去跳转路由&#xff0c;可能会有问题。 比如&#xff1a; <a href"/home"><img src"/logo.png" class"logo" /></a> 在跳转路由时…

机器学习数学原理专题——线性分类模型:损失函数推导新视角——交叉熵

目录 二、从回归到线性分类模型&#xff1a;分类 3.分类模型损失函数推导——极大似然估计法 &#xff08;1&#xff09;二分类损失函数——极大似然估计 &#xff08;2&#xff09;多分类损失函数——极大似然估计 4.模型损失函数推导新视角——交叉熵 &#xff08;1&#x…

Java | Leetcode Java题解之第174题地下城游戏

题目&#xff1a; 题解&#xff1a; class Solution {public int calculateMinimumHP(int[][] dungeon) {int n dungeon.length, m dungeon[0].length;int[][] dp new int[n 1][m 1];for (int i 0; i < n; i) {Arrays.fill(dp[i], Integer.MAX_VALUE);}dp[n][m - 1] …

C语言入门系列:初识函数

文章目录 一&#xff0c;C语言函数与数学函数的区别1&#xff0c;回忆杀-初中数学2&#xff0c;C语言中的函数 二&#xff0c; 函数的声明1&#xff0c;函数头1.1&#xff0c;函数名称1.2&#xff0c;返回值类型1.3&#xff0c;参数列表 2&#xff0c;函数体2.1&#xff0c;函数…

idea右侧找不到Maven,在View-> Tool Windows下也找不到

正常情况Idea右侧没有Maven&#xff0c;只需去View -> Tool Windows 目录中找到Maven并点击Maven&#xff0c;Idea右侧就会出现 问题&#xff1a; idea右侧找不到Maven&#xff0c;在View -> Tool Windows 目录中也找不到Maven&#xff0c;下图 全局搜索ctrl N&#xff…

数据结构历年考研真题对应知识点(栈和队列的应用)

目录 3.3栈和队列的应用 3.3.2栈在表达式求值中的应用 【中缀表达式转后缀表达式的过程(2012、2014)】 【栈的深度分析(2009、2012)】 【用栈实现表达式求值的分析(2018)】 3.3.3栈在递归中的应用 【栈在函数调用中的作用和工作原理(2015、2017)】 3.3.5队列在计算机系…

苹果智能和人工智能最大化

苹果智能和人工智能最大化 除了苹果公司&#xff0c;还没有人真正使用过苹果的智能功能。它要到秋天才会分阶段发布&#xff0c;即使到那时&#xff0c;它也无法在80%或90%的iPhone安装基础上运行&#xff0c;因为它需要只有iPhone 15 Pro才能使用的设备上处理功能。没有什么能…

如何从magento1迁移到magento2

m2相较m1 变化可以说非常大&#xff0c;相当于从头到位都改写一遍&#xff0c;更现代化&#xff0c;更优雅。除了数据库表变化不是很大。 主要迁移的内容有&#xff1a; 1&#xff0c;主题 2&#xff0c;插件(自己开发的或者第三方插件) 3&#xff0c;数据库 主题 不能迁移到m…

如何在Windows 11和10上清除更新缓存?这里提供了几种方法

​Windows 11和Windows 10都可以非常轻松地清除Windows更新缓存。可以使用图形方法或命令行选项删除保存的更新文件。我们将向你展示你的可用选项。 为什么要清除Windows更新缓存 你可能希望清除Windows更新缓存的原因有很多。 你可能在查找或安装更新时遇到问题,清除缓存通…