研究三:组合导航(2/3)——SLAM部分

本文是作者对研究生阶段学习组合导航的总结,重点讨论了SLAM、视觉导航的基础知识,包括旋转向量、欧拉角、四元数的转换,以及相机模型和非线性优化。作者分享了学习心得,强调实际操作和代码理解的重要性,并提供了学习资源和建议。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

研究生生涯:历年的所有学习规划总结

终于到了组合导航这一门学科的讲解了,怎得说,经过了SLAM的毒打,静下心研究之后才发现惯导挺有意思的。注意:因为版权问题,很多东西是付费内容,我没放出来。


目录

研究生生涯:历年的所有学习规划总结

组合导航——visual部分

序章

1.1 心理活动ed:

1.2 食用指南

1.3 其他

第二章 绪论

2.1 Slam方向分类

2.2 装系统篇

2.3 前置学习

三 刚体旋转运动

3.1 前言

3.2 旋转向量(轴角)

3.3 欧拉角

3. 4 四元数

3.5 相互转换

 四 李群李代数

五 相机模型

5.1 相机模型

 5.2 相机标定

六 非线性优化

6.1 认识到优化和滤波

6.2 非线性优化原理

七 视觉里程计1

7.1 什么是视觉里程计

八 视觉里程计2

总结


组合导航——visual部分

谈到视觉导航,就让人联想到SLAM。这篇博客大致和你谈一谈SLAM中关于定位部分。


序章

        内容大体都源于视觉SLAM十四讲。这本书我觉得是目前SLAM国内研究的圣经,总结了前二十年的发展概况,是必看的一本书。但是,科研可以,找工作慎重。

1.1 心理活动ed:

        首先,说一下自己的心理历程。走SLAM这条路算是命运的是使然,本科就接触过一段时间,但是基本没学啥,到了研一下学期才开始研究,截至到2022年7月末,期间发生了各种事情,是否走slam也困扰了我好久。师兄(高冷)给不了我什么建议(我唯一记得的就是五月份的时候想问师兄如何入门,师兄说了一句:都是这样过来的,然后我就没说啥了。截止到本月末我都没有找过他)。本来入学就特别焦虑,加上中间发生的一系列事情,心理历程非常丰富,晚上睡不着觉都是小事,半夜脑壳疼才是痛点。具体就不想再说啥了,现在想想就是一句话:怪自己不够强大,同时自己脸皮还不够厚。

        这个博客算是自己四个月入门slam的所有学习路线,我依稀记得有位大佬说自己入门一年多,也有大佬半个月看完14讲的,但是就像当初考研捣鼓高数那样:研究难不难屁用没有,学到手的才是真实。

        虽然我也不清楚那些学一年的人到底是在学啥,但是研究四个月发现SLAM内容非常丰富,如果你研究其中一个库甚至花一个月都不一定能研究明白。对于硕士来说,能看懂代码改改能用就行了。

1.2 食用指南

注意:这个学习历程and总结只针对以下人群,

  1. 硕士,且不准备读博
  2. 对于SLAM十四讲要求仅仅是理解大概这本书在讲什么,能看懂代码(或者是先看懂代码)
  3. 由于SLAM在找工作这一块对算法要求很高(本质上都是在原有的框架上修修改改,不谈新框架),也就造成在找工作的时候,硕士对SLAM学习深度不深,但是找工作要求肯定是很高的,所以要合理分配时间。反正就一句话——只要学不死,就往死里学。

提前说几句:

  1. 不读博有几本书千万别碰,浪费时间还碎脑子
  2. 对于很多知识,就像某克学家说的那样——知识是有毒的,学习一部分就行,没必要弄懂全部,否则你不仅会陷入诡异的我数学驳论当中,而且众多的库知识会让你难以难以起步。时间是有限的,而且尤其是入门四个月已经把我耐心耗光了。不是说一年入门就应该花一年时间学习(感觉很大一部分时间都用来磨洋工了),所以说呀,人要知道那些课是看看就行,哪些课是真正有用的那些课就是用来磨时长的(就像考研那样初级班——中级班——高级班)。本书有些地方直接折叠了。
  3. 如果你是有一定深度学习基础的小伙伴还应该关注其他的博客,这本书仅仅是入门书,很多代码都是c++写的
  4. 就像我上面所说:这本书都是C++写的。一定要有一定的C++代码水准,至少把C++入门的教程看完一遍。
  5. 由于是基础书,对于STL可能介绍并不多,但是学到后期不仅要学习标准库,还需要学习一些算法实例
  6. 想入slam先看看这位知乎上的帖子,然后在说其他的

