ROS 节点订阅未连接
ROS node subscription not connected
我正在使用 rosbag 发布各种主题,我正在尝试让我的示例程序允许一个节点通过 class 方法函数订阅这些主题。但是控制台上没有为订阅者打印任何内容。我尝试了 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%28c%2B%2B%29
// 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::ConstPtr& msg)
{
ROS_INFO_STREAM(msg->data.c_str());
}
void callback2(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO_STREAM(msg->data.c_str());
}
void callback3(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO_STREAM(msg->data.c_str());
}
void callback4(const std_msgs::String::ConstPtr& 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, &callback_node::callback1, &callback_obj);
ros::Subscriber sub2 = nh.subscribe(SUB_TOPIC_2, 1000, &callback_node::callback2, &callback_obj);
ros::Subscriber sub3 = nh.subscribe(SUB_TOPIC_3, 1000, &callback_node::callback3, &callback_obj);
ros::Subscriber sub4 = nh.subscribe(SUB_TOPIC_4, 1000, &callback_node::callback4, &callback_obj);
// Spin
ros::spin();
// Success
return 0;
}
有一件事立即让我眼前一亮,即您实际上将 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
!
我正在使用 rosbag 发布各种主题,我正在尝试让我的示例程序允许一个节点通过 class 方法函数订阅这些主题。但是控制台上没有为订阅者打印任何内容。我尝试了 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%28c%2B%2B%29
// 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::ConstPtr& msg)
{
ROS_INFO_STREAM(msg->data.c_str());
}
void callback2(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO_STREAM(msg->data.c_str());
}
void callback3(const std_msgs::String::ConstPtr& msg)
{
ROS_INFO_STREAM(msg->data.c_str());
}
void callback4(const std_msgs::String::ConstPtr& 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, &callback_node::callback1, &callback_obj);
ros::Subscriber sub2 = nh.subscribe(SUB_TOPIC_2, 1000, &callback_node::callback2, &callback_obj);
ros::Subscriber sub3 = nh.subscribe(SUB_TOPIC_3, 1000, &callback_node::callback3, &callback_obj);
ros::Subscriber sub4 = nh.subscribe(SUB_TOPIC_4, 1000, &callback_node::callback4, &callback_obj);
// Spin
ros::spin();
// Success
return 0;
}
有一件事立即让我眼前一亮,即您实际上将 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
!