菜鸟专学:从头到尾创建自己的SLAM系统(转载,我觉这种自己写一个SLAM很好)

2023-12-18 05:08

本文主要是介绍菜鸟专学:从头到尾创建自己的SLAM系统(转载,我觉这种自己写一个SLAM很好),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自:https://blog.csdn.net/qq_29797957/article/details/98661883?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_title-0&spm=1001.2101.3001.4242

菜鸟专学:从头到尾创建自己的SLAM系统

爱发呆de白菜头 2019-08-06 21:14:40 1509 收藏 6
分类专栏: 创建和维护自己的SLAM系统 文章标签: SLAM 点云地图 octomap
版权
事件相机DAVIS
2019.9.4开始研究事件相机的工作原理和相关算法的实现,主要涉及机器人定位、地图构建以及运动跟踪等方法的研究和分析。
爱发呆de白菜头
¥9.90

RobotSlamApplication项目二: 小型SLAM系统

研究背景: 因为之前比较浮躁,总是喜欢研究别人的库然后测试跑通,效果好就拿来修修改改、然后测试测试就用,效果不好就抛弃。自己没有潜心下来真正写过一个系统,这次从头到尾写一个SLAM系统,写的过程真的不容易,写完就感觉舒畅多了。。

一、前言

RGB-D 相机的优点和缺点(结构光深度相机)

优点:

  1. 适合在光照不足,缺乏纹理的场景中使用;
  2. 在一定范围内可以达到较高的测量精度;
  3. 技术成熟,深度图像可以做到较高的分辨率;

缺点:

  1. 室外环境中基本不能使用;
  2. 测量距离较近;
  3. 容易受到光滑平面反光的影响。

二、相机的位姿估计

基于ORB特征点法获取不同帧图像之间的变换(这个方法原理很多大牛都讲过,这里就不多说), 主要涉及以下部分:

1. 特征点的提取和匹配:

在实时获取图像数据的过程中,这一环节需要注意图像帧的获取,这里的帧包括当前帧和参考帧(也就是上一时刻的图像帧),当我们计算图像的匹配时,需要区分不同时刻的帧,以计算相邻帧之间图像变换。

即,在初始时刻,将当前帧赋给参考帧,然后在相机运动跟踪过程中,执行完每一次的图像匹配和跟踪之后,都要将当前帧进行转换之后赋给参考帧,以实现"帧"的更新。

		case INITIALIZING:{state_ = OK;curr_frame = ref_frame = frame;....break;}case OK:{curr_frame = frame;....if ( CameraPoses is OK ... ){curr_frame->T_c_w_ = T * ref_frame->T_c_w_; ref_frame = curr_frame;....}else {.....}}

2. 相机位姿估算;

相机位姿的估算也有很多种方式:2d-2d(本质矩阵、单应矩阵计算求解), 3d-2d(PnP求解), 3d-3d(SVD+BA求解)。
在这些方法中使用比较多的就是PnP方法,而PnP求解也比较简单,可以直接调用OpenCV的方法。

	bool solvePnPRansac( InputArray objectPoints, InputArray imagePoints,InputArray cameraMatrix, InputArray distCoeffs,OutputArray rvec, OutputArray tvec,bool useExtrinsicGuess = false, int iterationsCount = 100,float reprojectionError = 8.0, double confidence = 0.99,OutputArray inliers = noArray(), int flags = SOLVEPNP_ITERATIVE );bool solvePnP( InputArray objectPoints, InputArray imagePoints,InputArray cameraMatrix, InputArray distCoeffs,OutputArray rvec, OutputArray tvec,bool useExtrinsicGuess = false, int flags = SOLVEPNP_ITERATIVE );

我自己测试tum的测试集获得相机运动轨迹(视觉里程计:VO)如下图:

在这里插入图片描述

三、地图创建1

在完成视觉里程计模块之后,接下来就是地图的创建和更新,由于时间有限,我又想完整整个SLAM系统所以对于地图的优化部分就没有深入调试,目前只完成了初步地图的创建和更新。第一步,构建点云地图如下:

在这里插入图片描述
看到这个样子的地图是不是要疯了。。。



不用着急,在经过仔细的对比调试之后, 发现其实是由于当前帧和参考帧之间的变换矩阵没有对应好,导致地图点的投影出现错误,在经过修改变换矩阵后得到如下:

在这里插入图片描述
这样是不是好看多了~~~。

四、地图创建2

在经过上述的步骤,就已经完成了基本的地图实时更新功能了,但是这个还没有对地图进行优化以及相应的回环检测部分,这个在后续会继续完善,但是在此之前,我还想尝试一下octomap地图的实时创建。。恩,想到就开始做,于是得到了如下的otomap地图:

