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相关推荐

  1. ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行

    ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行 一.自定义消息: 1.新建msg文件夹,创建定义Person.msg 文件 mkdir -p ~/catk ...

  2. 【ROS入门学习05|自定义话题消息,并且编程实现publisher和subscriber】

    这里是学习ROS第一次涉及到代码的部分.主要根据古月居视频教程整理出来的干货.本人是干货爱好者. 文章目录 前言 一.话题模型 二.自定义话题消息 1.定义msg文件 2.在功能包(learning_ ...

  3. 小白学习ROS(3)创建Publisher和Subscriber节点

    创建Publisher和Subscriber节点进行通讯 1.前言 在创建Publisher和Subscriber节点之前,先给介绍一个创建ROS包以及程序编写非常方便的一个ide,真的特别方便,尤其 ...

  4. 【ROS学习笔记】(三)发布者Publisher的实现

    一.目标功能 ROS Master内有两个节点,一个是Subscriber(turtlesim),一个是Publisher,发布者通过程序实现发布Message,Message的内容包括线速度.角度, ...

  5. ROS1学习笔记:话题中的Publisher与Subscriber(ubuntu20.04)

    参考B站古月居ROS入门21讲: 发布者Publisher的编程实现 订阅者Subscriber的编程实现 基于VMware Ubuntu 20.04 Noetic版本的环境 文章目录 一.乌龟例程中 ...

  6. 【ROS学习笔记】(四)订阅者Subscriber的实现

    一.目标功能 订阅者订阅海龟的位姿信息. 二.创建功能包 首先创建工作空间,参考[ROS学习笔记](二)工作空间与功能包的创建 然后创建一个功能包 cd ~/catkin_ws/src catkin_ ...

  7. ROS教程中Publisher和Subscriber (Python)的说明

    Publisher和Subscriber[Python]的说明 1.编写发布节点 2.编写订阅节点 3.编译现在的节点 1.编写发布节点 $ roscd beginner_tutorials #切换到 ...

  8. ROS学习—opencv使用之图片传输

    ROS学习-opencv使用之图片传输 前提操作:ros已安装,opencv已安装. 首先在工作空间中新建一个功能包rosopencv catkin_create_pkg rosopencv sens ...

  9. ROS学习笔记(八): ROS通信架构

    ROS学习笔记(八): ROS通信架构 文章目录 01 Node & Master 1.1 Node 1.2 Master 1.3 启动master和node 1.4 rosrun和rosno ...

最新文章

  1. Good Bye 2014 B. New Year Permutation(floyd )
  2. 撩课-Java面试宝典-第十二篇
  3. 网上测试了很多关于PYTHON的WEBSOCKET样例,下面这个才成功了
  4. 关于微信小程序开发中遇到的缺少game.json问题的解决
  5. 阿里大规模应用Flink踩过的坑:如何大幅降低HDFS压力?
  6. java--JVM--栈帧--JVM及其优化---逃逸技术(堆栈分配方法)(转载)
  7. zynq linux opencv效率,2 - 基于ZYNQ7000的交叉编译工具链Qt+OpenCV+ffmpeg等库支持总结
  8. 宿主机进程挂载到容器内_迄今为止最严重的容器逃逸漏洞:Docker cp命令漏洞分析(CVE201914271)...
  9. C语言 回调函数 callback - C语言零基础入门教程
  10. 接口文档生成工具Swagger2的使用
  11. Microsoft Enterprise Library 5.0 系列(二) Cryptography Application Block (初级)
  12. MySQL innodb_page_size
  13. 麒麟 UKUI 3.0 发布预告视频,能否接替 Win 7 成为大家的新选择?
  14. 教你正确设置CrossOver的Wine配置(三)
  15. 马踏飞燕——奔跑在Docker上的Spark
  16. 武术擂台机器人所需传感器_华北工控:嵌入式计算机在AMR机器人中的应用
  17. cad快速看图能合并图纸吗_【CAD快速看图电脑版】合并图纸、2张图之间复制
  18. htcd816+android密码,详细的HTC Desire 816解锁教程
  19. 【catia对模型无法进行操作,只能对树型图操作】
  20. 杂七杂八之Ubuntu-16.04安装 vs code

热门文章

  1. 基于区块链的去中心化抗量子密钥管理系统
  2. 基于SPringBoot的玩具销售商城管理系统
  3. 炫“库”行动-人大金仓有奖征文-KingbaseES V8R6 手工创建主备流复制集群案例
  4. 京东物流-三维装箱(记录)
  5. 【三十五】Python全栈之路--MySQL
  6. 工业强国机械制造增长新方向 工业机器人产业发展迅速
  7. android改变系统语言,Android 9.0设置系统语言
  8. c++读取cfg文件
  9. 一度智信:2021电商运营教程
  10. 手机dump内存Odex格式反编译