ROS添加发布者和订阅者机制实现

一. ROS的节点和包

Node: ROS的基本单位,实现某个功能的节点。比如实现超声波传感器就是一个节点,雷达传感器就可以是一个节点
Package 多个有联系的节点组成的单位,比如你要控制无人机姿态,可能需要多个节点(也就是多个传感器互相配合),如陀螺仪传感器,雷达,超声波传感器等等。我们就可以把这些联系的节点打包就是package。


这里我使用哔哩哔哩机器人工匠阿杰博主的视频例子作为说明。


在这里插入图片描述

节点通过订阅发布这种模式互相传递消息。可以的对应关系如下:


在这里插入图片描述

二,添加发布节点

  

既然我们要发布消息,就需要查看ROS支持的标准消息包类型。输入进入ROS的官网:ROS官网

  
输入std_msgs,点击搜索
  
在这里插入图片描述
  

✨  找到我们ROS对应的版本,Ubuntu18.04的是melodic.没装对可以参考我之前的博客。手把手教Ubuntu18.04安装melodic环境,一个是虚拟机,一个是服务器版本(带有1080显卡)

参考一

参考二
  
在这里插入图片描述

   点击Website

在这里插入图片描述
  

就可以查看到消息的信息支持列表

在这里插入图片描述

在上一篇文章当中我们使用catkin工具新建了节点工具包,具体参考如下。

✨ROS添加节点


  • 使用如下命令:
  • catkin_create_pkg ssr_pkg rospy roscpp std_msgs

2.1输入我们节点代码

我们就可以使用图片指令进行运行


  • rosrun ssr_pkg chao_node

#include<ros/ros.h>
#include<std_msgs/String.h>int main(int argc, char  *argv[])
{ros::init(argc,  argv,  "chao_node");printf("小马同学,hello welcome coming Ros world!  \n ");// 建立节点句柄ros::NodeHandle nh;//建立发布者ros::Publisher pub=nh.advertise<std_msgs::String>("play_game_topic",10);//控制循环次数,ros系统给我自带了控制语句,不用我们自己写睡眠函数ros::Rate loop_rate(10); // publish 10 times of per secondwhile(ros::ok()){printf("xiaoma will carry  !\n");//开始定义标准消息包、std_msgs::String msg;msg.data="please  come on!\n";//给发布者发布pub.publish(msg);loop_rate.sleep();//调用loop_rate的sleep函数,让其产生短暂的阻塞}return 0;
}

备注:ROS里面while循环要使用ROS::OK(),否则无法效应外界,按CTRL+C都没用。

在这里插入图片描述

然后,发现我们的主题名称不合法。修改我们的主题名称,26个大小字符和下划线。即可成功运行

在这里插入图片描述

使用rostopic list工具可以查看我们的话题活跃类型


在这里插入图片描述

rostopic echo /我们自己的主题(topic名称)可以查看消息内容


在这里插入图片描述

2.2小结

在这里插入图片描述
在这里插入图片描述

同理我们可以使用相同方法构建另外一个节点主题,新建yao_node.cpp

#include<ros/ros.h>
#include<std_msgs/String.h>int main(int argc, char  *argv[])
{ros::init(argc,  argv,  "yao_node");printf("小李同学,hello welcome coming Ros world!  \n ");// 建立节点句柄ros::NodeHandle nh;//建立发布者ros::Publisher pub=nh.advertise<std_msgs::String>("xiang_he_xiao_ma_wan_you_xi",10);//控制循环次数,ros系统给我自带了控制语句,不用我们自己写睡眠函数ros::Rate loop_rate(10); // publish 10 times of per secondwhile(ros::ok()){printf("xiaoli will follow  !\n");//开始定义标准消息包、std_msgs::String msg;msg.data="i am about   coming on!,waiting for me\n";//给发布者发布pub.publish(msg);loop_rate.sleep();//调用loop_rate的sleep函数,让其产生短暂的阻塞}return 0;
}

新建订阅节点,因为订阅和发布时分开的,我们需要再使用catkin根据新建一个包
在新建的包的src文件夹里面新建ma_node.cpp文件。**

#include<ros/ros.h>
#include<std_msgs/String.h>void xiaoli_callback(std_msgs::String msg)
{ROS_INFO(msg.data.c_str());
}void play_game_callback(std_msgs::String msg)
{ROS_WARN(msg.data.c_str());//这个输出语句只是把输出内容变成还黄色
}int main(int argc, char  *argv[])
{ros::init(argc,  argv,  "ma_node");printf("马同学,我将接受发布者的消息! \n ");// 建立节点句柄ros::NodeHandle nh;//建立订阅者1ros::Subscriber sub=nh.subscribe<std_msgs::String>("xiang_he_xiao_ma_wan_you_xi",10,xiaoli_callback);//建立订阅者2不能和第一个名字一样ros::Subscriber sub2=nh.subscribe<std_msgs::String>("play_game_topic",10,play_game_callback);while(ros::ok()){ros::spinOnce();}return 0;
}

