问题描述
我有一个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;
}