DIY车道保持系统
作者|Alberto G. Rivera
编译|VK
来源|Medium
许多人认为,2005年美国国防部高级研究计划局的挑战赛是当前自动驾驶汽车技术浪潮的开端。挑战小组的任务是制造一辆自动驾驶汽车,该车能够只使用稀疏的路点在内华达州和加利福尼亚州边境之间的132英里越野路线上驾驶。五支队伍完成了比赛,其中斯坦福赛车队和他们的赛车斯坦利名列前茅。
我认为2005年DARPA的巨大挑战将成为当前自动驾驶汽车技术的起点。 自2001年以来车道偏离警告系统一直在出现,但直到2019年下半年,我们才开始看到通过Waymo的自动乘车服务向公众首次展示自动驾驶汽车服务。
汽车工程师协会(SAE)已经开发了一系列的自动化水平来帮助我们比较不同的自动驾驶系统,从没有自动化(0级)完全没有驾驶员的自动化(要求等级5)。Waymo的自动化水平可以被描述为4级,意味着该汽车在地理围栏区域是完全自主的。
特斯拉的自动驾驶系统被归类为3级,因为它仍然需要人工监控,如果道路条件不适合自动驾驶,系统会自动脱离,并提示人工驾驶。市面上还有一些其他的三级系统,比如Cadilac的Super Cruise,但大多数汽车制造商只提供二级系统。2级自动化与3级自动化非常相似。特斯拉和凯迪拉克都表示,他们的自动驾驶仪和Super Cruise系统实际上是高水平的2级,因为它们要求司机随时监控系统。在我看来,二级系统有点像自动驾驶系统,自动驾驶仪和Super Cruise被描述成这样,以避免责任。大多数ADAS(高级驾驶员辅助系统)将被归为二级。这些系统包括先进的巡航控制系统和车道保持系统,这些都是新车型的常见功能。1级系统已经存在了很长时间,最常见的是非自适应巡航控制。我还将包括车道偏离警告系统在这类。
我现在每天的司机是一辆2003年的轿车。它的非自适应巡航控制系统自20世纪70年代以来一直很普遍。作为一个附带项目,我想看看我是否可以使用最新的技术,通过建立和改造车道保持系统,将我的车从过时的1级升级到稍微不那么过时的2级。该项目的目标不是制造一辆像Waymo或Cruise那样的全自动驾驶汽车,甚至也不是特斯拉上的自动驾驶系统,而是一种像2014年以来汽车制造商提供的车道保持系统。这些系统在接近最佳的环境下运行,在这种环境中,车道标记是可见的,并且很容易识别。
方法
系统的成功需要能够控制和保持汽车在车道中间的良好标记的道路上。我正在构建的系统有3个基本组件。首先,它需要识别车道。其次,它需要识别汽车离车道中心有多远。最后,它需要一个控制系统,使汽车在车道的中心。
识别车道
在构建和测试系统时,我使用了从Udacity无人驾驶汽车Nanodegree获得的预录视频。尽管Udacity计划的项目目标非常相似,但该项目使用的方法却大不相同。 Udacity程序确实为该项目提供了灵感和基准。 Udacity还提供3个行车记录仪类型的难度越来越高的视频。对于Udacity项目,只希望学生在3个视频中最简单的一个上表现良好。使用课程中讲授的技术,我对Udacity项目的解决方案不够强大,不足以处理最后两个视频中的最佳条件。由于该项目的最终目标是将系统部署在实际的汽车上,因此我决定寻找一种可以更好地针对不同路况进行概括的不同方法。
使用传统的计算机视觉算法(如边缘检测)来识别车道线有很多方法,但我发现使用这种方法的解决方案不是很通用,只能在最优条件下工作。在寻找更好的方法时,我遇到了一篇论文,描述了一种叫做Lanenet的神经网络,它可以检测车道线。如果你不是很精通神经网络,也不要担心。在这篇文章中,我将简要地介绍它们,您不需要了解它们的内部工作原理来重新实现这个项目。本质上,这个神经网络充当了一个特征提取器,它突出了车道标记,而忽略了图像中的其他内容。Lanenet是一种深度神经网络,它使用一种类似于Enet的编码器-解码器架构,但经过了修改,具有两个分支。其中一个分支进行语义分割,给原始图像上的每个像素一个标签,并将其分配到一个车道上。第二个分支也标记原始图像中的每个像素,但只是二进制的,这意味着标记0是不对应于泳道的像素,标记1是确实属于泳道的像素。通过组合神经网络的两个输出,我们可以检测图像中存在的每个单独通道。
本文中描述的Lanenet模型是由Github用户MaybeShewill-CV实现、训练和提供的。系统的其余部分是围绕这个模型的修改版本构建的。虽然存储库提供了一个端到端解决方案,就像在文章中描述的那样,但是我发现模型后期处理不是很健壮,所以我实现了自己的版本。
后处理包括获取两个模型输出,并将它们组合起来,得到一个具有不同颜色的图像。在合并后的图像中,我们可以使用颜色阈值来只看到特定颜色的像素,因此我们可以选择一次只显示一条泳道。对于这个项目,只有直接的左车道和右车道标记是相关的,所以颜色阈值只应用于使这两个可见。对于每个相关的车道,我们可以应用自顶向下的图像变换,以更好地在笛卡尔平面上将车道可视化为曲线。
目前我们只把每个像素表示为平面上的一个点,所以我们需要找到一个多项式曲线,最适合通过这些点。为此,我们使用了一个最小二乘多项式拟合算法。由于我们的数据仍然是一些噪音,我们实际上运行这个算法两次。第一次我们只有一个线性拟合,并计算从每个点到新创建的直线的距离。第二次,我们计算一个二阶多项式拟合,忽略所有离第一行太远的点。这消除了我们的车道标记噪音,使我们的车道检测更加稳健。在这一点上,我们有一条线来描述我们的每一条泳道。
计算到中心的距离
有了描述车道线的两条曲线,我们就可以计算车道的中心,假设它是两条直线的中点。我们还假设图像的中心与汽车的中心对齐。知道了汽车中心和车道中心的位置,我们就可以计算出偏离车道中心的距离。这个偏差将被用作我们试图最小化的误差。这个距离的原始计算使用像素坐标作为我们的点。在美国,高速公路的车道标志间距为3.7米。利用这些信息,我们可以将距离测量从像素单位转换为米。这个到中心的距离(以米为单位)将是控制器的输入,它将控制汽车并使其保持在车道的中心。
转向控制
现在我们有了以米为单位的误差我们想利用这个信息得到一个合适的转向角。为此,我们将使用一个PID控制器。PID控制器是最流行的控制方法之一,广泛应用于船舶、飞机和火箭等各种场合。从本质上讲,PID控制器是一个反馈回路,它接受一个错误值,并试图通过对一个更大的系统应用一些操作来纠正它,并在操作完成后重新评估错误。
PID代表比例积分导数,描述控制器的各个组成部分比例分量作为放大器,把误差距离乘起来。积分部分是前面误差的总和。当系统始终存在少量错误时,这将有所帮助。随着时间的推移,一个小误差的积累会被积分分量放大为一个大得多的误差,然后由控制器进行校正。导数是最后一个误差和当前误差之间的变化率。这一项有助于不超过控制器的目标,然后在相反的方向有一个错误。每个组件的输出被添加到一起,以输出适当的流程变量,在我们的示例中,该流程变量是我们的转向角。
初始测试
随着车道检测和转向控制完成,我们准备开始测试一些硬件!第一轮测试是将所有组件连接在一起并控制一个模拟方向盘。这主要是为了确保系统是安全的。车道检测算法目前正在一台装有NVIDIA 1080显卡的台式电脑上运行,速度约为每秒12帧。通过将树莓派(Raspberry Pi)与马达驱动帽连接到步进马达上,方向盘就完成了。
我在Udacity的3个视频上测试了这个系统,对它的整体性能很满意。该系统在两段高速公路视频中表现出色,能够精确计算每一帧的车道中心。第三个视频更有挑战性,因为它是在一个蜿蜒的道路上,只有部分标记在右边和很多眩光在挡风玻璃上。我编写了这个程序,这样我就可以在一条单行道上驾驶,如果它看不见两边,我就可以在它看不见两边的情况下直接驾驶。这离最佳条件和这个项目的范围还很远。如果部署在真实的车辆上,系统应脱离并提示司机接管。然而,该系统能够识别车道和转向适合大多数视频。有一种情况是,当汽车在急转弯时发生灾难性的故障,他们的系统无法处理。
总的来说,作为一个在受限环境条件下运行的二级系统,我对系统的性能非常满意。
未来的改进和下一步
这个系统可以做很多改进。最大的改进是12帧/秒的处理速度。我们有很多选择,包括量化神经网络或运行在更好的硬件上。最耗时的部分之一是对每个车道运行两次曲线拟合算法,如果我们找到一种方法来降低神经网络输出中的噪声,就可以减少该算法。其他加快速度的方法可能包括用C之类的低级语言编写程序,或者使用CUDA而不是Python。
另一个想法是让神经网络直接预测车道的中心,而不是检测车道线,但这将需要一个非常广泛的变化的项目和一个不同的神经网络架构和训练数据集。
在硬件方面也有改进的空间。最初的计划是将步进电机安装在仪表板上,并在方向盘上系上皮带。我对这种方法进行了测试,发现电机末端的齿轮与方向盘之间的齿轮传动比太大,方向盘无法快速移动。这可能足以使一些轻型车道保持机动,但汽车不会在短期内急转弯。
下一步是用更多的行车记录仪做进一步的测试,然后用实际的汽车进行测试,最好不要在公共道路上测试。我计划继续编辑这篇文章,并在项目完成后再写一篇。我还计划稍后发布一段视频,详细介绍我的经验,并将代码公开。
现在,您可以看到在每个控件上运行程序的结果
- 项目的视频:https://youtu.be/kuY4kcaewBs
- 挑战的视频:https://youtu.be/JlMHsUHJuBs
- 更难的挑战视频:https://youtu.be/B6DHeF45q70
如果你有任何问题,请随时联系我。如果你觉得这篇文章很有趣,不要忘记去评论和喜欢它!
原创文章,作者:fendouai,如若转载,请注明出处:https://panchuang.net/2020/01/09/diy%e8%bd%a6%e9%81%93%e4%bf%9d%e6%8c%81%e7%b3%bb%e7%bb%9f/