slam入门——十四讲笔记(一)

文章目录

    • 第1讲 预备知识
  • 第1部分 数学基础
    • 第2讲 初识SLAM
      • 2.1 引子:小萝卜的例子
      • 2.2 经典视觉SLAM框架
      • 2.3 SLAM问题的数学表述
      • 2.4 实践:编程基础
        • 1. 安装Linux操作系统
        • 2. 使用cmake
        • 3. 使用库
        • 4. 使用IDE


第1讲 预备知识

  1. 了解什么是slam,如何使用本书和配套代码;
  2. 对高等数学、线性代数、概率论;C++;Linux有基本的了解;
    此处就略过,不细说了。

第1部分 数学基础

第2讲 初识SLAM

2.1 引子:小萝卜的例子

阅读一下即可,略

2.2 经典视觉SLAM框架

slam入门——十四讲笔记(一)_第1张图片
整个视觉SLAM流程包括以下步骤:

  1. 传感器信息读取。在视觉 SLAM 中主要为相机图像信息的读取和预处理。如果在机 器人中,还可能有码盘、惯性传感器等信息的读取和同步。
  2. 视觉里程计 (Visual Odometry, VO)。视觉里程计任务是估算相邻图像间相机的运动, 以及局部地图的样子。VO 又称为前端(Front End)。
  3. 后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回 环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在 VO 之后, 又称为后端(Back End)。
  4. 回环检测(Loop Closing)。回环检测判断机器人是否曾经到达过先前的位置。如果 检测到回环,它会把信息提供给后端进行处理。
  5. 建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。

2.3 SLAM问题的数学表述

  1. 什么是运动?我们要考虑从 k − 1 时刻到 k 时刻,小萝卜的位置 x 是如何变化的。
  2. 什么是观测?假设小萝卜在 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(xk1,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的使用
    可以参考我另一篇文章

你可能感兴趣的:(#,SLAM)