赞
踩
#include <ros/ros.h> #include <std_msgs/String.h> #include <sstream> /** * This tutorial demonstrates subscribing to a topic using a class method as the callback. */ // %Tag(CLASS_WITH_DECLARATION)% class Listener { public: std::string copy_data = "init init init"; int count = 0; public: void callback(const std_msgs::String::ConstPtr& msg); void print_data2(){std::cout << "Copy data is :" << copy_data << "\n";} }; // %EndTag(CLASS_WITH_DECLARATION)% void Listener::callback(const std_msgs::String::ConstPtr& msg) { ROS_INFO("I heard: [%s]", msg->data.c_str()); std::stringstream ss; ss << msg->data.c_str(); ss >> copy_data; std::cout <<"copy_data is: " << copy_data <<"\n"; print_data2(); ++count; } int main(int argc, char **argv) { ros::init(argc, argv, "listener_class"); ros::NodeHandle n; // %Tag(SUBSCRIBER)% Listener listener; ros::Subscriber sub = n.subscribe("chatter", 1000, &Listener::callback, &listener); ros::Rate loop_rate(10); // %EndTag(SUBSCRIBER)% while(ros::ok() and listener.count <=3){ ros::spinOnce(); loop_rate.sleep(); } std::cout << "After spin: \n"; listener.print_data2(); return 0; }
稍微简单说一下。listener_class节点订阅了chattertopic,并绑定Listener::callback为回调函数,当有数据过来以后,在回调函数里更新copy_data和count的值,在main函数里面,更新4次后停止对chatter的监听,此时再打印类中copy_data的值,发现该值已经被更新。更新多少次并没有特别的要求,只是为了退出监听,打印在回调函数中被修改的值看看是否真的被更新了,但是该值一定要比发布者发布的次数低,另外订阅者的刷新频率设高一点,这是为了防止订阅者更新的太慢或要求的次数达不到无法退出监听,就无法调用类中的函数打印我们想要观测的值。
完整的代码见github。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。