菜鸟专学:从头到尾创建自己的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

相关文章

Python FastAPI+Celery+RabbitMQ实现分布式图片水印处理系统

《PythonFastAPI+Celery+RabbitMQ实现分布式图片水印处理系统》这篇文章主要为大家详细介绍了PythonFastAPI如何结合Celery以及RabbitMQ实现简单的分布式... 实现思路FastAPI 服务器Celery 任务队列RabbitMQ 作为消息代理定时任务处理完整

Linux系统中卸载与安装JDK的详细教程

《Linux系统中卸载与安装JDK的详细教程》本文详细介绍了如何在Linux系统中通过Xshell和Xftp工具连接与传输文件,然后进行JDK的安装与卸载,安装步骤包括连接Linux、传输JDK安装包... 目录1、卸载1.1 linux删除自带的JDK1.2 Linux上卸载自己安装的JDK2、安装2.1

idea中创建新类时自动添加注释的实现

《idea中创建新类时自动添加注释的实现》在每次使用idea创建一个新类时,过了一段时间发现看不懂这个类是用来干嘛的,为了解决这个问题,我们可以设置在创建一个新类时自动添加注释,帮助我们理解这个类的用... 目录前言:详细操作:步骤一:点击上方的 文件(File),点击&nbmyHIgsp;设置(Setti

Linux系统之主机网络配置方式

《Linux系统之主机网络配置方式》:本文主要介绍Linux系统之主机网络配置方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、查看主机的网络参数1、查看主机名2、查看IP地址3、查看网关4、查看DNS二、配置网卡1、修改网卡配置文件2、nmcli工具【通用

Linux系统之dns域名解析全过程

《Linux系统之dns域名解析全过程》:本文主要介绍Linux系统之dns域名解析全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、dns域名解析介绍1、DNS核心概念1.1 区域 zone1.2 记录 record二、DNS服务的配置1、正向解析的配置

Spring 中使用反射创建 Bean 实例的几种方式

《Spring中使用反射创建Bean实例的几种方式》文章介绍了在Spring框架中如何使用反射来创建Bean实例,包括使用Class.newInstance()、Constructor.newI... 目录1. 使用 Class.newInstance() (仅限无参构造函数):2. 使用 Construc

Linux系统中配置静态IP地址的详细步骤

《Linux系统中配置静态IP地址的详细步骤》本文详细介绍了在Linux系统中配置静态IP地址的五个步骤,包括打开终端、编辑网络配置文件、配置IP地址、保存并重启网络服务,这对于系统管理员和新手都极具... 目录步骤一:打开终端步骤二:编辑网络配置文件步骤三:配置静态IP地址步骤四:保存并关闭文件步骤五:重

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Windows系统下如何查找JDK的安装路径

《Windows系统下如何查找JDK的安装路径》:本文主要介绍Windows系统下如何查找JDK的安装路径,文中介绍了三种方法,分别是通过命令行检查、使用verbose选项查找jre目录、以及查看... 目录一、确认是否安装了JDK二、查找路径三、另外一种方式如果很久之前安装了JDK,或者在别人的电脑上,想

Linux系统之authconfig命令的使用解读

《Linux系统之authconfig命令的使用解读》authconfig是一个用于配置Linux系统身份验证和账户管理设置的命令行工具,主要用于RedHat系列的Linux发行版,它提供了一系列选项... 目录linux authconfig命令的使用基本语法常用选项示例总结Linux authconfi