VLSAM14T-2-初识SLAM

 

Table of Contents

 

前言

单目相机Monocular

双目相机Stereo

深度相机RGB-D

经典SLAM框架

SLAM问题的数学描述

实践

习题


学了SLAM十四讲可以到达什么境界

学习完SLAM十四讲可以初步实现看懂SLAM相关的论文 

bilibili视频

书籍:https://blog.csdn.net/mobius_strip/article/details/84203471

其他推荐书籍:

  • Multiple View Geometry in computer vision
  • 概率机器人(激光)

这几本书没有实践方面的指导,此书不会讲到证明,遇到问题此书只需要知道结论就好,更注重的是看懂代码。

前言

机器人探索房间需要知道两件事情:定位、建图。前者是需要知道自身的状态,后者是了解外在的环境。

因为环境的多变,我们希望能够不约束环境条件的进行定位,使用IMU、激光传感器、相机进行定位建图。(这里我们讨论相机)

相机分为单目相机Monocular、双目相机Stereo、深度相机RGB-D。

单目相机Monocular

人因为见过大量的图像,形成天生远近到直觉,单色计算机不能直接知道远近,如果想恢复三维结构必须要改变相机的视角,也就是说我们必须移动相机,才能估计相机的运动,同时估计相机的同时估计场景中物体的远近(称为结构

我们看电影的时候无法推测出其中的大楼是真实存在还是奥特曼里的模型,也就是说我们把相机的运动和场景的大小同时方法相同的倍数看到的是一样的场景,这也就是单目SLAM估计到轨迹与地图和真实轨迹和地图相差一个因子,也就是尺度,单目SLAM无法仅通过图像确定这个真实尺度,这一现象称为尺度不确定性。

双目相机Stereo

双目摄像头两个单目之间的距离称为基线,双目摄像头能测到的范围与基线相关,基线距离越大能够测量到的就越远。缺点是配置与标定比较复杂,测量量程、精度受基线和分辨率所限,需要很大的计算量。

深度相机RGB-D

能够通过红外结构光或者ToF原理得到物体与相机之间的距离,常用到RGB-D包括Kinect/Kinect V2、Xtion Pro Live、RealSense等

经典SLAM框架

(btw,linux use ctrl shift printf to 截图,可在设置快捷键中修改)

我们把整个视觉 SLAM 流程分为以下几步:
1. 传感器信息读取。在视觉 SLAM 中主要为相机图像信息的读取和预处理。如果在机器人中,还可能有码盘、惯性传感器等信息的读取和同步。
2. 视觉里程计 (Visual Odometry, VO)。视觉里程计任务是估算相邻图像间相机的运动,以及局部地图的样子。VO 又称为前端(Front End),与计算视觉研究领域相关,比如图像的特征提取与匹配等。
3. 后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行最大后验概率估计MAP优化,得到全局一致的轨迹和地图。由于接在 VO 之后,又称为后端(Back End),主要是滤波和非线性优化算法,这部分反应了SLAM的本质:对运动主体自身和周围环境空间不确定性的估计
4. 回环检测(Loop Closing)。回环检测判断机器人是否曾经到达过先前的位置。如果检测到回环,它会把信息提供给后端,后端根据这个信息将轨迹和地图调整到符合回环检测结果的样子,回环检测本质上是对图像的相似性算法。
5. 建图(Mapping).它根据估计的轨迹,建立与任务要求对应的地图。

后端优化和回环检测解决每次VO估计出现的漂移问题。

地图大体上可以分为度量地图拓扑地图

度量地图可以分为稠密稀疏地图两种,稀疏地图往往只记录一些有代表意义到东西,称为路标,而稠密地图记录所有看到的东西,二维稠密地图是许多小格子Grid,三维地图是许多小方块(Voxel),状态有占据、空闲、未知,可以为导航提供很好的安全性,以及可以用于各种导航算法,比如A*、D*。

拓扑地图就是

SLAM问题的数学描述

我们将时间离散 t=1,..,K;

设机器人的位置为x,所以各个时刻的位置为x1,...,xK,他们构成了机器人的轨迹

此处假设是稀疏地图,每一个时刻传感器测量到一部分路标点,设路标点一共N个,每一个路标则表示为y1,...,yN

SLAM既关注机器人自身位置的变化——运动;又关心每一个时刻在某个位置观测到的路标——观测;

运动方程可以表示为x_{k}=f(x_{k-1},u_{k},w_{k}) ,xk为k时刻位置,xk-1为k-1时刻位置,uk为运动传感器的输入(比如码盘、IMU) wk为噪声,f不指定,以此表示通用的运动传感器。

观测方程可以表示为z_{k}=h(y_{j},x_{k},v_{k,j}),yj表示机器人在xk看到的路标点yj,从而产生zk,j观测数据,vk,j是观测噪声,因为观测所用的传感器多种多样,所以观测数据z和观测方程h也有不同的形式。

考虑具体问题,f和h都是不同的参数化形式

  • x_{k}=f(x_{k-1},u_{k},w_{k})
  • z_{k}=h(y_{j},x_{k},v_{k,j})

这两个方程描述了最基本的SLAM问题,已知运动测量的读数u,以及传感器的读数z,求解定位问题(估计x),和建图问题(估计y),这时候SLAM就是一个状态估计问题:如何通过带有有噪声的测量数据,估计内部的、隐藏着的状态变量?

状态估计问题由运动方程和观测方程的线性和噪声的高斯分布与否,可以分为线性/非线性-高斯/非高斯系统

线性高斯LG系统的无偏估计使用卡尔曼滤波(Kalman Filter,KF)

非线性非高斯NLNG系统使用扩展卡尔曼滤波(EKF,在工作点将系统线性化)求解

为了克服EKF线性化误差和噪声高斯分布假设的缺点,粒子滤波器,非线性优化出现了。

到现在我们认为优化技术已经明显优于滤波器技术,主流视觉SLAM现在常使用以图优化为代表的优化技术状态估计。

实践

建议去看pdf,涉及linux下程序的生成,cmake到使用,如何配合cmake写库,以及推荐使用到IDE

涉及内容有:

https://blog.csdn.net/jmu201521121021/article/details/78629946

https://blog.csdn.net/linzdg/article/details/81041456

best:https://blog.csdn.net/weixin_42056625/article/details/85810928

以下是汉化后的教程(未汉化可以翻译过来,是一样的)

1.首先点击工程-从模板新建,出现以下内容

2.选择Standard-Terminal,在项目名称输入工程的名称(比如helloworld)然后下一步-完成,出现配置

构建类型选择debug,就会出现

如果需要调试程序:

1.在cmake中将工程调到debug编译模式,既在CMakeList.txt中加入以下命令set( CMAKE_BUILD_TYPE "Debug" )

2.告诉Kdevelop想启动的程序:运行-配置启动,然后点击左侧的“Add New-应用程序”,然后在以下界面,我们既可以直
接选择一个 cmake 的工程目标(也就是我们用 add_executable 指令构建的可执行程序),也可以直接指向一个二进制文件。我建议你使用第二种方式,根据我的经验,这更少出现问题。

第一种;

注意,如果使用第二种方式

可执行文件为build下面的helloworld1,需要如下配置

第二种;

第二栏行为里,你可以设置程序的运行参数和工作目录。有时我们的程序是有运行参数的,它们会作为 main 函数的参数被传入。如果没有的话可以留空,对于工作目录亦是如此。配置好这两项后,可以点击“OK”按钮保存配置结果。

然后就可以设置断点调试了,但是我点击某一个语句 默认是收缩代码段,可以通过设置-配置快捷键看各种操作的快捷键

然后发现ctrl-alt-b已经设置断点了,那一行的代码背景颜色加深,执行的时候会执行到

kdevelop还有很多地方没有学习如何使用,此处有kdevelop学习笔记、初识KDevelop集成开发环境(Note3.2)

习题

不能

  • 使用 build 文件夹来编译你的 cmake 工程,然后在 Kdevelop 中试试。
  • 刻意在代码中添加一些语法错误,看看编译会生成什么样的信息。你能看懂 g++ 的错误吗?
  • g++命令参数、如何更改生成的文件名:https://blog.csdn.net/love_linney/article/details/47187743
  • 如果忘了把库链接到可执行程序上,编译会报错吗?什么样的错?
  • * 阅读《cmake 实践》,了解 cmake 的其他语法
  • * 完善 hello SLAM 的小程序,把它做成一个小程序库,安装到本地硬盘中。然后,新建一个工程,使用 find_package 找这个库并调用它。
  • * 寻找其他 cmake 教学材料,深入了解 cmake,例如 https://github.com/TheErk/CMake-tutorial。
  • 寻找 Kdevelop 的官方网站,看看它还有哪些特性。你都用上了吗?
  • 如果你在上一讲学习了 vim,请试试 Kdevelop 的 vim 编辑功能

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值