00:00
我这次分享的内容就是如何快速入门视觉slim。嗯,首先说一下呃开发的环境,这边推荐的是Linux发行版本U般two16.04,当然也可以装更高版本的,但是网上相对的呃,解决遇到问题的解决方案会少一点,不过也可以踩一下坑。呃,高版本的系统体验会更好一点。嗯,然后我这面推荐的是。单独装一个Ubuntu系统,然后也可以装双系统。因为有一些。有一些工作可能还是要在Windows下面做,然后呢。装系统的话需要一个U盘,然后来制作一个系统盘,然后呢,我这面在微信公众号小邱司令笔记有发过这三篇教程,然后第一篇就是如何制作U盘,然后第二篇文章是呃。
01:11
双系统就是你已有一个WIN10,然后在WIN10下面做一个分区,然后去装u two16.04。然后就是在装这个的时候,大家要注意嗯,要把Windows下面的资料做一下备份,有可能操作失误,这样WINDOWS10系统就没有了,然后直接被Ubuntu16.04给覆盖了,嗯,然后还有就是嗯,大家按照这个教程操作的时候一定要小心,嗯。看看一下。下面的评论。然后我也。有,嗯,在评论的地方也添加了一个参考的教程,大家可以看一下。
02:00
因为嗯,这个像操作系统的话,Windows u to,还有呃,苹果的,然后还有一些架构,他可能就是每个人的笔记本他都嗯不太一样,所以遇到的问题的话,可能都不一样,嗯。我觉得也就是只是针对我这个。笔记本的,嗯,做的一些记录,我的笔记本是,嗯,联想的新pad。然后就版本很低,然后这个后面的话就是呃,是用的嗯。惠普的那个游戏本。然后装的时候有一个地方就是显,因为那个它有呃,显卡不兼容的问题,就是比较麻烦,然后我教程里面都有详细的写到。然后装了U班兔系统啊,就要会一些U班兔系统的基本操作。
03:03
然后这一篇教程的话,就是写一些我工作过程中比较常用的一些操作啊,然后当然还有一些其他的。然后大家可以先把这些比较高频的操作去熟悉,然后这样可以应用大部分问题,大部分的,呃,那解决大部分问题,然后其他的话可能就是要在网上去找一下。然后这个就是整体的,嗯。STEM或者是视觉STEM的开发的环境。当然也有在Windows下面或者是Mac下面做开发的,然后嗯,我是一直在Ubuntu16.04下面做开发,所以比较推荐这个吧。开发环境就是这样。当我们学习这个STEM的话,肯定是肯定是要运行一些代码的。
04:04
运行代码的话。就要去编译运行以及调试,那在UB库下面比较推荐的话就是c make跨平台编译的这个工具,然后这个工具在视觉SLAM14讲第一版本,第二版本,嗯,高博的那个那个书里面写的不是很不是很详,就是很很详细吧,然后我我也。我也就是写了这一系列的教程。然后呢,这每一篇教程下面都有都有相应的视频。然后大概是这六篇。这六天,然后这最下面这一篇的话是如何?嗯,用那个GDP去调试。然后整个的话就是用CMA去编译,然后编译好了就可以运行,然后一旦出错了,然后就用GDP去调试,然后这个CMA是在u two下面,嗯,是全都是在终端命令行下面去操作的,然后。
05:17
就是没有图形化的界面。嗯,所以嗯大家嗯没有接触过这个CMA的话,就嗯还是很有必要对着这个视频和教程在呃实际的去操作一下,因为在window有Windows系统切换到linus系统下去做开发的话,嗯第一点就是要。嗯,要做一个切换,就是没有那些图形界面了,像在Windows下面一般都用Windows studio去做,然后这个Windows studio它就屏蔽了你,嗯,这个编译器。
06:01
嗯,比就是那些工作,就是我们都看不到它如何去编译的,嗯,如何去运行调试,这样编译的话,需要这个需要生成,嗯,需要写一个c make list文件去写一些。嗯,这个代码需要生成的一些库啊,需要链接到哪些库啊,需要依赖哪些第三方库啊,啊,以及我们生成的那个动态库放在哪里,还有可执行程序放在哪里,都是这个CMA这个工具做的一系列工作,以及我们。调试的话也是要在C里面把它编译的,呃,生成的生成的内容就是生成的那个版本,给它设置成debug版本的。嗯,大家就详细看一下这些教程吧,我写的也很详细,然后如果有什么问题的话可以呃添加一下我的微信,然后是小邱slim笔记英文的全拼,然后嗯,加大家进交流群,大家一起交流呃问题,然后我如果有时间的话也会在群里面回复前面的c make是没有图形界面的,就是在终端去操作的,你像Linux的发行版本UB two的话,它是有界面的,你像如果把Linux放到服务器上的话,你可能就是嗯,或者是其他版本,就是图形界面不太方便吧。
07:38
然后接下来的话就是在UB兔下可以装一个图形化的IDE,就是这个C烂,C烂其实非常强大,嗯,它可以。图形化的展示了那些我们需要,嗯,编译啊,运行调试的一些一些按键空间什么的,其实它底层也是调用了CMA跟GDB,然后我也是写了三篇这个教程,然后也有视频,嗯。
08:13
大家可以对照的去看一下,第一天的话就是讲ubtu如何安装,呃,Clan。然后还有一些配置,然后的话,第二篇就是cline怎么调试C加加的代码,然后第三篇是cline调试Rose,其实Rose的代码它主要也是基于C加加的,然后像C加加的话,它是用它是用C,那这个原因嘛,因为Rose的话它就是catic,它其实。有一些细微的差别,但是嗯,可以。嗯。跟C加加也差不多,然后的话,Rose主要的一个功能就是负责多机通信,你就把它当做一个通信的模块就好了。
09:02
当然在战术上有。要就是把它抽象化,然后具体的话我们还是要嗯系统的去学习的,就是cline cline下面如何去,嗯,编译运行调试代码,这个其实还是很快的,我现在主要的开发环境的话就是C烂。这个调试的时候可以一步步的看到,比CMA和GDB终端去调试方便很多,而且而且有一些东西不用你去配,只要嗯,只要把你的嗯。把你的可执行程序,嗯,放到放到cline下面,然后给他做一些参数,告诉他在哪里就可以了,这个C烂的话没有VS扣的那么麻烦。然后的话说一下这个Vs code的。这面有四篇,四篇教程,然后也是第一篇是嗯。
10:06
如何安装,然后还有最主要的是它有一些高频的快捷键,这个VS扣的安。他其实应该是一个是一个类似于,嗯。就Windows下面的。Note配的加加那个那个工具吧,它其实就是。更更适合于编辑一些东西它,嗯,不,没有,不是那种重量型的,像C烂,它集集成的那些,嗯,编译的那些东西,如果你想要把它打造成为一个一个IDE,一个编译器的话。那就需要借助一些插件,然后当然它下面它的它的界面风格就是很。很受大家欢迎,然后有一些插件也很好用。然后的话。
11:01
可以自己安装一些插件,然后把它打造为适合自己,自己喜欢的一个IDE吧,但是它在运行调试的时候有一点点麻烦,所以我刚开始的时候,嗯就是想着嗯就。都切换到Vs code下面,但是后面发现就是确实挺耗费心力的,其实就是大部分就是看代码的时候我会用Vs code的,但是运行调试的话我还是用C。然后这面也有调试C加加调试Rose的教程,也是这是四个,然后都有对应的视频,都在公众号下面。然后前面的话就是搭建好了开发环境,然后运行调试的一些,嗯,前期准备工作,然后的话在因为我们做嗯,这个STEM的话,他。
12:02
学校的语言还是C加加吧,因为他嗯。就是需要跟硬件去打交道,然后用到Python的话,可能就是一些,呃,一些脚本啊,一些处理数据啊,或者是。嗯,不太那么底层的开发需要用到Python这个语言,然后就是如果,如果你是一个有开发经验的话,那当然就不必说了,如果要是说代码开发经验很少的话,嗯,我建议先先不用大而全的去把这个C加加整个框架全都过一遍,因为这个很浪费时间。如果你要把它全部都。全部都搞,搞一遍的话,这个太浪费时间了,而且拉的战线特别长,嗯,也许等你学完这个的时候,你就放弃STEM。然后呢,就是嗯,最主要的你就嗯,搞清楚代码整个的执行流程,比如说它的if else,还有for循环,Well,还有就主要是那个顺序执行,循环执行什么的,这个你要搞清楚它的执行逻辑,其实整个你就不管是一个大的大的工程还是一个小的代码的话,它都是按照这个逻辑去执行的。然后你。
13:30
如果后期有精力的话。嗯,我建议一定要要去系统的学一下呃,数据结构和算法,因为我们的代码最核心的是什么呢?就是操作那些数据,然后数据,你操作数据就要用到一些一些算法,一些策略,这个这个影响是潜移默化的,对你整个的开发生涯的话,它都是有一个呃很大的帮助的。
14:01
下面说一下we依赖的第三方库。首先呢,这个微就是微就是视觉嘛,视觉最主要的就是这个open CV这个库,它主要的就是图像跟图像的特征。这个库其实它嗯包含了很多图像的,你像嗯深度学习。STEM这一块它都有很多成熟的一些方法,当然如果你作为一个资深的,嗯,图像领域的传统的方法工程师的话,可能会呃,对这个open CV的源码要很详细,嗯,很了解,很熟悉,然后如果他哪里哪里的源码不符合你的要求,可能要改一下源码,或者是把它的功能去拿出来,自己再做一下二次开发。然后,但是我们我们现在如果作为初学者的话,没有必要搞得那么深。
15:07
嗯。嗯,就是简单的了解一下,嗯,OC的数据类型像。这个现在比较常用的就是这个CV max,然后怎么去读写图片,然后读写视频,怎么打开摄像头,然后还有就是图片的一些格式啊,还有图片的一些呃。灰度处理什么的类似的,嗯,还有一些opencv怎么去机电呐,呃,一些滤波的操作。这些都是视觉STEM需要的,像我在公众号也写了几篇opencv比较常用的一些文章。大概是七八篇的样子,然后呢,就是嗯,我个人的话比较注重实践,所以我的我的文章的话都是有很有一个完整的代码,然后代码里面加了一些比较详细的注释,这个对初学者很友好,然后呢,也会详细的写,详细的写明怎么去呃运行这个代码。
16:22
然后第二个库的话,就是这个PCL,它就是一个点云的处理库。然后这个等一下后面我们再说,然后这个潘格就是一个显示的。就像我们,嗯。像orb slim two的话,它主要的显示都是用这个古做的。然后也有像高博的话,在代码里面就用open CV的一个,呃,自己自带的一个显示的,显示的叫VTK的去做的,然后像第三第四个的话,就是这个II3跟这个surface,他俩其实可以放到一起的,都是,嗯,都是对矩阵的一些操作跟计算,你像CMA就是用它去表示图像嘛,你对图像提特征,然后去做一些操作的话,都是需要大量矩阵运算的。
17:21
所以这两个,嗯,这两个的话就是。主要就是矩阵运算相关的一些库,然后下面的话就是寄托关,他俩是,嗯,是后期的话你需要去。对矩阵求,嗯。亚克比啊,海森矩阵啊,然后怎么去优化你的位姿去。用到的这两个库像。嗯。14讲里面关于g two跟series都有相应的代码,然后orb STEM to里面,它主要是用g two。
18:04
寄托,嗯。他们俩的其实可以就是。主要是后端优化的时候才用的到,然后最后一个就是这个d bow,它是一个磁带,它主要是回访检测端重定位的时候用的到。这个就是为STEM需要依赖的一些第三方库。然后重就是刚才我说的open CV的一些像嗯,Open CV。就是这一篇文章的话,就是有两个点要说一下,一个就是嗯,数字图像跟模拟图像,然后还有就是呃,CV ma,就是做了很详细的讲解,然后还有代码,还有一些图片的属性,就是我。
19:00
我最开始也是忽略这一块的,然后就是通过这这一篇文章,就是把它补齐,嗯,把它补充了吧,就是对图像有了有了一些呃,更更全面的了解吧,嗯,然后就是第二篇文章,就是嗯,图像的一些旋转,平移,反射变换,其实图像的一些操作无非就是。像他像嗯多视图几何里面列出的那些内容,其实我觉得大家不要被他的名字给吓到,其实就是图像与图像之间的一些变换,那图像与图像之间的变换就是通过一个矩阵吧,这些只是名字不一样,但是它变换来变换去,中间的东西都是通过矩阵去去做的。怎么去求这个变换矩阵,或者是我把这个矩阵应用到这张图像,它就变成另一幅图像了,就这样。
20:02
然后的话是第三个。就是图像的一些混合呀,然后还有显示。然后就是图像的滤波,以及滤波的话,就是因为我们。要提取特征嘛,提取特征的话就是一定要呃,要首先把图像转为灰度图,然后再做一些操作,然后像添加噪声的话,可能就是一些,嗯,像深度学习里面用的比较多一点,是因为它呃训练的数据集比较少嘛,然后你要通过这些图像的变换去生成一些多的图像。然后这个的话,这个就是在图像上绘制一些东西,你像我们提取特征的图片上面不是画了一些小圆点嘛,然后还有一些文文字什么的也可以加上,然后这个都都做了一些详细的代码讲解。然后这个的话就是。
21:06
嗯,OCV的YML跟TST文件的处理相关相关的内容,因为就是。我们在编写代码的时候,运行一个程序,不可能把所有的参数都写到源码里面,然后你最终生成一个可执行程序,那你要是再输入别的参数的话。比如说你想改个数据读入的路径,你难道还要再重新编译一下吗?这前不是太高效的,所以的话就是这个这个这些文件就是处理这些外,就是这个程序的外部接口的一些参数配置,以及它的输入输出什么的,然后这个就是很方便,然后就是。他YM有一个C加加版本,Open CV一个版本,然后呢。我当时处理问题的时候,也是也是也是有遇到一些问题吧,然后就把它写写出来了。
22:04
有都是我的,我写的这些东西呢,都是很结合实践的。都有详细的代码。然后这个就是图像的一些,嗯。域名啊,就是些操作嘛,因为我们在我们不可能总是跑别人的数据吧,总要自己做一些。那你自己做一些数据集,有一些名字啊嗯,图像那些东西,那些操作你。肯定是要自己去制作,然后符合,嗯,数据集或者是你想要的那种格式,所以这个就涉及到批量操作图像的,其实Python的话更适合去做这些工。他的代码量少。然后也比较容易。但是对于处理速度方面来说,还是C加加比较快,比如说同样处理1万张图片。
23:03
丫丫会很。然后的话,最后就是这个欧文。头像去店吗?这个其实也是一大块儿内容,然后我写的都是调用OCV的。像。嗯,高博14讲里面也是也有有一有一个第五章,它不是自己写那个去积变的那个针孔相机去变的,去积变的函数嘛,然后我也有把它放到里面去做了一个对比。那个去,嗯,高国14讲里面,它是针对于针孔相机的去积变的实现,然后。你如果要是语言或者是其他的,呃,摄像头的话,就是要针对性的去改一些参数,然后。去去去几点。这个也是,嗯,STEM图像的一个基本操作,你输入要么是把去机变的,去机变以后的图像输入你这个slim系统,像RP slim图,或者是你不去机变,然后再sli RP slim或者是其他视觉的算法里面去做一个操作。
24:19
所以这些都是一些很基本的,因为我现在就是可能我就是公众号,嗯,Opencv这个实践的这块,就现在更新了这些文章,可能我后面遇到一些问题,我会把它补充吧,然后。嗯,不想把它就是单纯的写成一个open CA的什么东西,就是把一些我用不到的都放上去,反而就是嗯。感觉不太不太友好吧,就显得,然后就是。说一下这个Rose。Rose就是一个机器人操作系统嘛,但是我觉得把它理解为一个负责通信的通信的包,就是比较比较好好一点,然后呢,这这一篇是我的教教程,然后的地址是这,然后就是说一下他的。
25:19
他的目录,我这篇文章的目录结构吧,就是在,因为我发现就是嗯。好好多好多好多人嘛,他就是可能用了很长时间的肉,但是他他他连工作空间,嗯功能包的概念分不清,然后呢,就是就是搞得模棱两可,然后还有Rose的一些,嗯一些工具,他用的都不是很很熟练,然后就我就觉得这是一个。很需要澄清的一个问题,所以这篇文章的话,我写的非常详细。好,还有一个就是Rose lunch启动文件的那个,我忘记放在上面了,稍后我把它贴上去。
26:08
然后这个都都写的非常详细,我觉得这是你一直都要用到的一个工具,就没有必要。就是很有必要去去给他搞懂。因为这个的话,它肯定是要,嗯,涉及多个机器之间的通信。所以现在呃,我们就可以借助肉像,嗯。百度阿波罗他们应该是就是抛弃Rose自己写了一个负责通信的。东西。然后的话是这个相机以及它的标定,像相机的话还有弹幕啊,双目啊,二级DD啊。嗯,刚S类里面还有其他一些传感器啊,像什么编码轮啊,MU啊,还有激光雷达,还有GPS,我这篇文章呢,就对这些传感器啊,以及使用场景做了一个汇总,写的挺全的,然后也挺多,然后都在我这个这个地址下面,在我博客里面,然后呢。
27:22
嗯。还有就是它的标定,像一些普通的相机的标定啊,然后一眼相机的标定,然后还有IMU的标定,都写到这一篇文章里面,嗯,像他标定的三个三大方法,要么你就是调用open CV的工具就标定,要不然你就是Rose的,然后还有一个就是Cali去标定它。就这三大块儿。然后呢,教程里面都很详细,这个单拿出来讲的话都要讲很久,大家可以直接就看这篇文章。
28:01
给大家讲一下,就是嗯,STEM的一个核心的问题,首先这个V的话就是视觉,你用视觉的话就是视觉和传感器嘛,单目双目RGBD嘛,然后呢,这个S呢,就是同时,然后这个L呢,就是location,就是定位的意思。然后这个A是and m是。Map,然后呢,就是对应中文就是建立地图嘛,建立地图你。嗯,然后再去先它的核心,那我们其实像像2p STEM to的话,它是有一个呃,定位模式跟一个建图模式嘛,那我们不见图不就指定位嘛,那我们把这个M就去掉了。然后就是把这个M如果去掉的话,那就是这个L了,就是这个定位的问题嘛,那你定位的问题,如果那这个定位它究竟定的是什么,它其实就是一个RR跟小T。
29:05
大写的R是什么呢?就是旋转矩阵,小写的T就是平移向量。然后呢,你像高国前,嗯,14讲里面他。他前面做了做了大量的铺铺垫呢,去去讲这个东西,我觉得就是很容易把大家就是拦在了这个STEM的,STEM的就是入门,还没入门呢,就就拦到这儿了,我觉得就是呃嗯如果如如果就就是大家学的时候可以就是嗯策略性的把它先放一块,那就就就搞懂这个什么是旋转矩阵就就OK了,然后的话就为了。为了计算方面,就搞了一个素元数嘛,剩下剩下那个像什么角轴跟那个嗯,跟那个欧拉角,就就就如果你暂时理解不了,就放放那块就好了,你就搞懂什么是旋转矩阵嘛,旋转矩阵它有另一个名字,也叫方向余弦,它就是为了表达表示两个坐标系,你像刚才不是说,嗯,刚才那个open CV时候,我不是也说到嘛,就是两张图像嘛,两张图像你你你这这一秒拍了一个第一帧图像,你第二秒你又拍了一个图像,那这两张图像之间我是怎么变换得到的这一张图像的像素,怎么变到另一张图像的像素,那就是一个变换的矩阵嘛,那这个定位你这个RR不就是。
30:37
而就是一个矩阵呀,你你把它,你把它理解成两个两个坐标系,两个坐标系之间的转换,就是这个旋转矩阵呀。我们的定位,定位的问题,定的就是这个东西,就是with r跟T。大家不要把这个问题想得太复杂,其实每个人,每个人的理解不一样,每个人的表述方式也不一样,所以就感觉好像太多内容了,太复杂了,其实你如果把这些东西都给他归纳总结一下,其实他就是求这个RT。
31:13
变了发着求这个RT,然后后面的话你像。嗯,像高博14讲里面,他其实做了两帧视觉里程记嘛,它就是两张图片去求这个RT,那你求完这个RT可能不准确,你就做一些优化呀,然后就做一些什么操作啊,你的图像什么怎么的,输入的问题啊,什么不好还是像什么的,像RP STEM to,对图像的题特征啊,一些存储啊,一些搜索,你像回款检测,他用了搞了那个。嗯,什么把茶树啥的去去做一些,那都是一些优化的东西,你完完全完全都是一些后期的工作嘛,所以就是那那些对我们理解这个STEM问题,就是会造成一些阻碍混乱,就就我们就把它理解为一个去RT的过程,然后后面就是一系列的优化,一系列的应用,然后你求完RT了之后。
32:11
求RT之后,你就你就可以,你就可以求出它的,求出它的那个,求出它的那个三维点嘛,然后你就可以建图啊,你你可以建图建图,你可以建一些嗯稀疏的地图啊,像2P图,然后嗯也可以建一些稠密的地图,你想做什么应用,你就去做什么应用啊,现在还有基于基于点云图像的稠密点云图像的一些深度学习啊,那都是一些后面的操作,那我们最核心的就是定位。你这个定位RT,那然后再回到他最开始,假如说我们像像其实这这三种相机的话,是RGPD是最好理解的,然后双目单,那RGBD它。它这个相机它有两种测距方法嘛,一种是结构光,一种是飞行时间测距这个。
33:04
就是说这个传感器,我在我在返回给你图像的同时,我还给你返回一个数据是啥呢?就比如说我我相机照,嗯,拍到拍到了一个一个东西,我能我能告诉我能给你返回这个图像,这个这个图像的颜色信息,我还能给你返返回它的。它距离你多远的信,那你知道了这个D,然后你还知道了这个图像的信息,那就相当于你知道了,呃。然后你的提取特征,然后你就相相当于知道了你你图像的像素的位置UV,然后你还知道了这个像素的距离那。通过通过这个UV。还有这个D,然后还有我们求,然后我们就可以通过那个PP,像OCV里面它有个pnp那个server那个算法嘛,你就可以。
34:05
把它解解出来,解除那个RT轴成,然后你再回到这个双目,双目它是没办法直接返回你D的,它是通过是他图去求这个D,然后ICP。然后去去求出它的RT,然后像弹幕的话,弹幕你没办法求它的那个求求它的D,然后就比较麻烦嘛,然后你就用对积约数跟三角化去求。最终也是求RT,所以最核心的问题就是求RT。反正就是大家把这个重点就放到定位这里面吧,就是怎么去求RT就是有一些问题的话就是,嗯,不要太纠结了,可能有一些有一些你现在暂时不太理解,但是后面后面当你接触了更多内容的话,你就会很自然的去理解了,如果你一直卡在一个地方的话,就。就没办法进行下去了。
我来说两句