Отписаться от темы и подписаться на новую среду выполнения (C ++) (ROS)

Я использую узел ROS (код C ++), чтобы выполнить некоторую обработку изображений, считывая изображения с различных визуальных сенсоров, живущих в симуляторе.
У меня большая проблема, которая до сих пор не решена …

скажем, мой узел активен и выполняет некоторые операции с изображением, полученным из темы «A»; в определенный момент (так в время выполнения) мне нужно отписаться от этой темы «А» и подписаться на другую тему «Б» (название этой темы «B» сообщается узлу другим абонентом) для чтения изображений с другого визуального датчика: я хотел бы сделать это, просто изменив название темы (например, используя строковую переменную) и используя тот же обратный вызов, что и для темы «А».

трудности следующие:

  • я не могу прочитать все изображения и выбрать то, что мне нужно: датчика слишком много, чтобы обрабатывать такой поток данных, и, кроме того, эта система вообще не масштабируется.

  • мне нужно объявить этого нового подписчика в области, которая «живет» достаточно долго для процесса чтения из темы (это причина, я думаю, подписчики определены в основной области, до того времени), но в в то же время, в области, которая дает мне возможность обновить тему (так что это своего рода цикл, а не часть в то время как это выполняется только один раз).

пожалуйста, помогите мне … я действительно не знаю, как это сделать

0

Решение

Предполагая, что тема A и тема B имеют сообщения одного типа, это можно сделать только с одной переменной подписчика. Просто измените сообщение, на которое подписан подписчик. От Учебник для абонентов ROS,

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, то вам, вероятно, потребуется определить подписчика и обработчик узла глобально.

5

Другие решения

Я столкнулся с аналогичной проблемой, которая была на самом деле из-за моего непонимания ROS.

ros::topic::waitForMessage() (в конце концов, в цикле) была интересная альтернатива.

0

По вопросам рекламы [email protected]