【VSLAM学习记录1】视觉SLAM

SLAM简介:

SLAM (simultaneous localization and mapping),中文译作"同时定位与地图构建",它是指搭载特定传感器的主体,在没有环境先验信息的情况下,于运动过程中建立环境的模型,同时估计自己的运动,如果这里的传感器主要为相机,则称为’'视觉SLAM"

经典视觉SLAM流程:
传感器数据
前端视觉里程计
后端非线性优化
建图
回环检测

1.传感器信息读取,在视觉SLAM中主要为相机图像信息的读取和预处理。

2.视觉里程计(Visual Odometry , VO).视觉里程计的任务是估算相邻图像间相机的运动,以及局部地图的样子。VO又称为前端(Front End)。

​ 【里程计,顾名思义类似是用来完成某种运动估计的装置(测量速度,加速度,计算位移等)由于 受噪声影响其估计误差会逐渐累积,累计误差,这种现象叫漂移(drift)】

​ 参考博客:https://blog.csdn.net/weixin_37251044/article/details/79009385

3.回环检测。判断机器人是否到达过先前的位置。如果检测到回环,它会把信息提供给后端进行处理。

​ 【我们的位姿约束都是与上一帧建立联系的,第5帧的位姿误差便已积累了前4帧位姿约束中的误差。但如果发现位姿5不一定由4推出,还可由1推出(回环),这样累计误差便减小了。但如何确定除4外5还可由谁推呢?找出可以建立这种位姿约束的历史帧,就是回环检测

​ 参考博客:https://blog.csdn.net/fishmarch/article/details/82892847

4.后端优化(Optimization)。后端接受不同时刻视觉里程计测量的相机位姿,以及回环检测的信息,对它们进行优化,得到全局一致的轨迹和地图。由于接在VO之后,又称为后端(Back End)。

​ 【把所有地图数据放到一起做一次完整的优化,从而降低各部分的误差

​ 参考博客: https://www.jianshu.com/p/e4a45ccd128f

5.建图(Mapping)。它根据估计的轨迹,建立与任务要求对应的地图。

SLAM第一讲习题:

1.线性方程 AX=b 该如何求解,对A和b有何要求? Ps:(以向量空间的角度理解)

1)若b==0,即AX==0:

​ 若R(A)==n&&X!=0 即A张成的空间有n维,且x有n行(b也存在于n维空间),X存在的原始n维空间无法通过A的线性变换而降维,(或理解为构成A的向量组无法通过由b指导的线性组合而变为0向量),所以当且仅当X==0即X只有零解时,等式才成立。

​ 若R(A)<n时,即A张成的空间小于其满秩时的维数(存在线性相关组),即X存在的原始空间通过A的线性变换降低了维度,则当X的方向恰为线性变换后降维的方向时,X存在非零解,其解集即基础解系的缩放版本(模变方向不变),而基础解系的多少取决于原始空间降低的维数。

2)若R(A)==R(A,b)==n:

​ 即A满秩,X存在于n维空间,X的原始空间通过A的线性变换后不降维,则X通过A的线性变换必将成为一个相对于原始空间的新的向量,即b,b也存在于n维空间中,且仅有唯一解b。

3)若R(A)==R(A,b)<n:

​ 即原始n维空间通过A变换降维且b与变换后的空间同维,而X存在于更高的n维空间,且X通过A变换后失去了降低的维度的信息成为b,此时X解不唯一,其解集即降维后X的’'剩余维度信息(常向量)"加上降维方向上丢失的向量系(基础解系),基础解系的数目多少取决于原始空间降低的维数,若当降维方向上的向量分量恰为0,则其特解便为基础解系中的常向量。

4)若R(A,b)>R(A):

​ 即通过线性变换将X转化为与A同维(<=n)的向量,而转换后的向量b的维度却>R(A),故不存在这样的解

解法:对于齐次线性方程,对系数矩阵进行初等行变换化为行最简,求解,若有多解则求通解;

​ 对于非齐次线性方程,对增广矩阵进行初等行变换化为行最简,求解,若有多解则求通解。

2.高斯分布(通常指正态分布概率密度函数):

一维形式:
f ( x ) = 1 2 π σ e ( − ( x − μ ) 2 2 σ 2 ) , f(x) = \frac{1}{\sqrt[]{2\pi}\sigma}e^{(-\frac{(x-\mu)^2}{2\sigma^2})}, f(x)=2π σ1e(2σ2(xμ)2),

