一、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节点的更多相关文章

  1. ROS学习手记 - 8 编写ROS的Publisher and Subscriber

    上一节我们完成了 message & srv 文件的创建和加入编译,这次我们要玩简单的Publisher 和 Subscriber 要玩 Publisher 和 Subscriber, 需要具 ...

  2. Writing a Simple Publisher and Subscriber

    用c++实现一个publisher/subscriber publisher #include "ros/ros.h" #include "std_msgs/String ...

  3. C#的publisher与subscriber,事件发布者与订阅者

    说明:示例借鉴自这里,但原版很不友好,于是修改了下,一目了然. 直接上代码: using System; using System.Collections.Generic; using System. ...

  4. ROS验证publisher和subscriber

    在前面的两篇博客中我们用C++在ROS中创建了一个发布者和接收者,并使用catkin_make构建了新的节点,下面就需要验证一下,我们写的是否正确. 首先运行roscore roscore 在使用ca ...

  5. ROS-5 : 自定义消息

    自定义消息一般存储在功能包的msg文件夹下的.msg文件中,这些定义可告诉ROS这些数据的类型和名称,以便于在ROS 节点中使用.添加完这些自定义消息后,ROS会将其转为等效的C++节点,从而可在其他 ...

  6. Publisher/Subscriber(发布/订阅者)消息模式开发流程

    该模式的作用是发布者和订阅者 可以相互发送消息 发布者和订阅者都充当 生产者和消费者 发布者 package publisher.to.subscriber; import java.awt.font ...

  7. 节点和Topic通信

    1.简介 对于实时性. 周期性的消息, 使用topic来传输是最佳的选择. topic是一种点对点的单向通信方式, 这里的“点”指的是node, 也就是说node之间可以通过topic方式来传递信息. ...

  8. emqtt 分布集群及节点桥接搭建

    目录 分布集群 emq@s1.emqtt.io 节点设置 emq@s2.emqtt.io 节点设置 节点加入集群 节点退出集群 节点发现与自动集群 manual 手动创建集群 基于 static 节点 ...

  9. C# 泛型简介

    摘要:本文讨论泛型处理的问题空间.它们的实现方式.该编程模型的好处,以及独特的创新(例如,约束.一般方法和委托以及一般继承).此外,本文还讨论 .NET Framework 如何利用泛型. 下载 Ge ...

随机推荐

  1. Java - 异常解析基础

    java提高篇(十六)-----异常(一) 一.为什么要使用异常 首先我们可以明确一点就是异常的处理机制可以确保我们程序的健壮性,提高系统可用率.虽然我们不是特别喜欢看到它,但是我们不能不承认它的地位 ...

  2. ETCD 简介 + 使用

    etcd简介 etcd是一个高可用的分布式键值(key-value)数据库.etcd内部采用raft协议作为一致性算法,etcd基于Go语言实现. etcd是一个服务发现系统,具备以下的特点: 简单: ...

  3. 1-初识java

    目录 java 历史 Java 平台 Java 开发环境 Java 运行原理[简] Java 历史 这里不详细记录java的历史,只是标记出时间点和事件. 时间点 事件 1991 Sun公司成立Gre ...

  4. POJ2406(SummerTrainingDay10-I KMP)

    Power Strings Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 50036   Accepted: 20858 D ...

  5. python-命令模式

    源码地址:https://github.com/weilanhanf/PythonDesignPatterns 说明: 命令在发送方被激活,而在接收方被响应.一个对象既可以作为命令的发送方,也可以作为 ...

  6. Flutter 数据模型创建

    build_runner的使用 1.在根目录运行 2.一次性创建.g.dart文件 使用build 此时目录内不能有.g.dart文件 3.watch是监听 有model类的文件创建 自动创建.g.d ...

  7. 声明元素<%! %>、Scriptlet元素<% %>、表达式元素<%= %>、注释元素、输出特殊符号<%和%>

    声明元素 <%! 类成员声明或方法声明 %> 在声明元素中编写的代码,将转译为Servlet中的类成员或方法. 重新定义jspInit()方法,或是在jspDestroy(),就是在声明元 ...

  8. rdlc里面的textbox怎么赋值

    通过传递参数来实现 当前在rdlc页面,ctrl+alt+d,打开report data侧边栏 点击report data的Parameters文件夹,右键,添加新的参数,命名.定义类型,譬如命名为R ...

  9. webpack+sass+vue 入门教程(三)

    十一.安装sass文件转换为css需要的相关依赖包 npm install --save-dev sass-loader style-loader css-loader loader的作用是辅助web ...

  10. YYYY-mm-dd HH:MM:SS大小写解释

    d               月中的某一天.一位数的日期没有前导零.    dd             月中的某一天.一位数的日期有一个前导零.    ddd           周中某天的缩写名 ...