故跬步不休,跛鳖千里;累积不辍,可成丘阜。——(西汉)刘安《淮南子·说林训》

差不多从夏天的时候开始就一直在找有没有什么方法可以生成ROS bag数据,当时只找到了录制的方法,使用图片等原始数据生成的方法一直没找到。直到最近看到一篇博客使用了一个Python脚本将ASL数据转换成了ROS bag,试了一下挺好用的,欣喜若狂。有了它就可以将自己的数据按照ASL格式进行组织,之后使用脚本直接生成ROS bag就可以了。

简单说一下使用方法。因为需要用到ROS的一些Python包,所以使用的Python环境必须是安装了ROS的。我是在Ubuntu 16.04 LTS下运行的,安装的ROS Kinetic,运行环境其实和这篇博客的一样:一周小结(七)——从零开始配置VINS-Mono运行环境。不知道什么原因,在Pycharm中导入相关包时一直报错,但是相同的Python版本在终端却可以,大家如果有知道什么原因的欢迎评论区留言。所以无奈就抛弃了IDE而在终端运行,使用时需要给出ASL数据解压的文件路径以及生成的ROS bag数据的路径、名称,后者可以使用默认值(home文件夹下生成output.bag),例如:

python '/home/dong/Code/zip2bag/zip2bag.py'  --folder /home/dong/catkin_ws/dataset/1

最后给出Python脚本。大家也可以根据自己数据的组织结构、命名规则等进行适当修改。

