本文是对自动驾驶领域需要的软件进行了系统的总结,属于入门级介绍科普文。
简介
无人驾驶软件分为车辆端和云端2个部分,其中车辆端运行操作系统和无人驾驶系统,云端提供无人驾驶所需要的各种服务。
操作系统主要负责无人车硬件资源(包括传感器、系统总线、网络等)的管理以及计算资源的调度。对无人驾驶来说,操作系统的实时性非常重要,操作系统要保证任务能够在规定的时间内得到响应。
无人驾驶系统实现了无人驾驶所需要的各种算法,包括定位、环境感知、路径规划和控制等,无人驾驶系统是无人驾驶软件的核心部分。最后云平台提供了无人驾驶所需要的各种基础服务,共同构成了整个无人驾驶软件。无人驾驶整体软件框图:
从整体上看,自动驾驶包括存储、计算和基础服务3个基本需求。
- 存储包括车辆端存储和云端存储。车辆端的存储空间非常有限,只能存储少量数据,而云端存储的好处是大容量,能够存储海量数据。另外还需要考虑存储的效率,对数据的优先级、数据的保存格式以及数据库类型做区分。
- 计算分为在线计算和离线计算。在线计算主要是运行无人驾驶所需要的各种算法,主要关注算法的鲁棒性,能否适应各种环境;同时还要关注算法的时效性,通常需要在100ms之内完成一次计算。离线计算主要是处理离线数据,要处理的数据量非常大,但对时效性的要求没那么高,可以通过并行分布式计算来提高效率。
- 基础服务提供了自动驾驶所需要的各种基础能力,分为操作系统层面和软件服务层面。操作系统层面主要是提供自动驾驶系统运行的环境,提供系统调度,协调硬件资源等。软件服务包括高精度地图和模型训练等基础服务,同时上层软件还提供无人驾驶打车和物流等服务。
操作系统
无人车的软件算法都运行在操作系统之上,对操作系统最主要的要求是稳定性和实时性。稳定性体现在操作系统占用的资源少,出现故障之后系统不会奔溃,能够长时间运行。
实时性要求系统能够及时响应控制指令,工业设备、汽车电子、航空航天等领域都要求采用实时操作系统,因为在这些领域操作系统如果不能及时响应控制指令,会产生很严重的后果。试想一下在驾驶过程中发出了紧急刹车指令,而操作系统没有及时响应,会导致严重的交通事故。
那么什么是实时操作系统呢?
实时操作系统是指能够在规定的时间范围内响应系统指令的操作系统,这在自动驾驶中非常关键。以Apollo 5.0为例,采用的操作系统是Linux操作系统,而Linux不是实时操作系统,需要打上系统补丁之后,才能成为实时操作系统。
那么如何保证系统任务的实时调度呢?接下来看Linux采取的调度策略。
Linux进程调度
操作系统最基本的功能就是管理进程,Linux的进程调度采用的是CFS(Completely Fair Scheduler)算法,我们先看下没有调度和有调度的情况下的差异。
如图3.2所示单个CPU核心的情况下,左边是没有进程调度的情况,任务1在执行完成之后,会读取IO(内存、硬盘等)数据,这时候CPU会进入等待状态,CPU在等待的过程中没有做任何事情。而右边采用了调度策略,在CPU等待的过程中,任务1主动让出CPU,下一个任务就可以在当前任务等待IO的过程中执行。综上所述任务的调度合理的利用了CPU资源,使得CPU的利用率更高,从而使任务执行的更快。
Linux内核分为抢占式内核和非抢占式内核。非抢占式内核禁止CPU被抢占,即在一个任务执行完成之前,除非它主动让出CPU,否则CPU会一直被这个任务占据,不能够被更高优先级的任务抢占。而抢占式内核则支持在一个任务执行的过程中,如果有更高优先级的任务请求,那么内核会暂停现在执行的任务,转而执行优先级更高的任务,显然抢占式内核的实时性更好。
CPU给任务划分时间片,通过时间片轮转,使CPU看起来在同一时间执行多个任务。就好像一个人同时交叉做几件事情,看起来多个事情像是一起完成的一样。每个进程会分配一段时间片,在进程的时间片用完之后,如果没有其它任务,那么会继续执行,如果有其它任务,那么当前任务会暂停ÿ