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一樣的全局對象來避免我們的目標系統的內存限制。如果超出了這個範圍,當下一條消息到來的時候,你的程序將會崩潰。