#!/usr/bin/env python
print
"importing libraries"import rosbag
import rospy
from sensor_msgs.msg import Image
from sensor_msgs.msg import Imu
from geometry_msgs.msg import PointStamped
# import ImageFile
# import PIL.ImageFile as ImageFile
import time, sys, os
import argparse
import cv2
import numpy as np
import csv# structure
# dataset/cam0/data/TIMESTAMP.png
# dataset/camN/data/TIMESTAMP.png
# dataset/imu0/data.csv
# dataset/imuN/data.csv
# dataset/leica0/data.csv# setup the argument list
parser = argparse.ArgumentParser(description='Create a ROS bag using the images and imu data.')
parser.add_argument('--folder', metavar='folder', nargs='?', help='Data folder')
parser.add_argument('--output_bag', metavar='output_bag', default="output.bag", help='ROS bag file %(default)s')# print help if no argument is specified
if len(sys.argv) < 2:parser.print_help()sys.exit(0)# parse the args
parsed = parser.parse_args()def getImageFilesFromDir(dir):'''Generates a list of files from the directory'''image_files = list()timestamps = list()if os.path.exists(dir):for path, names, files in os.walk(dir):for f in files:if os.path.splitext(f)[1] in ['.bmp', '.png', '.jpg']:image_files.append(os.path.join(path, f))timestamps.append(os.path.splitext(f)[0])# sort by timestampsort_list = sorted(zip(timestamps, image_files))image_files = [file[1] for file in sort_list]return image_filesdef getCamFoldersFromDir(dir):'''Generates a list of all folders that start with cam e.g. cam0'''cam_folders = list()if os.path.exists(dir):for path, folders, files in os.walk(dir):for folder in folders:if folder[0:3] == "cam":cam_folders.append(folder)return cam_foldersdef getImuFoldersFromDir(dir):'''Generates a list of all folders that start with imu e.g. cam0'''imu_folders = list()if os.path.exists(dir):for path, folders, files in os.walk(dir):for folder in folders:if folder[0:3] == "imu":imu_folders.append(folder)return imu_foldersdef getImuCsvFiles(dir):'''Generates a list of all csv files that start with imu'''imu_files = list()if os.path.exists(dir):for path, folders, files in os.walk(dir):for file in files:if file[0:3] == 'imu' and os.path.splitext(file)[1] == ".csv":imu_files.append(os.path.join(path, file))return imu_filesdef loadImageToRosMsg(filename):image_np = cv2.imread(filename, cv2.IMREAD_GRAYSCALE)timestamp_nsecs = os.path.splitext(os.path.basename(filename))[0]timestamp = rospy.Time(secs=int(timestamp_nsecs[0:-9]), nsecs=int(timestamp_nsecs[-9:]))rosimage = Image()rosimage.header.stamp = timestamprosimage.height = image_np.shape[0]rosimage.width = image_np.shape[1]rosimage.step = rosimage.width  # only with mono8! (step = width * byteperpixel * numChannels)rosimage.encoding = "mono8"rosimage.data = image_np.tostring()return rosimage, timestampdef createImuMessge(timestamp_int, omega, alpha):timestamp_nsecs = str(timestamp_int)timestamp = rospy.Time(int(timestamp_nsecs[0:-9]), int(timestamp_nsecs[-9:]))rosimu = Imu()rosimu.header.stamp = timestamprosimu.angular_velocity.x = float(omega[0])rosimu.angular_velocity.y = float(omega[1])rosimu.angular_velocity.z = float(omega[2])rosimu.linear_acceleration.x = float(alpha[0])rosimu.linear_acceleration.y = float(alpha[1])rosimu.linear_acceleration.z = float(alpha[2])return rosimu, timestamp# create the bag
bag = rosbag.Bag(parsed.output_bag, 'w')# write images
camfolders = getCamFoldersFromDir(parsed.folder)
for camfolder in camfolders:camdir = parsed.folder + "/{0}".format(camfolder) + "/data"image_files = getImageFilesFromDir(camdir)for image_filename in image_files:image_msg, timestamp = loadImageToRosMsg(image_filename)bag.write("/{0}/image_raw".format(camfolder), image_msg, timestamp)# write imu data
imufolders = getImuFoldersFromDir(parsed.folder)
for imufolder in imufolders:imufile = parsed.folder + "/" + imufolder + "/data.csv"topic = os.path.splitext(os.path.basename(imufolder))[0]with open(imufile, 'rb') as csvfile:reader = csv.reader(csvfile, delimiter=',')headers = next(reader, None)for row in reader:imumsg, timestamp = createImuMessge(row[0], row[1:4], row[4:7])bag.write("/{0}".format(topic), imumsg, timestamp)# write leica data
leicafile = parsed.folder + "/leica0/data.csv"
with open(leicafile, 'rb') as csvfile:reader = csv.reader(csvfile, delimiter=',')headers = next(reader, None)for row in reader:timestamp_nsecs = str(row[0])timestamp = rospy.Time( int(timestamp_nsecs[0:-9]), int(timestamp_nsecs[-9:]) )pos = PointStamped()pos.header.stamp = timestamppos.point.x = float(row[1])pos.point.y = float(row[2])pos.point.z = float(row[3])bag.write("/leica/position", pos, timestamp)bag.close()

又到年底了,一年快要结束了。去年因为出差的原因(其实就是因为懒),没有写年终总结与新年展望。今年可不能这样了,先给自己立一个小小的flag,O(∩_∩)O哈哈~,年底见!

参考:

1、The EuRoC MAV Dataset

2、从 EuRoC MAV Dataset 的 .zip 文件生成 .bag 的 python 脚本

ASL数据转换为ROS bag数据相关推荐

  1. [工具库]JOJSONBuilder工具类——一键把多个bean对象数据转换为JSON格式数据

    本人大四即将毕业的准程序员(JavaSE.JavaEE.android等)一枚,小项目也做过一点,于是乎一时兴起就写了一些工具. 我会在本博客中陆续发布一些平时可能会用到的工具. 代码质量可能不是很好 ...

  2. [工具库]JOXMLBuilder工具类——一键把多个bean对象数据转换为XML格式数据

    本人大四即将毕业的准程序员(JavaSE.JavaEE.android等)一枚,小项目也做过一点,于是乎一时兴起就写了一些工具. 我会在本博客中陆续发布一些平时可能会用到的工具. 代码质量可能不是很好 ...

  3. 将正常表格数据转换为横版数据(js实现)

    将正常表格数据转换为横版数据 在维护一个看板系统的时候遇到一个有意思的问题 一张正常表的数据看起来应该是这样的 //列设置 const column:[{field:'name',title:'姓名' ...

  4. JavaScript数组格式的数据转换为json格式数据

    vue + JavaScript 把数组格式的数据转换为json格式数据 <!DOCTYPE html> <html lang="en"><head& ...

  5. EXCEL公式-文本型数据转换为数值型数据

    从后台导出的销售数据中,金额.订单数等均为文本型数据,无法进行求和计算. 这个时候可以通过*1将文本型数据快速转换为数值型数据. 如下所示: 其中clean函数用于去除字符串中的非打印字符,如Tab制 ...

  6. 将excel表格数据转换为xml文本数据

    原文:http://blog.javayc.com/archives/12 这篇blog主要是讲述java中poi读取excel,并将excel中的数据转化为xml文本中的数据,而excel的版本包括 ...

  7. clob大数据转换为多行数据

    --创建类型 CREATE OR REPLACE TYPE picid_rowtype as object(in_picid nvarchar2(50),in_order number) CREATE ...

  8. python统计库存_通过Python中的pandas将每日库存数据转换为每周库存数据

    我有一个存储每日数据的DataFrame,如下所示:Date Open High Low Close Volume 2010-01-04 38.660000 39.299999 38.509998 3 ...

  9. PANDAS面板数据转换为dict字典数据

    我们来总结几种将dataframe转换为字典的方法.1.使用 to_dict() 函数将 Pandas DataFrame 转换为字典Pandas to_dict() 函数将一个 DataFrame ...

最新文章

  1. 图论 ---- F. The Shortest Statement (最短路的性质 + 任意两点间最短路 + 图转树)
  2. 月薪40-60k| 银牛微电子Inuitive招计算机视觉算法、应用软件等岗位
  3. CentOS7系统ifconfig无法使用的解决方法
  4. Java Lambda表达式入门
  5. wukong引擎源码分析之索引——part 1 倒排列表本质是有序数组存储
  6. 管理者如何提升下属执行力---视频学习记录
  7. 分布式架构中一致性解决方案——Zookeeper集群搭建
  8. libsvm中数据归一化的重要性
  9. Oracle监听启动扫描sqlnet,监听中sqlnet.ora的作用
  10. Unity3D之Material(材质、着色器、纹理)
  11. DE14 Interpretation of the Exceptional Case: Resonance
  12. CentOS服务器Mysql主从复制集群的搭建
  13. Jcrop实现图片裁剪
  14. python selenium ActionChains类与鼠标的模拟事件
  15. DMAc-MPM cas:1870041-76-1,齐岳提供
  16. 从裁员到扩招/从自研到生态,汽车行业新年新气象
  17. 服务器装win7无限重启吗,win7系统重装系统后无限重启电脑的解决方法
  18. C 生化危机 SDUT
  19. EM算法 估计混合高斯模型参数 Python实现
  20. qLabel 字体大小不受控制

热门文章

  1. PDF文档的编辑密码如何去除?
  2. 使用 vue 创建你的第一个 PWA 应用
  3. win10python3.9安装pycocotools
  4. 存货核算的存储过程设计
  5. python调用Agora_Recording_SDK_for_Linux_FULL
  6. 一个超牛妈妈对儿子说的话(三)
  7. Ubuntu20.04下解决Qt出现qt.qpa.plugin:Could not load the Qt platform plugin “xcb“ 问题
  8. 基于jsp+ssm的房源信息管理系统
  9. 关于nginx上的limit_req_zone模块限流使用与geo与map的白名单配置
  10. 忘记Apple ID密码,如何从iPhone/iPad上移除iCloud账号