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

news/2024/12/22 0:05:59/

尝试关于单目视觉 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

一、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算法

2016年,Raul 等人提出了ORB-SLAM 算法,它是一个开源的 SLAM 算法,该算法支持单目、双目和 RGB-D 相机,在大多数环境中均可以运行。该系统在环境场景变化较快以及移动平台高速移动的情况下也有很好的鲁棒性。 ORB-SLAM 系统采用的是基于特征点方法对相机的轨线进行实时计算,并根据提取的特征点和计算出的轨迹生成周围环境的三维稀疏特征点地图为了增加ORB-SLAM算法的应用性,作者在其基础上提出了支持双目相机和RGB-D相机的ORBSLAM2系统。为实现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,用来解决带边界约束的非线性最小二乘问题

ORB-SLAM2
需要做多模态融合的工作,ORB-SLAM2很多需要修改,不能直接使用
在这里插入图片描述

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


http://www.ppmy.cn/news/69892.html

相关文章

力扣sql中等篇练习(二十二)

力扣sql中等篇练习(二十二) 1 坚定的友谊 1.1 题目内容 1.1.1 基本题目信息 1.1.2 示例输入输出 1.2 示例sql语句 # Write your MySQL query statement below # ①求出所有朋友关系的总表 WITH T as (SELECT user1_id ,user2_idFROM friendshipUNION SELECT user2_id user1…

SpringBoot 日志文件

1.日志的作用 日志是程序的重要组成部分,最常见的,当程序报错时,打开控制台就能看到报错信息,这些就是日志.通过日志,可以看到错误信息,找到错误原因 除了发现和定位问题,日志还能实现这些实用的功能: 记录用户登录日志,分析用户是正常登录还是恶意破解用户(用来分析用户的行…

Blender基础技巧小结(二)

本文续前一篇:Blender基础技巧小结_皮尔斯巴巴罗的博客-CSDN博客 由于2.83开始使用的是新版ui,但是2.83文档内并没有更新,所以最好参考3.3版文档 https://docs.blender.org/manual/zh-hans/3.3/interface/controls/buttons/menus.html 缩…

Vite 是如何站在巨人的肩膀上实现的

所谓的巨人,指的就是 Vite 底层所深度使用的两个构建引擎——Esbuild和Rollup。这两个构建引擎对于 Vite 来说究竟有多重要呢?在 Vite 的架构中,这两者各自扮演了什么样的角色?接下来,我们一起拆解 Vite 的双引擎架构&…

初始化vue中data中的数据

当组件的根元素使用了v-if的时候, 并不会初始化data中的数据 如果想完全销毁该组件并且初始化数据,需要在使用该组件的本身添加v-if 或者是手动初始化该组件中的数据 初始化化数据的一些方法 Object.assign(this.$data, this.$options.data()) this.$data:当前的da…

约翰霍普金斯大学诺奖得主涉嫌造假,撤回5篇PNAS论文

2019年,约翰霍普金斯大学的著名基因医学科学家Gregg L. Semenza博士因为“发现细胞如何感知和适应氧气供应”,和另外两名科学家( William Kaelin Jr. and Peter J. Ratcliffe)分享当年的生理医学诺贝尔奖。 近期,Gregg…

unittest自动化测试框架讲解以及实战

为什么要学习unittest 按照测试阶段来划分,可以将测试分为单元测试、集成测试、系统测试和验收测试。单元测试是指对软件中的最小可测试单元在与程序其他部分相隔离的情况下进行检查和验证的工作,通常指函数或者类,一般是开发完成的。 单元…

指令流和数据流

指令流和数据流 Flynn于1972年提出计算平台分类法主要根据指令流和数据流来分类,分为四类: ①单指令流单数据流机器(S1SD) SISD机器是一种传统的串行计算机,它的硬件不支持任何形式的并行计算,所有的指令都是串行执…