在一段时间内发布主题

问题描述

我有一个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 ::时间 Ros ::持续时间解决方案。但是我在回调函数中有一个发布者这一事实不允许我这么做。

即使我的 publish事件在回调函数中,也有办法吗?如果没有,那么任何解决方案都行得通,主要是我的订阅者和发布者在同一节点上。

解决方法

就像我在评论中说的那样,我认为这只是一个逻辑问题,并不是真正针对ROS的。这是几种可能的解决方案之一:

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

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

void sub_cb(const std_msgs::StringConstPtr& 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;
}