笔记记录:
-
SLAM基本框架
-
如何用cmake编译cpp源文件
SLAM要解决两个问题:定位和建图。一个基本的SLAM框架包括:传感器信息读取,视觉里程计,后端优化,回环检测和建图。视觉里程计称为整个框架的前端,它的任务是估算相邻图像中相机的运动轨迹,构建局部地图。由于估算会有误差积累(累计漂移)导致估算的轨迹不再准确,这时候需要回环检测负责把“机器人回到原始位置”的事情检测出来,视觉里程计和回环检测会把数据传递给后端优化,校正整个轨迹的形状,最后构建全局地图。整个框架的框图如下:
以下是阅读 《视觉SLAM十四讲》 做的笔记:第一张是相机分类,后两张是SLAM基本框架各部分的大致内容和联系:
例子会用到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 构建工程,需要创建一个文件夹,并把两个文件拷贝进去:
-
main.cpp
-
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 后面有两个 .)
注意到 build 目录下生成了 Makefile ,然后进行工程实际构建:
此时 build 目录中生成可执行文件 practice1 ,运行:
此时 output 文件夹下输出重命名后的图片,程序顺利执行~