2.1创建节点

   本节中,创建两个节点:一个发布一些数据,另一个接收这些数据。两节点之间使用最基本的方式通信,发送和接收这些数据来做工作:

$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;
}

猜你喜欢

转载自blog.csdn.net/wtj318_/article/details/82852597
2.1
今日推荐