在这里插入图片描述
OK, 顺利完成小型SLAM的编写测试。

五、心得体会

在完成上述系统的编写测试之后,才能清晰无误把握SLAM过程中的每个环节,这对于刚开始入门SLAM的同学来说非常重要。不仅如此对我自己而言理一理SLAM的整体过程也能收获很多~, 接下来将会重点放在后端优化部分,回环检测很重要呀。

而且,在过一遍SLAM过程之后,就开始从这几个重要部分开始进军深度学习在SLAM中的应用和提升啦,继续加油~~

参考文献

[1]. 深度相机原理

这篇关于菜鸟专学:从头到尾创建自己的SLAM系统(转载,我觉这种自己写一个SLAM很好)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/507139

相关文章

解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题

《解决IDEA使用springBoot创建项目,lombok标注实体类后编译无报错,但是运行时报错问题》文章详细描述了在使用lombok的@Data注解标注实体类时遇到编译无误但运行时报错的问题,分析... 目录问题分析问题解决方案步骤一步骤二步骤三总结问题使用lombok注解@Data标注实体类,编译时

MySQL分表自动化创建的实现方案

《MySQL分表自动化创建的实现方案》在数据库应用场景中,随着数据量的不断增长,单表存储数据可能会面临性能瓶颈,例如查询、插入、更新等操作的效率会逐渐降低,分表是一种有效的优化策略,它将数据分散存储在... 目录一、项目目的二、实现过程(一)mysql 事件调度器结合存储过程方式1. 开启事件调度器2. 创

C#实现系统信息监控与获取功能

《C#实现系统信息监控与获取功能》在C#开发的众多应用场景中,获取系统信息以及监控用户操作有着广泛的用途,比如在系统性能优化工具中,需要实时读取CPU、GPU资源信息,本文将详细介绍如何使用C#来实现... 目录前言一、C# 监控键盘1. 原理与实现思路2. 代码实现二、读取 CPU、GPU 资源信息1.

mysql外键创建不成功/失效如何处理

《mysql外键创建不成功/失效如何处理》文章介绍了在MySQL5.5.40版本中,创建带有外键约束的`stu`和`grade`表时遇到的问题,发现`grade`表的`id`字段没有随着`studen... 当前mysql版本:SELECT VERSION();结果为:5.5.40。在复习mysql外键约

Window Server创建2台服务器的故障转移群集的图文教程

《WindowServer创建2台服务器的故障转移群集的图文教程》本文主要介绍了在WindowsServer系统上创建一个包含两台成员服务器的故障转移群集,文中通过图文示例介绍的非常详细,对大家的... 目录一、 准备条件二、在ServerB安装故障转移群集三、在ServerC安装故障转移群集,操作与Ser

在C#中获取端口号与系统信息的高效实践

《在C#中获取端口号与系统信息的高效实践》在现代软件开发中,尤其是系统管理、运维、监控和性能优化等场景中,了解计算机硬件和网络的状态至关重要,C#作为一种广泛应用的编程语言,提供了丰富的API来帮助开... 目录引言1. 获取端口号信息1.1 获取活动的 TCP 和 UDP 连接说明:应用场景:2. 获取硬

Window Server2016 AD域的创建的方法步骤

《WindowServer2016AD域的创建的方法步骤》本文主要介绍了WindowServer2016AD域的创建的方法步骤,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价... 目录一、准备条件二、在ServerA服务器中常见AD域管理器:三、创建AD域,域地址为“test.ly”

JAVA系统中Spring Boot应用程序的配置文件application.yml使用详解

《JAVA系统中SpringBoot应用程序的配置文件application.yml使用详解》:本文主要介绍JAVA系统中SpringBoot应用程序的配置文件application.yml的... 目录文件路径文件内容解释1. Server 配置2. Spring 配置3. Logging 配置4. Ma

2.1/5.1和7.1声道系统有什么区别? 音频声道的专业知识科普

《2.1/5.1和7.1声道系统有什么区别?音频声道的专业知识科普》当设置环绕声系统时,会遇到2.1、5.1、7.1、7.1.2、9.1等数字,当一遍又一遍地看到它们时,可能想知道它们是什... 想要把智能电视自带的音响升级成专业级的家庭影院系统吗?那么你将面临一个重要的选择——使用 2.1、5.1 还是

高效管理你的Linux系统: Debian操作系统常用命令指南

《高效管理你的Linux系统:Debian操作系统常用命令指南》在Debian操作系统中,了解和掌握常用命令对于提高工作效率和系统管理至关重要,本文将详细介绍Debian的常用命令,帮助读者更好地使... Debian是一个流行的linux发行版,它以其稳定性、强大的软件包管理和丰富的社区资源而闻名。在使用