ROS学习——在同一个节点实现发布、订阅消息

在ROS的应用中,常常会遇见一个节点接收了某个数据后,经过处理再转发出来。下面就这种情况给出在同一个节点实现发布、订阅消息的例子。

1.代码

#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();
};

2. 代码说明

  1. 这里注意一下registerPubSub中给sub_f64赋值的方法,最后一个参数是this指针。有一种流行的说法是this指针指针指向类本身。当我们在类中需要指定类对象的时候,就可以用this指针代替那个我们不知道的对象。

  2. 可以注意到我在文章开头说,有些数据收到后需要经过一系列处理,这里我的处理就是+1了。

  3. 这里注意到有一个usleep(500000)代表休眠500ms,因为两个节点的通过topic建立起来联系是需要时间的,所以这里要留给节点接收消息的时间。

3. 节点图

在这里插入图片描述

参考文献:
1.https://www.jianshu.com/p/1f5dbf1f3488
2.http://wiki.ros.org/cn/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29

你可能感兴趣的:(c++)