Публиковать в теме в течение определенного периода времени

#time #ros #robot #publisher #subscriber

#время #ros #робот #издатель #подписчик

Вопрос:

У меня есть узел ROS, где я подписываюсь на тему, а затем публикую в другой теме следующим образом :

 #include ...

//Ros Nodehandle   Publisher

//Callback Function definition

int main (int argc, char** argv){
   //Initialisation

   // Pub
   pub = nh->advertise<Messagetype>("Topic2", 1);
 
   //Sub
   ros::Subscriber sub = nh->subscribe("Topic1", 1, sub_cb);

   ros::spin();

   return 0;
}

void sub_cb(){
    //Write the msg i want to publish

    pub.publish(msg);

}
  

Я хотел опубликовать сообщение, например, в течение 15 секунд. Я попробовал решение с Ros::Time и Ros::Duration . Но тот факт, что у меня есть издатель в моей функции обратного вызова, не позволил мне этого сделать.

Есть ли способ сделать это, даже если мое событие публикации находится в моей функции обратного вызова? Если нет, то любое решение будет работать, главное, чтобы мой подписчик и мой издатель находились на одном узле.

Комментарии:

1. почему бы просто не установить проверку времени перед публикацией и публиковать только в том случае, если с момента запуска часов прошло менее 15 секунд?

2. Если я запускаю часы в функции sub_cb(), отображается ошибка. Я думаю, что могу сделать это только в основном.

3. это проблема?

4. Я думаю, что я не совсем правильно понимаю факт публикации. Я всегда думал, что публикация осуществляется через «pub.publish (msg);». Поэтому, если я хочу повлиять на то, когда и как публиковать, я должен сделать управляющее заявление для «pub.publish (msg);». Как управлять этим из main? Из определения издателя?

5. Создайте таймер в глобальной области видимости; установите его в main; проверьте его sub_cb перед вызовом publish .

Ответ №1:

Как я уже сказал в комментариях, я думаю, что это просто логический вопрос, ничего особенного для ROS. Вот одно из нескольких возможных решений:

 #include "ros/ros.h"
#include "std_msgs/String.h"

ros::Publisher pub;
ros::Time begin;

void sub_cb(const std_msgs::StringConstPtramp; str) {
  std_msgs::String msg;
  msg.data = "hello world";
  ros::Time now = ros::Time::now();
  if (now.sec - begin.sec < 15) { // stop publishing after 15 seconds
    std::cout << "." << std::endl;
    pub.publish(msg);
  } else {
    std::cout << "stopped" << std::endl;  // just for debugging
  }
}

int main (int argc, char** argv){
  ros::init(argc, argv, "test");
  ros::NodeHandle nh;
  pub = nh.advertise<std_msgs::String>("Topic2", 1);
  ros::Subscriber sub = nh.subscribe("Topic1", 1, sub_cb);
  begin = ros::Time::now();
  ros::spin();
  return 0;
}
  

Комментарии:

1. theone, был ли этот ответ полезным? Если да, пожалуйста, примите и / или проголосуйте «за».