SLAM 入门需要多久,到可以胜任工作岗位又需要多久? - 知乎

1.3 其他

博客里面有其他博主的内容我也会全部标出,,但是有的可能直接复制粘贴了,首先声明:这个文档仅仅用于自己学习,如果看见传出去了了也仅仅作为个人学习内容。不涉及商业活动(虽然可能这个文档最后还是自己在捣鼓)。

如果有问题我在删。

  1. 首先提前感谢大佬资料强烈看这位大佬的

nullwh的博客_优快云博客-学习笔记,刷题练习,Apollo进阶课程领域博主

  1. 其次是视觉SLAM14讲
  2. cvlife.net

第二章 绪论

        SLAM是计算机视觉的一个重要的实践方向,涉及方向比较多,正因为视觉主要分类是学习和视觉几何,对SLAM的研究同样也是建立在二者之上的

        SLAM是定位和构图技术,也就是说 SLAM和导航(实际上是路径规划问题)其实并没有关系。虽然导航中用到SLAM的一些地图,但这些地图一般来说拥有的信息量是普通SLAM无法提供的。

        总体来说:SLAM代码复杂程度比较高,建议14讲之后直接看工程代码

2.1 Slam方向分类

2.2 装系统篇

        要求:要么双系统要么虚拟机(建议虚拟机学习,双系统开发)双系统参考:        

        Windows 和 Ubuntu 双系统的安装和卸载_哔哩哔哩_bilibili

        虚拟机配置:

(72条消息) VMware Ubuntu安装配置详细教程_我是五十的博客-优快云博客_vmware配置ubuntu

在双系统中记住分配几个区(一般磁盘都是GPT格式)

2.3 前置学习

vim

首先这是一个文本编译软件,对于刚接触的话,不咋建议学。硬说用到并且学习也就只有几个命令罢了,可能在其他配置一些文件中要用vim进行编写,但是完全可以用其他的文本编译器编译(如gedit),vim好处在于具有一定的保护措施(比如按i进入编译文本)

1 <ESC>键进入操作模式(小心数据不在受到保护)

2:按i进入编辑模式(小心编写内容)

3::wq保存并推出,:q只推出

其他指令看看vimtutor就行,坦白说挺鸡肋的,除非有些指令需要涌起打开,不然同类型的其他软件远超过它

ubuntu操作

        这一部分建议到blbl找一个视频学完就行了,知道ubuntu是什么样的目录结构,能够熟练的使用终端命令即可。

C++开发环境搭建

        如何在ubuntu环境下书写一个C++代码,然后编译成中间文件。知道什么是gcc,g++。

Cmake工程

        这块见:文件附录(1)

库安装

        这块见:文档附录(2)

三 刚体旋转运动

3.1 前言

其实在这一章开始就明显感受到技术壁垒了,如果你是控制专业的,或许十分熟悉,但是如果你是研究其他方向的可能就会比较晕。因为SLAM涉及机器人运动等众多领域

这里只放出大佬的博客

《视觉SLAM十四讲 第二版》笔记及课后习题(第三讲)_nullwh的博客-优快云博客

3.2 旋转向量(轴角)

        旋转矩阵的缺点:有9个元素,但一次旋转只有3个自由度,表达冗余+必须是正交矩阵且行列式为1,求解困难,所以就出现旋转向量了任意旋转都可以用一个旋转轴和一个旋转角来刻画,定义一个旋转向量/角轴,其方向与旋转轴一致,长度等于旋转角矩阵到轴角可以用罗德里格斯公式来得出旋转向量就是一个3维向量,但是轴角是一个四参数的向量但是关系很密切,所以一般称呼二者可以相互转换

 其中第一个式子xyz表示X^2+y^2+z^2=1要注意

1、用一个旋转轴n和旋转角θ来描述一个旋转,所以也称轴角。不过很明显,因为旋转角度有一定的周期性(360°一圈),所以这种表达方式具有奇异性。

2、从旋转向量到旋转矩阵的转换过程称为 罗德里格斯公式。这个推导比较麻烦,否则也不会有一个专属的名字了。OpenCV和MATLAB中都有专门的罗德里格斯函数。

3、旋转向量本身没什么出彩的,不过旋转向量和旋转矩阵的转换关系,其实对应于李代数和李群的映射,这对于后面理解李代数很有帮助。

3.3 欧拉角

个旋转分解成3次绕不同轴的旋转(例如绕Z-Y-X轴旋转)业内人士常说的俯仰、翻转、偏航

存在万向锁问题

