一、包(.bag)是怎么得到的 ?
rosbag record 命令是用于在ros系统中录取系统中其他ros节点发出来的 topic 的message。录取的的包可以使用 rosbag play 命令来回放,订阅这些消息的node节点就可以收到这些消息,进而执行对应的程序。
1.1 录制所有话题的包
rosbag record -a
1.2 录制指定话题,设置 bag 包名为:bag_name
rosbag record -O bag_name.bag /topic1_name /topic2_name /xxx
1.3 录制包不设置 包名称,默认按照录制结束时间命名
rosbag record /topic1_name /topic2_name /xxx
例如:录制 topic 为 image_raw , 名字为 pylon_camera 的包
rosbag record -O pylon_camera.bag/image_raw
二、回放
2.1 直接回放
rosbag play pylon_camera.bag
2.2 设置以 0.5 倍速回放,也就是以录制频率的一半回放:
rosbag play -r 0.5 pylon_camera.bag
此时,包内的 信息 以 topic 为 image_raw 不断地读出来; 运行rviz, 选择 topic 为 image_raw; 便可以出来图像
三、 显示包文件内容的可读摘要,包括开始和结束时间,主题及其类型,消息计数、频率以及压缩统计信息
rosbag info pylon_camera.bag
四、提取bag文件中的数据并保存为csv格式
对于非图片数据,大部分情况下都可用csv文件存储
# <BAGFILE>是bag文件,<TOPIC>为数据所在的topic
rostopic echo -b <BAGFILE> -p <TOPIC> > <output>.csv
例如上面:
rostopic echo -b pylon_camera.bag -p image_raw > pylon_camera.csv
五、提取bag文件中的数据并保存为 txt 格式
就是举个例子,图片转化成 txt 不太合理; 可以是IMU的数据
rostopic echo -b pylon_camera.bag -p image_raw > pylon_camera.txt
备注:csv 转换成 txt格式
在那个文件上右键单击,选择打开方式-记事本打开,再另存为txt各式就行了。
六、图片的bag文件 提取出 图片
方法一
1、创建文件 export.launch; vim export.launch; i ; Esc ; :wq ; 回车
<launch>
<node pkg="rosbag" type="play" name="rosbag" args="-d 2 /home/jht/Data/GVINS_data/GPS_Cam_IMU_20hz_second_2022-10-01-13-44-05.bag"/>
<node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
<remap from="image" to="/image_raw"/>
</node>
</launch>
注意:
/home/jht/Data/GVINS_data/GPS_Cam_IMU_20hz_second_2022-10-01-13-44-05.bag // 换成自己 .bag 的 绝对位置
<remap from="image" to="/img_right"/>
中 /image_raw 改为想要读取的 topic 名称; rosbag infoGPS_Cam_IMU_20hz_second_2022-10-01-13-44-05.bag
写好后,执行命令
终端1
roscore
终端2
- mkdir Bag2_image
- cd Bag2_image
- 输入如下内容到launch文件
<launch> <node pkg="rosbag" type="play" name="rosbag" args="-d 2 /home/jht/Data/GVINS_data/GPS_Cam_IMU_20hz_second_2022-10-01-13-44-05.bag"/> <node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME"> <remap from="image" to="/image_raw"/> </node> </launch>
- roslaunch bag2image.launch
注意:这一步骤可能会出现问题,不是内容的问题,而是 export.launch 排版可能不对
如下图所示,正在提取:
结束标志:
所提取的图片在~/.ros
路径下,先查看如下图所示:
终端3
cd ~/.ros
那么已经提取成功的图像存储在你 home文件夹下的 .ros 文件夹下,一般是隐藏的文件夹,使用 crtl+h 可显示出来。
将其移到你的目标文件中,标红的为新建的目录
mv ~/.ros/*.jpg /home/hltt3838/vins/Dates/bag_picture
执行结果:运行成功,没有差错
优点:操作简单,使用ros即可;
缺点:提取信息与原始录制的信息并不完全一致,主要体现在提取的图片数量和ros录制的时候的信息数量不一致,会少。此外,不含有时间戳;
方法二
ROS-从rosbag中提取图像(by python2)
通过编写 Python程序 按照我们想要的信息及方式来提取,在与bag文件同级目录下建立.py文件(方便操作,若不是同级目录,下面代码中要写绝对路径)--- 默认电脑上安装了 opencv 和 python
打开终端 1
查看 opencv 的版本
pkg-config --modversion opencv //我的是3.4.1
查看python2安装版本
python2 --version //2.7.17
查看python2安装版本
python3 --version //3.6.9
打开终端 2
cd vins/Dates
mkdir cam0
mkdir cam1
vim read_bag.py
i -> 拷贝 -> Esc -> :wq -> 回车
# coding:utf-8
#!/usr/bin/python
# Extract images from a bag file.
import roslib; #roslib.load_manifest(PKG)
import rosbag
import rospy
import cv2
from sensor_msgs.msg import Image
from cv_bridge import CvBridge
from cv_bridge import CvBridgeError
#Reading bag filename from command line or roslaunch parameter.
#import os
#import sys
cam0_path = '/home/hltt3838/vins/Dates/cam0/' # 已经建立好的存储cam0 文件的目录
cam1_path = '/home/hltt3838/vins/Dates/cam1/'
class ImageCreator():
def __init__(self):
self.bridge = CvBridge()
with rosbag.Bag('MH_01_easy.bag', 'r') as bag: #要读取的bag文件;
for topic,msg,t in bag.read_messages():
if topic == "/cam0/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+ ".jpg" #图像命名:时间戳.jpg
cv2.imwrite(cam0_path + image_name, cv_image) #保存;
elif topic == "/cam1/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+ ".jpg" #图像命名:时间戳.jpg
cv2.imwrite(cam1_path + image_name, cv_image) #保存;
if __name__ == '__main__':
#rospy.init_node(PKG)
try:
image_creator = ImageCreator()
except rospy.ROSInterruptException:
pass
运行
python read_bag.py
可能报错,原因1:
解决:python是一种对缩进非常敏感的语言,最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分别的。
原因2:ImportError: No module named roslib
解决:没有解决,哪位大什么看到了告诉我一下呀, 找到问题了,python2和python3不要乱使用, 可以看我的博客怎么换回到python2
最后的程序是运行成功的;学会了这个要举一反三,订阅其他话题的时候,比如激光雷达和IMU应该怎么弄?
优点:
没有信息损失,完全按照你录制的数据完整提取,且具有时间戳。
缺点:
使用python2,不依赖ros,依赖OpenCV;最好 3.x版本
订阅话题,保存图片
rosbag文件中提取图像--分别通过cam/image_raw和cam/image_raw/compressed方话题_m_zhangJingDong的博客-CSDN博客
ros下 同步保存双目数据 raw image_haha074的博客-CSDN博客
参考:激光雷达 + 相机 , 两个一起转转化的
【学习笔记】使用python带时间戳提取rosbag中的图像和雷达数据_拔刀吧TensorFlow!-CSDN博客_python读取rosbag数据
ROS中使用Python3的注意事项
https://blog.csdn.net/handsome_for_kill/article/details/819479