目录
从rosbag中提取图片和数据
本文只针对rosbag中包含了图片和数字(可以有多个topic),并需要分别提取不同的数据的情况。提取图片和数据分别介绍两种方法,一种是比较麻烦的方法,一种是利用Python写脚本直接提取。
1 提取图片
1.1 用launch文件提取图片
这种方法比较麻烦,提取后图片名是序号。这部分内容可以参考以下链接:
https://blog.csdn.net/tlglove326/article/details/105385208
1.1.1 安装工具(一般不需要)
roscd image_view
rosmake image_view
sudo apt-get install mjpegtools
1.1.2 直接创建roslaunch文件
先cd到rosbag所在文件夹,查看topic名称:
rosbag info xx.bag
创建ros laungh 文件,例如本文命名为:export.launch,文件内容如下:
<launch>
<node pkg="rosbag" type="play" name="rosbag" args="-d 2 $(find image_view)/test.bag"/>
<node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
<remap from="image" to="/camera/image_raw"/>
</node>
</launch>
注意只有两个地方需要修改:
(1)$(find image_view)/test.bag处修改为rosbag的路径
(2)camera/image_raw是查看的topic的名字
1.1.3 运行launch文件
打开一个终端运行
roscore
打开另一个终端,cd到export.launch所在路径下,运行:
roslaunch export.launch
1.1.4 转移提取的文件
所提取的图片在~/.ros路径下,将其转移到目标文件中,如:
cd ~
mkdir image
mv ~/.ros/*.jpg ~/image
1.1.5 批量修改文件名
提取之后图片的名字都是按照帧的顺序进行命名的,需要修改一下,这个网上有很多方法,这里不再赘述。
1.2 用Python提取图片
这种方法一步到位,操作简单
直接运行下面链接中的Python代码即可:
https://blog.csdn.net/qq_22059843/article/details/103018216?utm_medium=distribute.pc_aggpage_search_result.none-task-blog-2allfirst_rank_v2~rank_v25-3-103018216.nonecase
注意代码中有三个地方需要修改,包的地址/包的名称/目标文件夹。具体代码如下:
#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='image/' #存放图片的位置
class ImageCreator():
def __init__(self):
self.bridge = CvBridge()
with rosbag.Bag('stat.bag', 'r') as bag: #要读取的bag文件;
for topic,msg,t in bag.read_messages():
if topic == "/usb_cam/image_raw": #图像的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+ ".png" #图像命名:时间戳.jpg
cv2.imwrite(path+image_name, cv_image) #保存;
if __name__ == '__main__':
#rospy.init_node(PKG)
try:
image_creator = ImageCreator()
except rospy.ROSInterruptException:
pass
2 提取数据为csv或txt格式
这个比较简单,两种方法都很简单
2.1 命令行提取
2.1.1 查看topic信息
rosbag info xx.bag
2.1.2 转换为csv格式
rostopic echo -b xxx.bag -p /topic > xxx.csv(或.txt)都可以
【注意】/topic是话题名称,xxx.csv是被转换成的名称,这两个地方需要修改
2.2 使用Python一次性从rosbag中提取多个csv文件
具体参考下面的链接:
https://zhuanlan.zhihu.com/p/97148509
3 关于同步
注意,上述方法只能从原rosbag文件中提取出原本的topic,但是实际使用的过程中发现,尤其是当rosbag中包含多个topic的时候(比如多传感器数据),我们实际关心的是如何能够直接提取出同步好的图片和数据。这个需要用到Ros自带的时间同步滤波器,具体参见我的Github和另一篇博客:
github : https://github.com/KatelynLiu/SynMultiSensors
博客 : https://blog.csdn.net/weixin_43977894/article/details/108423854
转载请声明出处