【发布时间】: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