gpt4 book ai didi

c++ - 取消订阅主题并订阅新的运行时 (C++) (ROS)

转载 作者:太空宇宙 更新时间:2023-11-04 16:20:43 25 4
gpt4 key购买 nike

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

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

难点如下:

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

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

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

最佳答案

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

subscribe() returns a Subscriber object that you must hold on to until you want to unsubscribe. When all copies of the Subscriber object go out of scope, this callback will automatically be unsubscribed from this topic.

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

关于c++ - 取消订阅主题并订阅新的运行时 (C++) (ROS),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17066839/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com