1.数据集rosbag

1.1 录制所有话题的包

rosbag record -a

1.2 录制指定话题,设置 bag 包名为:bag_name

rosbag record -O bag_name.bag /topic1 /topic2 /xxx

1.3 录制包不设置 包名称,默认按照录制结束时间命名

rosbag record /topic1_name /topic2_name /xxx

例如:录制 topic 为 camera、imu、odom , 名字为 shuju.bag的包

rosbag  record /camera/image_raw /imu /odom -O shuju.bag 

2、回放
2.1 直接回放

rosbag play shuju.bag

2.2  设置以 0.5 倍速回放,也就是以录制频率的一半回放:

rosbag play -r 0.5 shuju.bag

此时,包内的 信息 以 topic 为 image_raw 、imu、odom不断地发布出来; 例如运行rviz, 选择 bytopic 为 image_raw; 便可以出来图像

3、 显示rosbag详细信息

rosbag info shuju.bag

4、提取bag文件中的数据并保存为csv/txt格式
对于非图片数据,大部分情况下都可用csv文件存储

rostopic echo -b shuju.bag -p /odom > odom.csv
rostopic echo -b shuju.bag -p /odom > odom.txt

5、从 rosbag包里提取图片

5.1提取包里带时间戳的图片数据

①单目 全部代码如下(python):取名为readbag.py
只要第10行、第14行、第16行根据自己的文件名进行更改就行了。

#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 CvBridgeErrorpath='/home/zxy/shu_ju/2021-03-03-15-57-52/image2/' #要存放图片的位置
class ImageCreator():def __init__(self):self.bridge = CvBridge()with rosbag.Bag('MH01.bag', 'r') as bag:   #要读取的bag文件;for topic,msg,t in bag.read_messages():if topic == "/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" #图像命名:时间戳.jpgcv2.imwrite(path+image_name, cv_image)  #保存;if __name__ == '__main__':try:image_creator = ImageCreator()except rospy.ROSInterruptException:pass

运行

python readbag.py

②双目

修改17.18.23.25.34行

# 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 syscam0_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" #图像命名:时间戳.jpgcv2.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" #图像命名:时间戳.jpgcv2.imwrite(cam1_path + image_name, cv_image)  #保存;if __name__ == '__main__':#rospy.init_node(PKG)try:image_creator = ImageCreator()except rospy.ROSInterruptException:pass

5.2从 ros 的 bag 包里提取不带时间戳的图片数据

全部代码如下(后缀为 “.launch” 的文件):例如:export.launch
只要第2行、第4行根据自己的文件名和文件路径进行更改就行了。

<launch><node pkg="rosbag" type="play" name="rosbag" args="-d 2 $(find /home/zxy/Datastes)/2021-03-03-15-57-52.bag"/><node name="extract" pkg="image_view" type="extract_images" respawn="false" output="screen" cwd="ROS_HOME">
<remap from="image" to="/hik03/forwardright/image_raw"/></node>
</launch>

写好后,执行命令

终端1

roscore

终端2

roslaunch export.launch

5.3 从 ros 的 bag 包里提取带时间戳的 PointCloud 格式的点云数据,把提取出来的点云保存为 txt 格式

全部代码如下(python):
只要第9行、第11行、第12行根据自己的文件名和文件路径进行更改就行了。

#!/usr/bin/env python
#coding:utf-8
import sys
import argparse
from fnmatch import fnmatchcase
from rosbag import Bag
import rosbagbag_file = '2021-03-03-15-57-52.bag'
bag = rosbag.Bag(bag_file, "r")
bag_data = bag.read_messages('/ruby128result')
save_path = "/home/zxy/pcd_result/"j = 0
for topic, msg, t in bag_data:timestr = "%.6f" %  msg.header.stamp.to_sec()#print(timestr)#%.6f表示小数点后带有6位,可根据精确度需要修改;cloud_name = save_path + timestr+ ".txt" #点云命名:时间戳.txtwith open(cloud_name,"w") as f:#其中i为索引值,如下直接通过索引取得接收到的数据对象for i in range(len(msg.points)):msg.points[i].x;msg.points[i].y;msg.points[i].z;f.writelines([str(msg.points[i].x), ' ', str(msg.points[i].y), ' ', str(msg.points[i].z), '\n'])  # 自带文件关闭功能,不需要再写f.close()if j % 10 == 0:print('di ', j, ' zhen')j += 1#o3d.io.write_point_cloud(pcd_name, pcd)#o3d.io.write_point_cloud("../../TestData/sync.ply", pcd)

