阅读一下即可,略
先来看运动。
无论是什么传感器,我们都能使用一个通用的、抽象的数学模型:
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问题建模成了一个状态估计问题:如何通过带有噪声的测量数据,估计内部的、隐藏着的状态变量?
具体怎么安装,可以参考我另一篇文章
理论上,任意一个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)
着重记录一下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)
1. KDevelop的使用
sudo apt-get install kdevelop
就这么简单… 不信可以参考我另一篇文章
2. CLion的使用
可以参考我另一篇文章