發布者:
#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 来调用它们。它们没有放在 ' 因为在将软件包安装到系统时会污染 PATH。如果您希望您的可执行文件在安装时位于 PATH 上, 您可以设置安装目标,请参阅:catkin/CMakeLists.txt*/ add_dependencies(listener beginner_tutorials_generate_messages_cpp)