同样,别忘了在CMakeLists.txt文件里面末尾添加如下两句。


add_executable(ma_node src/ma_node.cpp) #添加执行文件,我们这里ma_node.cpp
target_link_libraries(ma_node
${catkin_LIBRARIES}
) #详细说明连接库


在这里插入图片描述
我们都把节点运行起来,使用rosrun指令(参考之前运行的chao_node节点)

三 常用工具使用


  • rqt_graph # 查看节点之间的信息传递关系

在这里插入图片描述
在这里插入图片描述

3.1 XML文件一下子启动全部节点

定义:XML(可扩展标记语言)是一种用于存储和传输数据的文本格式。它是一种可扩展的、标签化的数据描述语言,旨在提供一种通用的数据格式,以便不同应用程序和平台之间可以轻松地交换信息。
XML文件由一系列标签和文本内容组成,其中标签用于标识数据的结构和含义。每个标签通常包含一个元素(element),可以有属性(attributes)和子元素(子标签)。XML文本使用标签来描述数据的层次结构,使得数据可以按照树状结构进行组织。
如描述纸盒中有小纸盒

在这里插入图片描述

描述阵容

在这里插入图片描述类比我们可以描述我们的节点

在这里插入图片描述

直接运行全部代码


在这里插入图片描述
在这里插入图片描述

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

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

相关文章

Crowd-Robot Interaction 论文阅读

论文信息 题目&#xff1a;Crowd-Robot Interaction:Crowd-aware Robot Navigation with Attention-based Deep Reinforcement Learning 作者&#xff1a;Changan Chen, Y uejiang Liu 代码地址&#xff1a;https://github.com/vita-epfl/CrowdNav 来源&#xff1a;arXiv 时间…

ES新特性部分

文章目录 Symbol创建使用拓展对象的方法直接添加 控制对象控制类型检查控制是否展开 遍历迭代器自定义遍历 生成器函数&#xff08;实现异步编程&#xff09;解决回调地狱 Promise连续读文件 SetMap类静态属性继承ES5ES6 GET与SET 数值Object方法模块化导入另一种导入 babel ES…

2023华数杯数学建模竞赛选题建议

提示&#xff1a;DS C君认为的难度&#xff1a;C<B<A&#xff0c;开放度&#xff1a;B<A<C 。 A题&#xff1a;隔热材料的结构优化控制研究 A题是数模类赛事很常见的物理类赛题&#xff0c;需要学习不少相关知识。 其中第一问需要建立平纹织物整体热导率与单根纤…

力扣 -- 467. 环绕字符串中唯一的子字符串