1、把一次旋转分解成3次绕不同坐标轴的旋转,比如航空领域经常使用的“偏航-俯仰-滚转”(yaw,pitch,roll)就是一种欧拉角。该表达方式最大的优势就是直观。

2、欧拉角在SLAM中用的很少,原因是它的一个致命缺点:万向锁。也就是在俯仰角为±90°时,第一次和第3次旋转使用的是同一个坐标轴,会丢失一个自由度,引起奇异性。事实上,想要表达三维旋转,至少需要4个变量。

3. 4 四元数

通过复数的拓展得到四元素(通过复数表示表示旋转,四元素就可以表示空间旋转

1、SLAM编程中使用频繁程度接近旋转矩阵。稍微有点抽象,不太直观,但是一定得掌握。

2、四元数由一个实部和三个虚部组成,是一种非常紧凑、没有奇异的表达方式。

3、编程时候很多坑,必须注意。首先,一定要注意四元素定义中实部虚部和打印系数的顺序不同,很容易出错!

4、其次,单位四元素才能描述旋转,所以四元素使用前必须归一化:q.normalize()。

3.5 相互转换

 

 

 

 

 

 

 四 李群李代数

李群李代数这部分不说,很难,没有能力总结,建议直接看书

五 相机模型

5.1 相机模型

这一章大致介绍了传统的单目相机的针孔模型、畸变模型(介绍了鱼眼模型)。双目相机模型,RGBD模型。模型简单来说是一种理解实物到图像的一个过程,只有先有这个模型才能够谈后期对其精确的定位问题,还有简单的图片知识。Opencv库还是要多看看

数字图像处理

这里主要说一下:这一块涉及到了关于图像上的知识

SLAM14讲对图像讲的不多,似乎默认了图像是简单的一环,其他课程也并没有说说太多,但是作为计算机视觉来说,需要一本最基础的书。

这里需要一本书——数字图像处理(冈萨雷斯)——感谢老鲍的推荐

相机模型

这一块书还有博客做的都挺好的,就不复制粘贴了

《视觉SLAM十四讲 第二版》笔记及课后习题(第五讲)_nullwh的博客-优快云博客

 5.2 相机标定

        标定这块建议直接搜博客

六 非线性优化

6.1 认识到优化和滤波

        看书,略

6.2 非线性优化原理

        之前就说过在估计相机位姿的时候,由于累积会有一定的误差,为了减少这种误差,我们就需要使用降低误差的方法,目前主要有两种方法,一是使用传统以KF系列的滤波器方法,但是实验发现这种滤波器的实际效果并不是很好,后来研究发现非线性优化的方法比滤波器要好很多,因此。这一节我们介绍非线性优化的方法。

目前使用的库一般是g20采用了图优化的手段,而ceres用的不太多,如果说ceres是一种数学的角度来及进行求解,数学方法来进行优化,那么g2o就是一种创造性的进行求解具体需要看cvlife的博客(8.2日查看:发现之前整理的又消失了)

从零开始一起学习SLAM | 理解图优化,一步步带你看懂g2o代码_计算机视觉life的博客-优快云博客

从零开始一起学习SLAM | 掌握g2o顶点编程套路_g2obi编程套路_计算机视觉life的博客-优快云博客

从零开始一起学习SLAM | 掌握g2o边的代码套路_计算机视觉life的博客-优快云博客

七 视觉里程计1

7.1 什么是视觉里程计

        视觉里程计,就是反应相机的运动状况(也就是相机的变化矩阵),如果说上一张讲的是利用最小二陈对状态进行最优估计,找到相机的运动后的位置,那么这一章则是上一章的进一步应用:在找到相机的位置前提下,利用两个相机的位置关系,找到相机变换矩阵(也可能是变化向量),然后来反映相机的运动状态

          那么相机运动过程中谁不动?谁在动?

        我们回答是相机在动,但是相机中的物体没在动,因此我们需要以相机中的物体为依据,反应相机的运动。主要有两种方法:特征点法(本节)和直接法(第八章)

视觉里程计1这一部分的第一个主要内容是ORB特征点的提取与匹配。这里主要关注两个内容:

1)什么是特征点,以及特征点的一些性质,特征点的匹配方法及代码实现

2)ORB特征点的BRIEF描述子如何实现旋转不变性及在示例代码中的体现

目的只有一个:找到最好的匹配点用于下一个步骤计算相机的运动变化状态

这一节知识点很多,所以抽空列了一个知识导图

 

八 视觉里程计2

这里是注意一点:匹配像素点(很难)

 


总结

后面就是一些后端的东西了,我觉得定位就基本上这么多。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值