为准备IMAV Indoor赛任务,近日决定开始学习视觉slam,为飞机提供室内定位信息。
本文为高翔新书《视觉SLAM十四讲》读书笔记,用作梳理思路。
(1)终端环境下建立库,并使用库函数
目录:slam/test/helloSLAM.cpp
slam/test/libHelloSLAM.cpp
slam/test/CMakeLists.txt
其中,libHelloSLAM为库,helloSLAM为使用库函数的源码//slam/test/helloSLAM.cpp
#include <iostream>
#include "libHelloSLAM.h"
using namespace std;
int main( int argc, char** argv )
{
printHello();
return 0;
}
//libHelloSLAM.c
#include <iostream>
using namespace std;
void printHello()
{
cout<<"Hello SLAM"<<endl;
}
//libHelloSLAM.h
#ifndef LIBHELLOSLAM_H_
#define LIBHELLOSLAM_H_
void printHello();
#endif
最重要的就是使用cmake来制作工程,将库与调用库函数的源码建立连接。在cmake中的注释不是//,而是#
当仅有几个源文件需要编译时,用g++就很方便。但一般的工程项目中,有大量文件需要编译,且其中的依赖关系较为复杂,用cmake来管理更为高效。
#slam/test/helloSLAM.cpp
# 声明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )
# 声明一个 cmake 工程
project( HelloSLAM )
# 设置编译模式
set( CMAKE_BUILD_TYPE "Debug" )
# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable( helloSLAM helloSLAM.cpp )
# 添加一个库
add_library( hello libHelloSLAM.cpp )
# 共享库
add_library( hello_shared SHARED libHelloSLAM.cpp )
# 将库文件链接到可执行程序上
target_link_libraries( helloSLAM hello_shared )
在编译后cmake会生成不少中间文件,所以我们在编译前统一建立一个文件夹,在该文件夹中进行编译,将中间文件和源码分开。
mkdir build
cd build
cmake..
make
(2)IDE环境下建立库,并使用库函数
高翔书中使用的是Kdevelop,这个软件比较蛋疼的是使用Eigen库时不提时成员运算,还各种显示错误。。。
好处就是可以debug
如果需要debug,需要先在cmake文件中加入
set( CMAKE_BUILD_TYPE "Debug" )
1.载入工程:Project->Open/Import Project...
选择写好的CMakeLists文件即可。
2.如果不需要debug,之间build就行
需要debug的话,要先配置一下运行:Run->Configure Launches...
进入Launch Configurations界面后,点击add New->Compiled Binary(二进制文件)
设置好后,添加断点,debug即可,F10单步运行,F11单步跟进,F12单步跳出
OpenCV安装
https://opencv.org/releases.html
由于OpenCV最新的版本3.4.1还没有编译好的库文件,所以要从上面网站中下源代码进行安装
首先安装OpenCV依赖项
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
然后进入OpenCV源文件中的build文件夹,像普通Cmake工程文件一样编译
cd build
cmake ..
make//编译
sudo make install//安装OpenCV
编译时间大概十多分钟,默认储存目录在/usr/local/lib下