ORB-SLAM2学习笔记5之EuRoc、TUM和KITTI开源数据运行ROS版ORB-SLAM2生成轨迹

news2025/1/11 16:00:00

文章目录

  • 0 引言
  • 1 数据预处理
    • 1.1 EuRoc数据
    • 1.2 TUM数据
    • 1.3 KITTI数据
  • 2 代码修改
    • 2.1 单目
    • 2.2 双目
    • 2.3 RGB-D
  • 3 运行ROS版ORB-SLAM2
    • 3.1 单目
    • 3.2 双目
    • 3.3 RGB-D
  • ORB-SLAM2学习笔记系列:

0 引言

ORB-SLAM2学习笔记1已成功编译安装ROS版本ORB-SLAM2到本地,本篇目的是用EuRoc、TUM、KITTI开源数据来运行ROSORB-SLAM2,并生成轨迹。

1 数据预处理

1.1 EuRoc数据

👉 EuRoc开源数据已经支持rosbag的数据包下载,如下图,直接点击对应的link下载即可,本文以Machine Hall 01为例:
请添加图片描述
下载的Machine Hall 01数据包,用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

1.2 TUM数据

👉 TUM开源数据已经支持rosbag的数据包下载,如下图,直接点击对应的ROS bag下载即可,本文以freiburg1_desk为例:
请添加图片描述
下载的freiburg1_desk数据包,用rosbag info rgbd_dataset_freiburg1_desk.bag 命令查看:

path:         rgbd_dataset_freiburg1_desk.bag
version:      2.0
duration:     23.8s
start:        May 10 2011 20:44:09.56 (1305031449.56)
end:          May 10 2011 20:44:33.32 (1305031473.32)
size:         371.7 MB
messages:     19893
compression:  bz2 [1210/1210 chunks; 29.85%]
uncompressed:   1.2 GB @ 52.3 MB/s
compressed:   370.9 MB @ 15.6 MB/s (29.85%)
types:        sensor_msgs/CameraInfo         [c9a58c1b0b154e0e6da7578cb991d214]
              sensor_msgs/Image              [060021388200f6f0f447d0fcd9c64743]
              sensor_msgs/Imu                [6a62c6daae103f4ff57a132d6f95cec2]
              tf/tfMessage                   [94810edda583a504dfda3829e70d7eec]
              visualization_msgs/MarkerArray [f10fe193d6fac1bf68fad5d31da421a7]
topics:       /camera/depth/camera_info     595 msgs    : sensor_msgs/CameraInfo        
              /camera/depth/image           595 msgs    : sensor_msgs/Image             
              /camera/rgb/camera_info       613 msgs    : sensor_msgs/CameraInfo        
              /camera/rgb/image_color       613 msgs    : sensor_msgs/Image             
              /cortex_marker_array         2360 msgs    : visualization_msgs/MarkerArray
              /imu                        11815 msgs    : sensor_msgs/Imu               
              /tf                          3302 msgs    : tf/tfMessage

1.3 KITTI数据

👉 KITTI开源数据是不支持rosbag的数据包下载,ORB-SLAM2学习笔记4 中已经下载非ROS版的KITTI数据data_odometry_poses,但本文又需要用rosbag的数据包,所以需要转换图片,时间戳等数据信息为rosbag数据包。

👉 推荐一个转换脚本:https://gitee.com/zengtaiping/image2rosbag_KITTIodometry
下载转换的脚本:

git clone https://gitee.com/zengtaiping/image2rosbag_KITTIodometry.git

下载后,进入到文件夹中,可发现如下的文件tree:

.
├── img2bag_kitti_MonoBag.py 
├── img2bag_kitti_odo.py      
├── img2bag_kitti_StereoBag.py # kitti转换成双目rosbag
├── kitti_republish.launch
└── README.md

0 directories, 5 files

然后执行如下命令(PATHdata_odometry_gray存放的路径,KITTI_StereoBag_seq00.bag可自行命名)来转换KITTI数据为rosbag数据,以下为 KITTI data_odometry_poses 中的 00 组数据,转换成双目rosbag为例:(也可用其他脚本转换成单目rosbag等)

python img2bag_kitti_StereoBag.py PATH/data_odometry_gray/dataset/sequences/00 KITTI_StereoBag_seq00.bag PATH/data_odometry_gray/dataset/sequences/00/times.txt

等待片刻,用命令rosbag info KITTI_StereoBag_seq00.bag 查看生成的rosbag

path:        KITTI_StereoBag_seq00.bag
version:     2.0
duration:    7:50s (470s)
start:       Jan 01 1970 08:00:00.00 (0.00)
end:         Jan 01 1970 08:07:50.58 (470.58)
size:        3.9 GB
messages:    9082
compression: none [4541/4541 chunks]
types:       sensor_msgs/Image [060021388200f6f0f447d0fcd9c64743]
topics:      camera/left/image_raw    4541 msgs    : sensor_msgs/Image
             camera/right/image_raw   4541 msgs    : sensor_msgs/Image

2 代码修改

由于ROS版本ORB-SLAM2中的图像topic都写死了,所以主要修改对应的图像topic名字为对应的开源数据图像topic的名字。

切记每次修改或统一修改后,执行./build_ros.sh重新编译。

2.1 单目

打开ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/ros_mono.cc文件,以使用EuRoc数据中的cam0图像topic名字 /cam0/image_raw为例,如下所示,大概在第64行代码处修改即可。

ros::NodeHandle nodeHandler;
// ros::Subscriber sub = nodeHandler.subscribe("/camera/image_raw", 1, &ImageGrabber::GrabImage,&igb);
ros::Subscriber sub = nodeHandler.subscribe("/cam0/image_raw", 1, &ImageGrabber::GrabImage,&igb);

2.2 双目

打开ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/ros_stereo.cc文件,以使用EuRoc数据中的cam0图像topic名字 /cam0/image_rawcam1图像topic名字 /cam1/image_raw为例,如下所示,大概在第112、113行代码处修改即可。

ros::NodeHandle nh;

// message_filters::Subscriber<sensor_msgs::Image> left_sub(nh, "/camera/left/image_raw", 1);
// message_filters::Subscriber<sensor_msgs::Image> right_sub(nh, "camera/right/image_raw", 1);
message_filters::Subscriber<sensor_msgs::Image> left_sub(nh, "/cam0/image_raw", 1);
message_filters::Subscriber<sensor_msgs::Image> right_sub(nh, "/cam1/image_raw", 1);

2.3 RGB-D

打开ORB_SLAM2/Examples/ROS/ORB_SLAM2/src/ros_rgbd.cc文件,以使用TUM数据中的rgb彩色图像topic名字 /camera/rgb/image_colordepth深度图像topic名字 /camera/depth/image为例,如下所示,大概在第68、69行代码处修改即可。

// message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nh, "/camera/rgb/image_raw", 1);
// message_filters::Subscriber<sensor_msgs::Image> depth_sub(nh, "camera/depth_registered/image_raw", 1);
message_filters::Subscriber<sensor_msgs::Image> rgb_sub(nh, "/camera/rgb/image_color", 1);
message_filters::Subscriber<sensor_msgs::Image> depth_sub(nh, "/camera/depth/image", 1);

3 运行ROS版ORB-SLAM2

3.1 单目

以使用EuRoc数据中的cam0图像topic名字 /cam0/image_raw为例,修改代码后,重新执行./build_ros.sh,然后执行以下ROS版本命令:

# 新开终端1
roscore
# 新开终端2   ORB-SLAM2工程目录下执行
rosrun ORB_SLAM2 Mono Vocabulary/ORBvoc.txt Examples/Monocular/EuRoC.yaml
# 新开终端3    MH_01_easy.bag 存放目录下执行
rosbag play MH_01_easy.bag

