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
<remap from="image" to="/img_right"/>中 /cam0/image_raw 改为想要读取的 topic 名称; rosbag info MH_01_easy.bag
终端1
roscore
终端2
roslaunch export.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
订阅话题,保存图片
https://blog.csdn.net/m_zhangJingDong/article/details/78515772?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param
https://blog.csdn.net/haha074/article/details/82423816
参考:激光雷达 + 相机 , 两个一起转转化的
https://blog.csdn.net/yourgreatfather/article/details/87783906?utm_medium=distribute.pc_relevant.none-task-blog-title-4&spm=1001.2101.3001.4242
https://blog.csdn.net/handsome_for_kill/article/details/819479
