关于单目视觉 SLAM 的空间感知定位技术的讨论

尝试关于单目视觉 SLAM 的空间感知定位技术的学习,做以调查。SLAM算法最早在机器人领域中提出,视觉SLAM又可以分为单目、双目和深度相机三种传感器模式,在AR应用中通常使用轻便、价格低廉的单目相机设备。仅使用一个摄像头作为传感器完成同步定位与地图创建操作,具有系统结构简单、成本低且易实现等优点。

正是尺度不确定性才使得单目SLAM 能够在大尺度和小尺度环境之间进行自由转换。所以单目视觉SLAM成为增强现实领域的研究热点。我近期的工作将从以下几个方面进行阐述:PTAM算法、ORB-SLAM2算法、ORB-SLAM3算法。

文章目录

    • 一、PTAM算法
      • 1、PTAM算法复现
        • (1)配置PTAM算法
        • (2)转化灰度图
        • (3)标定相机
        • (3)运行PTAM
      • 2、PTAM 算法总结
    • 二、ORB-SLAM2算法
      • 1、Pangolin库
      • 2、OpenCV(C++版)
      • 3、Eigen
      • 4、点云库PCL(Point Cloud Library)
      • 5、非线性优化库G2O
      • 6、Ceres
      • 7、视觉和惯性数据融合
      • 8、各传感器的时间同步
    • 三、ORB-SLAM3算法
      • 1、ROS系统
      • 2、张正友相机标定方法
      • 3、IMU模式
      • 4、INDMIND的IMU相机
      • 5、ORB-SLAM3算法总结

一、PTAM算法

1、PTAM算法复现

PTAM算法是2007年提出的经典的单目特征点法SLAM,同时也是早期将SLAM和AR结合起来的工作之一。虽然PTAM几乎已经过时,但其在整个SLAM发展过程中占有重要地位。

首先我跑了经典算法PTAM,全称Parallel Tracking And Mapping,是最早提出将Track和Map分开作为两个线程的一种SLAM算法,是一种基于关键帧的单目视觉SLAM算法。
David等人提出PTAM,第一个使用非线性优化的方法也是第一个将BA与视觉SLAM相结合的方法,首次出现前后端的概念,为后来视觉SLAM提供了良好思路。

PTAM是视觉SLAM领域里程碑式的项目。在此之前,MonoSLAM为代表的基于卡尔曼滤波的算法架构是主流,它用单个线程逐帧更新相机位置姿态和地图。地图更新的计算复杂度很高,为了做到实时处理(30Hz),MonoSLAM每帧图片只能用滤波的方法处理约10~12个最稳定的特征点。PTAM最大的贡献是提出了tracking、mapping双线程的架构,tracking线程只需要逐帧更新相机位置姿态,可以很容易实现实时计算;而mapping线程并不需要逐帧更新,有更长的处理时间,原来只能用在离线SfM(Structure from Motion)的BA(Bundle Adjustment)也可以用起来。这种基于优化的算法比滤波法在单位计算时间可以得到更高的精度。这种多线程的处理方式也更顺应现代CPU的发展趋势。之后的视觉SLAM算法几乎全部沿用了这一思想。

(1)配置PTAM算法

使用PTAM算法需要①安装ROS kinetic②编译PTAM③获取PTAM并编译④标定相机
相机标定已有很多开源的工具,比如Matlab、OpenCV和ROS都提供了一些工具包。这里使用PTAM自带的工具进行标定。首先在一个新的终端打开roscore。然后启动相机并发布消息,不同的相机需要打开不同的launch文件。

(2)转化灰度图

因为PTAM标定要求输入为灰度图像,必须首先将彩色的image_raw转换为灰度图,否则会出现issues#78 这样的图像重影模糊问题。因此使用的自带的image_proc节点来转换:
这时再查看rostopic list会发现多了很多topic,其中camera/image_mono表示灰度图。
然后需要根据相机的情况,对~/catkin_ws/src/ethzasl_ptam/ptam/PtamFixParams.yaml更改相关的配置参数:

(3)标定相机

接着运行标定节点,记得将变量名重新映射(remap)一下即可:
至此就可以开始标定相机了,标定后将保存文件camera.cfg。

(3)运行PTAM

在这里插入图片描述

2、PTAM 算法总结

