在ROS的应用中,常常会遇见一个节点接收了某个数据后,经过处理再转发出来。下面就这种情况给出在同一个节点实现发布、订阅消息的例子。
#include "ros/ros.h"
#include "std_msgs/Float64.h"
#include
class tl1{
public:
tl1();
void registerNodeHandle(ros::NodeHandle& _nh);
void registerPubSub();
void iniPub();
void fCallback(const std_msgs::Float64::ConstPtr& msg);
private:
ros::Publisher pub_f64;
ros::Subscriber sub_f64;
ros::NodeHandle nh;
};
int main(int argc, char **argv){
ros::init(argc, argv, "ask");
ros::NodeHandle nh;
tl1 pubSub1;
pubSub1.registerNodeHandle(nh);
pubSub1.registerPubSub();
pubSub1.iniPub();
ros::spin();
}
tl1::tl1(){};
void tl1::registerNodeHandle(ros::NodeHandle& _nh){
nh = _nh;
};
void tl1::registerPubSub(){
pub_f64 = nh.advertise<std_msgs::Float64>("NameAsk",1000);
sub_f64 = nh.subscribe("NameAnswer",1000,&tl1::fCallback, this); //this pointer here means the class itself
};
void tl1::fCallback(const std_msgs::Float64::ConstPtr& msg){
std::cout<<"who is groot "<<msg->data<<std::endl;
std_msgs::Float64 pubData;
pubData.data = msg->data + 1;
ros::Rate sr(10);
pub_f64.publish(pubData);
sr.sleep();
};
void tl1::iniPub(){
std::cout<<"who are you "<<std::endl;
std_msgs::Float64 pubData;
pubData.data = 1;
usleep(500000);//wait for connection
pub_f64.publish(pubData);
}
#include "ros/ros.h"
#include "std_msgs/Float64.h"
class tl1{
public:
tl1();
void registerNodeHandle(ros::NodeHandle& _nh);
void registerPubSub();
void fCallback(const std_msgs::Float64::ConstPtr& msg);
private:
ros::Publisher pub_f64;
ros::Subscriber sub_f64;
ros::NodeHandle nh;
};
int main(int argc, char **argv){
ros::init(argc, argv, "answer");
ros::NodeHandle nh;
tl1 pubSub1;
pubSub1.registerNodeHandle(nh);
pubSub1.registerPubSub();
ros::spin();
}
tl1::tl1(){};
void tl1::registerNodeHandle(ros::NodeHandle& _nh){
nh = _nh;
};
void tl1::registerPubSub(){
pub_f64 = nh.advertise<std_msgs::Float64>("NameAnswer",1000);
sub_f64 = nh.subscribe("NameAsk",1000,&tl1::fCallback, this); //this pointer here means the class itself
};
void tl1::fCallback(const std_msgs::Float64::ConstPtr& msg){
std::cout<<"i am groot "<<msg->data<<std::endl;
std_msgs::Float64 pubData;
pubData.data = msg->data + 1;
ros::Rate sr(10);
pub_f64.publish(pubData);
sr.sleep();
};
这里注意一下registerPubSub中给sub_f64赋值的方法,最后一个参数是this指针。有一种流行的说法是this指针指针指向类本身。当我们在类中需要指定类对象的时候,就可以用this指针代替那个我们不知道的对象。
可以注意到我在文章开头说,有些数据收到后需要经过一系列处理,这里我的处理就是+1了。
这里注意到有一个usleep(500000)代表休眠500ms,因为两个节点的通过topic建立起来联系是需要时间的,所以这里要留给节点接收消息的时间。
参考文献:
1.https://www.jianshu.com/p/1f5dbf1f3488
2.http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29