0%

SLAM十四讲_一预备及初识

预备知识

SLAM:Simultaneous Localization and Mapping

同步定位及建图:搭载特定传感器的主体,在没有环境先验信息情况下,在运动过程中建立环境模型,同时估计自己位姿的过程。根据传感器分为深度相机,RGB相机和激光。不同传感器特点不一样,应用环境以及遇到的难点不同。本书主要是视觉SLAM:围绕RGB相机,也会引入Depth相机。

CV之初,人们想象有一天计算机将和人一样,通过眼睛去观察世界,理解周围的物体,探索未知的环境–这是一个美妙而又充满浪漫色彩的梦想,让无数科研人员日夜为之奋斗。

SLAM相关的应用点:室内扫地机,移动机器人;户外的自动驾驶以及空中无人机;乃至虚拟现实和增强现实设备。

SLAM研究的三十年,将主干分为四个大模块:

  • 前端里程计(求pose):估计相邻图像相机的运动以及局部地图样子
  • 后端优化(优化pose):根据多个时刻的相机位姿以及回环检测进行优化,得到全局一致的轨迹和地图
  • 建图:根据轨迹建立与任务要求对应的地图
  • 回环检测(优化全局pose):判断是否到达过先前的位置

1.定位问题:我在什么地方?
2.建图问题:周围环境是什么样?
方法很多:室内可以在地板铺设导引线,在墙上贴二维码,在桌子放置无线电定位设备;室外可以安装定位设备(GPS)等
传感器主要两类:1.安装在本体上,如轮式编码器,IMU,相机,激光; 2.安装在环境上,上述提到的

不同传感器的特性以及SLAM的影响

单目:图像是三维空间的二维投影,必须移动(Motion)才能估计结构(Structure).motion后只能根据视差估计相对的值,具有尺度不确定性。
问题:平移才能计算深度以及无法确定真实尺度,导致单目SLAM困难多多,但是成本较低。

双目:利于基线解决尺度不确定性,但视差的匹配依然效率不高,需要引入GPU和FPGA加速才能实时输出整张图的距离信息。双目测量距离受基线大小影响,所以无人车上一般搭载很大的家伙
问题:对于SLAM而言,传感器的配置与标定较为复杂。

RGB-D相机:通过TOF物理测量手段直接获得全图的深度信息
问题:低端TOF测量范围窄,噪声大,视野小;普遍存在日光干扰、无法测量投射材质以及高反高吸收率材质;所以主要用于室内应用,室外难以使用。

目前而言,如果工作环境理想:静态、刚体、光照变化小、没有人为干扰的场景,SLAM是相当成熟。

整书结构

1.数学基础

  • SLAM概述
  • 三维空间运动
  • 李群和李代数
  • 针孔模型及opencv
  • 非线性优化

2.技术实践

  • 特征点法的视觉里程计
  • 直接法的视觉里程计
  • 里程计实践
  • 后端优化BA
  • 后端优化位姿图
  • 回环检测
  • 地图构建
  • SLAM的未来

基础知识须知:

  • 高等数学、线性代数、概率论
  • C++语言和Linux基础

课后习题

1.有线性方程 Ax = b,当我们知道 A, b,想要求解 x 时,如何求解?这对 A 和 b 需要哪些条件?提示:从 A 的维度和秩角度来分析
1)b等于0, n元齐次线性方程组$A_(m*n)x=0$有非0解的充必条件是系数矩阵的秩$Rank(A)<n$
2)b不等于0,非齐次线性方程组$Ax=b$有解的充必条件是系数矩阵的秩等与增广矩阵的秩; $R(A)=R(B)=n$,则有唯一解,$R(A)=R(B)<n$则有无穷多解

  1. 高斯分布是什么?它的一维形式是什么样子?它的高维形式是什么样子?
    又名正态分布,由于中心极限定理,任何分布的抽样分布样本足够大时,其渐进分布都是高斯分布。

初识SLAM

目标:

  • 理解VSLAM各个模块
  • 搭建环境
  • 掌握基本CMAKE

传感器

传感器类型:机器人自身和环境上
自身传感:mono, stereo, rgbd, lidar, event camera, imu, 编码器及新式传感器

一些相关术语:

  • 尺度不确定性:2d的rgb图像没有真实尺度信息
  • 运动motion: 相机外参R, t
  • 结构structure: 物体的远近和大小

经典VSLAM框架


流程:

  • 1.传感器信息读取融合:将所有观测数据正确读入并预处理
  • 2.视觉里程计VO:估算相邻图像间的运动以及局部地图的样子,又称前端
  • 3.后端优化:接受不同时刻VO的相机位姿,以及回环检测的信息,一并优化获得全局一致的轨迹和地图
  • 4.回环检测:判断机器人是否曾经到达过先前的位置,如果有则放到步骤3优化
  • 5.建图:根据估计的轨迹,建立与任务要求对应的地图

总体而言,如果把工作环境限定在静态、刚体以及光照变化不明显、没有人为干扰的场景,那么VSLAM系统相当成熟了

为什么叫里程计? 因为它和实际的里程计一样,只计算相邻时刻的运动,而和再之前过去的信息没有关联。所以属于短时记忆的方案
因此也引起累计漂移:随着相邻估计的误差叠加,后续的误差会更大和不可控
因而引入后端优化回环检测的技术来校正

后端主要处理SLAM过程的噪声问题,具体是如何从带有噪声的数据中估计整个系统的状态,以及这个状态估计的不确定性有多大(Maximum-A-Posteriori),这里包括自身轨迹和地图。主要涉及滤波和非线性优化的算法。

回环检测主要让机器人具有识别曾到达过场景的能力,具体实施可以是二维码图片或者图像间的相似性。

最后建图包括度量和拓扑地图:2D栅格地图、2D拓扑地图、3D点云地图、3D网格地图;
度量地图:强调精确表示地图中物体的位置关系
拓扑地图:强调地图元素之间的关系,考虑节点间的连通性

SLAM数学建模

主要分为运动方程和观测方程,根据这两个方程是否线性以及噪声是否服从高斯分布进行分类,主要信息是位姿以及观测的路标

CMAKE的使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
add_executable(exe main.cpp) # 编译执行文件

add_library(lib lib.cpp) # 编译静态库 .a

add_library(lib_shared SHARED lib.cpp) # 编译动态库 .so

add_executable(useLib useLib.cpp) # cpp include动态库的头文件调用
target_link_libraries(useLib lib_shared) # 将库文件链接到编译后的文件,最后链接生成最后的执行文件useLib



# 将库hello和共享库hello_shared安装到/usr/local/lib下
INSTALL(TARGETS hello hello_shared
LIBRARY DESTINATION lib
ARCHIVE DESTINATION lib)

# 将库的头文件安装到/usr/local/include下
INSTALL(FILES libHelloSLAM.h DESTINATION include/libHelloSLAM)


# 另外目录的项目调用,引入头文件
include_directories(/usr/local/include/libHelloSLAM)

# 链接库文件
target_link_libraries(useHello /usr/local/lib/libhello_shared.so)

库文件是压缩包,包含编译好的二进制函数,但不知道函数是什么样和调用形式,所以需要结合头文件使用。只有拿到头文件和库文件才可以调用库。