一、题目 二、解题步骤 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 三、参考代码 class Solution { public:int findSubstringInWraproundString(string s) {int ns.size();vector<int> dp(n,1);int re…

Android 刷新与显示

目录 屏幕显示原理&#xff1a; 显示刷新的过程 VSYNC机制具体实现 小结&#xff1a; 屏幕显示原理&#xff1a; 过程描述&#xff1a; 应用向系统服务申请buffer 系统服务返回一个buffer给应用 应用开始绘制&#xff0c;绘制完成就提交buffer&#xff0c;系统服务把buffer数据…

移动开发最佳实践:为 Android 和 iOS 构建成功应用的策略

您可以将本文作为指南&#xff0c;确保您的应用程序符合可行的最重要标准。请注意&#xff0c;这份清单远非详尽无遗&#xff1b;您可以加以利用&#xff0c;并添加一些自己的见解。 了解您的目标受众 要制作一个成功的应用程序&#xff0c;你需要了解你是为谁制作的。从创建…

接口自动化测试Mock Get和Post请求

Mock可以模拟一个http接口的后台响应&#xff0c;可以模拟request&#xff0c;response 下载 moco-runner-0.11.0-standalone.jar 下载链接: https://pan.baidu.com/s/1bmFzvJPRnDlQ-cmuJ_3iRg 提取码: kpjv 确保安装了jdk,cmd下可以运行java -version 一、模拟不带参的get请求…

AQL品质抽样标准

AQL抽样标准 - 百度文库 Acceptance Quality Limit 接收质量限的缩写&#xff0c;即当一个连续系列批被提交验收时&#xff0c;可允许的最差过程平均质量水平。 AQL普遍应用于各行业产品的质量检验&#xff0c;不同的AQL标准应用于不同物质的检验上。在AQL 抽样时&#xff0c;…

VUE框架:vue2转vue3全面细节总结(3)路由组件传参

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人_python人工智能视觉&#xff08;opencv&#xff09;从入门到实战,前端,微信小程序-CSDN博客 最新的uniapp毕业设计专栏也放在下方了&#xff1a; https://blog.csdn.net/lbcy…

idea添加翻译插件并配置有道翻译

1、安装Translation插件 2、 创建有道云应用 有道智云控制台 3、设置idea 4、效果&#xff08;选中文本右键翻译&#xff0c;默认快捷键CtrlShiftY&#xff09;

图文演示:如何三分钟极速搭建一个元宇宙3D虚拟展厅

引言&#xff1a; 元宇宙3D虚拟展厅时代已经来临。元宇宙是一个虚拟的、立体的数字空间&#xff0c;可以让用户沉浸在其中进行交互操作&#xff0c;并体验无限可能。如何快速搭建一个属于自己的虚拟展厅则受到越来越多人的关注。 一&#xff0e;虚拟展厅类型 1.党建展馆 实现…

Linux 匿名页的生命周期

目录 匿名页的生成 匿名页生成时的状态 do_anonymous_page缺页中断源码 从匿名页加入Inactive lru引出 一个非常重要内核patch 匿名页何时回收 本文以Linux5.9源码讲述 匿名页的生成 用户空间malloc/mmap(非映射文件时&#xff09;来分配内存&#xff0c;在内核空间发生…

前端笔记html-layer使用

layer.open方法 layer.open({type:2, //可传入的值有&#xff1a;0&#xff08;信息框&#xff0c;默认&#xff09;1&#xff08;页面层&#xff09;2&#xff08;iframe层&#xff09;3&#xff08;加载层&#xff09;4&#xff08;tips层&#xff09;title: title,content:[…

网络安全之原型链污染

目录&#xff1a; 目录&#xff1a; 一、概念 二、举例 三、 实操了解 总结 四、抛出原题&#xff0c;历年原题复现 第一题&#xff1a; 五、分析与原理 第二题&#xff1a; 八、分析与原理 九、具体操作&#xff0c;payload与结果 结果&#xff1a; 一、概念 Java…

《面试1v1》ElasticSearch基础

&#x1f345; 作者简介&#xff1a;王哥&#xff0c;CSDN2022博客总榜Top100&#x1f3c6;、博客专家&#x1f4aa; &#x1f345; 技术交流&#xff1a;定期更新Java硬核干货&#xff0c;不定期送书活动 &#x1f345; 王哥多年工作总结&#xff1a;Java学习路线总结&#xf…

阿里云快速部署开发环境 (Apache + Mysql8.0)

本文章的内容截取于云服务器管理控制台提供的安装步骤&#xff0c;再整合前人思路而成&#xff0c;文章末端会提供原文连接 ApacheMysql 8.0部署MySQL数据库&#xff08;Linux&#xff09;步骤一&#xff1a;安装MySQL步骤二&#xff1a;配置MySQL步骤三&#xff1a;远程访问My…

Redis压缩列表

区分一下 3.2之前 Redis中的List有两种编码格式 一个是LINKEDLIST 一个是ZIPLIST 这个ZIPLIST就是压缩列表 3.2之后来了一个QUICKLIST QUICKLIST是ZIPLIST和LINKEDLIST的结合体 也就是说Redis中没有ZIPLIST和LINKEDLIST了 然后在Redis5.0引入了LISTPACK用来替换QUiCKLIST中的…

vue整合脑图编辑管理系统-kitymind百度脑图

前言 项目为前端vue项目&#xff0c;把kitymind百度脑图整合到前端vue项目中&#xff0c;显示了脑图的绘制&#xff0c;编辑&#xff0c;到处为json&#xff0c;png&#xff0c;text等格式的功能 文章末尾有相关的代码链接&#xff0c;代码只包含前端项目&#xff0c;在原始的…

线性代数 | 机器学习数学基础

前言 线性代数&#xff08;linear algebra&#xff09;是关于向量空间和线性映射的一个数学分支。它包括对线、面和子空间的研究&#xff0c;同时也涉及到所有的向量空间的一般性质。 本文主要介绍机器学习中所用到的线性代数核心基础概念&#xff0c;供读者学习阶段查漏补缺…

Visual Studio 2022的MFC框架——应用程序向导

我是荔园微风&#xff0c;作为一名在IT界整整25年的老兵&#xff0c;今天我们来重新审视一下Visual Studio 2022开发工具下的MFC框架知识。 MFC(Microsoft Foundation Class&#xff0c;微软基础类库&#xff09;是微软为了简化程序员的开发工作所开发的一套C类的集合&#xf…