玩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时间戳不匹配,所以,问题是我忘了写时间戳校正的代码。
我正在尝试使用如下代码从我自己的图像 (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时间戳不匹配,所以,问题是我忘了写时间戳校正的代码。