ROS学习----Publisher与Subscriber
1.Publisher(发布者)与subscriber(订阅者)关系。
Publisher的主要作用是对于指定话题发布特定数据类型的消息。
下面是利用代码实现一个节点,节点创建一个Publisher并发布字符串“Hello world”,其详细内容如下:
#include <sstream>
#include "ros/ros.h" **1**
#include "std_msgs/String.h" **1**int main (int argc,char **argv)
{//ROS节点初始化ros::init(argc,argv,"talker"); **2**//创建节点句柄ros::NodeHandle n; **3**//创建一个Publisher,发布名为chatter的topic,消息类型为std_msgs::Stringros::Publisher chatter_pub=n.advertise<std_msgs::String>("chatter",1000); **4**//设置循环的频率ros::Rate loop_rate(10); **5**int count=0;while(ros::ok()) **6**{//初始化std_msgs::String类型的消息std_msgs::String msg; **7**std::Stringstream ss; **7**ss<<"hello world"<<count; **7**msg.data=ss.str(); **7**//发布消息ROS_INFO("%s",msg.data.c_str()); **8**chatter_pub.publish(msg); **9**//循环等待回调函数ros::spinOnce(); **10**//按照循环频率延时loop_rate.sleep(); **11**++count;}return 0;
}
代码说明:
“1”:“ros/ros.h”包含了大部分ROS中通用的头文件
“2”:初始化ROS节点,init函数包含三个参数,前两个参数是命令行或launch文件输入的参数;第三个参数定义了Publisher节点的名称,而且该名称在运行的ROS中必须是独一无二的,不允许同时存在相同名称的两个节点。
“3”:创建一个节点句柄,方便对节点资源的使用和管理。
“4”:在ROS master注册一个Publisher,并告诉系统Publisher节点将会发布以chatter为话题的String类型消息。第二个参数表示消息队列的大小,当消息数量超过队列大小时,ROS会自动删除队列中最早入对的消息。
“5”:设置循环的频率,单位是Hz。
“6”:进入节点的主循环,遇到异常的状况便会返回false,跳出循环。异常情况包括:
- 收到SIGINT信号(Ctrl+c)
- 被另外一个相同名称的节点踢掉线
- 节点调用了关闭函数ros::shutdown()
- 所有ros::NodeHandles句柄被销毁
“7”: 初始化即将发布的消息。
“8”:ROS_INFO类似与C/C++中的printf/cout函数,用来打印日志信息。
“9”:发布封装完毕的消息msg。消息发布后,Master会查找订阅该话题的节点,并且帮助两个节点建立连接,完成消息的传输。
“10”:用来处理节点订阅话题的所有回调函数
“11”:调用休眠函数使节点进入睡眠在台。但是10Hz的睡眠时间过后,节点又会开始下一阶段的循环工作
总结Publisher的流程,为:
- 初始化ROS节点
- 向ROS Master注册节点信息,包括发布的话题名和话题中的消息类型。
- 按照一定频率循环发布消息
创建Subscriber:
创建一个Subscriber以订阅Publisher节点发布的“Hello world”字符串,其源码为:
#include "ros/ros.h"
#include "std_msgs/String.h"//接收到订阅的消息后,会进入消息回调函数void chatterCallback(const std_msgs::String::ConstPtr& msg){//将接收到的消息打印出来ROS_INFO("I heard: [%s]",msg->data.c_str());}int main(int argc,char **argv)
{//初始化ROS节点ros::init(argc,argv,"listener");//创建节点句柄ros::NodeHandle n;//创建一个Subscriber,订阅名为chatter的话题,注册回调函数chatterCallbackros::Subscriber sub=n.subscribe("chatter",1000,chatterCallback);//循环等待回调函数ros::spin();return 0;
}
Subscriber的实现简要流程:
- 初始化ROS节点
- 订阅需要的话题
- 循环等待话题消息,接收到消息后进入回调函数
- 在回调函数中完成消息处理
ROS学习----Publisher与Subscriber相关推荐
- ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行
ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行 一.自定义消息: 1.新建msg文件夹,创建定义Person.msg 文件 mkdir -p ~/catk ...
- 【ROS入门学习05|自定义话题消息,并且编程实现publisher和subscriber】
这里是学习ROS第一次涉及到代码的部分.主要根据古月居视频教程整理出来的干货.本人是干货爱好者. 文章目录 前言 一.话题模型 二.自定义话题消息 1.定义msg文件 2.在功能包(learning_ ...
- 小白学习ROS(3)创建Publisher和Subscriber节点
创建Publisher和Subscriber节点进行通讯 1.前言 在创建Publisher和Subscriber节点之前,先给介绍一个创建ROS包以及程序编写非常方便的一个ide,真的特别方便,尤其 ...
- 【ROS学习笔记】(三)发布者Publisher的实现
一.目标功能 ROS Master内有两个节点,一个是Subscriber(turtlesim),一个是Publisher,发布者通过程序实现发布Message,Message的内容包括线速度.角度, ...
- ROS1学习笔记:话题中的Publisher与Subscriber(ubuntu20.04)
参考B站古月居ROS入门21讲: 发布者Publisher的编程实现 订阅者Subscriber的编程实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录 一.乌龟例程中 ...
- 【ROS学习笔记】(四)订阅者Subscriber的实现
一.目标功能 订阅者订阅海龟的位姿信息. 二.创建功能包 首先创建工作空间,参考[ROS学习笔记](二)工作空间与功能包的创建 然后创建一个功能包 cd ~/catkin_ws/src catkin_ ...
- ROS教程中Publisher和Subscriber (Python)的说明
Publisher和Subscriber[Python]的说明 1.编写发布节点 2.编写订阅节点 3.编译现在的节点 1.编写发布节点 $ roscd beginner_tutorials #切换到 ...
- ROS学习—opencv使用之图片传输
ROS学习-opencv使用之图片传输 前提操作:ros已安装,opencv已安装. 首先在工作空间中新建一个功能包rosopencv catkin_create_pkg rosopencv sens ...
- ROS学习笔记(八): ROS通信架构
ROS学习笔记(八): ROS通信架构 文章目录 01 Node & Master 1.1 Node 1.2 Master 1.3 启动master和node 1.4 rosrun和rosno ...
最新文章
- Good Bye 2014 B. New Year Permutation(floyd )
- 撩课-Java面试宝典-第十二篇
- 网上测试了很多关于PYTHON的WEBSOCKET样例,下面这个才成功了
- 关于微信小程序开发中遇到的缺少game.json问题的解决
- 阿里大规模应用Flink踩过的坑:如何大幅降低HDFS压力?
- java--JVM--栈帧--JVM及其优化---逃逸技术(堆栈分配方法)(转载)
- zynq linux opencv效率,2 - 基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结
- 宿主机进程挂载到容器内_迄今为止最严重的容器逃逸漏洞:Docker cp命令漏洞分析(CVE201914271)...
- C语言 回调函数 callback - C语言零基础入门教程
- 接口文档生成工具Swagger2的使用
- Microsoft Enterprise Library 5.0 系列(二) Cryptography Application Block (初级)
- MySQL innodb_page_size
- 麒麟 UKUI 3.0 发布预告视频,能否接替 Win 7 成为大家的新选择?
- 教你正确设置CrossOver的Wine配置(三)
- 马踏飞燕——奔跑在Docker上的Spark
- 武术擂台机器人所需传感器_华北工控:嵌入式计算机在AMR机器人中的应用
- cad快速看图能合并图纸吗_【CAD快速看图电脑版】合并图纸、2张图之间复制
- htcd816+android密码,详细的HTC Desire 816解锁教程
- 【catia对模型无法进行操作,只能对树型图操作】
- 杂七杂八之Ubuntu-16.04安装 vs code