發布者:
#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::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.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/<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)