它既可以提供实时的定位和建图,也可以在虚拟平面上叠加虚拟物体,PTAM算是早期的结合AR 的SLAM 工作之一。与许多早期工作相似,存在着明显的缺陷:场景小,跟踪容易丢失,等等。这些又在后续的方案中得以修正。

二、ORB-SLAM2算法

到目前为止,ORB-SLAM 是最完整的基于特征点法 VSLAM, 它可以看做是 PTAM 的一个延伸。2016年,Raul 等人提出了ORB-SLAM 算法,它是一个开源的 SLAM 算法,该算法支持单目、双目和 RGB-D 相机,在大多数环境中均可以运行。该系统在环境场景变化较快以及移动平台高速移动的情况下也有很好的鲁棒性。ORB-SLAM 系统采用的是基于特征点方法对相机的轨线进行实时计算,并根据提取的特征点和计算出的轨迹生成周围环境的三维稀疏特征点地图为了增加ORB-SLAM算法的应用性,作者在其基础上提出了支持双目相机和RGB-D相机的ORB-SLAM2系统。为实现ORB-SLAM2需要实现一些数学库以及理解原理。

1、Pangolin库

可视化的库,SLAM的可视化绘图库,基于OpenGL的,主要优势在于使用比OpenGL简单

2、OpenCV(C++版)

开源的计算机视觉编程程序库,强大的计算机视觉库,相机标定和三维重建算法,如SfM和PnP等。

3、Eigen

适用范围广,支持包括固定大小、任意大小的所有矩阵操作,甚至是稀疏矩阵;支持所有标准的数值类型,并且可以扩展为自定义的数值类型;支持多种矩阵分解及其几何特征的求解;它不支持的模块生态系统提供了许多专门的功能,如非线性优化,矩阵功能,多项式解算器,快速傅立叶变换等。

4、点云库PCL(Point Cloud Library)

实现了大量点云相关的通用算法和高效的数据管理。

5、非线性优化库G2O

在SLAM领域就是预测值或者说是基于模型的预期结果和测量之间的误差,使用G2O解决优化问题。

6、Ceres

谷歌开发C++库Ceres Solver,用来解决带边界约束的非线性最小二乘问题

7、视觉和惯性数据融合

只依赖单目视觉SLAM,感知定位效果仍然不能够满足,ORB-SLAM2可以借助IMU传感器提高提取精度,视觉和惯性数据融合的第一步,是一段松耦合过程,视觉SLAM常见的QR分解SVD分解等矩阵分解方式求解满秩和亏秩最小二乘问题,需要做多模态融合的工作,ORB-SLAM2很多需要修改,不能直接使用。

8、各传感器的时间同步

通过ROS系统对单目相机和IMU发布的话题进行数据交换,IMU初始化会出现问题

在这里插入图片描述

三、ORB-SLAM3算法

ORB-SLAM3在2的基础上,引进了IMU的初始化和融合估计,以及子地图功能。
ORB-SLAM3有IMU模式,ORB-SLAM3的回环检测方法相比于2的有所改进,首先确定的一个地方是:即使系统中存在子地图,我们也只会存储唯一的一个BOW数据集,而每个关键帧都会存储各自所在的子地图,以此来加以区分。具体的回环检测策略大体上与ORB-SLAM2并无太大的区别,为了满足实时性的要求需要在ROS下跑ORB-SLAM3。

1、ROS系统

ROS全称Robot Operating System(机器人操作系统), 集成了大量的工具,库,协议,提供类似OS所提供的功能,SLAM在ROS下跑和非ROS下跑的区别:可以把ROS理解成Linux下集成了许多好用的第三方和多进程编程的一个库集。在ROS下跑SLAM可以使用ROS的许多成熟的方法库。比如进程间通信可以默认使用ROSMaster建立的本地socket通信。不在ROS下跑,很多进程间通信、同步、回调之类的就需要自己去设计。

Ubuntu20.04的ROS环境安装ORB-SLAM3,执行单目实时usb_cam效果,
在这里插入图片描述

2、张正友相机标定方法

在ROS中已经集成了对相机完成标定以及畸变矫正的整个流程,用起来非常方便。通常使用张正友相机标定方法,即利用平面坐标的单应性关系,流程简洁,注意标定过程中左右,上下,前后,对角方向前后倾斜标定板,这样使得右边X,Y,Size,Skew保存到相机配置文件中,将标定结果保存至本地。

3、IMU模式

