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

2023-05-16

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]. 深度相机原理

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • evo安装、evo使用方法详细介绍使用教程,SLAM轨迹精度评估工具,如何用来评估ORB-SLAM2生成的轨迹精度,评估激光雷达SLAM与视觉SLAM的轨迹精度,量化SLAM的误差

    evo在视觉SLAM中是一个极为有用的工具 对于论文党 科研党 工程党都非常有帮助 它可以用于评估SLAM输出的轨迹的精度 可以自动生成均值 方差 轨迹等等信息的图或者表 总之评估SLAM精度用它足以 它目前支持的公开数据集格式有 TUM
  • SLAM方法汇总

    原文 http blog csdn net smartxxyx article details 53068855 目录 SLAM概述 SLAM一般处理流程包括track和map两部分 所谓的track是用来估计相机的位姿 也叫front e
  • slam数学基础——最小二乘

    一 前言 1 最小二乘是一类特殊形式的最优化求解问题 相比于其他优化问题 求解方式比较简洁 2 最小二乘被广泛应用于各种实际问题的建模 在求解实际工程问题中有着广泛的应用 例如 slam 中随处可见最小二乘的声影 二 线性最小二乘法 1 预
  • vscode_c++_slambook 编译配置

    工作目录 配置文件 launch json version 0 2 0 configurations name slamBook程序调试 type cppdbg request launch program fileDirname buil
  • 正交矩阵的保范性:正交变换不改变向量的长度(范数)

    在推导使用SVD分解解方程时 用到了正交矩阵的保范性这一性质 1 正交矩阵定义 A mathbf A intercal A A A A
  • 基于深度相机的三维重建技术

    本文转载自http www bugevr com zblog id 14 原创作者bugeadmin 转载至我的博客 主要是为了备份 日后查找方便 谢谢原创作者的分享 三维重建 3D Reconstruction 技术一直是计算机图形学和计
  • 各向异性(anisotropic)浅提

    文章目录 各向异性 anisotropic 定义 哪种物体具有各向异性反射 什么导致各向异性反射 总结 各向异性 anisotropic 定义 它指一种存在方向依赖性 这意味着在不同的方向不同的特性 相对于该属性各向同性 当沿不同轴测量时
  • 激光SLAM直接线性方法里程计运动模型及标定

    原创作者 W Tortoise 原创作者文章 https blog csdn net learning tortosie article details 107763626 1 里程计运动模型 1 1 两轮差分底盘的运动模型 1 2 三轮全
  • 【SLAM】卡尔曼滤波(Kalman Filter)

    卡尔曼滤波 Kalman filter 一种利用线性系统状态方程 通过系统输入输出观测数据 对系统状态进行最优估计的算法 由于观测数据中包括系统中的噪声和干扰的影响 所以最优估计也可看作是滤波过程 卡尔曼滤波器的原理解释如下 首先 我们先要
  • 对最小二乘法的一点理解 - slam学习笔记

    我对最小二乘法的理解 在给定参数个数和函数模型之后 根据测试数据 找出与所有测试数据的偏差的平方和最小的参数 这里面应该有两个问题 1 为什么选取与真实数据平方和最小的拟合函数 2 如何求参数 为什么选取与真实数据平方和最小的拟合函数 极大
  • 【SLAM】libQGLViewer:VS 2019 + Qt 5.14.2 + Win 10 配置

    libQGLViewer 2 7 2 VS 2019 Qt 5 14 2 Win 10 配置 注意 这次配置没有完全成功 编译25个成功 一个失败 失败的是 qglviewerplugin qglviewerplugin 是一个可选控件 不
  • 深度相机Kinect2.0三维点云拼接实验(一)

    文章目录 摘要 Kinect2 0简介 工作原理 RGB相机成像原理 深度相机成像原理 总结 参考文献 摘要 Kinect2 0是微软推出的一款RGB D相机 它即支持普通相机的拍摄 也支持脉冲测量深度信息 本系列文章基于该传感器给出基本的
  • 关于GPS、惯导、视觉里程计的几个定义

    1 首先写几个定义 惯性导航系统 Inertial Navigation System INS 全球定位卫星系统 Global Navigation Satellite System GNSS GNSS 包括全球定位系统 Global Po
  • Lego-LOAM IMU坐标系变换的详细记录

    Lego LOAM IMU坐标系变换的详细记录 0 基础知识 1 IMU 重力加速度消除 2 相机坐标系 camera 到初始坐标系 camera init 的转换 最近看了Lego LOAM 的IMU部分 没看懂IMU的坐标系变换 看其它
  • LeGO-LOAM代码详细注释版

    学习LeGO LOAM时 写的代码注释github代码链接 一部分注释来自github用户wykxwyc 一部分来自网上查阅 还有一部分是自己的理解 持续更新中
  • SLAM--三角测量SVD分解法、最小二乘法及R t矩阵的判断

    目录 一 三角测量 方法一 SVD分解法的推导 方法二 最小二乘法求解 二 ORB SLAM2 三角测量源码 三 利用Eigen源码实现三角测量 方法一 SVD分解法 方法二 最小二乘法求解 速度最快 方法三 利用OpenCV自带函数 四
  • LIO-SAM运行自己数据包遇到的问题解决--SLAM不学无数术小问题

    LIO SAM 成功适配自己数据集 注意本文测试环境 Ubuntu18 04 ROS melodic版本 笔者用到的硬件以简单参数 激光雷达 速腾聚创16线激光雷达 RS Lidar 16 IMU 超核电子CH110型 9轴惯导 使用频率1
  • 3.Open3D教程——点云数据操作

    点云数据 本教程阐述了基本的点云用法 随需要的文件链接 1 显示点云 import open3d as o3d import numpy as np print Load a ply point cloud print it and ren
  • 什么是深度学习的无监督学习与有监督学习

    无监督学习 深度学习中的无监督学习方法是一种训练算法 它在没有标注输出的情况下从输入数据中学习模式和特征 这种方法的核心是探索和理解数据的内在结构和分布 而不是通过已知的输出来指导学习过程 无监督学习在深度学习领域有许多不同的形式和应用 以
  • KITTI校准文件中参数的格式

    我从以下位置访问了校准文件KITTI 的部分里程计 http www cvlibs net datasets kitti eval odometry php 其中一个校准文件的内容如下 P0 7 188560000000e 02 0 000

