当前位置:   article > 正文

ROS从callback中获取数据在回调函数以外使用_rospy sub callback函数使用

rospy sub callback函数使用

ROS回调函数中的数据如何在回调函数以外使用


关于回调函数的理解或者示例请自行谷歌吧。由于回调函数的定义,其处理的是被调用者的数据,所以一般在调用者那里无法获得回调函数里面的数据,要想在回调函数以外使用回调函数内的数据,目前好像只能借助类来实现了。下面是是根据 ROS官方教程-使用类方法作为回调函数稍加改动实现的。

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


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51

稍微简单说一下。listener_class节点订阅了chattertopic,并绑定Listener::callback为回调函数,当有数据过来以后,在回调函数里更新copy_data和count的值,在main函数里面,更新4次后停止对chatter的监听,此时再打印类中copy_data的值,发现该值已经被更新。更新多少次并没有特别的要求,只是为了退出监听,打印在回调函数中被修改的值看看是否真的被更新了,但是该值一定要比发布者发布的次数低,另外订阅者的刷新频率设高一点,这是为了防止订阅者更新的太慢或要求的次数达不到无法退出监听,就无法调用类中的函数打印我们想要观测的值。

完整的代码见github

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/49913
推荐阅读
相关标签
  

闽ICP备14008679号