Publisher and Subscriber代碼最強解析

發布者:

#include "ros/ros.h"

#include "std_msgs/String.h"

#include <sstream>

/* *本教程演示了通过 ROS 系统发送消息的简单方法。 */

int main(intargc,char**argv)

{/**ros::init() 函数需要看到 argc 和 argv 才能执行

* 在命令行中提供的任何 ROS 参数和名称重新映射。

 * 对于程序化重新映射,您可以使用不同版本的 init(),它需要

* 直接重新映射,但对于大多数命令行程序,传递 argc 和 argv 是

* 最简单的方法。init() 的第三个参数是节点的名称。在使用任何其他 之前,您必须调用 ros::init() 的版本之一

 * ROS系统的一部分。*/

ros::init(argc,argv,"talker");

/**

创建此进程节点的句柄。创建的第一个NodeHandle实际上会执行节点的初始化,

而最后一个被破坏的 NodeHandle 将清除节点正在使用的所有资源。

*/

ros::NodeHandlen;

/**advertise()函数是你告诉 ROS 你想要

 * 在给定的主题名称上发布。这会调用 ROS

 * 主节点,保存谁在发布和谁正在订阅。在进行此advertise()调用后,主控节点将通知任何试图订阅此主题名称的人,

* 他们将依次与这节点。Advertisement() 返回一个 Publisher 对象,它允许您通过调用 publish() 发布关于该主题的消息。

一次返回的Publisher对象的所有副本都被销毁,主题将自动不做advertise。

 * Advertisement()的第二个参数是消息队列的大小 用于发布消息。如果消息发布得更快,

这里的数字指定多少条消息到在扔掉一些之前缓冲。*/

ros::Publisherchatter_pub=n.advertise("chatter",1000);

ros::Rateloop_rate(10);

/**

我们发送了多少消息的计数。这用于创建每条消息的唯一字符串。

*/

int count=0;


while(ros::ok())

{

/**

这是一个消息对象。你用数据填充它,然后发布它。

*/

std_msgs::String msg;

td::stringstream  ss;

ss<<"hello world "< <count;

msg.data=ss.str();

ROS_INFO("%s",msg.data.c_str());


/** 

* publish() 函数是您发送消息的方式。参数

是消息对象。此对象的类型必须与类型

一致 作为模板参数提供给advertise<>() 调用,正如所做的那样 在上面的构造函数中。

 */

chatter_pub.publish(msg);

ros::spinOnce();//執行一次回調結束後,繼續執行

loop_rate.sleep();//頻率

++count;

}

return 0;

}



訂閱者:

#include "ros/ros.h"

#include "std_msgs/String.h"

/** 

 本教程演示了通过 ROS 系统简单地接收消息。

*/

void chatterCallback(conststd_msgs::String::ConstPtr&msg)

{

ROS_INFO("I heard: [%s]",msg->data.c_str());

}

int  main(intargc,char**argv)

{

/** 

 ros::init() 函数需要看到 argc 和 argv 才能执行

在命令行中提供的任何 ROS 参数和名称重新映射。

对于程序化重新映射,您可以使用不同版本的 init(),它需要直接重新映射,

但对于大多数命令行程序,传递 argc 和 argv 是最简单的方法。init() 的第三个参数是节点的名称

在使用任何其他版本之前,您必须调用 ros::init() 版本之一

 ROS系统的一部分。

*/

ros::init(argc,argv,"listener");


/** 

NodeHandle 是与 ROS 系统通信的主要接入点。

 * 构造的第一个 NodeHandle 将完全初始化这个节点,最后

* NodeHandle destructed 将关闭节点。

 */

ros::NodeHandlen;

/** 

 * subscribe() 调用是你告诉 ROS 你想接收消息的方式

* 在给定的主题上。这会调用 ROS 主节点,保存谁在发布和谁 的注册表

正在订阅。消息被传递给回调函数,这里是称为chatterCallback。subscribe() 返回一个订阅者对象,你必须坚持到您想退订为止。

当订阅者的所有副本对象超出范围,此回调将自动从退订 这个话题。subscribe() 函数的第二个参数是消息的大小 队列。

如果消息到达的速度快于它们的处理速度,则这 是在开始抛出之前将被缓冲的消息数远离最古老的。

*/

ros::Subscribersub=n.subscribe("chatter",1000,chatterCallback);


/** 

* ros::spin() 将进入一个循环,抽取回调。有了这个版本,所有

 回调将从该线程(主线程)中调用。ros::spin()  将在按下 Ctrl-C 或节点被主节点关闭时退出。

*/

ros::spin();

return0;

}

您在之前的教程中使用了catkin_create_pkg ,该教程为您创建了package.xmlCMakeLists.txt文件。

生成的CMakeLists.txt应如下所示(从创建 Msgs 和 Srvs教程中进行了修改,并删除了未使用的注释和示例):

cmake_minimum_required(VERSION 2.8.3)

project(beginner_tutorials)

## Find catkin and any catkin packages

find_package(catkin REQUIRED COMPONENTS roscpp rospy std_msgs genmsg)

##声明 ROS 消息和服务

add_message_files(DIRECTORY msg FILES Num.msg)

add_service_files(DIRECTORY srv FILES AddTwoInts.srv)

## 生成添加的消息和服务

generate_messages(DEPENDENCIES std_msgs)

##声明一个catkin包

catkin_package()


## 构建说话者和倾听者

include_directories(include ${catkin_INCLUDE_DIRS})

add_executable(talker src/talker.cpp)

target_link_libraries(talker ${catkin_LIBRARIES})


##这将创建两个可执行文件,talker和listener,默认情况下它们会进入你的开发空间的包目录,

##默认位于~/catkin_ws/devel/lib/<package name>。

add_dependencies(talker beginner_tutorials_generate_messages_cpp)

add_executable(listener src/listener.cpp)


/**这可以确保在使用之前生成此包的消息头。如果您在 catkin 工作空间中使用来自其他包的消息,

您还需要将依赖项添加到它们各自的生成目标中,因为 catkin 并行构建所有项目。从 *Groovy* 开始,

您可以使用以下变量来依赖所有必要的目标:*/

target_link_libraries(listener ${catkin_LIBRARIES})

/**您可以直接调用可执行文件,也可以使用 rosrun 来调用它们。它们没有放在 '<prefix>/bin' 中,

因为在将软件包安装到系统时会污染 PATH。如果您希望您的可执行文件在安装时位于 PATH 上,

您可以设置安装目标,请参阅:catkin/CMakeLists.txt*/

add_dependencies(listener beginner_tutorials_generate_messages_cpp)

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容