Подписка на узел ROS не подключена

#c #c #ros #robotics

Вопрос:

Я использую пакет rosbag для публикации по различным темам, и я пытаюсь заставить свою примерную программу разрешить одному узлу подписываться на эти темы с помощью функций метода класса. Но ничего не распечатывается на консоли для подписчиков. Я попробовал roswtf и получил

  WARNING The following node subscriptions are unconnected:
 * /roscpp_pcl_example:
 * /camera/depth/points
 

Вот мой программный код, и я не уверен, в чем заключается проблема. Это моя ссылка на API https://wiki.ros.org/roscpp_tutorials/Tutorials/UsingClassMethodsAsCallbacks
http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber(c++)

 
// Include the ROS library
#include <ros/ros.h>

// Include pcl
#include <pcl_conversions/pcl_conversions.h>
#include <pcl/point_cloud.h>
#include <pcl/point_types.h>

// Include PointCloud2 message
#include <sensor_msgs/PointCloud2.h>
#include <std_msgs/String.h>

// Topics
static const std::string SUB_TOPIC_1 = "/ecu_pcl";
static const std::string SUB_TOPIC_2 = "/velodyne_back/velodyne_points";
static const std::string SUB_TOPIC_3 = "/velodyne_center/velodyne_points";
static const std::string SUB_TOPIC_4 = "/velodyne_front/velodyne_points"


//define class with member functions for callback usage
//allows for subscription of various topics in the same node
class callback_node{
    public:

    void callback1(const std_msgs::String::ConstPtramp; msg)
    {
      ROS_INFO_STREAM(msg->data.c_str());
    }

    void callback2(const std_msgs::String::ConstPtramp; msg)
    {
      ROS_INFO_STREAM(msg->data.c_str());
    }

    void callback3(const std_msgs::String::ConstPtramp; msg)
    {
      ROS_INFO_STREAM(msg->data.c_str());
    }

    void callback4(const std_msgs::String::ConstPtramp; msg)
    {
      ROS_INFO_STREAM(msg->data.c_str());
    }

    

};

int main (int argc, char** argv)
{
    // Initialize the ROS Node "roscpp_pcl_example"
    ros::init (argc, argv, "roscpp_pcl_example");
    ros::NodeHandle nh;
    callback_node callback_obj;
    // Print "Hello" message with node name to the terminal and ROS log file
    ROS_INFO_STREAM("Hello from ROS Node: " << ros::this_node::getName());

    // Create ROS Subscribers to SUB_TOPIC with a queue_size of 1000 and a callback function via class methods
    ros::Subscriber sub1 = nh.subscribe(SUB_TOPIC_1, 1000, amp;callback_node::callback1, amp;callback_obj);
    ros::Subscriber sub2 = nh.subscribe(SUB_TOPIC_2, 1000, amp;callback_node::callback2, amp;callback_obj);
    ros::Subscriber sub3 = nh.subscribe(SUB_TOPIC_3, 1000, amp;callback_node::callback3, amp;callback_obj);
    ros::Subscriber sub4 = nh.subscribe(SUB_TOPIC_4, 1000, amp;callback_node::callback4, amp;callback_obj);


    // Spin
    ros::spin();

    // Success
    return 0;
}
 

Ответ №1:

Одна вещь, которая сразу бросается мне в глаза, заключается в том, что вы на самом деле указали std_msgs::String::ConstPtr тип темы, но у вас есть темы /ecu_pcl , /velodyne_points которые не должны быть типа std_msgs::String , а вместо этого должны иметь разные типы данных, облака точек, я полагаю, так что что-то вроде sensor_msgs::PointCloud2 . Поэтому вам придется изменить обратные вызовы в соответствии с их правильными типами данных, например sensor_msgs::PointCloud2::ConstPtr .

Что меня также удивляет, так это то, что сообщение roswtf дает вам:

 WARNING The following node subscriptions are unconnected:
  * /roscpp_pcl_example:
    * /camera/depth/points
 

Это означает, что ваш узел roscpp_pcl_example подписан на тему /camera/depth/points , которую на самом деле никто не публикует. Однако в вашем фрагменте кода ничего не упоминается /camera/depth/points . (Вы показываете только часть исходного кода узла или забыли перекомпилировать код catkin build ?)


В любом случае, чтобы отладить его, попробуйте следующее:

  • Убедитесь, что вы выбрали правильное рабочее пространство, выполнив $ source devel/setup.bash в каждой открытой консоли следующие действия
  • Откройте консоль и просмотрите rosbag то, что вы хотите воспроизвести и выполнить $ rosbag info <filename.bag> , и проверьте вывод. Убедитесь, что все темы, необходимые для вашего узла, действительно были записаны!
  • Если это так, продолжайте играть с $ rostopic play <filename.bag> ним .
  • Теперь проверьте, правильно ли опубликованы все темы, открыв новую консоль, выбрав рабочую область и введя $ rostopic list текст .
  • Затем проверьте тип каждой отдельной темы из этого списка $ rostopic info <topicname> .
  • Наконец, убедитесь, что вы используете правильный тип темы для своих подписчиков. Возможно, вам потребуется обновить свой CMakeLists.txt и package.xml соответственно!

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

1. на самом деле после поиска и catkin_make я все еще получаю эту упрямую /камеру/глубину/точки, что не имеет смысла. Раньше я, возможно, что-то с этим делал, но я уже сделал catkin_make, и его там не должно быть

2. Я не уверен, есть ли другой способ чистой перестройки, о котором я не знаю, но я только что создал новый pkg для запуска, и он не содержит этой темы камеры

3. В таком случае вы можете попытаться позвонить catkin_make clean , чтобы очистить рабочее пространство. Это должно удалить весь предыдущий код сборки. Но рад, что все так получилось!