Подписка не на ту тему

#real-time #ros #robot

#в режиме реального времени #ros #робот

Вопрос:

Моя проблема в том, что я хочу подписаться на тему «радость», но из класса.

Допустим, у меня есть класс с именем My_Class.

В качестве защищенного метода я написал подписчика.

 protected:
   
 ros::Subscriber my_subscriber;
  

Затем я внедрил это.

 my_subscriber = nh_.subscribe("joy", 1, amp;My_Class::my_subscriber_cb, this);
  

Затем я написал свою функцию обратного вызова

 void my_subscriber_cb(const sensor_msgs::Joy::ConstPtramp; msg){}
  

Затем я инициализировал свой узел следующим образом:

     // ROS-Node Initialisation
    ros::init(argc, argv, "TEST_CORE", ros::init_options::NoSigintHandler);

    
  

Проблема в том, что в конце, когда я показываю тему с списком ростопиков

Я получаю тему с именем TEST_CORE/joy . Итак, я подписываюсь на TEST_CORE/joy , а не на /joy .

Что я могу сделать или изменить, чтобы получить данные моего геймпада из правильной темы?

Комментарии:

1. как вы запускаете свой узел? использование rosrun напрямую или с использованием файла запуска?

2. Здравствуйте, я использую rosrun напрямую.

Ответ №1:

Ознакомьтесь с документацией на ROS Wiki: Names. Имена, как правило, относительны, это означает, что они создаются на основе имени узла. Поскольку ваше имя узла TEST_CORE , результатом подписки на joy является TEST_CORE/joy . Чтобы подписаться на абсолютную тему, вам нужно добавить / перед темой. Так

 my_subscriber = nh_.subscribe("/joy", 1, amp;My_Class::my_subscriber_cb, this);
  

разрешает подписку, которая требуется вам.

Комментарии:

1. Я согласен, что это должно устранить проблему. Однако это не полностью объясняет, что он видит. Согласно документу Names, узел /node1 должен отображаться bar в /bar , и если Slachcrash напрямую запускает rosrun, тогда не должно быть пространства имен. Итак, откуда берется пространство имен ‘TEST_CORE’?

2. Не уверен, что вы имеете в виду. В документации говорится: By default, resolution is done relative to the node's namespace. For example, the node /wg/node1 has the namespace /wg, so the name node2 will resolve to /wg/node2. не так ли?

3. точно, но у его узла, похоже, нет пространства имен, поэтому должна применяться первая строка в таблице в разделе 1.1.2. Однако я подозреваю, что его описание проблемы каким-то образом неполное, и он все-таки запускает его в пространстве имен.

4. Большое спасибо вам обоим за вашу помощь. Это устранило мою проблему. Мой ответ о rosrun неверен. Я думал, вы говорили о joy_node. TEST_CORE — это пространство имен. С документацией имен теперь все имеет смысл.