第二讲:初始SLAM
前言
本篇主要是针对视觉SLAM学习过程中的知识点进行总结,初识SLAM可能记录较为繁琐,后续学完会再次修改精炼。
1.相机分类
单目相机:得到照片,以二维形式反映三维世界,缺少深度信息,具有尺度不确定性
双目相机:由已知i基线的双单目组成,通过基线(双单目间距)估计各像素空间位置,但配置与标定较为复杂,视差计算耗费资源,深度量程和精度受双目基线和分辨率限制
深度相机:利用红外结构光或Time of Flight(ToF)原理来计算物体离相机距离,主要用于室内
2.框架
经典视觉框架如图所示:
视觉里程计:只计算相邻时刻运动,但会产生累计漂移,误差累积传递,导致地图建立不一致
后端优化:处理噪声,主要包括滤波和非线性优化方法
回环检测:解决位置估计随时间漂移问题,通过识别曾到达过的场景实现目标,可以利用环境传感器或者图像相似性判断实现
3.建图
度量地图:强调精确表示物体位置关系
拓扑地图:强调地图元素之间关系,只考虑节点连通性
4.数学表述
SLAM过程可以看作运动方程和观测方程的结合,根据空间自由度的不同,方程复杂度也不同
运动方程:,为输入,是运动传感器读数,是噪声,是k时刻的位置
观测方程:,在位置上看到路标,产生观测数据,为观测噪声
SLAM问题其实就是状态估计问题,一致运动测量读数u和传感器读数z,求解定位问题和建图问题,对x和y进行估计
系统分类:线性/非线性+高斯/非高斯
5.实践部分
5.1 HelloSLAM
在Ubuntu中建立文档为helloSLAM.cpp编写helloSLAM代码:
#include<iostream>
using namespace std;
int main( int argc , char** argv )
{
cout<<"Hello SLAM!"<<endl;
return 0;
}
打开终端输入:
sudo apt install g++
g++ helloSLAM.cpp
下载并运行g++编译器将cpp编译为可执行文件a.out
5.2 cmake
g++虽然可以编译任意c++程序,但是对应大规模工程而言会导致编译命令复杂化,因此可以采用cmake来进行管理,此时需要先创建个文档命名为:CMakeLists.txt输入:
cmake_minimum_required( VERSION 2.8 )
project( HelloSLAM )
add_executable( helloSLAM helloSLAM.cpp )
来进行版本、工程和可执行程序的声明和添加,在当前目录下开启终端输入
mkdir build
cd build
cmake ..
make
命令来产生可执行文件,并将中间文件存储在build文件夹内。
5.3 库的建立和调用
库文件libHelloSLAM.cpp:
#include <iostream>
using namespace std;
void printHello()
{
cout<<"Hello SLAM"<<endl;
}
静态库libhello.a 建立:CMakeLists.txt添加
add_library( hello libHelloSLAM.cpp )
共享库libhello.so建立:CMakeLists.txt添加
add_library( hello_shared SHARED libHelloSLAM.cpp )
终端输入:
cd build
cmake ..
make
头文件libHelloSLAM.h编写:
#ifndef LIBHELLOSLAM_H_
#define LIBHELLOSLAM_H_
void printHello();
#endif
useHello.cpp调用库:
#include "libHelloSLAM.h"
int main( int argc , char** argv )
{
printHello();
return 0;
}
CMakeLists.txt:
add_executable( useHello useHello.cpp )
target_link_libraries( useHello hello_shared )
5.4 IDE的使用
IDE选择kdevelop,在下载kdevelop时要注意同时下载相对应的cmake,否则无法进行正常的编译功能。
使用kdevelop时先在终端建立CMakeLists.txt,然后工程-打开/导入工程打开CMakeLists.txt文件,点击构建即可默认建立build文件夹。
通过在CMakeLists.txt中添加:
set( CMAKE_BUILD_TYPE "Debug" )
可调为Debug编译模式,进行断点调试并观察局部变量。
配置相对应的环境组,设置断点并采用Debug即可进行断电调试。
6. 习题
6.1 g++命令参数(转载于:https://www.cnblogs.com/gwj1314/p/9444662.html)
1、默认
命令: g++ helloSLAM.cpp
功能:生成默认为a.out的文件。
2、命名 -o
命令: g++ helloSLAM.cpp -o helloSLAM
功能:生成helloSLAM的文件。
3、调试 -g
命令: g++ qaq.cpp -o qdq -g
功能:生成用于gdb调试的文件qdq.dSYM。
4、警告 -W -w
命令:g++ qaq.cpp -o qaq -W
功能:显示所有的警告信息
命令:g++ qaq.cpp -o qaq -w
功能:禁止显示所有警告信息
5、优化 -O{num}
命令:g++ qaq.cpp -o qaq -O2
功能:主要有O1,O2,O3,Os,分别优化大小,功能,功能,大小。
6、标准 -std={version}
命令:g++ qaq.cpp -o qaq -O2 -std=c++11
注意:c++ 是小写字母c。
功能:使用标准c++11来编译程序
应用实例:
(1)g++ stoi.cpp -o stoi -std=c++11 使用标准c++11来编译程序, 将stoi.cpp 编译为名为stoi的可执行文件。
注意:c++ 是小写字母c。
7、Win系统栈 -Wl,–stack={size}
命令:g++ 1.cpp -o 1 -Wl,–stack=16777216
功能:把调用栈的大小指定为16MB。