今天我们以百度Apollo为例,讲讲无人驾驶的技术架构。通过本文的学习,希望大家可以初步建立起了对百度Apollo的架构的认知。
先来看一张百度Apollo技术框架图:
可以看到该架构分为四层,其中除了Cloud Service Platform部分是运行在云端的,其他的都是车端的系统。
自动驾驶系统最为重要的软件层。这一层包含了最底层的RTOS(Real Time Operation System)和第二层的运行软件所需的框架环境(Runtime Framework),再到更上层的各个子模块(地图引擎、定位、感知、规划、控制、端到端、人机界面)。
自动驾驶系统所依赖的硬件层。这里包含了控制器、GPS/IMU、HMI Device(其实就是显示器)、LiDAR、Camera、Radar、和Black Box等。
是线控的底层,不开放这个接口,就无法控制汽车。
下面我就对这几部分进行阐述。
我们想开发一辆无人车,我们首先需要一款可通过电子控制的车辆,这种类型的车辆具有特殊的名称,叫做线控驾驶车辆。在线控车中有一个非常重要的模块,它就是CAN总线,也就是控制器区域网络,它是车辆内部通信的网络。CAN和计算机是通过CAN卡进行连接的,计算机通过CAN线发送加速、制动和转向信号。除了线控车辆之外,我们还需要各种各样的传感器来作为无人车的一部分,我们来简单看一下:
•全球定位系统(GPS):通过绕地卫星确定定位
•惯性测量装置(IMU):通过速度、加速度、和其他一些因素判断车辆的运动和位置。
•激光雷达(LiDar):由一组脉冲激光器组成,雷达可以360度扫描车辆周围,根据激光反射形成一系列的点云。
•摄像头(Camera):通过捕获图像数据,再利用计算机视觉来进行提取信息,以此来了解自车周围的环境。摄像头可以感知颜色,这可以很好的检测车道线、红绿灯等一些信息。
•毫米波雷达(Radar):Radar也用于检测障碍物,Radar分辨率低,难以分辨出检测到了哪种障碍物,但是其经济实惠、适用于各种天气和照明条件等优势也让它能在无人驾驶中发挥很大的作用。
开源软件架构分为三层,分别为
RTOS(实时操作系统):可确保在给定的时间内完成特定的任务。我们看下图这个例子:
当传感器检测到自车前方的移动障碍物时,短时间内基于RTOS的软件模块,需要分析出障碍物是行人、车辆或其他的什么,预测该障碍物未来的运动方向和速度,以此确定自车是减速还是停止,然后,车辆需要按照上述决策执行对应的操作,在该过程中,实效性是系统稳定性和驾驶安全性的基础。 Appllo RTOS 是 Ubuntu Linux操作系统与Apollo内核相互结合的成果。
什么是Ubuntu,这里对Ubuntu进行一定的解释。 Ubuntu是一个以桌面应用为主的Linux操作系统,它是业内顶级Linux发行版之一,也是最流行的操作系统,原始的Ubuntu系统其实并不是实时操作系统,百度通过加入Apollo设计的内核,使其成为RTOS。
运行框架是Apollo的操作系统,它是在ROS的基础上进行二次开发的版本。那什么是ROS呢,我们就来了解一下。
ROS(Robot Operating System)是机器人操作系统,它提供一系列程序库和工具以帮助软件开发者创建机器人应用软件。它提供了硬件抽象、设备驱动、库函数、可视化、消息传递和软件包管理等诸多功能。ROS遵守BSD开源许可协议。
ROS在机器人行业有着悠久的历史,目前有三四千个基础库支持应用程序的快速开发,ROS根据功能将自治系统划分为多个模块,每个模块负责接收、处理和发布自己的消息,由于这些模块相互独立,只能通过运行时框架进行通信,因此调整任何单一模块都会很容易。这个其实很像微服务的概念,通过高内聚,低耦合的方式实现各个模块的稳定性。
为了使ROS能更好的和无人驾驶相结合,百度Apollo团队改进了共享内存的功能和性能、去中心化和数据兼容性。
(1)共享内存
共享内存降低了需要访问不同模块时的数据复制需求,对于一对多的传输方案,共享内存支持“一次写入 多次读取”的模式,例如我们只收到了一帧的点云,这些点云可以同时运行障碍物检测、定位和GUI工具,而需要点云数据的模块自行读取即可。这一点也非常像MQTT这种发布-订阅模式的协议,一方在一个主题内发送消息,需要该消息的角色订阅该主题即可。
这样做的最大好处就是可以更加高效的进行数据传输,增加了通信的速度。
(2)去中心化
去中心化解决了单点故障的问题。我们先来看看现成的ROS是怎么样的。现成的ROS是由许多的节点组成的,每个节点都有对应的功能,例如一个节点可以负责收集摄像头的图像、另一个节点可能负责路径规划,而第三个节点可以负责将控制命令发送到CAN总线上等。但是存在一个问题,上述的节点在ROS中,都需要由单个ROS主节点来控制,问题显而易见,如果这个主节点挂了,那么和他相关的所有节点都无法工作了。
为了避免这种问题,Apollo将所有的节点放在一个公共域中,域中每一个节点都有关于这个域中其他节点的信息,如下图所示:
通过这种去中心化的方案,公共域取代了原来的ROS主节点,因此就消除了单点故障的风险。
(3) 数据兼容
对于无人驾驶来说,由于项目本身的规模很大,数据兼容性至关重要,不同的ROS节点通过名为ROS消息的接口语言相互通信,ROS消息需要使用通用接口语言,使每个节点都可以解读来自其他节点的消息数据,如果消息文件的格式发生了变化,与节点期望的格式稍有不同,则会通信失败,这就导致了严重的兼容性问题。我们举个例子,比如我们对一个接口进行升级升级,结果数据不通会导致系统奔溃,对此解决方法是我们通过一次又一次的数据转换来拼凑出合适的数据,并且还需要考虑之前所记录的测试数据需要适应新的消息格式,这种做法的弊端显而易见,这一定不是最优解。
Apollo使用一种名为protobuf的接口语言来替代了原生ROS消息,Protobuf是一种结构化数据序列化方法,这对于开发用于通过电线彼此通信或用于存储数据的程序非常有用,它可以将新的字段添加到消息格式中而不会破坏向后兼容性,新的二进制文件可以在解析过程中接受旧的消息格式,这样说有些难以理解,我们来举个例子,比如我们约定好去上班签到需要提供姓名、时间,后来公司给每个人分配了工号,你每次签到都会报一次工号,对于签到这个行为而言并不会因为你多报了工号而导致无法完成签到,因为你虽然多报了工号,但是之前约定的姓名和时间依然是存在的,所以可以签到成功。
软件平台具有各种模块,这些模块包括MAP引擎、定位、感知、规划、控制、端到端驾驶以及人机接口,每个模块都有自己的算法库,且模块之间的关系非常复杂,这些模块我们后续会在单独的章节进行描述。
Apollo云服务平台提供了高精度地图(HD Map)、仿真平台(Simulation)、数据平台(Data Platform)、Security(安全)、OTA(空中软件升级)及DuerOS(智能语音系统)等能力。可以看出,Apollo的云服务不仅提供了存储的功能,更重要的是它提供了很多有助于我们快速搭建无人驾驶系统的工具。我们这里重点介绍一些仿真和数据平台。
仿真环境平台是Apollo开放软件平台提供的非常重要的工具,该平台可以允许每个开发者出于自身的需求,来构建仿真环境。除此之外,该平台还有大量的驾驶数据,开发人员可以检验和验证无人驾驶软件系统。仿真环境可以使Apollo车辆不仅可以查看环境,还可以了解道路情况和场景。仿真环境平台支持开发者配置不同的驾驶场景,比如障碍物、路线和交通灯状态。执行模式为开发者提供了一个在多场景中运转的完整设置,在执行模式中,开发者可以在Apollo环境中上传和验证模块,当前的自动评分系统,从几个指标对场景进行评估,其中包括碰撞检测、交通灯识别、速度限制、障碍物检测和路线逻辑,最后,三维可视化可以去描述实时路况,在显示无人驾驶车状态的同时,使模块输出可视化。
我们知道数据对于无人车而言是非常重要的,Apollo的数据平台提供了非常丰富的数据。仿真场景的数据有两个不同的来源,分别是记录场景和虚拟场景:
•记录场景:我们可以使用记录的场景数据来重放我们在实际道路测试中已经观察到的传感器的数据。
•虚拟场景:我们可以借助虚拟场景,使用虚拟编辑器创建新的驾驶场景,这有助于快速检验与验证算法。
除此之外,为了训练像深度学习网络那样的机器学习模型,Apollo 数据平台还提供了带标签的注释数据,例如下图所示的交通灯数据、带边界框的障碍物数据以及语义分割数据。