大数据分析挖掘作品,转载具体要求见文末
选文|微信公众号:大数据分析挖掘
翻译|黄维中,张一飞
我刚刚帮助我的朋友Kendrick完成了一个小的项目。我们制作了一个小汽车,你可以教会它怎么行驶,让它成为一辆小型无人车。我负责了所有的硬件和arduino软件,而kendrick制作了所有的机械自如学习软件。他称之为suiron,并把他上传到了github。https://github.com/kendricktan/suiron在arduino上运行的软件被称之为汽车控制软件,我也上传到了github。https://github.com/jabelone/car-controller
现在,你已经得到了代码链接,可以去看一下,并找出他的工作原理吧~ 我将在这里简单介绍一下该软件,但我的主要重点将是硬件。另外有一点需要注意的是开源许可证,我所有的东西是隶属GPL和肯德里克的Suiron项目隶属MIT 。
这个文章主要作为一个整个小车项目的概述。如果我以后有时间,我会尽力把这篇文章变成一个自主制造小车的辅导教程。
在我们开始介绍之前,你可以看看这辆小车在行驶中的小视频。(需要翻墙)
https://www.youtube.com/watch?v=tFwCyHdAWf0
现在我们来讲讲有趣的部分,它是怎么做出来的的
硬件
以下是需要用到的主要组件
1)无线遥控小汽车
我们使用的是这个车,但同样大小的遥控车也可以。不过他必须配备一个标准的esc和转向伺服。它最初应该配备了一个遥控器,电池和充电。我建议买一个新的无线远程控制系统
2) IntenNUC –raspberry pi并没有足够的动力并且是arm驱动的。一个在NUC中x86驱动的处理器i5较容易达到机械自主学习的目的。具体使用哪一个NUC并不要紧。
3)为了NUC服务的电池-一个标准的笔记本电脑电池组用于供电。这个kogan提供的电池可以支撑约6-10小时的运行时间。
4) 罗技c920网络摄像头-从任何信誉良好的零售商购买。你也许可以使用一个更便宜的摄像头,但是我们发现c920这款更好用。
4)镜头滤镜 -如果你准备在阳光下进行任何操作,你会希望有一个两极分化和ND(中性密度)滤光片。摄像头并不能很好的在刺眼阳光和阴影下运作,于是镜头滤镜帮助得到更好的画面。一个较好的ND(中性密度)滤光片帮助你更好地调节黑暗程度。
5)无线控制系统-如果你打算用这个项目做更多的事,我推荐买一个FrSky TARANIS. 你不会对它的质量感到失望。或者一个TURNIGY 9XR款效果也不错。如果无线控制系统里不包含接收器,记得买一个。
6)你还需要一个Arduino。个人比较喜欢Arduino nano,因为他们比较便宜并具有板上usb接口。
我建议你学习的ESC(电子调速器)如何与一个电动机,接收器,伺服和电池在一起工作的原理。这是正常遥控车标准设置。一旦你明白了这些,你应该看的Arduino的教程,以及如何使用它们来做到灯光闪烁和读取输入。通读Arduino的代码和连接组件应该是相当简单的。
这些组件是如何组成在一起的
如何组合这辆小车的组件取决于你。我建议把一切东西放得越低越好,这样电池在小车行驶的时候会更加稳定。摄像头必须被安装在高处,这样它能有更好的视野来观察。我用了一块轻木把所有东西黏在一起,因为它透光性强,并把摄像头粘在上面。我决定用几张图片来解释我是怎么把他们组建在一起的。所有白色的东西是3D打印机制作的,但其实不用3D打印机制也很容易。
两极分化/ ND滤镜
偏振过滤器的重要性不能被低估,因为它减少了反射和刺目眩光。 在下图,你可以看到有多少区别。 图中的水流是个有点极端的例子,但我选择了这幅图像是为了更容易表现出差异,在现实操作里的差异不会那么明显。
中性密度滤波器比起偏振滤光器来说更为重要。这种滤镜可以说是网络摄像头的太阳眼镜。网络摄像头并不适合在刺眼的光线下使用,因此降低光线的强度但又干扰不图像。 下图为正确的中性密度滤波器如何更好地使刺眼的光线的图像。
我建议在安装的时候将这些滤镜装成方便拆卸的,因为在低光照条件下这些滤镜会使得影像过暗。 即使在光照完美的一天,黄昏前的几个小时都比中午的时候暗了很多。 所以我做了一个简单的安装——用一个鳄鱼夹来固定滤镜。 两个滤镜是黏在一起的,然后我用3D打印机给他们做了一个“小架子”。
The Arduino
下图显示了这些硬件是怎样连接的。 Arduino是“硬件大脑”。,它读取在从R / C接收机的值,然后基于所述模式信道来决定具体做什么。 大家可以通过Arduino代码(文章开头有链接),看看这究竟是怎样实现的:基本上有3种模式,手动,自动和紧急停止。
在手动模式下,Arduino在转向和电机值读出并直其传递到电动机和转向伺服。 在这种模式下,右旗启用,它也发回了UART是什么,这些价值观是每收到一个字符时间。 (每收到时间,可以防止串行缓冲器快满了,“滞后”),在自主模式Arduino的在从国统会UART读取输入。 在此模式下它接收到两个消息; 引导,x和电机,其中x是你想要将它的值设置为。 然后将它写入这些产出到转向伺服或马达。 最后,急停杀死电动机的输出和拉直转向舵机。 这急停覆盖任何形式的手动或自主控制的。
机器学习部分
我们使用了一种叫做张量流动图书馆。 这是由谷歌发布的一个开放源码机器学习库。 它是开源的,并在Apache许可证下发布。 它有一个很好的Python和一个“没有废话的”C ++ API。
收集数据
这是整个过程的一个非常简短的总结。 每个视频帧被记录Suiron(在NUC软件)时会询问车控制器(Arduino的上软件)是什么人的运营商在做什么。 请记住,在手动模式下,操作员是围绕驾驶的汽车。 车载控制器通过发送当前的转向和电机值回Suiron响应。 Suiron取这些数值和与所述框架的一个处理版本保存它们沿。
这一过程发生在30Hz左右(或每秒30次),只要你记录数据。 在最后的模型中,我们使用了约20分钟,值得培养的数据。 这是20分钟左右的轨道连续驱动。这似乎不是很多,但它非常快的重复。 在现实中,20分钟足够近的数据没有在那里。 它的工作原理是特定的轨道类似的照明条件下的很大,但如果条件改变太多可能会失败。
训练数据
再次,我不是在这一个使出,但我会尽量简要说明训练是如何工作的。 卷积神经网络(细胞神经网络)是他们的工作方式很奇怪。 这是不可能的究竟是如何或为何CNN的工作知道的。 基本上,我们给张量流框架和两个数字。 (转向和电机)然后,我们要求它制定出框架如何与这两个数字。 给它成千上万的例子(帧)后它可以尝试概括的模型。
由于计算能力的量需要花费很长的时间来培养一个很好的模式。 由于它具有进行计算的种类,张量流运行在专用GPU快得多。 只有20分钟的数据我们的模型花了半天的时间才能正常训练。 培训发生在一个桌面带着借来的GTX980,一个GPU这是对消费者的显卡的高端。
利用该模型
你可以看到它的行动在下面的GIF。 蓝线是模型认为它应该做的,绿线是当我转向它是我实际做。 注意,这个数据不包括在训练集,这是为了确保该模型适用于其它数据。
只要它经过训练,这套模式就可以被拿来用了。 基本上,发生的事情是我们从摄像头收集只是一个框架。 然后,我们把它传递给张量流,并要求它通过模型来运行它。 该模型然后吐出它认为我们两个值应该是一个转向,一个用于油门。 此刻的油门是未使用的,它以恒定的速度运行。 然而,我们认为我们会包括以防万一,我们希望在将来使用它。
(更多文章,可到微信公众号:bigdata321, 寻求报道转载,请加微信:didaomaster)