Publisher和Subscriber节点
一、Publisher节点
/*"ros/ros.h"里面包含了ROS系统内最常用的一些头文件,包含此文件,便可以使用ROS的核心功能。*/#include "ros/ros.h" /*"std_msgs/String"是由std_msgs包自动生成的头文件,定义了String信息类型,包含此文件,我们就可以使用String类型*/ #include "std_msgs/String.h" #include <sstream> /*** This tutorial demonstrates simple sending of messages over the ROS system. */ int main(int argc, char **argv) { /**
* ros::init()函数需要两个系统命令行参数argc和argv,
* 由此可以执行命令行传来的任何ROS参数和节点的重命名
* 第三个参数是节点的名字,
* 注意这里只能使用基本命名,
* 即名字里不能含有'/'
* 在使用ROS的其他部分之前,你必须调用ros::init()
**/ ros::init(argc, argv, "talker"); /**
* NodeHandle 是节点同ROS系统交流的主要接口
* NodeHandle 在构造的时候会完整地初始化本节点
* NodeHandle 析构的时候会关闭此节点
*/ ros::NodeHandle n; /**
* 我们通过advertise() 函数指定我们如何在给定的topic上发布信息
* 它会触发对ROS master的调用,master会记录话题发布者和订阅者
* 在advertise()函数执行之后,master会通知每一个订阅此话题的节点
* 两节点间由此可以建立直接的联系
* advertise()会返回一个Publisher对象,使用这个对象的publish方法我们就可以在此话题上发布信息
* 当返回的Publisher对象的所有引用都被销毁的时候,本节点将不再是该话题的发布者
* 此函数是一个带模板的函数,需要传入具体的类型进行实例化
* 传入的类型就是要发布的信息的类型,在这里是String
* 第一个参数是话题名称
* 第二个参数是信息队列的长度,相当于信息的一个缓冲区
* 在我们发布信息的速度大于处理信息的速度时
* 信息会被缓存在先进先出的信息队列里
); /**
* Rate loop_rate()构造了一个Rate类的对象
* 用来指定我们发布信息的频率,单位为hz,即每秒多少次
* 在我们调用Rate对象的sleep()方法之前,信息发布的频率不会发生变化
*); /**
* 一个记录我们发布的信息数量的计数器
* 它用来为每条信息产生不一样的字符串
* 如'1 message','2 message'这样
; /**
* roscpp默认会构造一个咱SIGINT的处理器来处理系统信号
* 当出现以下情况之一的时候ros:ok()会返回false:
* 1.接受到了一个SIGINT信号(Ctrl-C)
* 2.在程序中调用了ros::shutdown()
* 3.所有的ros::NodeHandle对象及引用都被销毁
**/ while (ros::ok()) { /**
* 这是一个message对象,我们向其中填入数据,然后可以发布它
*/ std_msgs::String msg; /**
* 我们发布的信息的格式为"hello world 1/2/3..."
*/ std::stringstream ss; ss << "hello world " << count; msg.data = ss.str(); /**
* ROS_INFO是对ROS系统对printf/cout的替代
*/ ROS_INFO("%s", msg.data.c_str()); /**
* publish()函数用来发布信息
* 信息类型必须为前一步实例化advertised()时使用的模板参数的类型
* 这里为String
*/ chatter_pub.publish(msg); /**
* 在这个简单的应用中,我们没有使用任何回调函数
* 所以ros::spinOnce()的调用不是必须的
* 但是一直在代码里调用ros::spinOnce()是个好习惯
* 它可以保证你指定的回调函数会被调用
*/ ros::spinOnce(); /**
* 调用Rate对象的sleep方法来使我们前面指定的信息发布频率10Hz生效
; }
二、Subscriber节点
#include "ros/ros.h" #include "std_msgs/String.h" /**
* 传给NodeHandle.subscribe()的回调函数
* 它的参数是一个share_ptr类型的只能指针,功能这里不细讲
*/ void chatterCallback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str()); } int main(int argc, char **argv) { ros::init(argc, argv, "listener"); ros::NodeHandle n; /**
* 参数1:话题名称
* 参数2:信息队列长度
* 参数3:回调函数,每当一个信息到来的时候,这个函数会被调用
* 返回一个ros::Subscriber类的对象,当此对象的所有引用都被销毁是,本节点将不再是该话题的订阅者
, chatterCallback); /**
* 调用ros::spin()函数,进入一个循环
* 不断地接受信息,然后执行回调函数,知道ros::ok()返回false
; }
https://blog.csdn.net/ab748998806/article/details/51192027
Publisher和Subscriber节点的更多相关文章
- ROS学习手记 - 8 编写ROS的Publisher and Subscriber
上一节我们完成了 message & srv 文件的创建和加入编译,这次我们要玩简单的Publisher 和 Subscriber 要玩 Publisher 和 Subscriber, 需要具 ...
- Writing a Simple Publisher and Subscriber
用c++实现一个publisher/subscriber publisher #include "ros/ros.h" #include "std_msgs/String ...
- C#的publisher与subscriber,事件发布者与订阅者
说明:示例借鉴自这里,但原版很不友好,于是修改了下,一目了然. 直接上代码: using System; using System.Collections.Generic; using System. ...
- ROS验证publisher和subscriber
在前面的两篇博客中我们用C++在ROS中创建了一个发布者和接收者,并使用catkin_make构建了新的节点,下面就需要验证一下,我们写的是否正确. 首先运行roscore roscore 在使用ca ...
- ROS-5 : 自定义消息
自定义消息一般存储在功能包的msg文件夹下的.msg文件中,这些定义可告诉ROS这些数据的类型和名称,以便于在ROS 节点中使用.添加完这些自定义消息后,ROS会将其转为等效的C++节点,从而可在其他 ...
- Publisher/Subscriber(发布/订阅者)消息模式开发流程
该模式的作用是发布者和订阅者 可以相互发送消息 发布者和订阅者都充当 生产者和消费者 发布者 package publisher.to.subscriber; import java.awt.font ...
- 节点和Topic通信
1.简介 对于实时性. 周期性的消息, 使用topic来传输是最佳的选择. topic是一种点对点的单向通信方式, 这里的“点”指的是node, 也就是说node之间可以通过topic方式来传递信息. ...
- emqtt 分布集群及节点桥接搭建
目录 分布集群 emq@s1.emqtt.io 节点设置 emq@s2.emqtt.io 节点设置 节点加入集群 节点退出集群 节点发现与自动集群 manual 手动创建集群 基于 static 节点 ...
- C# 泛型简介
摘要:本文讨论泛型处理的问题空间.它们的实现方式.该编程模型的好处,以及独特的创新(例如,约束.一般方法和委托以及一般继承).此外,本文还讨论 .NET Framework 如何利用泛型. 下载 Ge ...
随机推荐
- Java的类加载过程
一个Java文件从编码完成到最终执行,一般主要包括两个过程:编译与运行.编译即将Java文件通过Javac命令生成.class文件的过程,运行就是将.class文件交给JVM进行执行. 类加载过程即是 ...
- CentOS 修改用户密码
CentOS 修改用户密码 1.普通用户 ①获取超级用户root权限 命令:su 或者 su- 或者 su -root ②输入命令: passwd 用户名 ③输入新密码 2.超级用户 ①打开syste ...
- js-ES6学习笔记-数组的扩展
1.Array.from方法用于将两类对象转为真正的数组:类似数组的对象(array-like object)和可遍历(iterable)的对象(包括ES6新增的数据结构Set和Map). 实际应用中 ...
- 【代码笔记】iOS-NSNotificationCenter
代码: -(void)viewWillDisappear:(BOOL)animated { [super viewWillDisappear:animated]; //移除通知 [[NSNotific ...
- JS 解决 IOS 中拍照图片预览旋转 90度 BUG
上篇博文[ Js利用Canvas实现图片压缩 ]中做了图片压缩上传,但是在IOS真机测试的时候,发现图片预览的时候自动逆时针旋转了90度.对于这个bug,我完全不知道问题出在哪里,接下来就是面向百度编 ...
- log4net 本地环境没问题 生产环境无法输出日志
log4net输出日志大概分两块 1.程序代码编写问题 2.配置文件问题 当程序本地可以正常输出日志.配置文件也都正常可用的情况下,发布到生产环境后,有的程序可以输出日志,有的程序不可以输出,程序无问 ...
- DevExpress.XtraCharts曲线上的点所对应的坐标值
private void chartControl_ObjectSelected(object sender, HotTrackEventArgs e) { e.Cancel = false; XYD ...
- SQLServer 学习笔记之超详细基础SQL语句 Part 7
Sqlserver 学习笔记 by:授客 QQ:1033553122 -----------------------接Part 6------------------- 29 存储过程和触发器 存储过 ...
- ubantu 16.4 Hadoop 完全分布式搭建
一个虚拟机 1.以 NAT网卡模式 装载虚拟机 2.最好将几个用到的虚拟机修改主机名,静态IP /etc/network/interface,这里 是 s101 s102 s103 三 ...
- Expo大作战(十九)--expo打包后,发布分用程序到商店的注意事项
简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...