#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 — это пространство имен. С документацией имен теперь все имеет смысл.