随机推荐

  • json离线解析格式化工具

    json离线解析格式化工具 xff1a 当没有网络的时候 xff0c 可以使用该工具实现json解析格式化 https download csdn net download boboelec 11992955 工具使用效果 xff1a
  • LMI 转化与Matlab工具箱

    目录 一些结论 1 1 中给出下面两结论 lmivarcase1case2case3case4 参考 需要将一些不等式转化为LMI 一些结论 1 1 中给出下面两结论 P gt 0
  • Err:1 http://security.ubuntu.com/ubuntu bionic-security InRelease Could not resolve ‘security.ubun

    在执行apt get update命令的时候更新报错 Err 1 http security ubuntu com ubuntu bionic security InRelease Could not resolve 39 security
  • 强化学习Q-Learning算法

    强化学习Q Learning算法 前言基本概念基本概念递推关系 Q learning基本原理注意事项局限性仿真 前言 学习这个算法有一段时间了 xff0c 但是因为自己犯懒一直没有整理 现整理一下 xff0c 一方面有刚入门的同学可以参考
  • 联想拯救者Y7000P装win10与Ubuntu18.04双系统

    初衷 写这个博客的初衷是为了记录本人在联想笔记本上安装Ubuntu18 04双系统时遇到的坑 xff0c 事后装完之后发现并不是很坑 xff0c 但是如果没有遇到过此类问题 xff0c 就很难受了 xff0c 所以决定记录下来 这款笔记本安
  • 强化学习DDPG算法

    强化学习DDPG算法 前言 因为疫情一直在辗转隔离 xff0c 没心思学习 xff0c 索性整理一下学过的东西 xff0c 记一下学习笔记 xff0c 就当自我安慰了 推导部分观看了这个B站的学习视频 DDPG 与DQN不同 xff0c D
  • 最优控制 3:最优控制理论中的极小值原理与动态规划

    最优控制 3 xff1a 使用极小值原理求解最优控制问题 引言极小值原理 t f t f t f 固定的情况
  • 使用Pycharm创建一个工程

    刚刚开始学习Python xff0c 使用的IDE是PyCharm 本来想记在本子上 xff0c 可是感觉有点慢 xff0c 而且多 xff0c 因此选择在网上记录自己的笔记 哈哈 xff0c 也不知道能记多长时间 PyCharm下载安装之
  • Pycharm在windows下使用Anaconda中的Python解释器各种报错的问题

    最近几天被windows下的软件快要搞疯了 电脑装了Anaconda3 xff0c 在运行一些python程序的时候 xff0c 这些程序在anaconda的自带终端中python代码可以正常运行 但是不可以使用诸如Pychrm和VS201
  • Ubnutu16.04 系统下编译PX4固件方法

    今天开始准备在Ubuntu16 04下搭建PX4的开发环境 早就听说源代码编译的过程中有很多坑 xff0c 所以在编译源代码之前在网上搜索了很多教程 xff0c 其中这个教程写的非常详细 xff1a https blog csdn net
  • 高斯过程回归中后验概率的简单推导

    最近几天在整理高斯过程回归 Gaussian Process Regression GPR 部分的知识 xff0c 虽然还有很多问题没有搞懂 xff0c 但是有一点进展还是决定总结下来 xff0c 防止遗忘 在整理之前 xff0c 先列出我
  • mavlink增加自定义消息

    mavlink作为PX4以及APM两大开源飞控的通讯协议 xff0c 应用非常广泛 在进行开源飞控二次开发时 xff0c 增加自定义消息非常普遍 比如在offboard模式下 xff0c 将视觉避障信息或者雷达信息发送给飞控 xff0c 这
  • 【从0到1】组装深度学习台式机

    本文旨在为有从事深度学习研究的同学提供一份装机攻略 xff0c 望对您有帮助 1 前言 目前 新基建 热潮 xff0c 人工智能如火如荼 xff0c 国内大部分院校 企业都会为学生 员工配置实验集群 xff0c 但是有时候想在本地自己跑些d
  • 【ROS学习】节点运行管理launch文件的基本操作

    launch文件的概念和作用 launch 文件是一个 XML 格式的文件 xff0c 可以启动本地和远程的多个节点 xff0c 还可以在参数服务器中设置参数 launch文件的作用是 xff1a 简化节点的配置与启动 xff0c 提高RO
  • 系统提示“该设备无法启动(代码:10)”,USB设备不能开始工作怎么办?

    文章来源 xff1a https www reneelab com cn this device cannot start html 目录 原因分析解决方法一 xff1a 在设备管理器中更新驱动程序解决方法二 xff1a 重新安装有问题的U
  • printf 在Linux终端上输出彩色字体 (串口也适用)

    有时我们希望在LINUX终端上按照调试级别打印不同颜色的调试信息 xff0c 如 include lt stdio h gt define DBG PRINT format arg do fprintf stdout 34 ld d fla
  • vSLAM重读(4): OKVIS--KeyFrame-based Visual-Inertial SLAM

    1 摘要 视觉传感器与IMU传感器互补 61 61 gt VIO系统 xff1b 由最初的以滤波为主题 xff0c 现在逐渐转换为非线性优化来实现SLAM xff1b 提出一种方法将视觉信息与IMU测量数据紧密结合 xff0c 将IMU的误
  • vSLAM重读(5): vSLAM中对双目相机的数据处理及与单目相对比

    1 双目相机概述 双目立体视觉模型 双目模型求取深度 双目立体相机分别校准可参考 ROS 单目相机 分别校准 双目立体匹配算法案例 https www cnblogs com riddick p 8486223 html https www
  • ROS回顾学习(11): TF之static_transform_publisher

    主要用于静态坐标转换 两种发布形式 1 俯仰角 43 位置坐标 span class token comment static transform publisher x y z yaw pitch roll frame id child
  • 菜鸟专学:从头到尾创建自己的SLAM系统

    RobotSlamApplication项目二 xff1a 小型SLAM系统 研究背景 xff1a 因为之前比较浮躁 xff0c 总是喜欢研究别人的库然后测试跑通 xff0c 效果好就拿来修修改改 然后测试测试就用 xff0c 效果不好就抛