5.4 如何将两个rosbag包合并或者提取rosbag包中某些或某一个话题到一个rosbag里

代码叫做merge_bag.py
运行的时候,命令行输入:

python merge_bag.py -v New_hebing.bag bag1.bag bag2.bag

就是把 bag1.bag 和bag2.bag 完全合并在一起了,合并的新bag包叫 New_hebing.bag,时间戳打的都是原来两个bag里原始的时间戳,而不是像一边rosbag play一边rosbag record一样录的是现在这个时间戳。

命令行输入:

python merge_bag.py -v –topics ‘/aft_mapped_to_init /gnss/data /imu/data vinReNoOutlier’ bag1.bag 2019-10-28-14-40-45.bag bag2.bag

全部代码如下(python):

#!/usr/bin/env python
import sys
import argparse
from fnmatch import fnmatchcase
from rosbag import Bag
def main():parser = argparse.ArgumentParser(description='Merge one or more bag files with the possibilities of filtering topics.')parser.add_argument('outputbag',help='output bag file with topics merged')parser.add_argument('inputbag', nargs='+',help='input bag files')parser.add_argument('-v', '--verbose', action="store_true", default=False,help='verbose output')parser.add_argument('-t', '--topics', default="*",help='string interpreted as a list of topics (wildcards \'*\' and \'?\' allowed) to include in the merged bag file')args = parser.parse_args()topics = args.topics.split(' ')total_included_count = 0total_skipped_count = 0if (args.verbose):print("Writing bag file: " + args.outputbag)print("Matching topics against patters: '%s'" % ' '.join(topics))with Bag(args.outputbag, 'w') as o: for ifile in args.inputbag:matchedtopics = []             included_count = 0skipped_count = 0if (args.verbose):print("> Reading bag file: " + ifile)with Bag(ifile, 'r') as ib:for topic, msg, t in ib:if any(fnmatchcase(topic, pattern) for pattern in topics):if not topic in matchedtopics:matchedtopics.append(topic)if (args.verbose):print("Including matched topic '%s'" % topic)o.write(topic, msg, t)included_count += 1if included_count % 10 == 0:print("Included messages:", included_count)else:skipped_count += 1total_included_count += included_counttotal_skipped_count += skipped_countif (args.verbose):print("< Included %d messages and skipped %d" % (included_count, skipped_count))if (args.verbose):print("Total: Included %d messages and skipped %d" % (total_included_count, total_skipped_count))
if __name__ == "__main__":main()

6、rosbag测评

evo是一款用于视觉里程计和slam问题的轨迹评估工具。核心功能是能够绘制相机的轨迹,或评估估计轨迹与真值的误差。支持多种数据集的轨迹格式(TUM、KITTI、EuRoC MAV、ROS的bag),同时支持这些数据格式之间进行相互转换。

6.1 将rosbag输出数据

rostopic echo -b bag_name.bag -p /odom > odom.txt

其中/odom为话题名  odom.txt为输出数据文件名
6.2 将bag文件输出保存为tum格式

evo_traj bag bag_name.bag /odom --save_as_tum

 绘制

evo_traj tum odom.tum --plot --plot_mode xy

轨迹与地图融合

evo_traj bag bag1.bag --all_topic --plot --plot_mode xy --ros_map_yaml mymap.yaml  #融合地图

其中mymap.yaml  参数文件名字需要与地图名字mymap.png一致

evo_traj tum odom.tum --plot --plot_mode xy --ros_map_yaml mymap.yaml

②对比

evo_traj tum KeyFrameTrajectory1.txt KeyFrameTrajectory2.txt --ref=data.tum -p --plot_mode=xz

③ape可视化测评

evo_ape tum KeyFrameTrajectory1.txt KeyFrameTrajectory2.txt -va --plot --plot_mode xz

④绘制MH01

evo_traj tum 1216LSD_ORB_KeyFrameTrajectory.txt --plot --plot_mode xz  #二维绘制
evo_traj tum 1216LSD_ORB_KeyFrameTrajectory.txt --plot

参考文献

​​​​​ROS 中 bag、txt、csv 格式文件的详细转换 和 图片的提取_贵在坚持,不忘初心的博客-CSDN博客_rosbag转txt
从 ros 的 bag 包里提取特定的数据_weixin_44832383的博客-CSDN博客_rosbag数据提取
轨迹评估工具使用总结(二) evo 绘图& ROS map_Techblog of HaoWANG的博客-CSDN博客_evo ros