预积分的计算原理主要是根据物理运动公式计算,即加速度,速度和位移之间的计算关系。在ORB-SLAM3中,IMU预积分最早是从第2帧开始的,因为是使用当前帧和上一帧之间的IMU数据,所以只能从第二帧开始。

4、INDMIND的IMU相机

实验室做视觉SLAM需要IMU相机,购入INDEMIND双目惯性模组运行多模态融合的感知定位,根据官方例程加以改进,运行实例并记录。IDEMIND这款双目摄像头可以匹配ubuntu18.04和ubuntu16.04两个版本的ubuntu,但是最好使用ubuntu16.04版本。
双目惯性模组 SDK1.4.2 版本改进了不少,官网上关于ROS环境下的教程十分简略,直接按照官网的步骤无法实现相机数据读取并发布到指定的topic上,在源码上进行修改,重新建构一个ROS节点发布话题。

修改ORB-SLAM3源码的跟踪线程,当前配置IMU相机使用yaml把相机外参对齐,写了一个Tbc,添加IMU积分后的数据还算稳定,IMU的加入使ORB-SLAM3能够完成对Roll、Pitch的估计,并对ORB特征点跟踪失败后仍能利用IMU的输出维持一段时间的定位。

在这里插入图片描述

5、ORB-SLAM3算法总结

目前能够编译运行诸如此类的特征法SLAM开源项目了,虽然初学经历了各种尝试,但是熟悉了Linux系统和ROS系统的操作、cmake、shell、OpenCV等等,为了能够自己进行开发,还需要更深入的学习。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

prettier 使用详细介绍

prettier 使用详细介绍 prettier是一个代码格式化工具,可以通过自定义规则来重新规范项目中的代码,去掉原始的代码风格,确保团队的代码使用统一相同的格式。 安装 npm i prettier -Dyarn add prettier --dev创建一个prettierrc.*配置文件&…

六级备考28天|CET-6|听力第二讲|长对话满分技巧|听写技巧|2022年6月考题|14:30~16:00

目录 1. 听力策略 2. 第一二讲笔记 3. 听力原文复现 (5)第五小题 (6)第六小题 (7)第七小题 (8)第八小题 扩展业务 expand business 4. 重点词汇 1. 听力策略 2. 第一二讲笔记 3. 听力原文复现 (5)第五小题 our guest is Molly Sundas, a university stud…

learn C++ NO.5 ——类和对象(3)

日期类的实现 在前面类和对象的学习中,由于知识多比较多和碎,需要一个能够将之前所学知识融会贯通的东西。下面就通过实现日期类来对类和对象已经所学的知识进行巩固。 日期类的基本功能(.h文件) //Date.h//头文件内容 #includ…

【数据结构】广度优先遍历(BFS)模板及其讲解

🎊专栏【数据结构】 🍔喜欢的诗句:更喜岷山千里雪 三军过后尽开颜。 🎆音乐分享【勋章】 大一同学小吉,欢迎并且感谢大家指出我的问题🥰 目录 🎁定义 🎁遍历方法 🎁根…

什么是边缘计算盒子?边缘计算盒子可以做什么?一文带你了解边缘计算云服务器 ECS

