自动驾驶相信大家都已经听过无数次了,但它到底是怎么运作的呢?或者说到它底遵循着一个什么样的工作流程呢?

据中国汽车纵横网了解到,最近,Voyage,一家出身优达学城(Udacity)、致力于把普通汽车改装成自动驾驶出租车的美国创业公司,给大家做了个解答。它的 CEO Oliver Cameron 写了一篇文章,详细介绍了自家的自动驾驶出租车 Homer 的工作原理。虽然只是个例,但对我们更好地认识自动驾驶还是有帮助和借鉴意义的。友情提示:文章很烧脑~

GeekCar 原文编译如下~

感知、规划和行动

通常来说,一辆自动驾驶汽车遵循着感知、规划和行动(SPA)这样一个模式。首先,它通过激光雷达、雷达和摄像头等传感器感知周围环境。然后,它分析传感器数据和其他相关数据,规划出从 A 点到 B 点的路线。最后,它控制方向盘和车速,按照之前规划好的路线完成行驶任务。

一辆具有感知、规划和行动能力的汽车,其背后是一套复杂的硬件和软件系统,整个系统的协调运作才能实现汽车的自动驾驶功能。你可能对激光雷达、摄像头等表面的零部件略知一二,但对于整套系统如何协调运作或许并不了解,而这正是自动驾驶的关键所在。

Voyage 的架构

下面是一张 Voyage 出租车的系统结构图,也是一辆多传感器自动驾驶汽车的标准架构,其中每一个部分都扮演着重要的角色。接下来,我们将分计算、动力和线控设备三个部分来来简单介绍一下。

计算

计算对规划路线十分重要。Homer——Voyage 的首款自动驾驶出租车,其大脑就是一块搭载了 Intel Core i7–7700K Kaby Lake 四核 2.4GHz 处理器以及英伟达 Titan X GPU 的技嘉 AORUS 主板。为了保证传感器拥有足够的数据管道,它还配备了 64GB 的 RAM 以及由三个固态硬盘组成的 3TB 大容量存储器来应对数据冗余。

这个强大的计算机运行的是 Ubuntu 版的 Linux,它使用 Docker 容器来管理系统环境,并利用机器人操作系统(ROS)来建立快速感知原型,规划运动路径,控制节点。ROS 是一个适用范围极其广泛的多功能中件,它能够对复杂的信息传递、数据结构、数据记录等过程进行抽象处理。虽然 Ubuntu(包括 ROS)并不能满足量产车对实时操作系统(RTOS)的要求,但是它对原型算法来说却是一个很有用的工具,能够尽快在现实世界的环境中进行测试。减少从想法到实践所需的时间至关重要,这些工具正好能够帮助我们做到这一点。

ROS 节点本质上是一些独立运行的小程序,但又相互关联在一起。例如,某一个节点的任务可能是通过以太网接口读取激光雷达的原始数据,然后再把它转换成点云信息。点云信息由大量的三维点及其元数据组成,它们被发布在 ROS 网络上,以供其他节点使用。使用这些信息的节点可以把点云与地图相结合进行定位,也可以运行聚类算法,探测并跟踪目标。它们同样把结果发布在 ROS 网络上,以供运行运动规划算法的节点使用。总的来说,过程大概就是首先从原始传感器收集数据,然后互联的 ROS 节点再处理这些数据,最后线控单元向油门、刹车、方向盘等发出控制信号。

在自动驾驶研发过程中,使用 ROS 可以带来很多便利。例如,当节点相互交流时,它们会使用特定的通道或者说「主题」(topic),这些主题会被自动记录下来,以供日后分析之用。事实上,一辆在路上行驶的 Voyage 汽车每时每刻都在记录数据。主题作为命名空间(namespace)可以防止数据冲突,同时将汽车的每一部分在每一时刻的活动整理成一份详细的日志。这样,我们就可以在自己的笔记本电脑上模拟具体的驾驶环境,而不用开着汽车在外面碰运气。而且,我们可以直接在办公室里测试新算法,而不用坐到汽车里面,这为工程师们节省了大量的时间。

一般情况下,我们大部分的计算任务都交给了计算机的 CPU。因为它们主要都是线性任务,在解决下一个问题之前必须为上一个问题找到答案。例如,激光雷达探测到的这个障碍物是什么?右转之前我是否需要左转?多线程被广泛地运用于处理大批量的数据,但是,有些问题用和人类智能相似的方法(平行思考)会解决得更好。

Voyage 热衷于机器学习。如果一个问题可以通过神经网络得到解决,我们可能已经正在开展这方面的工作了。我们会用深度学习去准确探测交通信号灯的状态,从一大堆雷达信号中识别出障碍物,通过场景分类把建筑物和道路区分开来,直接从端到端网络的成像中生成方向盘的偏转角度。把一个问题扔给 GPU 去解决并不总是对的,这时候如果能真正发挥工程师的创造力,或许会有意想不到的好结果。

动力

Voyage 自动驾驶出租车由福特 Fusion 原配的 12V 电瓶提供动力。电池首先将电力输送给一个配电装置(PDU)。这个配电装置是一个智能继电转换器,有 9 个不同的 12V 连接器。它还有自己的脚本语言,可以通过编程单独控制每个开关。车上负责计算的部分就是通过连接着一个 PDU 开关的一个 110V 逆变器获取能量的。

要想 PDU 维持运转,汽车必须保持行驶状态。例如,当福特 Fusion 混动车检测到司机不在车内时,车身控制模块就会在停止驾驶 30 分钟后关闭点火继电器,这样一来,PDU 和车上的计算机都会停止工作,这让很多工程师都有点恼火。

为了解决这一问题,我们更改了汽车的出厂配置,准确说来是更改了车上的一个模块,这样福特 Fusion 混动车就可以无限运转下去了。更改过程中,我们用到了一个叫作 FORScan 的开源工具,以及一个搭载 FTDI 芯片的 OBD-II 工具。我们用这些工具向车身控制模块发送特定信息,并修改原始出厂设置,这样汽车就不会自动关停了。

线控设备

现在我们有了计算能力和动力,那么怎么才能实际控制车辆呢?也就是说,在感知和规划路线完成之后,我们要如何行动?答案就是线控设备。

简单点,你可以把线控设备理解为传感器、计算机与传动装置之间的接口。有了它,计算机在处理完数据之后就可以向汽车发布指令,操纵汽车行驶。传动装置包括油门踏板、刹车踏板和转向器,它们都和线控设备连接在一起。在现在的汽车里,这些传动装置中很多都已经完全和司机的动作脱钩了。例如,当你踩下油门时,你只是移动了两个电位计,而它们则向发动机控制模块(ECM)发送一个原始的 0V-5V 的信号。这个踏板位置信息然后被转换为发动机扭矩,而发动机扭矩则决定点火正时,或通过打开节气门增加气流。

驱动油门踏板的线控设备连接在踏板总成和 ECM 之间。当这个系统关闭时,踏板的原始电位计向 ECM 发送一个 0V-5V 的信号。但是,当线控设备处于工作状态时,Ubuntu/ROS 计算机生成的指令将产生一个新的数字信号。

自动驾驶涉及到一系列复杂且相互关联的系统,希望这篇文章能帮助大家加深理解。