rosbag record 命令是用于在ros系统中录取系统中其他ros节点发出来的 topic 的message。录取的的包可以使用 rosbag play 命令来回放,订阅这些消息的node节点就可以收到这些消息,进而执行对应的程序。
rosbag record -O bag_name.bag /topic1_name /topic2_name /xxx
rosbag record /topic1_name /topic2_name /xxx
rosbag record -O pylon_camera.bag/image_raw
rosbag play pylon_camera.bag
rosbag play -r 0.5 pylon_camera.bag
此时,包内的 信息 以 topic 为 image_raw 不断地读出来; 运行rviz, 选择 topic 为 image_raw; 便可以出来图像
rosbag info pylon_camera.bag
对于非图片数据,大部分情况下都可用csv文件存储
rostopic echo -b pylon_camera.bag -p image_raw > pylon_camera.csv
就是举个例子,图片转化成 txt 不太合理; 可以是IMU的数据
rostopic echo -b pylon_camera.bag -p image_raw > pylon_camera.txt
备注:csv 转换成 txt格式
在那个文件上右键单击,选择打开方式-记事本打开,再另存为txt各式就行了。
中 /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文件
- roslaunch bag2image.launch
注意:这一步骤可能会出现问题,不是内容的问题,而是 export.launch 排版可能不对
所提取的图片在~/.ros
路径下,先查看如下图所示:
终端3
cd ~/.ros
那么已经提取成功的图像存储在你 home文件夹下的 .ros 文件夹下,一般是隐藏的文件夹,使用 crtl+h 可显示出来。
mv ~/.ros/*.jpg /home/hltt3838/vins/Dates/bag_picture
执行结果:运行成功,没有差错
ROS-从rosbag中提取图像(by python2)
通过编写 Python程序 按照我们想要的信息及方式来提取,在与bag文件同级目录下建立.py文件(方便操作,若不是同级目录,下面代码中要写绝对路径)--- 默认电脑上安装了 opencv 和 python
pkg-config --modversion opencv //我的是3.4.1
python2 --version //2.7.17
python3 --version //3.6.9
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
可能报错,原因1:
解决:python是一种对缩进非常敏感的语言,最常见的情况是tab和空格的混用会导致错误,或者缩进不对,而这是用肉眼无法分别的。
原因2:ImportError: No module named roslib
解决:没有解决,哪位大什么看到了告诉我一下呀, 找到问题了,python2和python3不要乱使用, 可以看我的博客怎么换回到python2
订阅话题,保存图片
rosbag文件中提取图像--分别通过cam/image_raw和cam/image_raw/compressed方话题_m_zhangJingDong的博客-CSDN博客
ros下 同步保存双目数据 raw image_haha074的博客-CSDN博客
参考:激光雷达 + 相机 , 两个一起转转化的
【学习笔记】使用python带时间戳提取rosbag中的图像和雷达数据_拔刀吧TensorFlow!-CSDN博客_python读取rosbag数据
https://blog.csdn.net/handsome_for_kill/article/details/819479