我使用一个ROS节点(C++代码)来执行一些图像处理,读取来自模拟器中不同视觉传感器的图像。我有个大问题,到目前为止,还没有解决办法.
假设我的节点处于活动状态,并且正在对从主题“A”获取的图像执行一些操作;在某个点(因此在运行时,),我需要从这个主题“A”中取消订阅,并从另一个主题“B”(,该主题的名称“B”由另一个订阅者传递给节点)中删除,以读取来自另一个视觉传感器的图像:我想这样做,只需更改主题名称(例如,使用字符串变量),并使用用于主题“A”的相同回调。
困难如下:
请帮帮我.我真的不知道该怎么做
发布于 2013-06-14 00:39:06
假设主题A和主题B具有相同类型的消息,这可以只用一个订阅服务器变量来完成。只需更改订阅者订阅的消息即可。从ROS订阅者教程,
subscribe()返回必须持有的订阅服务器对象,直到要取消订阅为止。当订阅服务器对象的所有副本超出作用域时,此回调将自动从此主题取消订阅。
使用相同的订阅者变量订阅新主题将导致旧订阅服务器对象超出范围并取消对旧主题的订阅。如果您想要显式,可以调用ros::订户::topic ()取消订阅某个主题。
示例:
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消息,则可能需要全局定义订阅服务器和节点处理程序。
发布于 2018-03-01 08:52:40
我正面临着一个类似的问题,这实际上是因为我对ROS缺乏了解。
ros::topic::waitForMessage() (最终在一个循环中)是一个有趣的替代方案。
https://stackoverflow.com/questions/17066839
复制相似问题