如何在ROS中执行回调函数内的耗时任务

时间:2018-06-09 13:43:04

标签: c++ callback ros

这个问题更可能是编码黑客,可能不依赖于ROS。我在回调函数中接收订阅者的数据。我试图在这个功能中执行耗时的任务。请参阅代码段 -

#include <ros/ros.h>
#include <std_msgs/String.h>

class TimeConsumingTask {
private:
  bool still_processing;
  void callback(const std_msgs::String::ConstPtr &msg);

public:
  TimeConsumingTask();
};

void TimeConsumingTask::callback(const std_msgs::String::ConstPtr &msg) {
  ROS_INFO("callback received");
  if (still_processing)
    return;

  still_processing = true;
  // perform time consuming task
  ros::Duration(5).sleep();
  still_processing = false;
}
}

TimeConsumingTask::TimeConsumingTask() {
  still_processing = false;
  ros::NodeHandle n;
  ros::Subscriber sub =
      n.subscribe("hello_word", 10, &TimeConsumingTask::callback, this);
  ros::spin();
}

int main(int argc, char **argv) {
  ros::init(argc, argv, "listener");
  TimeConsumingTask task;
  return 0;
}

如果前一个任务没有完成,我打算使用一个标志来跳过下一个呼叫。但是,它没有用!

虽然建议不要在回调函数内做任何耗时的任务。我没有问题,即使我跳过几个回调。 我想知道在ROS中回调函数内是否存在执行耗时任务的黑客攻击。

PS:我在Ubuntu 14.04 LTS 64位操作系统上使用ROS Indigo。请使用rostopic pub -r 10 hello_word std_msgs/String hello发布示例消息。

0 个答案:

没有答案