[置顶] ROS的学习(二十)rosserial中的Publisher和Subscriber中的编程步骤

     1.在一个话题上发布消息。

     可以使用ros::Publisher类创建一个句柄来在一个话题上发布消息,应该首先创建一个publisher将要使用的消息,然后在setup函数中调用advertise。整个程序的结构如下:

#include <ros.h>
ros::NodeHandle nh;

// before your setup() function
std_msgs::String str_msg;
ros::Publisher pub("foo", &str_msg);

void setup(){
    ...
    nh.advertise(pub);
    ...
}

     然后就可以发布一个消息了:
void loop()
{
   pub.publish( &str_msg );
   nh.spinOnce();
}

     2.订阅一个话题

     订阅一个话题的第一步是包括头文件,并且创建一个回调函数。所有的rosserial消息存在于ros_lib文件夹下的package_name/msg_name。例如包括消息std_mgs/Float64时使用#include <std_msgs/Float64.h>。

     回调函数必须满足函数返回值为空且使用一个常引用作为函数的参数。

#include <std_msgs/Float64.h>
void messageCb(const std_msgs::Float64& msg)
  if(msg.data > 1.0)
    digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}

     为了建立实际的连接,我们必须静态的分配一个 ros::Subscriber对象,它规定了你所使用的消息类型,并且在setup函数中调用 NodeHandle::subscribe函数。
#include <ros.h>
ros::NodeHandle nh;

void messageCb(const std_msgs::Float64& msg)
  if(msg.data > 1.0)
    digitalWrite(13, HIGH-digitalRead(13));   // blink the led
}

ros::Subscriber<std_msgs::Float64> sub("your_topic", &messageCb);

void setup()
{
    ...
    nh.subscribe(sub);
    ...
}

     保证你的subscriber不要超出程序的订阅周期是非常重要的,rosserial依赖于像Subscriber一样的全局对象来避免我们的目标系统的内存限制。如果超出了这个范围,当下一条消息到来的时候,你的程序将会崩溃。

你可能感兴趣的:(Publisher,subscriber,arduino,ROS,rosserial)