GalecinoCar:基于Java的自动驾驶汽车
我们自诩为您的特殊人才,在此期间一直致力于探索新的兴趣领域以保持专业素养,并渴望未来能够建立一个能实现财务自由的事业。然而事实并未如愿以偿,在那个充满希望的日子到来之前……除此之外还能享受与朋友合作完成有趣项目的快乐时光。通常我们会与朋友们共聚一堂,在孩子们入睡前在一个通风良好的地下车库中进行工作讨论。
不久以前我们了解了这个自动驾驶汽车项目Donkey Car并感到好奇当我们注意到这个项目是基于Python开发的时候 我们心中不禁有些失落因为我们正在学习Java当时就更加心灰意冷于是在这种情况下 我们决定输入GalecinoCar这是一个专为Python开发者的Donkey Car项目的Java与Groovy版本(顺便提一下驴车社区真是充满了创意!)
设置硬件
基于Exceed Magnet卡车底盘构建了这个项目。配备了计算能力的是Raspberry Pi设备;此外,在其后端连接的Raspberry Pi摄像机通过光学输入实现了图像捕捉。作为连接机箱与R raspberry pi核心组件,在此系统中采用了脉冲宽度调制技术。汽车的主要额外组件则是一台3d打印生成的防滚架设计。经过评估后发现:我们的团队缺乏足够的资源去自行设计并制造一个适合现有底盘使用的安装框架。
训练自动驾驶仪
在成功构建汽车并妥善维护软件之后,在接受自动驾驶仪的培训被视为一项具有挑战性的任务。为了生成足够的训练数据需要反复试验多次,并随后对汽车的自动驾驶装置进行相应的训练。有时候会给人一种像是在教导一位年幼的 learner 驾车的感觉。
“ 不,不要那样走!”
“ 踩油门!”
“ 别打那只猫!”
初次体验自动驾驶技术令我们感到无比震撼。
在一个房间内悬挂在墙边的投影仪上播放着汽车摄像头的画面。
令人紧张的是,在汽车松动前我们的倒计时持续了。
随后的一刻钟充满了激烈的兴奋、紧张和混乱。
当自动驾驶装置启动后,车辆以极高速度撞向了三面墙并最终稳稳地停了下来。
从第一眼观察来看,这辆车似乎存在严重的安全隐患,特别是在发生碰撞后几乎没有留下任何痕迹。
通过车载摄像头记录下来的这一切令人不禁感叹其不可思议!
经过研究发现, 最优方法用于训练汽车是最有效的. 采用 vintage PS3 controllers作为基础, 该设备通过蓝牙技术实现便捷连接至车辆.
您可以选择Pi上提供的其他几个可用选项来操控车辆。然而我们观察到,在操作指令(如右转)之间存在等待时间,并导致了一些不理想的自动驾驶模型出现。PS3控制器组件具备低延迟特性,并帮助实现更精确的操控。
编码软件
我们正在集成Micronaut软件以支持远程控制用户界面(UI)的RESTful服务,并同时也能操控车辆的动力与转向系统。 该平台允许用户通过深度学习框架自行选择手动操作或完全自动驾驶模式。
Micronaut是一个基于Java虚拟机(JVM)的现代全栈框架,专门设计用于构建模块化且易于测试的微服务应用程序,该框架提供内置依赖注入功能以及自动生成配置的能力,并支持共享配置和负载均衡,能够快速启动(在具备良好硬件条件的情况下启动时间仅需一秒钟左右),可集成Java语言及其扩展 Groovy 和 Kotlin 版本,并附带命令行界面以生成代码;同时包含一个控制台界面供创建各种项目的概要文件信息
在 Micronaut 程序包内部, 使用 Robo4J 库通过手动操作油门和转向机构来完成控制任务。 为了实现与相机的接口连接, 我们采用了 jrpicam 库来建立 Micronaut 与相机之间的接口关系。 如图所示, 请查阅以下信息以了解各组件是如何集成工作的

这是一些将所有内容捆绑在一起的代码的工作方式:

在代码示例中,在初始化过程中(您可以在创建类时配置相关属性),该实例特化为一个GORM数据服务实例,并且无需依赖数据库即可获得一个提供更为便捷的服务对象(如果您希望省去对数据库的支持)。请注意,在初始化完成后才会有以下操作发生(您可以在类构造函数中设置@PostConstruct标记即可实现这一点;当将其应用于多个方法时,请按照声明顺序依次执行)。此外,在当前环境下服务器面临高强度请求攻击的情况下(为了过滤掉超出范围的指令),我们采用了队列机制过滤掉超出范围的所有指令

该代码实现了依据发送到电动机的PWM值控制汽车前进或后退的功能。

该代码揭示了Robo4J库实现转向功能的方法。 Robo4J由Marcus Hirt和Miro Wengner编写为Java库,并旨在帮助开发者通过Java Native Interface(JNI)操控具有该接口支持的机器人系统。 该代码通过提供相应的API接口实现了对机器人转向功能的实现,并为开发者提供了简便的方式来控制机器人的运动方向和路径选择。
在当前代码环境中,micronaut控制器会传递端点用于汽车的控制功能。 您可以通过@Get标记来管理方法以及其对应的内容类型,并通过该标记指定的方法创建一个简单的列表来配置代码所使用的GET参数。 如果您希望让结果返回为JSON格式的数据,则只需修改'produces'参数设置为'text/json'即可完成转换操作。

您可以在我们的GitHub仓库里查阅GalecinoCar项目的代码。
观看GalecinoCar的动作
在GR8Conf EU 2018这个平台上首次亮相,在会上我们围绕该项目进行了专题演讲,并重点演示了其运行机制。

来自GalecinoCar的图片,观看了GR8Conf EU 2018的赛道。
这是GR8Conf EU 2018的片段,它在起作用 :
展望未来
在该项目中存在许多富有创意的想法。其中最为关键的是提升其运行效率,并使其具备类似车辆转向器的思考逻辑。我们希望汽车在驾驶时做出更好的决策,在避开物体方面特别突出,并计划使用机器学习、图像识别和LIDAR系统来添加识别物体的功能。
我们期望自动驾驶仪既能识别物体的距离又能确定物体的身份,并采取相应措施进行避让。例如,在避让行人与倒伏树枝时所需转向策略差异显著。遗憾的是受限于Pi计算能力的限制,在此场景下目前尚无法实现这一功能;或许未来某一天我们将借助CUDA技术实现这一目标
车与车之间的沟通是我们计划解决的一个重要课题。 将两辆车放置在同一轨道上时,它们应当能够自主协调并顺利通过彼此所在的位置。 或许我们必须深入研究交通协议并了解相关的法规。
我们无意中将汽车扩展到整尺寸的可能性不存在。
那些被排除掉的可能性也已经被考虑到了。
例如, 占比为1/16的比例的汽车其对GPS数据采集的影响较小
GalecinoCar无疑是一个令人惊叹的有趣项目,无疑是我们的最具挑战性的兴趣爱好之一。然而,在建立了稳固的基础上,我们预测该项目将以更快的速度发展下去。通过这项技术的发展,我们可以利用这辆车探索许多可能性,而这也意味着我们需要持续投入时间和资源来维护和发展这一计划
Ryan Vanderwerf 和 Lee Fox 将在 7 月 16 日至 19 日期间,在俄勒冈州波特兰举行的第 20 届 OSCON 年会上展示 GalecinoCar:一款结合机器学习、微服务架构、Java 和 Groovy 的无人驾驶汽车
