欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【学习记录1】视觉SLAM

程序员文章站 2024-03-25 10:41:06
...

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)=12πσe((xμ)22σ2), f(x) = \frac{1}{\sqrt[]{2\pi}\sigma}e^{(-\frac{(x-\mu)^2}{2\sigma^2})},

二维形式:
f(x,y)=(2πσ1σ2)1e[12(1ρ2)((xμ1)22σ122ρ(xμ1)(yμ2)σ1σ2+(yμ2)2σ22)], 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})]},
​ 参考博客: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

上一篇: 用tensorflow构建动态RNN

下一篇: