8402浏览
查看: 8402|回复: 1

[漂移驴车项目] 驴车项目第 2 部分:数据分析(ZZ)

[复制链接]
本帖最后由 极凹甫 于 2022-4-16 21:18 编辑

我在https://medium.com/看到 Jason Wu 发的3个帖子,讲述了自己玩驴车的过程,我觉得值得转给大家看看。

驴车项目第 2 部分:数据分析


SatApril-202204163239..png
来自相机的视图

在我关于这个项目的上一篇文章中,我谈到了使用驴库构建和设置驴车。现在它可以自动驾驶了,下一步是什么?我的驾驶方式与模型之间仍有一点距离。目前的模型只能以低速绕过我的轨道,即使在这种低速下它仍然经常崩溃。官方博客确实有一些非常好的建议,但我真的很想更好地了解当前系统的不足之处。为了做到这一点,我决定采用更加面向数据的方法。以下是我为更好地理解数据并在不实际更改模型的情况下改进结果所做的事情。


探索性数据分析

在这里,我使用 Jupyter notebook 来查看使用 Pandas 和 Matplotlib 的数据。如果您不熟悉 Jupyter notebook,请看这里。首先,我想看看我的数据有多平衡。我担心由于客厅的空间限制,我的轨道相当小,我的转向会由于急转弯而趋于极端。另外,当时我还在使用手机作为控制设备,很难通过手指在屏幕上滑动来提供精确的转向。我担心对不平衡数据的训练会导致模型只做出极端的预测,这会阻止汽车保持良好的状态。

SatApril-202204165735..png


车轮角度数据的分布图。


事实证明,数据并没有我想象的那么糟糕。转向角范围从 -1 到 1,其中 -1 一直向左, 1 一直向右。虽然在极端和中心都有明显的峰值,但它们似乎并没有太不成比例。

我发现有助于查看的另一个图表是转向角相对于相机框架的图。它提供了一些有关汽车行驶平稳程度的有用信息(在本例中为手动)。

SatApril-202204165351..png


使用手机上的网络控制器转弯

似乎数据根本不平滑。上面的示例显示了一条非常颠簸的曲线,这可能是由于我在手指滑过屏幕时笨拙地尝试急转弯。


获得更好的数据

正如我在该项目的上一篇文章中提到的,我进行了修改以添加对使用原始 RC 控制器和 Arduino 的支持,以实现更好的控制。基于上面的简要数据分析,我想知道以这种方式获得更平滑的控制数据是否有助于模型预测。

您还可以通过购买蓝牙操纵杆控制器并按照以下步骤将其与 Raspberry Pi 连接来实现更好的控制,这是实现这一目标的最快方法。我决定克服困难主要是为了强迫自己更多地了解驴车控制库,也因为我身边有一个 Arduino,不想买一个额外的控制器而放弃一个完美的控制器。

如果您有兴趣走这条路,或者只是想了解更多关于 Arduino 的信息,以下是我使用以下资源的方法。否则请随意跳到下一段。通过阅读驴库,我了解到我可以修改网络控制器以适应我的使用。它不会从 Web 界面接收输入,而是会监听 Arduino 插入的串行(USB)端口。重要的部分是确保 Arduino 发出正确的信号并且 Raspberry Pi 正确接收它。在 Arduino 方面,我使用 PulseIn 函数来测量PWM来自汽车接收器的信号并将其转换为可用信号发送到 Pi。(PulseIn 不是使用 Arduino 的 CPU 的最有效方式,但由于它没有做任何其他事情,这暂时就足够了)。以下是代码:

  • Arduino草图读取串行端口中0到200之间的PWM信号和输出
  • 用于替换 Raspberry Pi 上的 Web 控制器的Python SerialController 代码。您还可以将其与原始 Web 控制器代码结合使用,以使其与现有界面一起使用。这是我未来的待办事项清单。
  • 您还必须稍微更改 manage.py 以将 Web 控制器部分替换为新的 SerialController 部分:
从 donkeycar.parts.serial_controller 导入 SerialControllerctr = SerialController()      
V.add(ctr, outputs=['user/angle', 'user/throttle', 'user/mode', 'recording'], threaded=True)

那么原始控件和新控件之间的数据有何不同?

SatApril-202204164898..png

使用 RC 控制器(左)与 Web 控制器(右)同时转弯

这是同一回合的两个情节。似乎使用新的 RC 串行控制器模块,我能够实现更顺畅的转弯。


噪声过滤

在开始研究模型之前,我想探索一些关于简单过滤的知识。由于汽车在自动驾驶期间仍然经常发生碰撞,因此我决定更仔细地查看飞行员驾驶数据。默认情况下,驴库仅自动记录手动驾驶数据以用于训练目的。幸运的是,在自主模式下很容易改变它来记录飞行员的动作。只需将“pilot/angle”关键字添加到主驱动循环文件中浴缸的输入数组中,然后通过按 Web 界面上的录制按钮手动录制。

在获得飞行员驾驶数据后,我批量查看所有图像以找到碰撞前的几帧,并仔细查看这些帧预测的角度。我发现很多坠机事故是由飞行员做出的一个极端异常预测造成的。例如,如果汽车正在左转,一个错误的预测会一直向右转向,这会导致它偏离轨道。


SatApril-202204166629..png

SatApril-202204168416..png


一种极端错误的预测通常会使车辆偏离轨道

基于该信息,我添加了一个简单的过滤器来丢弃与上一个偏差超过 25% 的异常值预测。经过一些实验后,我还为这个过滤器添加了一个约束,使其仅每隔几帧打开一次。需要约束是因为一旦检测到异常预测,其数据就会被丢弃;并且过滤器只能依靠最后一个已知的良好预测来与接下来的预测进行比较。然而,在正常情况下,每帧所做的预测通常可能与两帧前的偏差超过 25%,这可能导致过滤器过度补偿。添加约束后,生成的过滤器擅长偶尔丢弃异常值,这不是一个完美的解决方案,但它确实帮助汽车在轨道上停留更长时间。


SatApril-202204168652..png

开启过滤器自动驾驶

应用过滤器后,蓝色的实际转向角与橙色的飞行员预测。使用条件语句仅忽略不连续的异常值预测,可以更顺畅地进行转向,而不会过多地损害飞行员的意图

这种方法似乎可以使用一段时间。尽管从长远来看它并不可靠,但它展示了简单的过滤器可以通过限制驾驶行为来补偿预测失败。接下来,我想探索如何实际改进模型,以便它首先做出更好的预测。去我的下一篇文章阅读:

  • 为深度学习搭建环境
  • 寻找更好的模型架构
  • 测试和比较模型


极凹甫  初级技师
 楼主|

发表于 2022-4-16 21:28:31

https://github.com/Muosvr/donkey   作者的github地址
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2022 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail