Kalibr将EuRoC公共数据集转换为bag格式

news2024/11/29 22:28:12

文章目录

  • 使用脚本
  • 1.Ubuntu20.04安装kalibr
  • 2.kalibr打包
  • 3.报错
    • 终端无法识别 kalibr_bagcreater 这个命令
  • 参考


使用脚本

6. EUROC公用数据集打包成ROSBAG方法使用的是python2,下面使用python3进行了修改。

#!/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 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 timestamp
        sort_list = sorted(zip(timestamps, image_files))
        image_files = [file[1] for file in sort_list]
    return image_files


def 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_folders


def getImuFoldersFromDir(dir):
    """Generates a list of all folders that start with imu e.g. imu0"""
    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_folders


def 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_files


def 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 = timestamp
    rosimage.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.tobytes()  # Python 3: use tobytes() instead of tostring()

    return rosimage, timestamp


def 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 = timestamp
    rosimu.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
try:
    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, "r"
        ) as csvfile:  # Change to text mode ('r') instead of binary mode ('rb')
            reader = csv.reader(csvfile, delimiter=",")
            headers = next(reader, None)  # Read the header
            for row in reader:
                imumsg, timestamp = createImuMessge(row[0], row[1:4], row[4:7])
                bag.write("/{0}".format(topic), imumsg, timestamp)

finally:
    bag.close()

结果

damon@damon-virtual-machine:/mnt/hgfs/Shared/datasets/EuRoC/MH_01_easy$ ls
bagcreater.py  mav0
damon@damon-virtual-machine:/mnt/hgfs/Shared/datasets/EuRoC/MH_01_easy$ python3 bagcreater.py --folder mav0 --output-bag output.bag
importing libraries
damon@damon-virtual-machine:/mnt/hgfs/Shared/datasets/EuRoC/MH_01_easy$ rosbag info output.bag 
path:        output.bag
version:     2.0
duration:    3:04s (184s)
start:       Jun 25 2014 03:02:59.76 (1403636579.76)
end:         Jun 25 2014 03:06:03.85 (1403636763.85)
size:        2.5 GB
messages:    44184
compression: none [2472/2472 chunks]
types:       sensor_msgs/Image [060021388200f6f0f447d0fcd9c64743]
             sensor_msgs/Imu   [6a62c6daae103f4ff57a132d6f95cec2]
topics:      /cam0/image_raw    3682 msgs    : sensor_msgs/Image
             /cam1/image_raw    3682 msgs    : sensor_msgs/Image
             /imu0             36820 msgs    : sensor_msgs/Imu
damon@damon-virtual-machine:/mnt/hgfs/Shared/datasets/EuRoC/MH_01_easy$ rosbag info ../MH_01_easy.bag
path:        ../MH_01_easy.bag
version:     2.0
duration:    3:06s (186s)
start:       Jun 25 2014 03:02:59.81 (1403636579.81)
end:         Jun 25 2014 03:06:06.70 (1403636766.70)
size:        2.5 GB
messages:    47283
compression: none [2456/2456 chunks]
types:       geometry_msgs/PointStamped [c63aecb41bfdfd6b7e1fac37c7cbe7bf]
             sensor_msgs/Image          [060021388200f6f0f447d0fcd9c64743]
             sensor_msgs/Imu            [6a62c6daae103f4ff57a132d6f95cec2]
topics:      /cam0/image_raw    3682 msgs    : sensor_msgs/Image         
             /cam1/image_raw    3682 msgs    : sensor_msgs/Image         
             /imu0             36820 msgs    : sensor_msgs/Imu           
             /leica/position    3099 msgs    : geometry_msgs/PointStamped
damon@damon-virtual-machine:/mnt/hgfs/Shared/datasets/EuRoC/MH_01_easy$ 

1.Ubuntu20.04安装kalibr

Ubuntu20.04安装kalibr

2.kalibr打包

damon@damon-virtual-machine:~/kalibr_ws$ source devel/setup.bash
damon@damon-virtual-machine:~/kalibr_ws$ devel/lib/kalibr/kalibr_bagcreater --folder /mnt/hgfs/Shared/datasets/EuRoC/MH_01_easy/mav0/ --output-bag /mnt/hgfs/Shared/datasets/EuRoC/MH_01_easy_kalibr.bag
importing libraries

此时,rosbag info如下

damon@damon-virtual-machine:~/kalibr_ws$ rosbag info /mnt/hgfs/Shared/datasets/EuRoC/MH_01_easy_kalibr.bag
path:        /mnt/hgfs/Shared/datasets/EuRoC/MH_01_easy_kalibr.bag
version:     2.0
duration:    3:04s (184s)
start:       Jun 25 2014 03:02:59.76 (1403636579.76)
end:         Jun 25 2014 03:06:03.81 (1403636763.81)
size:        2.5 GB
messages:    7364
compression: none [2455/2455 chunks]
types:       sensor_msgs/Image [060021388200f6f0f447d0fcd9c64743]
topics:      /cam0/image_raw   3682 msgs    : sensor_msgs/Image
             /cam1/image_raw   3682 msgs    : sensor_msgs/Image
