首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从主题取消订阅,从新的运行时(C++) (ROS)订阅

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

Stack Overflow用户
提问于 2013-06-12 13:29:51
回答 2查看 16.3K关注 0票数 0

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

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

困难如下:

  • 我无法读取所有的图像并选择我需要的图像:传感器太多,无法处理这样的数据流,而且,这个系统根本无法扩展。
  • 我需要在“生存期”足够长的范围内声明这个新订阅者,以便在阅读主题的过程中进行(我认为,这是在主作用域中定义订阅者的原因,也是在时间之前定义订阅者的原因),但同时,在允许我更新主题的范围内(所以是某种循环,而不是在仅执行一次的while之前的部分)。

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

EN

回答 2

Stack Overflow用户

发布于 2013-06-14 00:39:06

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

subscribe()返回必须持有的订阅服务器对象,直到要取消订阅为止。当订阅服务器对象的所有副本超出作用域时,此回调将自动从此主题取消订阅。

使用相同的订阅者变量订阅新主题将导致旧订阅服务器对象超出范围并取消对旧主题的订阅。如果您想要显式,可以调用ros::订户::topic ()取消订阅某个主题。

示例:

代码语言:javascript
复制
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消息,则可能需要全局定义订阅服务器和节点处理程序。

票数 8
EN

Stack Overflow用户

发布于 2018-03-01 08:52:40

我正面临着一个类似的问题,这实际上是因为我对ROS缺乏了解。

ros::topic::waitForMessage() (最终在一个循环中)是一个有趣的替代方案。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17066839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档