国外网友分享如何从零开始打造一辆真正的自动驾驶汽车

在毕业后的暑假里投入最前沿的技术领域进行自动驾驶软件的自主开发,并将其成功应用于量产车上。通过在网络平台展示核心代码片段并发布详细演示视频后,得到了许多关注和反馈意见。于是决定深入讲述整个开发过程中的独特经历。
作为一名特斯拉坚定拥护者,在自动驾驶技术与计算机视觉领域我一直保持着极大的热情与探索欲。尽管我对GTA游戏中的神经网络实现感到自豪但我也意识到这并不是真正的突破我希望突破仅在GTA游戏中的实现水平而是在更复杂的现实场景中取得进步并真正解决实际问题
在初步研究的基础上,受限于时间和预算等因素,在选择自主转向机构时我"确定下来"采用神经网络驱动的方法。很快就能意识到,即使由单一操作者完成车辆行驶同样是一项极具挑战性的任务。为了实现路径规划与车道检测等功能,在开始项目之前我重点研读了各种相关算法,并从经典的显式分解问题求解方法入手。然而由于本项目旨在加深对深度学习基础理论的理解与应用能力,在方法选择上我更加倾向于采用基于神经网络的端到端学习体系。后来机缘巧合发现了NVIDIA在2016年发表的一篇论文中详细阐述了CNN的设计原理以及其实现方式。这篇论文展示了将视频输入中的原始像素直接映射至转向指令所取得的成功效果令人印象深刻,并且项目的可实现性也让我萌生了自己动手实现的想法。
- 为汽车前部增添摄像头系统
- 采集任意指定时间点的转向角数据
- 关联这两个参数并利用神经网络传输这些关联
- 设计一个系统负责在方向盘上处理转向指令
- 实现即时响应能力:实时捕捉前方道路图像,并计算相应的转角;随后将这些数据用于方向盘上的转向操作。
选车
基于该项目的高度实验性和潜在破坏性考虑,在目前阶段选择了花费最少的一台汽车——即斯柯达Fabia的第一代车型。仅就动力转向装置提出要求,在无需对转向柱进行大规模且 costly 的调整时就能完成转向机构的设计与构建。
轻松地来说吧,在我的清单里排在第一位也是最重要的任务就是印刷一个特斯拉品牌标识并将其放置于车辆前方位置。回想起来,在那次尝试中险些犯了严重的方向调整错误

收集预算数据
为了确保项目实现"端到端"的目标,我的目标是自动生成一套数据集.经过对多种网络摄像头的测试与评估后,我决定选择一部二手的iPhone 6S放置于车窗后方,并将其作为视频采集模块使用.转向角的测量成为一个更为复杂的难题.大多数现代汽车配备了CAN总线接口,能够实时获取车辆转向角度信息;然而,某些高端车型配备了独立于方向盘之外的独特转向传感器.由于我的车辆不具备上述两种解决方案所需的技术条件,因此不得不自行设计并搭建一套独特的转向角检测系统.
我的设计灵感来源于利用转向过程中产生的阻力,并将其转化为相应的转向角值。然而,在实际应用中遇到了一个问题:第一个问题在于方向盘转过了360度以上。因此必须特别注意这些超出常规范围的转动情况。最初解决这个问题的方法是在转向柱周围安装了一个线圈,并在线圈周围附加了一个特殊的刷子装置,在这种情况下可以通过改变刷子的位置来调节电路中的电阻值以达到精确控制的目的。经过反复思考与改进后我发现其实可以采用一种更为简洁的方法:基于齿轮传动系统结合电位器反馈的技术方案。具体来说就是通过计算出合适的齿轮比从而将车辆转弯的角度信号准确地映射到位于车体下方的电位器内部并完成这一转换过程之后就可以方便地通过电位器输出信号来实现对方向盘位置的有效控制这一方案不仅大大简化了系统的结构而且对于大多数驾驶员来说也更容易理解和操作现在来看这种设计思路无疑是一种更为高效可靠的解决方案

电位器通过Arduino板进行信号接线后,并联至运行相应程序的笔记本电脑端口端子上;随后将此设备与配备摄像头装置的iPhone系统进行数据同步采集接口对接;通过该装置可实时采集车辆转向角度信息并将其与摄像头捕捉的画面信息实现精准匹配处理过程;尽管所设计的应用程序逻辑相对简单明了但因汽车驾驶操作中对实时反馈响应速度存在严格的技术要求所以整个系统的难点主要体现在确保Arduino与笔记本电脑之间的高效同步串行数据传输环节上;在上述操作完成后随后的时间段内我便进入了一种持续观看莱克斯·弗里德曼(Lex Fridman)节目的状态在这种专注的状态下我在城市间缓慢行驶成为了日常休闲活动的一部分。
数据预处理
在不同训练模型的过程中,我进行了多方面的技术探索。然而,在实际应用中只有部分方法能够展现出显著的效果。首先,在视频输入中获取的图像被统一调整为100x100分辨率,并通过裁剪的方式去除混淆网络中不必要的细节特征——特别是在光线条件不佳的情况下(主要指天空曝光过曝)。(此处可插入数学公式:image\_size = 100 \times 100)随后将所有图像均经过单通道处理以减少信息量并优化后续处理流程。除此之外,在这些方法之外我还尝试应用了低通滤镜和其他过滤工具——这在某些特定情况下带来了微乎其微的影响
该段文字描述了基于合适数据集设计并实现高效收敛的深度学习框架的核心内容。该方法最初的设计方案借鉴自NVIDIA的相关论文,在实践中探索了多种模型架构和优化策略。
论文中描述的主要架构,也是公共存储库的一部分,如下所示:
归一化过程;接着采用六个卷积层(ReLU激活)进行特征提取;随后进行展平操作;经过四个全连接层的逐步计算后得到输出结果。

