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.hqwc.cn/news/55124.html

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

相关文章

在java中操作redis_Data

1.引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency> 2.配置Redis数据源 redis:host: ${sky.redis.host}port: ${sky.redis.port}password: ${sk…

GPIO实验

一、GPIO GPIO&#xff08;General-purpose input/output&#xff09;即通用型输入输出&#xff0c;GPIO可以控制连接在其之上的引脚实现信号的输入和输出 芯片的引脚与外部设备相连&#xff0c;从而实现与外部硬件设备的通讯、控制及信号采集等功能 LED实验步骤 最终目的&am…

无涯教程-Perl - do...while 语句函数

与 for 和 while 循环不同&#xff0c;它在循环的顶部测试循环条件&#xff0c;而 do ... while 循环在以下位置检查其条件:循环的底部。 do ... while 循环与while循环相似&#xff0c;除了保证do ... while循环至少执行一次。 do...while - 语法 do {statement(s); }while(…

Devops系统中jira平台迁移

需求:把aws中的devops系统迁移到华为云中,其中主要是jira系统中的数据迁移,主要方法为在华为云中建立一套 与aws相同的devops平台,再把数据库和文件系统中的数据迁移,最后进行测试。 主要涉及到的服务集群CCE、数据库mysql、弹性文件服务SFS、数据复制DRS、弹性负载均衡ELB。 迁…

pytorch学习——如何构建一个神经网络——以手写数字识别为例

目录 一.概念介绍 1.1神经网络核心组件 1.2神经网络结构示意图 1.3使用pytorch构建神经网络的主要工具 二、实现手写数字识别 2.1环境 2.2主要步骤 2.3神经网络结构 2.4准备数据 2.4.1导入模块 2.4.2定义一些超参数 2.4.3下载数据并对数据进行预处理 2.4.4可视化数…

华为QinQ技术的基本qinq和灵活qinq 2种配置案例

基本qinq配置&#xff1a; 运营商pe设备在收到同一个公司的ce发来的的包&#xff0c;统一打上同样的vlan &#xff0c;如上图&#xff0c;同一个家公司两边统一打上vlan 2&#xff0c;等于在原内网vlan 10或20过来的包再统一打上vlan 2的标签&#xff0c;这样传输就不会和其它…

mysql进阶-修改linux服务器中MySQL的字符集

1.背景 linux中mysql8默认的字符集是latin1&#xff0c;在插入中文时会报错&#xff0c;所以一般在配置好mysql时需要修改字符集为utf8【又叫utfmb3,一般开发够用&#xff0c;一个字符用3个字节表示】或者utfmb4【一个字符用4个字节表示&#xff0c;如果存储emoji表情&#xf…

创建者模式-单例模式

文章目录 一、创建者模式1. 单例设计模式1.1 单例模式的结构1.2 单例模式的实现&#xff08;1&#xff09;饿汉式-方式1&#xff08;静态变量方式&#xff09;&#xff08;2&#xff09;饿汉式-方式2&#xff08;静态代码块方式&#xff09;&#xff08;3&#xff09;懒汉式-方…

CS 144 Lab Four 收尾 -- 网络交互全流程解析

CS 144 Lab Four 收尾 -- 网络交互全流程解析 引言Tun/Tap简介tcp_ipv4.cc文件配置信息初始化cs144实现的fd家族体系基于自定义fd体系进行数据读写的adapter适配器体系自定义socket体系自定义事件循环EventLoop模板类TCPSpongeSocket详解listen_and_accept方法_tcp_main方法_in…

SSL原理详解

SSL协议结构&#xff1a; SSL协议分为两层&#xff0c;下层为SSL记录协议&#xff0c;上层为SSL握手协议、SSL密码变化协议和SSL警告协议。 1.下层为SSL记录协议&#xff0c;主要作用是为高层协议提供基本的安全服务 建立在可靠的传输之上&#xff0c;负责对上层的数据进行分块…

【数组数组】应用

一.题目 样例输入&#xff1a; 5 7 1 5 1 5 5 3 3 1 1 样例输出&#xff1a; 1 2 1 1 0 二.分析 有两个数据&#xff1a;x&#xff0c;y。 我们不妨先将x排序&#xff0c;再判断y&#xff0c;若小于&#xff0c;就即可。 这是暴力的思路 for(int i1;i<n;i){int ans0;for(…

前端页面--视觉差效果

代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><link rel"stylesheet" href"https://un…