执行后,两个可视化页面ORB-SLAM2 Current FrameORB-SLAM2 Map Viewer开始有数据输入,如下图:
请添加图片描述
请添加图片描述
数据回放完毕后,还在该终端目录下保存了轨迹文件KeyFrameTrajectory.txt

3.2 双目

以使用1.3中转换的KITTI rosbag数据为例,左目图像topic名字 camera/left/image_raw右目图像topic名字 camera/right/image_raw为例,修改代码后,重新执行./build_ros.sh,然后执行以下ROS版本命令:

# 新开终端1
roscore
# 新开终端2   ORB-SLAM2工程目录下执行
rosrun ORB_SLAM2 Stereo Vocabulary/ORBvoc.txt Examples/Stereo/KITTI00-02.yaml false
# 新开终端3    MH_01_easy.bag 存放目录下执行
rosbag play KITTI_StereoBag_seq00.bag

执行后,两个可视化页面ORB-SLAM2 Current FrameORB-SLAM2 Map Viewer开始有数据输入,如下图:
请添加图片描述
请添加图片描述
数据回放完毕后,还在该终端目录下保存了三个文件:

Saving keyframe trajectory to KeyFrameTrajectory_TUM_Format.txt ...

trajectory saved!

Saving camera trajectory to FrameTrajectory_TUM_Format.txt ...

trajectory saved!

Saving camera trajectory to FrameTrajectory_KITTI_Format.txt ...

trajectory saved!

3.3 RGB-D

以使用TUM数据中的rgb彩色图像topic名字 /camera/rgb/image_colordepth深度图像topic名字 /camera/depth/image为例,修改代码后,重新执行./build_ros.sh,然后执行以下ROS版本命令:

# 新开终端1
roscore
# 新开终端2   ORB-SLAM2工程目录下执行
rosrun ORB_SLAM2 RGBD Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yaml
# 新开终端3    MH_01_easy.bag 存放目录下执行
rosbag play rgbd_dataset_freiburg1_desk.bag

执行后,两个可视化页面ORB-SLAM2 Current FrameORB-SLAM2 Map Viewer开始有数据输入,如下图,Map Viewer 可视化有问题,轨迹在中心处聚集:
请添加图片描述
仔细排查后,TUM 官网已经说明,如果用的是16-bit PNG图片数据,factor=5000,但如果用的是 32-bit ROS bag数据,factor=1

factor = 5000 # for the 16-bit PNG files
# OR: factor = 1 # for the 32-bit float images in the ROS bag files

所以打开对应的Examples/RGB-D/TUM1.yaml文件,修改DepthMapFactor参数为 1.0

# Deptmap values factor
# DepthMapFactor: 5000.0
DepthMapFactor: 1.0

然后重新执行rosrun ORB_SLAM2 RGBD Vocabulary/ORBvoc.txt Examples/RGB-D/TUM1.yamlrosbag play rgbd_dataset_freiburg1_desk.bag ,如下图,Map Viewer可视化问题解决:
请添加图片描述
请添加图片描述
数据回放完毕后,还在该终端目录下保存了轨迹文件KeyFrameTrajectory.txt

至此,成功用EuRoc、TUM、KITTI开源数据来运行ROSORB-SLAM2,并生成轨迹。

此外,如果需要用evo评估工具来评估ROSORB-SLAM2生成的轨迹和真值轨迹,可参考之前的ORB-SLAM2学习笔记。

ORB-SLAM2学习笔记系列:

  • ORB-SLAM2学习笔记1之Ubuntu20.04+ROS-noetic安装ORB-SLAM2
  • ORB-SLAM2学习笔记2之TUM开源数据运行ORB-SLAM2生成轨迹并用evo工具评估轨迹
  • ORB-SLAM2学习笔记3之EuRoc开源数据集运行ORB-SLAM2生成轨迹并用evo工具评估轨迹
  • ORB-SLAM2学习笔记4之KITTI开源数据集运行ORB-SLAM2生成轨迹并用evo工具评估轨迹

