《视觉SLAM十四讲》学习笔记

第二讲:初始SLAM

前言

本篇主要是针对视觉SLAM学习过程中的知识点进行总结,初识SLAM可能记录较为繁琐,后续学完会再次修改精炼。

1.相机分类

单目相机:得到照片,以二维形式反映三维世界,缺少深度信息,具有尺度不确定性

双目相机:由已知i基线的双单目组成,通过基线(双单目间距)估计各像素空间位置,但配置与标定较为复杂,视差计算耗费资源,深度量程和精度受双目基线和分辨率限制

深度相机:利用红外结构光或Time of Flight(ToF)原理来计算物体离相机距离,主要用于室内

2.框架

 经典视觉框架如图所示:

视觉里程计:只计算相邻时刻运动,但会产生累计漂移,误差累积传递,导致地图建立不一致

后端优化:处理噪声,主要包括滤波和非线性优化方法

回环检测:解决位置估计随时间漂移问题,通过识别曾到达过的场景实现目标,可以利用环境传感器或者图像相似性判断实现

3.建图

度量地图:强调精确表示物体位置关系

拓扑地图:强调地图元素之间关系,只考虑节点连通性

4.数学表述

SLAM过程可以看作运动方程和观测方程的结合,根据空间自由度的不同,方程复杂度也不同

运动方程:x_k=f(x_{k-1},u_k,w_k)u_k为输入,是运动传感器读数,w_k是噪声,x_k是k时刻的位置

观测方程:z_{k,j}=h(y_j,x_k,v_{k,j}),在x_k位置上看到路标y_j,产生观测数据z_{k,j}v_{k,j}为观测噪声

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。
 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值