0

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

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

困难如下:

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

  • 我需要在一个“生命”足够长的范围内声明这个新订阅者,以便从主题中读取(我认为,这就是为什么订阅者在主范围中定义的原因,在此之前)但是,在同时,在一个让我有可能更新主题的范围内(所以是一种循环,而不是只执行一次的 while 之前的部分)。

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

4

2 回答 2

8

假设主题 A 和主题 B 具有相同类型的消息,这可以通过一个订阅者变量来完成。只需更改订阅者订阅的消息。来自ROS 订阅者教程

subscribe() 返回一个订阅者对象,您必须持有该对象,直到您想取消订阅。当订阅者对象的所有副本超出范围时,此回调将自动取消订阅此主题。

使用相同的订阅者变量订阅新主题将导致旧订阅者对象超出范围并取消订阅旧主题。如果你想明确一点,你可以调用 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 消息的回调中更改此订阅者,那么您可能需要全局定义订阅者和节点处理程序。

于 2013-06-14T00:39:06.780 回答
2

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

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

于 2018-03-01T08:52:40.943 回答