damon@damon-virtual-machine:~/kalibr_ws$ rosbag info /mnt/hgfs/Shared/datasets/EuRoC/MH_01_easy.bag
path:        /mnt/hgfs/Shared/datasets/EuRoC/MH_01_easy.bag
version:     2.0
duration:    3:06s (186s)
start:       Jun 25 2014 03:02:59.81 (1403636579.81)
end:         Jun 25 2014 03:06:06.70 (1403636766.70)
size:        2.5 GB
messages:    47283
compression: none [2456/2456 chunks]
types:       geometry_msgs/PointStamped [c63aecb41bfdfd6b7e1fac37c7cbe7bf]
             sensor_msgs/Image          [060021388200f6f0f447d0fcd9c64743]
             sensor_msgs/Imu            [6a62c6daae103f4ff57a132d6f95cec2]
topics:      /cam0/image_raw    3682 msgs    : sensor_msgs/Image         
             /cam1/image_raw    3682 msgs    : sensor_msgs/Image         
             /imu0             36820 msgs    : sensor_msgs/Imu           
             /leica/position    3099 msgs    : geometry_msgs/PointStamped
damon@damon-virtual-machine:~/kalibr_ws$ 

Note:使用这个方法没有bag中imu0数据,有问题。还没解决。

3.报错

终端无法识别 kalibr_bagcreater 这个命令

damon@damon-virtual-machine:~/kalibr_ws$ kalibr_bagcreater
kalibr_bagcreater:未找到命令
  1. 检查是否存在 kalibr_bagcreater: 使用 find 命令搜索 kalibr_bagcreater 是否存在:
find . -name kalibr_bagcreater
  1. 如果 kalibr_bagcreater 存在,你可以通过完整路径运行它,例如:
devel/lib/kalibr/kalibr_bagcreater

基本上正确安装kalibr,到这一步就行了。

  1. 检查 PATH 环境变量: 如果你想通过简单的命令 kalibr_bagcreater 来调用它,可以检查是否将 devel/lib/kalibr 路径添加到 PATH 环境变量中:
echo $PATH

如果没有包含 ~/kalibr_ws/devel/lib/kalibr,你可以手动将该路径添加到 PATH:

export PATH=$PATH:~/kalibr_ws/devel/lib/kalibr

成功的话,则使用kalibr_bagcreater即可。

参考

6. EUROC公用数据集打包成ROSBAG方法


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2250040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

格网法计算平面点云面积(matlab版本)

1、原理介绍 格网法计算平面点云面积&#xff0c;其思想类似高中油膜法计算面积。其将点云投影到水平面&#xff0c;再将点云划分成尺寸相同的格网。最后&#xff0c;统计格网内包含点的数量number&#xff0c;那么可利用如下公式计算得到点云的面积&#xff1a; Aeranumber*L…

无代码实现可视化GIS+模型+三维

现在的工具是越来越方便了&#xff0c;本来不是做前端的。可以节省很多的人力和时间&#xff0c;更快的搭建自己想要的可视化大屏&#xff0c;看例子 主要由三维的gis地图和模型加上二维的数据表格分析来实现这个可视化界面。 gis地图的设置 每一个gis都要设置世界远点&#x…

Jmeter中的监听器

3&#xff09;监听器 1--查看结果树 用途 调试测试计划&#xff1a;查看每个请求的详细信息&#xff0c;帮助调试和修正测试计划。分析响应数据&#xff1a;查看服务器返回的响应数据&#xff0c;验证请求是否成功。检查错误&#xff1a;识别和分析请求失败的原因。 配置步骤…

kafka进阶_3.消费消息

文章目录 一、消费消息概览1.1、消费示例代码1.2、消费过程 二、消费者组2.1、push & pull2.2、消费者组 三、调度器Coordinator四、消费者分配策略4.1、引言4.2、分配基本流程4.3、分配策略4.3.1、轮询分配策略4.3.2、轮询分配策略 五、消费偏移量5.1、起始偏移量5.2、指定…

用VC2019+MFC 创建一个DLL封装MD工业相机库然后用EXE调用这个相机库采图并且显示

主要描述&#xff1a; 用VC2019MFC 创建一个DLL封装MD工业相机库&#xff0c;再建一个EXE调用这个相机库采图并且显示。 先创建库工程&#xff1a; 新建一个库工程&#xff0c; 创建完成&#xff0c;添加一个DllFunction.h头文件&#xff0c;一个DllFunction.cpp 源文件 拷贝…

ODB 框架

目录 概述 基本工作原理 映射C对象到数据库表 从数据库中加载对象 持久化C对象到数据库 ODB常用接口 表创建预处理 #pragma db Object table 数据表属性 id auto column&#xff08;“xxx”&#xff09; type("xxx") unique index null default&…

ModuleNotFoundError: No module named ‘_ssl‘ centos中的Python报错

