视觉惯性slam学习记录目录
本专栏主要用于记录本人自身学习《视觉惯性slam:理论与源码解析》记录。
目录
一、slam概览
在这里简单介绍一下slam定义及其应用吧。
slam指的是同步定位及建图,可以简单理解为一个搭载某传感器或多个传感器的运动载体(如机器人、小车、无人机等)在一个位置环境里,进行运动时,能通过传感器计算出自身的定位和位姿,然后通过传感器采集到的数据信息传到系统后端,在后端系统会完成一个建图的操作,大致意思就是载体在未知环境运动,能通过传感器的数据对自身进行定位以及对这个未知环境进行一个初步的建图。
slam的不可替代性以及和GPS相比:首先,GPS精度范围只能是一块大致的范围,无法做到特别准确,能达到米级的误差,但是slam的定位精度已经能到达厘米级,甚至更高;其次,GPS的使用条件会受到一定的限制,由于采用的是卫星定位,在开阔场景下,定位信号强且定位准确,但在室内、洞穴、隧道等地方,卫星定位失效,在室外的复杂环境,如茂密的森林、高楼林立的城市窄路上,卫星信号弱,也不利于GPS定位;最后,卫星定位会受到一些极端天气的影响,如暴雨暴雪等,slam在此时的作用就体现出来了。
目前,slam的应用十分广泛,目前普遍应用在自主移动机器人、AR技术、自动驾驶技术以及智能无人机上。
二、编程及编译工具
slam使用的主要语言是C++,推荐在linux环境下运行而非Windows环境,主要原因是目前开源的一些slam算法都是在linux环境下编程的,可以直接下载下来运行或是修改。
其次,c++拥有下列优点:更便捷的列表初始化、省心省力的自动类型推导、简洁的循环体、简洁的lambda表达式以及可随心所欲变长的模板参数等。
该章节后面介绍了Cmake文件以及环境的配置等,在此略过不谈。
三、slam中常用的数学基础知识
1.坐标相关
使用齐次坐标能大大简化在三维空间中的点、线、面表达方式和旋转、平移等操作。利用向量的点乘和叉乘运算可以很方便简洁的表示点线面之间的关系,而且使用齐次坐标之后能用0来表示无穷远点。
同时,使用齐次坐标可以方便地表达空间中的旋转、平移和缩放。通过引入齐次坐标,可以将旋转和平移写在一个变换矩阵中,此时整个变换过程就是一种线性关系,就可以通过变换矩阵连乘来表示连续的欧式变换。
2.三维空间中刚体旋转的几种表达方式
主要可以分为旋转矩阵、四元数、旋转向量和欧拉角,具体的定义和运算可以参考高博写的《视觉slam十四讲》。
2.1 旋转矩阵
该矩阵大小是3x3,且有较强的约束条件:首先需要满足正交性,即该矩阵和它的转置矩阵乘积是单位矩阵且行列式值为1;该矩阵可逆,逆矩阵表示相反方向的旋转。
物体在空间中旋转的方向只有三个自由度,但旋转矩阵使用9个元素来表示,这种表达方式是冗余的。
2.2 四元数
四元数由一个实部和三个虚部组成,是一种非常紧凑没有奇异的表达方式。在表示旋转时记得要先将四元数归一化,因为只有单位四元数才能描述旋转。
2.3 旋转向量
旋转向量用一个旋转轴和旋转角描述一个旋转,也称轴角,但是该方式具有奇异性,这是因为旋转是具有周期性的,当旋转一整圈即360度时,我们无法得知目前所处的旋转三哪个周期的。
从旋转向量到旋转矩阵的转换公式称为罗德里格斯公式,可以从opencv、eigen库中调用,或者使用matlab调用。
旋转向量和旋转矩阵的转换关系,对应于李代数和李群的映射。(不了解李群和李代数的读者可以阅读视觉slam14讲第四章)
2.4 欧拉角
把一次旋转分解成三次绕不同坐标轴的旋转称作欧拉角,比如航空领域的俯仰-滚转-偏航就是一种欧拉角,这种方法的好处在于很直观,但同样存在奇异性的问题:在俯仰角为正负90度时,第一次旋转和第三次旋转使用的是同一个坐标轴,丢失了一个自由度,这种现象也称为万象锁。因此想要无歧义地表达三维旋转,至少需要四个变量。
3.矩形线性代数运算库Eigen
随后介绍了矩形代数的运算库Eigen,该库以矩阵为基本数据单元,所有矩阵和向量都是Matrix模板类的对象,该库提供了大量的矩阵运算函数,除了空间几何变换函数外,还提供了矩阵分解、稀疏线性方程求解等函数。
总结
记录了《视觉惯性slam》前三讲的主要知识点,用于日后查阅。以上。