Publisher and Subscriber代碼最強解析

發布者:

#include "ros/ros.h"

#include "std_msgs/String.h"

#include

/* *本教程演示了通过 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 "< 

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.xml和CMakeLists.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/

add_dependencies(talker beginner_tutorials_generate_messages_cpp)

add_executable(listener src/listener.cpp)


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

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

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

target_link_libraries(listener ${catkin_LIBRARIES})

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

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

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

add_dependencies(listener beginner_tutorials_generate_messages_cpp)

你可能感兴趣的:(Publisher and Subscriber代碼最強解析)