#include"ros/ros.h"
#include"std_msgs/String.h"
void doMsg(const std_msgs::String::ConstPtr &msg)
{
// 通过msg获取并操作订阅到的数据
ROS_INFO("翠花订阅的数据:%s",msg->data.c_str());
}
int main(int argc, char *argv[])
{
// 解决中文乱码问题
setlocale(LC_ALL,"");
// 初始化ros节点
ros::init(argc,argv,"GuiHua");
// 创建节点句柄
ros::NodeHandle nh;
// 创建订阅者对象
ros::Subscriber sub=nh.subscribe("fang",10,doMsg);
ros::spin();
return 0;
}
程序解读:
订阅节点话题,并用回调函数对该话题进行处理
ros::Subscriber sub=nh.subscribe("fang",10,doMsg);
回调函数的消息类型 std_msgs::String来自于fang的消息格式,ConstPtr &msg是一个常引用指针
void doMsg(const std_msgs::String::ConstPtr &msg)2 订阅话题时,将订阅函数写入c++类中
// 将回调函数放在类中
#include"ros/ros.h"
#include"std_msgs/String.h"
class chatter_sub
{
public:
chatter_sub(){};
void chatterCallback(const std_msgs::String::ConstPtr &msg){
// 通过msg获取并操作订阅到的数据
ROS_INFO("翠花订阅的数据:%s",msg->data.c_str());
};
~chatter_sub();
};
chatter_sub::~chatter_sub()
{
}
int main(int argc, char*argv[])
{
// 解决中文乱码问题
setlocale(LC_ALL,"");
ros::init(argc,argv,"GuiHua_class");
ros::NodeHandle nh;
chatter_sub s8;
ros::Subscriber sub=nh.subscribe("fang_class",1000,&chatter_sub::chatterCallback,&s8);
ros::spin();
return 0;
}
代码实现流程如下:
(1)ros初始化节点
(2)创建节点句柄
(3)创建类对象chatter_sub s8;类的构造函数中默认为空
(3)写入订阅话题的函数
ros::Subscriber sub=nh.subscribe(“fang_class”,1000,&chatter_sub::chatterCallback,&s8);
fang_class为订阅节点话题名,1000为队列长度,&chatter_sub::chatterCallback为回调函数,另外还需要传入一个参数(类的)
在定义subscriber时和不使用类时有很大的不同.
不使用类时,我们是这么写的
ros::Subscriber sub = n.subscribe("chatter", 1000, chatterCallback);
使用类时,我们是这么写的
ros::Subscriber sub = n.subscribe("chatter", 1000, &subInt8::chatterCallback, &s8);
即原来我们只需要把回调函数名作为参数写在n.subscribe中,现在我们需要用&类名::函数名代替原来那个参数,之后还需要增加一个参数,即在定义subscriber之前定义好的类的对象名&对象名.



