我正在使用ROS节点(C ++代码)执行一些图像处理,从生活在模拟器中的不同视觉传感器读取图像。我有一个很大的问题,到目前为止,没有解决方案......
假设我的节点处于活动状态,并且正在对从主题“A”获取的图像执行某些操作;在某一点(所以在运行时)我需要取消订阅这个主题“A”并从另一个主题“B”订阅(本主题“B”的名称由另一个订阅者传达给节点)从中读取图像另一个视觉传感器:我想这样做只是更改主题名称(例如使用字符串变量)并使用与主题“A”相同的回调。
困难如下:
请帮帮我...我真的不知道该怎么做
假设主题A和主题B具有相同类型的消息,则可以仅使用一个订户变量来完成。只需更改订阅者订阅的消息即可。来自ROS subscriber tutorial,
subscribe()返回您必须保留的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消息,那么您可能需要全局定义订阅者和节点处理程序。
我遇到了类似的问题,这实际上是由于我对ROS缺乏了解。
ros::topic::waitForMessage()
(最终在一个循环中)是一个有趣的选择。