【问题标题】:Unsubscribe from a topic and subscribe from a new one runtime (C++) (ROS)取消订阅主题并订阅新的运行时 (C++) (ROS)
【发布时间】:2013-06-12 13:29:51
【问题描述】:

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

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

困难如下:

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

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

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

【问题讨论】:

    标签: c++ ros subscriber


    【解决方案1】:

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

    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 消息的回调中更改此订阅者,那么您可能需要全局定义订阅者和节点处理程序。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-08-11
        • 1970-01-01
        • 2020-10-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多