本节中,创建两个节点:一个发布一些数据,另一个接收这些数据。两节点之间使用最基本的方式通信,发送和接收这些数据来做工作:
$roscd chapter2_tutorials/src
创建example_a.cpp:发送带有节点名称的数据和example_b.cpp:把数据显示在shell窗口中。
#include "ros/ros.h" //包含ROS节点所有必要的文件
#include "std_msgs/String.h" //包含我们要使用后的消息类型
#include <sstream>
int main(int argc,char **argv)
{
ros::init(argc,argv,"example1_a"); //启动该节点并设置名称,名称必须唯一
ros::NodeHandle n; //设置节点进程的句柄。
ros::Publisher chatter_pub=n.advertise<std_msgs::String>("message",1000);
//将节点设置为发布者,chatter为话题名称。
//消息类型为std_msgs/String
//第一个参数是消息的名称,设置为message
//第二个参数是缓冲区大小,如果主题发布数据较快,那么缓冲区设置为1000个消息。
ros::Rate loop_rate(10); //发送数据的频率为10Hz
while(ros::ok())
{
std_msgs::String msg; //创建消息变量,变量的类型必须符合发送数据的要求。
std::stringstream ss;
ss<<"I am the example1_a node";
msg.data=ss.str();
chatter_pub.publish(msg);//消息发布。
ros::spinOnce(); //如果有一个订阅者出现,ROS就会更新和读取所有的主题。
loop_rate.sleep(); //按照10Hz频率被挂起。
}
return 0;
}
把下面代码复制到example_b.cpp 文件
#include "ros/ros.h"
#include "std_msgs/String.h" //头文件和消息类型
void messageCallback(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO("I heard: [%s]", msg->data.c_str()); //ROS_INFO()用于在命令行窗口输出数据。
}
//每次该节点收到一条信息时都会调用此函数,我们就可以使用或处理数据。在本例中,我们将收到的数据在命令行窗口中输出出来:
int main(int argc, char **argv)
{
ros::init(argc, argv, "example1_b");
ros::NodeHandle n;
ros::Subscriber sub = n.subscribe("message", 1000, messageCallback);
//创建一个订阅者,并从主题获取以message为名称的消息数据,设置缓冲区为1000个消息,处理消息句柄的回调函数是messageCallback.
ros::spin();
//是节点读取数据的消息响应循环,当消息到达的时候,回调函数messageCallback就会被调用,当用户按下Ctrl+c时,节点退出消息循环,于是循环结束。
return 0;
}