【学习记录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.高斯分布(通常指正态分布概率密度函数):
一维形式:
二维形式:
参考博客: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
上一篇: 用tensorflow构建动态RNN