SLAM的基本框架

笔记记录:

  1. SLAM基本框架

  2. 如何用cmake编译cpp源文件

SLAM基本框架

SLAM要解决两个问题:定位和建图。一个基本的SLAM框架包括:传感器信息读取,视觉里程计,后端优化,回环检测和建图。视觉里程计称为整个框架的前端,它的任务是估算相邻图像中相机的运动轨迹,构建局部地图。由于估算会有误差积累(累计漂移)导致估算的轨迹不再准确,这时候需要回环检测负责把“机器人回到原始位置”的事情检测出来,视觉里程计和回环检测会把数据传递给后端优化,校正整个轨迹的形状,最后构建全局地图。整个框架的框图如下:

以下是阅读 《视觉SLAM十四讲》 做的笔记:第一张是相机分类,后两张是SLAM基本框架各部分的大致内容和联系:

用cmake编译cpp源文件

例子会用到opencv和cmake.两者在Linux下安装步骤看这里。 为什么要用cmake? 《CMake Practice》 里这样说:

1.开放源代码,使用类 BSD 许可发布。

2.跨平台,并可生成 native 编译配置文件,在 Linux/Unix 平台,生成 makefile,在苹果平台,可以生成 xcode,在 Windows 平台,可以生成 MSVC 的工程文件。

3.能够管理大型项目,KDE4 就是最好的证明。

4.简化编译构建过程和编译过程。Cmake 的工具链非常简单:cmake+make。

5.高效虑,按照 KDE 官方说法,CMake 构建 KDE4 的 kdelibs 要比使用 autotools 来构建 KDE3.5.6 的 kdelibs 快 40% ,主要是因为 Cmake 在工具链中没有 libtool。

6.可扩展,可以为 cmake 编写特定功能的模块,扩充 cmake 功能。

下面用cmake编译 mian.cpp 构建工程,需要创建一个文件夹,并把两个文件拷贝进去:

  1. main.cpp

  2. CMakeLists.txt

main.cpp在本例子要实现读取指定文件夹图片,将每张图片重命名为数字序列(如0001.png,0002.png...),并将图片存储在新的文件夹下,代码如下:

 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
27
28
29
30
31
32
33
34
35
36
37
#include <opencv2/opencv.hpp>
#include <iostream>
#include <stdio.h>

using namespace std;
using namespace cv;

int main() {
	
	String Pattern = "/home/gaki/image/";
	String OutputDir = Pattern+"output/";//注意在该目录创建一个*output*文件夹,重命名的图片将储存在这个。
	char newName[10];
	Mat OutputImage;
	vector<String> FileName;	
	glob(Pattern, FileName, false);
	
	for(int i=0;i<FileName.size();i++)
	{
	  if(FileName[i].find(".png")!=String::npos)
	  {
	      OutputImage = imread(FileName[i]);
	      imshow("image",OutputImage);
	      waitKey(1000);
	      sprintf(newName,"%04d.png",i);
	      imwrite(OutputDir+newName,OutputImage);
	      cout<<"images found !"<<endl;
	      cout<<"writed in"<<OutputDir+newName<<endl;
	  }
	  
	  else{
	    cout<<"not a png image found"<<endl;
	  }
	}
	
	return 0;
	
}

CMakeList.txt如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#这是注释
cmake_minimum_required(VERSION 2.8) #cmake最低版本要求,低于这个版本编译不会通过

project(practice1) #工程名称,可以随意起名字

#设置源文件列表,当需要编译多个源文件时这样的形式是方便的,如set(SRC_LIST a.cpp b.cpp c.cpp)
#SRC_LIST作为变量,main.cpp作为一个值赋给SRC_LIST这个变量
set(SRC_LIST main.cpp) 

find_package(OpenCV REQUIRED)

include_directories(${OpenCV_INCLUDE_DIRS}) #${ }表示取变量的值

add_executable(${PROJECT_NAME} ${SRC_LIST}) #生成一个可执行文件,相关源文件是变量SRC_LIST中的值

target_link_libraries(${PROJECT_NAME} ${OpenCV_LIBS})

一个最简的CMakeLists.txt如下:

1
2
project(practice1)
add_executable(practice1 main.cpp)

其他语句依实际构建工程需要添加。

  • 编译 将以上两个文件放在随意一个文件夹下,比如我的在/home/gaki/slampractice/p1,首先终端进入该文件夹:
1
cd /home/gaki/slampractice/p1

新建 build 文件夹并且进入 build 文件夹:

1
mkdir build && cd build

构建工程:(注意cmake 后面有两个 .)

1
cmake ..

注意到 build 目录下生成了 Makefile ,然后进行工程实际构建:

1
make

此时 build 目录中生成可执行文件 practice1 ,运行:

1
./practice1

此时 output 文件夹下输出重命名后的图片,程序顺利执行~

updatedupdated2019-12-282019-12-28