目录
一.查看.bag文件中的数据信息
rosbag info *.bag
结果如下所示:
二.解析.bag文件到.jpg文件
方法一(存在解析出的图片数量与msg数量不符的情况,方法二可解决)
1.使用touch命令建立export.launch文件, 文件内容如下所示,注意更改相应的.bag文件路径和topics名称。
touch export.launch
<launch>
<node pkg="rosbag" type="play" name="rosbag" args="-d 2 /home/gao/GAC/1stroll.bag"/>
<node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
<remap from="image" to="/Output_Matrix_Mono_Image"/>
</node>
</launch>
2.打开终端,运行roscore:
roscore
3.新建终端,cd到export.launch文件夹下,运行.launch文件。
roslaunch export.launch
4.解析的图片在home下的 .ros目录里,将目录下的图片移动到你想要的文件夹。
mv ~/.ros/frame*.jpg ~/GAC/image/1st
方法二(推荐,亲测可用)
1.在.bag文件所在的文件夹下建立get_image.py文件,内容如下。
#coding:utf-8
import roslib;
import rosbag
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
path='/home/gao/GAC/image' #存放图片的位置
class ImageCreator():
def __init__(self):
self.bridge = CvBridge()
with rosbag.Bag('2ndroll.bag', 'r') as bag: #要读取的bag文件;
for topic,msg,t in bag.read_messages():
if topic == "/Output_Matrix_Mono_Image": #图像的topic;
try:
cv_image = self.bridge.imgmsg_to_cv2(msg,"bgr8")
except CvBridgeError as e:
print e
timestr = "%.6f" % msg.header.stamp.to_sec()
#%.6f表示小数点后带有6位,可根据精确度需要修改;
image_name = timestr+ ".jpg" #图像命名:时间戳.jpg
cv2.imwrite(path+image_name, cv_image) #保存;
if __name__ == '__main__':
#rospy.init_node(PKG)
try:
image_creator = ImageCreator()
except rospy.ROSInterruptException:
pass
2.如果安装有anaconda,退出base环境,并运行get_image.py文件。
conda deactivate #退出base环境
python --version #查看Python版本,确保使用的Python是ros的Python
python get_image.py
三.解析.bag文件到.pcd点云数据文件
利用bag_to_pcd, 代码如下(亲测有效)
rosrun pcl_ros bag_to_pcd <*.bag> <topic> <output_directory>
参考资料:
http://wiki.ros.org/rosbag/Tutorials/Exporting image and video data
从ROS bag包中提取出带时间戳的图片和pcd点云数据_zbr794866300的博客-CSDN博客_rosbag 提取点云