Ubuntu中rosbag、txt、csv 格式文件的转换和bag文件图片的提取相关推荐

  1. python读取数据文件夹_使用python依次读取文件中的所有csv格式的数据

    使用python依次读取文件中的所有csv格式的数据: #coding=gbk import pandas as pd import os path = r'D:\ml_datasets\PHM\c6 ...

  2. csv格式清洗与转换python_实例详解Python中 CSV格式清洗与转换

    Python中 CSV格式清洗与转换的实例代码 题目: CSV格式清洗与转换 描述 附件是一个CSV格式文件,提取数据进行如下格式转换:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬ ...

  3. mysql数据导入导出 CSV格式_MySQL中导入导出CSV格式数据

    原标题:MySQL中导入导出CSV格式数据 预备阅读:MySQL中的主键问题和赋权限问题 今天来讲一下在MySQL中导入和导出CSV格式数据的操作. CSV格式数据 逗号分隔值(Comma-Separ ...

  4. Python123 CSV格式清洗与转换

    Python123 CSV格式清洗与转换 题目描述 原始代码 简化代码 题目描述 附件是一个CSV格式文件,提取数据进行如下格式转换:‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪ ...

  5. 第7周 CSV格式清洗与转换

    CSV格式清洗与转换 描述 附件是一个CSV格式文件,提取数据进行如下格式转换:‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬ ...

  6. java中M格式_Java中Date日期字符串格式的各种转换

    编程语言 Java中Date日期字符串格式的各种转换 字号+ 作者:小虾米 2017-04-21 08:51 以下程序源码都是从网络上整理之后,才发到本网站的,新手请收藏啊! public class ...

  7. JSP文件如何转换成Java文件?

    文章目录 jsp 文件如何转换成 java 文件 jsp 何时开始编译 jsp 编译后的文件存储目录 jsp 文件如何转换成 java 文件 html                         ...

  8. 将windows下文件编码格式转换成UTF-8 文件编码格式

    将windows下文件编码格式转换成UTF-8 文件编码格式 背景说明: 一个芯片厂商的SDK中的所有文件使用的GB2312的中文编码方式,所以在linux下开发的时候会发现中文的部分都是乱码. 因为 ...

  9. csv格式文件如何转换成excel文件

    CSV(Comma Separated Values)是一种以逗号分隔的文件格式,用于存储表格数据,可以支持多个表格数据的存储和交换.由于它的格式简单,通常可以在不同的应用程序之间进行快速的数据交换. ...

最新文章

  1. 5G+AI,自动驾驶进入“中国时间”
  2. 内部使用final参数的原因
  3. Make uploadify button text support multiple languages(使uploadify的buttonText支持多国语言)
  4. 如何通过标签体系,打造精细化运营?
  5. 获取png格式的MNIST数据集
  6. 几张旧照片,用傻瓜拍的,翻出来凑数 (续)
  7. ABB 机器人 通信指令(人机对话):
  8. 前端学习(3):vs code编辑器
  9. 面向对象的接口思想与函数式编程
  10. Android性能优化:布局优化 详细解析(含include、ViewStub、merge讲解 )
  11. java界面ATM机取款后的余额_java_ATM机银行存取款系统的设计与实现本科毕业论文...
  12. 声网(agora)音视频通话sdk—微信小程序demo
  13. python全栈马哥_马哥Python全栈+爬虫+高端自动化,资源教程下载
  14. 用于敏捷开发的免费 UML 工具 2022
  15. matlab 生成伽罗华域中元素代码
  16. 有源淹没分析arcgis_基于DEM的有源洪水淹没分析算法
  17. word中全部数字、大小写字母、标点更改为新罗马字体Times News Romans
  18. kubectl源码分析之rollout history
  19. Android开发者账号申请注册及上传
  20. 2016 版 Laravel 系列入门教程(一)【最适合中国人的 Laravel 教程】

热门文章

  1. 把自己的项目部署在腾讯云服务器上给大家浏览
  2. 乡村调研笔记----乡村振兴,实现城乡融合发展新局面
  3. 工作心得:mysql之手写sql
  4. 腾讯云点播简介和使用流程
  5. 腾讯云点播 上传视频回调接口
  6. 电脑共享怎么换其他用户登录到这台计算机,怎样切换电脑的用户名登陆?
  7. GD库 图片水印+文字水印+缩率图+圆形图
  8. 解决安装APK报FileUriExposedException
  9. bcm免破线_新能源汽车分时租赁如何不破线检测汽车的BMS(电源管理)+BCM信息汽车车门锁控制以及远程断电?...
  10. 11n/ac/ax对比