取消订阅主题并从新的运行时订阅(C ++)(ROS)

时间:2013-06-12 13:29:52

标签: c++ ros subscriber

我正在使用ROS节点(C ++代码)执行一些图像处理,从生活在模拟器中的不同视觉传感器读取图像。 到目前为止,我有一个很大的问题是没有解决方案......

假设我的节点处于活动状态,并且正在对从主题“A”获取的图像执行某些操作;在某一点(所以运行时间)我需要取消订阅此主题“A”并从另一个主题“B”订阅(此主题的名称“B”被传达给另一个订阅者的节点)从另一个视觉传感器读取图像:我想这样做只是更改主题名称(例如使用字符串变量)并使用与主题“A”相同的回调。

困难如下:

  • 我无法读取所有图像并选择我需要的图像:传感器太多而无法处理这样的数据流,此外,该系统根本无法扩展。

  • 我需要在一个范围内声明这个新订阅者,这个范围“足够长”以便从主题中读取过程(我认为,这是因为订阅者在主要范围内被定义,但是,同时,在一个范围内,我可以更新主题(所以一种循环,而不是在一段时间之前执行的部分)。

请帮助我......我真的不知道该怎么做

2 个答案:

答案 0 :(得分:5)

假设主题A和主题B具有相同类型的消息,则可以仅使用一个订阅者变量来完成。只需更改订阅者订阅的消息即可。来自ROS subscriber tutorial

  

subscribe()返回一个必须保留的Subscriber对象,直到   你想取消订阅。当Subscriber对象的所有副本都去的时候   超出范围,此回调将自动取消订阅   这个话题。

使用相同的订阅者变量订阅新主题将导致旧订阅者对象超出范围并取消订阅旧主题。如果你想要明确,你可以调用ros :: Subscriber :: shutdown()取消订阅主题。

示例:

ros::NodeHandle nh;
ros::Subscriber sub = nh.subscribe("A", 1, callbackFunc);

// Do something
...

// shutdown the subscriber (this should be unnecessary)
sub.shutdown();


// Now change the subscriber
sub = nh.subscribe("B", 1, callbackFunc);
// You are no longer subscribed to topic A

如果您希望能够在回调中更改此订阅者以获取另一个ROS消息,那么您可能需要全局定义订阅者和节点处理程序。

答案 1 :(得分:0)

我遇到了类似的问题,这实际上是由于我对ROS缺乏了解。

ros::topic::waitForMessage()(最终在一个循环中)是一个有趣的选择。

相关问题