玩rosbag的时候ROS没有发布某话题的消息

ROS no message published on a topic when I played a rosbag

我正在尝试使用如下代码从我自己的图像 (RGB-D) 和 IMU 数据创建一个 rosbag:

        sensor_msgs::ImagePtr ros_rgb_msg;
        ros_rgb_msg = imgrgb.toImageMsg();
        ros_rgb_msg->header.seq = iFrame;
        ros_rgb_msg->header.stamp = stamp;
        ros_rgb_msg->header.frame_id = iFrame;
        bag.write("cam0/image_raw", stamp,ros_rgb_msg);

        sensor_msgs::ImagePtr ros_depth_msg;
        ros_depth_msg = imgdepth.toImageMsg();
        ros_depth_msg->header.seq = iFrame;
        ros_depth_msg->header.stamp = stamp;
        ros_depth_msg->header.frame_id = iFrame;
        bag.write("cam0/depth", stamp, ros_depth_msg);

        sensor_msgs::Imu imu_msg;
        imu_msg.header.stamp = stamp;
        imu_msg.header.seq = iFrame;
        imu_msg.header.frame_id = "imu";
        imu_msg.angular_velocity.x = tmpgyros.data[0];
        imu_msg.angular_velocity.y = tmpgyros.data[1];
        imu_msg.angular_velocity.z = tmpgyros.data[2];
        imu_msg.linear_acceleration.x = tmpacc.data[0];
        imu_msg.linear_acceleration.y = tmpacc.data[1];
        imu_msg.linear_acceleration.z = tmpacc.data[2];

        imu_msg.angular_velocity_covariance[0] = 0.001f;
        imu_msg.angular_velocity_covariance[1] = 0.0f;
        imu_msg.angular_velocity_covariance[2] = 0.0f;
        imu_msg.angular_velocity_covariance[3] = 0.0f;
        imu_msg.angular_velocity_covariance[4] = 0.001f;
        imu_msg.angular_velocity_covariance[5] = 0.0f;
        imu_msg.angular_velocity_covariance[6] = 0.0f;
        imu_msg.angular_velocity_covariance[7] = 0.0f;
        imu_msg.angular_velocity_covariance[8] = 0.001f;
        imu_msg.linear_acceleration_covariance = imu_msg.orientation_covariance =imu_msg.angular_velocity_covariance;
        bag.write("/imu0", stamp, imu_msg);

其中iFrame是一个int表示第iFrame的图片正在写入包中,代码开头六行将RGB部分写入包中并发布到cam0/image_raw,后面六行将深度部分写入包中,发布到cam0/depth

然后我尝试使用生成的包作为VINS的输入,在feature_tracker_node.cpp中,我修改订阅者如下

ros::Subscriber sub_img = n.subscribe("cam0/image_raw", 100, img_callback);

但是,当我在两个不同的终端中先运行 roslaunch vins_estimator euroc.launch 然后运行rosbag play mytest.bag 时,我使用rostopic hz cam0/image_raw 来查看节点上的消息, 但它显示没有消息发布在这个节点上,而两个终端都是 运行ning。而 feature_tracker_node.cpp 中的回调函数,即 void img_callback(const sensor_msgs::ImageConstPtr &img_msg) 永远不会被调用。

但是当我看的时候imu0,效果很好,很多帖子都是关于这个话题的。

我也用过

        cv_bridge::CvImageConstPtr ptr1;
        ptr1 = cv_bridge::toCvCopy(ros_rgb_msg, sensor_msgs::image_encodings::RGB8);
        cv::imshow("test bag1",ptr1->image);
        cv::waitKey(0);

先检查图片是否损坏再写入包中,但是显示的图片并没有损坏

任何人都知道可能导致问题的原因是什么?

对我来说,主题名称似乎有问题。看看 the ROS documentation for names。尤其是绝对名称和相对名称。

您正在相对于您的节点进行订阅:

ros::Subscriber sub_img = n.subscribe("cam0/image_raw", 100, img_callback);

这意味着,结果将是对 /your_node_name/cam0/image_raw 之类的主题的订阅,这不是 rosbag 发布的主题。要订阅 absolute,您需要在主题前添加一个 /,例如:

ros::Subscriber sub_img = n.subscribe("/cam0/image_raw", 100, img_callback);

提示:要查看可用主题,请输入

rostopic list

开始回放后在终端中。

仔细检查了数据集,发现它的IMU和RGB-D时间戳不匹配,所以,问题是我忘了写时间戳校正的代码。