自动驾驶的软件也是极其复杂,作为测试人员,大致理解为三层就够了。第一层是系统软件,主要由BSP、操作系统内核以及中间件三部分组成。第二层是功能软件,包含自动驾驶的核心功能模块,如相关算法的编程框架。第三层是应用层软件,实现自动驾驶关键的感知、定位、规划、决策等应用能力。需要特别说明的是,并不是所有公司的方案都是严格按照上述三层方式去开发软件平台,分层方式各有差异。比如有些将系统软件中的中间层单独设立为一层,以突出其重要新,有些公司并部需要上述提到的第二层功能软件层,或者将功能软件层合并到应用层软件中。
系统软件也可称之为基础软件,最核心的就是OS内核。OS内核又称为“底层OS”,提供操作系统最基本的功能,如管理系统的进程、内存、设备驱动程序、文件和网络系统。OS内核决定着系统的性能和稳定性。在自动驾驶领域,由于对实时性要求极高,通常采用实时操作系统RTOS(Real Time Operating System)。常用的RTOS有QNX、基于Linux的OS和VxWorks(风河)。
BSP(board support package)即板级支持包,是系统软件中重要组成部分。BSP包括了Bootloader(以基础支持代码来加载操作系统的引导程序)、HAL(硬件抽象层)代码、驱动程序、配置文档等,是内核与硬件之间的接口层,目的是为操作系统提供虚拟硬件平台,使其具有硬件无关性,可以在多平台上移植。驱动(Driver)是直接控制Lidar、Camera等外设传感器硬件的基础软件。
中间件是底层操作系统和应用程序之间的桥梁,主要利用系统软件所提供的基础服务(功能),衔接网络上应用系统的各个部分或不同的应用,能够达到资源共享、功能共享的目的。中间件通常对传感器、计算平台等资源进行抽象,对算法、子系统、功能采取模块化的管理,通过提供的统一接口,让开发人员能够专注于各自业务层面的开发,而无需了解无关的细节。这为开发者快速、高效、灵活地开发和集成自动驾驶软件提供了极大的便利。我们常说的AP AutoSar 、CP AutoSar、SOA就是指的系统软件中的中间件部分。
很多头部企业都在尝试自研OS,通常是指在QNX、Linux内核基础上进行一些裁剪和增加,并叠加自研的中间件,以此形成一个功能更完整的应用框架,比如华为的鸿蒙OS,ROS、AGL等。
功能软件通常包括算法接口API,自动驾驶通用框架模块、库组建和中间件。华为、英伟达这些公司提供的芯片或者计算平台都会为客户开发相应的功能软件SDK。
以NVDIA的 AP2X软件架构为例, 功能软件DRIVEWORKS由三个核心的模块组成:DRIVE Networks、DRIVE Calibration、DRIVE Core,如图8所示。
DRIVE Networks是一套DNN算法加速库,可用障碍物感知、车道线检测、交叉路口感知、距离感知、交通牌以及交通灯的感知以及对驾驶员的监测,甚至包括交警手势指挥的检测网络、远光灯的检测网络、相机失明检测网络等。
DRIVE Calibration是一套标定工具,可用于视觉里程计、摄像头、激光雷达的标定。例如自动驾驶汽车在路上行驶一段时间,视觉传感器可能因为振荡原因产生图像输出畸变,可以利用Self Calibration进行在线标定。
DRIVE Core是一套核心库,包括传感器抽象层、车辆IO、图像处理、点云预处理、DNN框架和其它库。
图8 NVIDIA DRIVE AP2X Architecture
应用层软件运行在系统软件和功能软件之上,具体负责自动驾驶功能实现。应用层软件内容繁杂,包括场景算法,如数据感知、决策规划、控制执行等,还有数据地图、人机交互(HMI)等。
从图9应用层软件控制流程中可以看到,传感器(Sensors)和高精度地图(HM Map)数据输入到控制器后,应用层大致按照感知(Perception)、定位(Localization)、融合(Fusion)、规划(Planning)、决策(Decision)、控制(Control)几个步骤实施。实际的应用层处理方式会更复杂,比如Fusion 会拆分为相同类型传感器的前融合和不同类型传感器并结合Map的后融合,再比如Planning前会对目标(Object)进行轨迹预测(Prediction)。
图9 应用层软件4. 云端平台
自动驾驶的研发、测试、运营,会产生海量数据。一辆路测车如果进行全量采集,一天会产生超过2TB数据。随着量产车辆持续规模化交付,数据量会几何倍数增长。所以这些数据采集、分析,场景的回放都离不开云平台。
基于云平台开发的用户功能也越来越多,比如远程通话,车辆远程控制等。