该网络旨在最小化其输出与实际转向角之间的均方误差(MSE)。我开发了该模型框架并将其部署于TensorFlow平台中,在大多数情况下我使用了我的老旧笔记本电脑进行训练(诚然,在这一过程中需要投入大量的计算资源)。为了加快训练速度,在大多数情况下我使用了我的老旧笔记本电脑进行训练,并采用了Adam优化器配合Dropout技术以期在其他测试集上获得更好的性能表现。经过测试发现,在处理缓慢行驶的情景时该模型表现优异;但在复杂或不具有典型特征的情况中出现了一些问题。正如预期所示,在车道线和路面边缘区域周围观察到神经元活动主要集中在这些区域周围。

转向机制
在完成对上一阶段收集的数据进行分析后(这可能是最为关键的一步),随后一项具有同等难度的任务是实现对汽车运行状态的实际控制。
基于我在齿轮技术与Arduino开发方面积累的成功经验,最初的构想是利用H桥集成电路将单个直流或步进电机连接至车体并驱动其旋转。为了获取可靠的直流电源模块,我移除了后雨刷。然而,该电机的输出功率有限,即便在高速档位下也难以稳定转动方向盘。

经过对周边几个不同型号电机的测试后,在深入了解了自己的负载需求之后,采购并安装了一款更高性能的电机(型号XX, 输出功率32Amp, 380W),将其成功安装在我的主控单元上,并将其连接至主控单元上的电源接口处。随后发现...无法正常工作,并直接使用 600mAmp H 桥 😃
实际上,在软件开发领域工作多年后才逐渐深入电子设计领域是我的opicus之一。在尝试应用H桥驱动时遇到了不少挑战:一方面由于电路特性限制,在实际应用中往往需要选用价格较高且足够强大的H桥芯片;另一方面则需要额外考虑如何有效进行散热设计以维持小型H桥组件的稳定运行。
因此,在之前转向传感器的基础上,我通过搭建一个由两个继电器组成的'H 桥'装置来解决这一问题,并成功地将Arduino控制器与汽车电池供电的直流电机进行物理隔离。随后,在反复调试和校准系统参数后,在一个空停车场顺利完成了测试

最终测试和结果
第一次真正的小幅测试结果并不令人满意。汽车在行驶几分钟后出现异常漂移现象,在此期间它可能会采取一个看似随机且不自主的动作来补偿系统中某个地方积累起来的误差。特别喜欢在恶劣天气条件下进行的测试,在这种情况下汽车决定前往附近的湖泊进行短暂的水上表演以缓解压力。
经过数小时的努力工作以及多日的睡眠不足,团队成员致力于修复各种错误,开发了一种机制用于跟踪并修正错误同时也能覆盖自治系统,并对模型进行了进一步分析并评估其性能.尽管整个系统的管道设计略显简单,但所有潜在故障点均已被识别并加以改进.从电机稳定性到转向角精度控制再到序列频率调节等各项指标均得到了优化.然而,这个过程充满了挑战:如何维持电机稳定性的运转;如何精确控制转向角避免车轮在两个预设值之间无止境摆动;以及如何优化序列频率以提高整体系统的响应效率等等.即便如此,最终的结果依然超出了我们的预期.但事实证明,这一切的努力终于取得了预期效果。

结论
本文记录了作为一名新手开发者在软件与硬件领域参与的高级项目经验。在数据采集与处理方面搭建了一套完整的 pipeline;针对自主转向功能开发了一套基于深度学习的自动驾驶控制算法;从零开始设计并制作了一系列关键硬件组件;这些经历构成了我目前为止最雄心勃勃的学习实践,并帮助我在专业知识体系中获得了最深刻的理解与成长;回顾这段经历中的各项决定与选择过程 today, 我会更加理性地看待很多过去的选择——但这恰恰体现了学习过程中的重要价值所在;这一项目不仅让我接触到自动驾驶技术、深度学习算法以及计算机视觉应用领域的核心关联性;而且成功地将理论知识转化为实际应用能力;这激励着我持续探索人工智能与机器人学交叉领域的可能性,并期待未来能够在这方面取得更多突破。