1、检查系统有没有openssl&#xff0c;有的话&#xff0c;就是python安装时没有指定openssl openssl version&#xff0c;有输出版本号就有&#xff0c;没有的话&#xff0c;需要手动安装 下载地址 参见https://www.openssl.org/&#xff0c;包括以下版本&#xff1a; https:/…

小程序-基于java+SpringBoot+Vue的微信小程序养老院系统设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

linux高级系统编程之进程

进程 一个正在进行的程序 并行与并发 并行:执行的程序在不同CPU上同时执行 并发:一个CPU,多个进程交替执行,因为交替速度很快,所以从宏观上来看是同时执行的,但是从围观的角度是交替执行的 单道与多道 单道程序设计:所有进程一个一个排队执行,若A阻塞,B只能等待,,即使CPU处于空…

GitHub Copilot革命性更新:整合顶尖AI模型,如何重塑开发体验?

在技术快速发展的今天&#xff0c;代码辅助工具已成为提升开发效率的利器。今天&#xff0c;我们带来了一个激动人心的消息——GitHub Copilot宣布引入多模型选择功能&#xff0c;这不仅是技术上的一次飞跃&#xff0c;更是对开发者工作流程的一次革新。 多模型选择&#xff1a…

AppFlow:支持飞书机器人调用百炼应用

AppFlow&#xff1a;支持飞书机器人调用百炼应用 简介&#xff1a; 本文介绍了如何创建并配置飞书应用及机器人&#xff0c;包括登录飞书开发者后台创建应用、添加应用能力和API权限&#xff0c;以及通过AppFlow连接流集成阿里云百炼服务&#xff0c;最后详细说明了如何将机器…

华为E9000刀箱(HWE9000V2)服务器硬件监控指标解读

随着数据中心规模的不断扩大&#xff0c;服务器的稳定性和可靠性变得尤为重要。华为E9000刀箱&#xff08;HWE9000V2&#xff09;作为一款高性能的服务器设备&#xff0c;其硬件状态的实时监控对于保障业务的连续性和系统的稳定运行至关重要。 监控易作为一款专业的IT基础设施监…

GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解

GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解 目录 GWO-SVMD分解 | Matlab实现GWO-SVMD灰狼算法优化逐次变分模态分解效果一览基本介绍程序设计参考资料 效果一览 基本介绍 GWO-SVMD灰狼算法优化逐次变分模态分解 内有15种用以优化svmd的适应度函数&#…

景联文科技:高质量数据采集标注服务引领AI革新

在当今这个数字化时代&#xff0c;数据已经成为推动社会进步和产业升级的关键资源。特别是在人工智能领域&#xff0c;高质量的数据是训练出高效、精准的AI模型的基础。景联文科技是一家专业的数据采集与标注公司&#xff0c;致力于为客户提供高质量的数据处理服务&#xff0c;…

pycharm添加gitee插件

一、拉取gitee上托管的代码到本地&#xff0c;用pycharm运行 前置条件 1.安装python运行环境 2.安装pycharm 安装&#xff1a;https://blog.csdn.net/m0_65482549/article/details/141394352 1.3.安装git git config --global user.name “" git config --global user.em…

Echarts 绘制地图

一、Apache Echarts 官网地址&#xff1a;https://echarts.apache.org/ npm install echarts --save 二、获取地图的GeoJSON 地址&#xff1a;DataV.GeoAtlas地理小工具系列 左侧是地图&#xff0c;右侧是JSON数据路径&#xff0c;点击你想要生成的地图省市、地级&#xff0…

DHCP服务(包含配置过程)

目录 一、 DHCP的定义 二、 使用DHCP的好处 三、 DHCP的分配方式 四、 DHCP的租约过程 1. 客户机请求IP 2. 服务器响应 3. 客户机选择IP 4. 服务器确定租约 5. 重新登录 6. 更新租约 五、 DHCP服务配置过程 一、 DHCP的定义 DHCP&#xff08;Dynamic Host Configur…

html+css+js网页设计 旅游 厦门旅游网14个页面

htmlcssjs网页设计 旅游 厦门旅游网14个页面 网页作品代码简单&#xff0c;可使用任意HTML辑软件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html编辑软件进行运行及修改编辑等操作&#xff09;。 获取源码 1&am…

springboot(20)(删除文章分类。获取、更新、删除文章详细)(Validation分组校验)

目录 一、删除文章分类功能。 &#xff08;1&#xff09;接口文档。 1、请求路径、请求参数。 2、请求参数。 3、响应数据。 &#xff08;2&#xff09;实现思路与代码书写。 1、controller层。 2、service接口业务层。 3、serviceImpl实现类。 4、mapper层。 5、后端接口测试。…

现代化水库可视化管理平台:提升水库运行效率与安全保障

随着科技的飞速发展&#xff0c;现代化水利管理逐渐依赖于数字化、智能化手段。作为水利基础设施的重要组成部分&#xff0c;水库的管理不仅关乎水资源的合理利用&#xff0c;还关系到防洪、灌溉、供水等多项社会功能的实现。为了提升水库的管理水平&#xff0c;确保其运行安全…