二维形式:
f ( x , y ) = ( 2 π σ 1 σ 2 ) − 1 e [ − 1 2 ( 1 − ρ 2 ) ( ( x − μ 1 ) 2 2 σ 1 2 − 2 ρ ( x − μ 1 ) ( y − μ 2 ) σ 1 σ 2 + − ( y − μ 2 ) 2 σ 2 2 ) ] , f(x,y) = (2\pi\sigma_{1}\sigma_{2})^{-1}e^{[-\frac{1}{2(1-\rho^2)}(\frac{(x-\mu_1)^2}{2\sigma_1^2}-\frac{2\rho(x-\mu_1)(y-\mu_2)}{\sigma_1\sigma_2}+-\frac{(y-\mu_2)^2}{\sigma_2^2})]}, f(x,y)=(2πσ1σ2)1e[2(1ρ2)1(2σ12(xμ1)2σ1σ22ρ(xμ1)(yμ2)+σ22(yμ2)2)],
​ 参考博客:https://www.cnblogs.com/bingjianing/p/9117330.html

3.1.C++中的类:

​ 1)C++中的类是对C struct 的拓展和延伸,C中只能定义成员变量而不能定义成员函数,C++可以

​ 2)C的结构体对内部成员变量的访问权限只有public而C++允许public,private,protected三种

​ 3)C语言的结构体是不了继承的,C++的类可以从其他结构体或类继承过来.

​ 参考博客:https://blog.csdn.net/u013925378/article/details/51661081

https://blog.csdn.net/ycwasdfasdf/article/details/51363756

#include<iostream>
//using namespace std;
int b=1000; 
class test
{ 
	public:	//class默认是private; struct默认是public   
	    void sum(int a,int b=0); //C++初始化参数值只能靠右定义(int a=0,int b)是错误的 
 }; 
 void test::sum(int a,int b)  //test::注明sum是属于test类下的函数 
 {
 	std::cout<<a+b<<",";  //std::注明所使用的函数属于哪个库(命名空间) 
 }


 int main()
 {
 	int b=9999;
 	test a[5];
 	a[1].sum(1,2);
 	a[2].sum(2,4);
 	std::cout<<::b<<',';  //::b注明b属于全局变量 
 	std::cout<<b;  //这里的b是局部变量 
 	
 	
 }

输出:3,6,1000,9999

3.2.C++STL:

C++标准库由三组库构成:C库,C++库,标准模板库(STL: Standard Template Library)简单来说就是封装好的一些组件

在C++标准中,STL被组织为下面的13个头文件:algorithm, deque, functional, iterator, vector, list, map, memory, numeric, queue, set, stack, utility

STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。

为什么要学STL呢?
方便。比如你要实现一个链式队列,以及它的一系列功能,你需要敲几十乃至上百行代码,还要投入精力debug,可在STL里,给你做好现成的queue你用不用?现成的快排你用不用?平均复杂度O(nlogn)的排序只要几句话,手写一个冒泡也得好几行吧?还卡时。

示例:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{	

    int a,b;
    cin >>a>>b;
    swap(a,b); //交换函数 
    cout<<"swap:"<<a<<' '<<b<<'\n';


    int c[5]={1,2,3,4,5};
    int i;
    reverse(c,c+5); // 逆序函数  <algorithm>
    cout<<"reverse:"<<c[0]<<c[1]<<c[2]<<c[3]<<c[4]<<'\n'; 


    cin >>a>>b;
    cout<<"gcd:"<<__gcd(a,b)<<'\n';  //最大公约数 (两个下划线)  <algorithm>


    int e[]={1,2,2,3};
    cout<<"全排列:"<<'\n'; 
    do{
        cout<<e[0]<<e[1]<<e[2]<<e[3]<<'\n';
    }while(next_permutation(e,e+3));  //全排列   <algorithm>


 }

输入输出:

12 21
swap:21
12
reverse:54321
23 46
gcd:23
全排列:
1223
1232
1322
2123
2132
2213
2231
2312
2321
3122
3212
3221

参考博客:https://blog.csdn.net/mMingfunnyTree/article/details/79182048

4.C++11标准:

参考博客:https://blog.csdn.net/whhitxjl/article/details/50703918

https://blog.csdn.net/xiaomu_347/article/details/82563688

5.linux目录结构:

参考博客: https://blog.csdn.net/wangrongrongwq/article/details/79624797

6.linux常用命令:

参考博客:https://blog.csdn.net/intflojx/article/details/85882002

https://blog.csdn.net/zanzhebo0157/article/details/87907123

7.linux安装软件的几种方法:

参考博客:https://blog.csdn.net/u010509774/article/details/50593231

全篇参考:https://www.cnblogs.com/NikkiNikita/p/9450772.html

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值