Тупик при использовании условной переменной с подписчиком ros - PullRequest
0 голосов
/ 28 апреля 2020

Я последовал советам из этого обсуждения и написал оболочку для подписчика, которая будет использоваться в многопоточном приложении. Он должен отправить последнее полученное сообщение и ждать получения нового сообщения. Все это должно произойти после получения первых n (10 здесь) сообщений. В следующем коде есть тупик. wait() для переменной условия не снимает блокировку. Я не могу понять, в чем проблема.

class NewSub
{
public:
  NewSub(ros::NodeHandle* node_handle, std::string topic)
        : node_handle(node_handle), topic_(topic)
  {
    sub = node_handle->subscribe(topic, 1, &NewSub::latest_data, this);
  }

  auto get_latest()
  {
    if(counter > 10) {
      boost::unique_lock<boost::mutex> lock(mutex_);
      auto condition = [this]{std::cout << "Checking predicate..." << std::endl;
                         return this->data_received;};
      cond.wait(lock, condition);
      data_received = false;
    }
    return data;
  }

private:

  ros::NodeHandle* node_handle;
  ros::Subscriber sub;
  std_msgs::Int32 data;

  boost::condition_variable cond;
  boost::mutex mutex;
  bool data_received = false;
  int counter=0;

  std::string topic_;

  void latest_data(const std_msgs::Int32& msg)
  {
    {
      boost::lock_guard<boost::mutex> lock(mutex_);
      data = msg;
      datareceived_ = true;
      counter++;
    }
    cond_var_.notify_one();
  }
};

Буду признателен, если кто-нибудь укажет, в чем заключается ошибка. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...