上文,我们已经为大家介绍了什么是边缘计算、边缘计算的诞生、以及边缘计算与CDN之间的关系,感兴趣的小伙伴欢迎阅读以往文章: 边缘计算节点是啥?边缘计算与CDN有什么关系?一文带你了解边缘计算节点BEC(1&am…

nest笔记十一:一个完整的nestjs示例工程(nestjs_template)

概述 链接:nestjs_template 相关文章列表 nestjs系列笔记 示例工程说明 这个工程是我使用nestjs多个项目后,总结出来的模板。这是一个完整的工程,使用了yaml做为配置,使用了log4js和redis和typeorm,sawgger&#…

Elasticsearch 集群部署插件管理及副本分片概念介绍

Elasticsearch 集群配置版本均为8以上 安装前准备 CPU 2C 内存4G或更多 操作系统: Ubuntu20.04,Ubuntu18.04,Rocky8.X,Centos 7.X 操作系统盘50G 主机名设置规则为nodeX.qingtong.org 生产环境建议准备单独的数据磁盘主机名 #各自服务器配置自己的主机名 hostnamectl set-ho…

STM32实现基于RS485的简单的Modbus协议

背景 我这里用STM32实现,其实可以搬移到其他MCU,之前有项目使用STM32实现Modbus协议 这个场景比较正常,很多时候都能碰到 这里主要是Modbus和变频器通信 最常见的是使用Modbus实现传感器数据的采集,我记得之前用过一些传感器都…

学习RHCSA的day.03

目录 2.6 Linux系统的目录结构 2.7 目录操作命令 2.8 文件操作命令 2.6 Linux系统的目录结构 1、Linux目录结构的特点 分区加载于目录结构: 使用树形目录结构来组织和管理文件。整个系统只有一个位于根分区的一个根目录(树根)、一棵树。…

盘点 | 10大类企业管理系统有哪些

人类的发展史也是一部工具的进化史,企业管理手段同样不例外。移动互联网时代给了传统低下的手工操作方式致命一击,应运而生的各类企业管理系统工具为企业管理插上腾飞的翅膀,彻底颠覆了手动低效率的历史,变得更加移动化、智能化。…

求最小生成树(Prim算法与Kruskal算法与并查集)

目录 1、案例要求2、算法设计与实现2.1 Prim算法2.1.1 构造无向图2.1.2 编写Prim算法函数2.1.3 实现代码2.1.4 运行结果截图 2.2 Kruskal算法2.2.1 构造无向图2.2.2 编写并查集UnionFind类2.2.3 编写Kruskal算法2.2.4 实现代码2.2.5 运行结果截图 3、总结 1、案例要求 利用贪心…

低代码与其拓荒,不如颠覆开发行业

目录 一、前言 二、低代码是一个值得信赖的“黑盒子” 粗略总结,开发者对低代码平台所见即所得设计器有两种反应: 三、人人都爱黑盒子 四、用“低代码平台”来开发是什么样的感受? 五、结论 一、前言 在科幻电影中,我们看到…

【OpenCV】C++红绿灯轮廓识别+ROS话题实现

目录 前言 一、背景知识 Opencv轮廓检测 ROS相关知识 二、环境依赖 三、具体实现 Step1:初始化ROS,订阅话题 Step2:接收话题,进入回调 1. 帧处理 2. 膨胀腐蚀处理 Step3:红绿特征处理 1. 提取绘制轮廓 2…

【网络协议详解】——数据链路层协议(学习笔记)

📖 前言:数据链路层是 OSI 模型中的第二层,位于物理层之上,是通信网络中的重要组成部分之一。数据链路层协议负责将网络层传输的数据分组封装成帧,传输到物理层,并通过物理介质进行传输。同时,数…

算法笔记:A2-A4-RSRQ切换算法

1 LTE 切换 LTE切换是移动通信网络中的一个过程,移动设备在保持无间断服务的情况下,将其连接从一个基站切换到另一个基站。当移动设备离开当前基站的覆盖范围或网络资源拥塞时,就需要进行切换。LTE切换通常是基于特定的条件触发的&#xff0…

makefile 学习(1):C/C++ 编译过程

1. GCC 介绍 1.1 介绍 GCC 官方文档 https://gcc.gnu.org/onlinedocs/ 官方文档是最权威的,网上所有的答案都来自官方文档国内论坛参差不齐,找到好的答案比较花时间,并且很容易被错误的文档误导。所以推荐看官方文档靠谱点,并且…

二、数据字典开发

文章目录 二、数据字典开发1、搭建service-cmn模块1.1 搭建service-cmn模块1.2 修改配置1.3 启动类 2、数据字典列表2.1 数据字典列表接口2.1.1 model模块添加数据字典实体2.1.2 添加数据字典mapper2.1.4 添加数据字典controller 2.2 数据字典列表前端2.2.1 添加路由2.2.2 定义…

【Java算法题】剑指offer_01数据结构

前言 刷题链接: https://www.nowcoder.com/exam/oj/ta?page2&tpId13&type265 1. 链表 JZ24 反转链表 思路:基本操作,如下所示。 /* public class ListNode {int val;ListNode next null;ListNode(int val) {this.val val;} }…

ad18学习笔记一

如何自学altium designer如何自学altium designer? - 知乎如何自学altium designer 这里面有ad官方推荐的b站的视频:可以直接去b站关注ad官方账号 AltiumChina,它本身就发布了很多实用教程。 在知乎的这个界面也有Altium Designer Ver18_官…

c++ 11标准模板(STL) std::set(六)

定义于头文件 <set> template< class Key, class Compare std::less<Key>, class Allocator std::allocator<Key> > class set;(1)namespace pmr { template <class Key, class Compare std::less<Key>> using se…