前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >自己动手做一辆无人车!

自己动手做一辆无人车!

作者头像
顶级程序员
发布2018-04-26 11:33:46
1.2K0
发布2018-04-26 11:33:46
举报
文章被收录于专栏:顶级程序员顶级程序员

我刚刚帮助我的朋友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。 蓝线是模型认为它应该做的,绿线是当我转向它是我实际做。 注意,这个数据不包括在训练集,这是为了确保该模型适用于其它数据。

只要它经过训练,这套模式就可以被拿来用了。 基本上,发生的事情是我们从摄像头收集只是一个框架。 然后,我们把它传递给张量流,并要求它通过模型来运行它。 该模型然后吐出它认为我们两个值应该是一个转向,一个用于油门。 此刻的油门是未使用的,它以恒定的速度运行。 然而,我们认为我们会包括以防万一,我们希望在将来使用它。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2016-10-25,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 顶级程序员 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档