Этот вопрос более вероятен с точки зрения кодирования и может не зависеть от 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: я использую ROS Indigo в 64-битной ОС Ubuntu 14.04 LTS.Пожалуйста, используйте rostopic pub -r 10 hello_word std_msgs/String hello
, чтобы опубликовать образец сообщения.