【问题标题】:ROS no message published on a topic when I played a rosbag玩rosbag时,ROS没有发布关于某个主题的消息
【发布时间】:2020-07-08 21:54:43
【问题描述】:

我正在尝试使用以下代码从我自己的图像(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 来查看节点上的消息,但它显示没有消息在这个节点上发布,而两者都是终端正在运行。而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);

在我把它写入包之前检查图像是否损坏,但是显示的图像没有损坏

有人知道是什么原因造成的吗?

【问题讨论】:

    标签: ros


    【解决方案1】:

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

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

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

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

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

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

    rostopic list
    

    开始回放后在终端中。

    【讨论】:

    • 谢谢你的建议,虽然今天终于发现我的问题是IMU和rgb-d时间戳不匹配造成的,你的建议还是很有价值的。
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2023-03-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-30
      • 2016-01-17
      相关资源
      最近更新 更多