文章目录
第1讲 预备知识
- 了解什么是slam,如何使用本书和配套代码;
- 对高等数学、线性代数、概率论;C++;Linux有基本的了解;
此处就略过,不细说了。
第1部分 数学基础
第2讲 初识SLAM
2.1 引子:小萝卜的例子
阅读一下即可,略
2.2 经典视觉SLAM框架
整个视觉SLAM流程包括以下步骤:
- 传感器信息读取。在视觉 SLAM 中主要为相机图像信息的读取和预处理。如果在机 器人中,还可能有码盘、惯性传感器等信息的读取和同步。
- 视觉里程计 (Visual Odometry, VO)。视觉里程计任务是估算相邻图像间相机的运动, 以及局部地图的样子。VO 又称为前端(Front End)。
- 后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回 环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在 VO 之后, 又称为后端(Back End)。
- 回环检测(Loop Closing)。回环检测判断机器人是否曾经到达过先前的位置。如果 检测到回环,它会把信息提供给后端进行处理。
- 建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。
2.3 SLAM问题的数学表述
- 什么是运动?我们要考虑从 k − 1 时刻到 k 时刻,小萝卜的位置 x 是如何变化的。
- 什么是观测?假设小萝卜在 k 时刻,于 xk 处探测到了某一个路标 yj,我们要考虑 这件事情是如何用数学语言来描述的。
先来看运动。
无论是什么传感器,我们都能使用一个通用的、抽象的数学模型:
x
k
=
f
(
x
k
−
1
,
u
k
,
w
k
)
\mathbf{x}_k = f (\mathbf{x}_{k-1}, \mathbf{u}_k, \mathbf{w}_k)
xk=f(xk−1,uk,wk)
这里
u
k
\mathbf{u}_k
uk 是运动传感器的读数(有时也叫输入),
w
k
\mathbf{w}_k
wk 为噪声。我们把这个称为运动方程。
与运动方程相对应,还有一个观测方程。
z
k
,
j
=
h
(
y
j
,
x
k
,
v
k
,
j
)
\mathbf{z}_{k,j} = h(\mathbf{y}_j, \mathbf{x}_k, \mathbf{v}_{k,j})
zk,j=h(yj,xk,vk,j)
这两个方程描述了最基本的SLAM问题:当我们知道运动测量的读数 u \mathbf{u} u,以及传感器的读数 z \mathbf{z} z时,如何求解定位问题(估计 x \mathbf{x} x)和建图问题(估计 y \mathbf{y} y)?这是,我们把SLAM问题建模成了一个状态估计问题:如何通过带有噪声的测量数据,估计内部的、隐藏着的状态变量?
2.4 实践:编程基础
1. 安装Linux操作系统
具体怎么安装,可以参考我另一篇文章
2. 使用cmake
理论上,任意一个C++程序都可以用g++来编译。但当程序规模越来越大时,这时输入的编译命令将越来越长,如果仅靠g++命令,则需要输入当量的编译指令,整个编译过程会变得异常繁琐。因此,对于C++项目,使用一些工程管理工具会更加高效。cmake在工程上广泛使用,我们会看到后面提到的大多数库都使用cmake管理源代码。
这里对CMakeLists.txt文件中常用的语句进行简单说明,具体的cmake的深入学习,以后有机会再总结。
我们使用了先执行cmake再执行make的做法,执行cmake的过程处理了工程文件之间的关系,而执行make的过程实际调用了g++来编译程序。
# 声明要求的cmake最低版本
cmake_minimum_required(VERSION 2.8)
# 声明一个cmake工程
project(HelloSLAM)
# 添加一个可执行程序
# 语法:add_executable(程序名 源代码文件)
add_executable(helloSLAM helloSLAM.cpp)
3. 使用库
着重记录一下cmake中关于库的使用。
# 表示我们想把这个libHelloSLAM.cpp文件编译成一个叫做'hello'的库。
add_library(hello libHelloSLAM.cpp)
Linux中,库文件分成静态库和共享库两种。上面的方式是生成了静态库。静态库以.a作为后缀名,共享库以.so结尾。所有库都是一些函数打包后的集合,差别在于静态库每次被调用都会生成一个副本,而共享库则只有一个副本,更省空间。下面的语句是申城共享库
add_library(hello_shared SHARED libHelloSLAM.cpp)
add_executable(useHello useHello.cpp)
# target_link_libraries(A B1 B2 B3...) 将B1 B2 B3 ...这些库链接到A上,使得A可以使用那些库,
# 因此后面使用opencv、pcl等第三方库时,要记得进行链接,不然会出现unreference to balabala...的错误
target_link_libraries(useHello hello_shared)
4. 使用IDE
1. KDevelop的使用
sudo apt-get install kdevelop
就这么简单… 不信可以参考我另一篇文章
2. CLion的使用
可以参考我另一篇文章