#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, был ли этот ответ полезным? Если да, пожалуйста, примите и / или проголосуйте «за».