Reference:

  • https://gitee.com/zengtaiping/image2rosbag_KITTIodometry
  • https://cvg.cit.tum.de/data/datasets/rgbd-dataset/file_formats#intrinsic_camera_calibration_of_the_kinect



须知少时凌云志,曾许人间第一流。



⭐️👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍👍🌔

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

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

相关文章

3、基于Zookeeper实现分布式锁

目录 3.1、Zookeeper安装和相关概念3.1.1 安装启动3.1.2 相关概念3.1.3 Java客户端 3.2 Zookeeper实现分布式锁的思路分析3.3 ZooKeeper分布式锁的基本实现 3.1、Zookeeper安装和相关概念 3.1.1 安装启动 # 解压到/mysoft文件夹下 tar -zxvf zookeeper-3.7.0-bin.tar.gz # 重…

SAP从放弃到入门系列之批次派生-Batch Derivation-Part1

文章目录 一、概述二、系统配置三、主数据3.1 分类主数据3.2 派生规则设置3.2.1发送物料3.2.2 接收物料 四、 测试数据&#xff08;生产订单&#xff09;五、 最后 Batch Derivation翻译成批次派生&#xff08;衍生&#xff09;或批次继承都是问题不大&#xff0c;继承和派生个…

day31贪心算法 用最少数量的箭引爆气球 和无重叠区间

题目描述 题目分析&#xff1a; x轴向上射箭&#xff0c;12一支&#xff0c;重叠的需要一支&#xff0c;3-8一支&#xff0c;7-16一支 返回2&#xff1b; 就是让重叠的气球尽量在一起&#xff0c;局部最优&#xff1b;用一支弓箭&#xff0c;全局最优就是最少弓箭&#xff1b…

ShardingSphere分库分表实战之MySQL主从集群搭建

&#x1f680; ShardingSphere &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&…

uniapp 微信小程序 uni.modal弹框+content内容自定义(内容换行)

效果图&#xff1a; 1、template <view click"showPriceDialog"></view>2、data data() {return {contentText:"",} },3、methods // 价格公示 showPriceDialog: function() {// 吨let minPriceTon 1900let maxPriceTon 3895// 袋let …

23.多项式与非多项式曲线拟合对比(matlab程序)

1.简述 拟合标准&#xff1a; (1)原始数据向量与拟合向量之间的距离最小&#xff0c;该距离的度量一般使用误差平方和表示&#xff0c;即均方误差&#xff1a;R||Q-Y||22 (2)当均方误差最小时&#xff0c;说明构造的拟合向量与原始向量最为接近&#xff0c;这种曲线拟合的方法…

sql中group by 的使用

1、概述 Group By 从字面意义上理解就是根据By指定的规则对数据进行分组&#xff0c;所谓的分组就是将一个数据集划分为若干个小区域&#xff0c;然后针对若干个小区域进行数据处理 2、原始表 3、简单的Group By 示例1 select 类别&#xff0c;数量 as 数量之和 from A gro…

easyui Uncaught TypeError: Cannot read properties of null (reading ‘width‘)

问题描述 在将easyui1.3.6版本替换为1.7版本的时候。只有表头显示出来了&#xff0c;内容并没有显示出来&#xff0c;且报异常。表头也没有按照期望的宽度正常显示。错误提示如下 问题原因及解决办法 该问题出现的原因是因为该表格的表头涉及到跨行跨列问题&#xff0c;原因…

2023年国际高校数学建模竞赛A题:购物网站的数据分析

数据处理&#xff1a; Appendix II的词频统计和数据可视化&#xff1a; 代码: 代码注释完美&#xff0c;可直接运行&#xff0c;简单易用&#xff0c;不懂可以直接问我&#xff0c;在线答疑。 四个题目的代码获取&#xff1a; 可直接运行代码 可直接运行代码 可直接运行…

小程序自定义步骤条实现

效果展示&#xff1a; 支持背景颜色自定义 <view class"hl_steps"><view class"hl_steps_item" wx:for"{{steps}}" wx:key"id"><view class"hl_steps_item_circle_out" style"background-color: {{col…

数据可视化——如何绘制地图

文章目录 前言如何绘制地图添加配置项 根据已有数据绘制地图整体代码展示 前言 前面我们学习了如何利用提供的数据来对数据进行处理&#xff0c;然后以折线图的形式展现出来&#xff0c;那么今天我将为大家分享如何将提数据以地图的形式展现。 如何绘制地图 前面我们绘制折线…

Flutter动画库:animations(路由过渡动画或者页面切换动画)

animations animations 是一个 Flutter 库&#xff0c;它提供了一组用于创建动画效果的工具和组件。这个库的核心重点是路由过渡动画或者页面切换动画 地址 https://pub-web.flutter-io.cn/packages/animations 安装 flutter pub add animations看了下官方文档和官方例子&a…

编程规范—代码风格

先看以下两段代码。 对于计算机来说&#xff0c;这两段代码并没有什么区别&#xff0c;都可以执行&#xff0c;执行结果也一样。但是对于我们人类来说&#xff0c;第二段代码显然看起来更舒适&#xff0c;程序的可读性也更强&#xff0c;跟写作文类似&#xff0c;把所有内容挤在…

RocksDB架构

1、rocksdb是什么? RocksDB中文网 | 一个持久型的key-value存储 rocksdb是一种KV存储引擎&#xff0c;常用于数据库存储数据&#xff0c;无法直接使用&#xff0c;没有提供sql命令&#xff0c;通过调用rocksdb提供的api进行数据库的读写等操作。 rocksdb是以leveldb为基础开…

WinCE OSDesign项目创建模拟器

vs2005创建OSDesign项目&#xff0c;WinCE6 1.解决方案管理器&#xff0c;项目鼠标右键属性 默认语言设置 编译选项 2.主菜单&#xff1a;Target->Connectivity Options Add Device/Remove Device不用管 Kernel Service Map Core Service Settings默认 Service Status默…

网络安全(黑客)自学路线笔记

一、什么是黑客&#xff1f; 黑客泛指IT技术主攻渗透窃取攻击技术的电脑高手&#xff0c;现阶段黑客所需要掌握的远远不止这些。 二、为什么要学习黑客技术&#xff1f; 其实&#xff0c;网络信息空间安全已经成为海陆空之外的第四大战场&#xff0c;除了国与国之间的博弈&am…

企业微信在ios机型无法吊起打开个人信息页接口(openUserProfile)

wx.qy.openUserProfile({type: 1,//1表示该userid是企业成员&#xff0c;2表示该userid是外部联系人userid: "wmEQlEGwAAHxbWYDOK5u3Af13xlYAAAA", //可以是企业成员&#xff0c;也可以是外部联系人success: function(res) {// 回调} });遇到的问题&#xff1a;调用打…

flutter开发实战-实现推送功能Push Notification

flutter开发实战-实现推送功能Push Notification 推送服务现在可以说是所有 App 的标配了&#xff0c;最近在Flutter工程项目上实现推送功能。flutter上实现推送功能需要依赖原生的功能&#xff0c;需要插件实现&#xff0c;这里使用的是极光推送的服务。 一、效果图 效果图…

整车总线系列——FlexRay 七

整车总线系列——FlexRay 七 我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 没有人关注你。也无需有人关注你。你必须承认自己的价值&#xff0c;你不能…

swagger对json数据的处理

在实习中遇到了一个不寻常的事情&#xff0c;今天和同事讨论一个小问题&#xff0c;同事使用swagger&#xff0c;想要调用一个接口&#xff0c;这个接口要传递一个json对象&#xff0c;对应java的一个实体类&#xff0c;但是有一个属性同事不想看到它&#xff0c;就用JsonIgnor…