北京未动科技肖猛:高安全高性能的自动驾驶中间件
由盖世汽车、AUTOSAR组织、上海车展三方联合主办的SDVF2021第二届软件定义汽车高峰论坛暨AUTOSAR2021中国日于4月19-21日在上海举办,本次活动也是2021上海车展的同期活动之一,同时也是AUTOSAR组织在中国区唯一官方活动。本次会议邀请到了北京未动科技有限公司研发VP 肖猛先生在本次论坛进行了题为《高安全高性能的自动驾驶中间件》的主题演讲,以下是他在本次演讲的主要内容:
未动科技于2014年成立,我们早期是以自动驾驶视觉感知算法赋能自动驾驶行业。当前来讲,我们的感知算法已经在很多OEM有落地。我们最近一年开始切入到高算力平台自动驾驶域控制器基础软件以及应用软件相关的开发,我们也希望能够为OEM提供相关的产品和服务。
我们会在高算力域控制器上实现高速路的自动领航,驾驶员监控,自动泊车,从系统基础软件到应用解决方案的完整实现。这次演讲主要讲两个方面,一是从场景出发提出了自动驾驶域控制器软件架构的鸟瞰图。因为这样一个架构会对中间件有非常高的要求,那么我们在性能域会大量使用AP AUTOSAR。AP AUTOSAR大部分是用C++开发,这样又引出来另外一些问题,我们想对这些问题做一些探讨。
这是L1和L2软件架构典型的拓扑形式,一般来讲L2产品都是一个功能一个功能叠加起来的,每个控制器做各自的事情。比如说图上下面这四个控制器有前向摄像头,前向毫米波雷达,左右侧角雷达控制器,各有各的感知算法处理能力和计算能力。上面是泊车和驾驶员监控,这两个系统架构比较接近一些,因为都会有高算力一部分做视觉AI处理的单元。这个架构对OEM来讲是有好处的,可以分别定点给不同企业,但是L3、L4这种叠加的方案会有问题。当我们往L3以上走的时候不可能把这样的控制器一个一个往上堆叠的,一方面是成本问题,另一方面各种算力并没有充分利用起来。比如说当速度降到低速的时候泊车启动,但是前向摄像头算力浪费掉了,不同功能设计出不同的ECU进行堆叠,无论在成本上还是软硬架构上都是不可行的。
这是我们画的高算力平台上软件架构的鸟瞰图,我们从三个维度来看这个问题。我们看纵轴的“分工”这个维度,这个维度分为两个域,一个是MCU实时域,它主要负责是实时处理。一个是性能域,这块运行大部分的AI算法和实时性要求不高的计算,一般会做到软实时。
从“层级”维度上来讲,L.HW提供软件运行的硬件平台,包括各种芯片、总线、电源、时钟、物理传感器等等。L.OS是计算机科学与工程意义上的“操作系统”,管理硬件的计算、存储、IO等各种资源并提供访问硬件资源的驱动程序和API接口,调度各种工作任务(Process或 Task) 的执行,处理IO中断等等。这一层不做与“车”相关的工作,与“车”没有直接关系,作为通用的计算机操作系统,同样可以用在其他不同的行业。
L.BSW(这里借用 CP AutoSar 的BSW 概念)层是为了解决汽车控制器的通用问题,也就是我们一般说的中间件。汽车控制器非常复杂,为了让控制器能够装入车内使用,很大一部分软件是用于让控制器满足汽车的电源管理标准,网络管理标准,诊断标准,刷写规范。
车载控制器需要比一般工业嵌入式系统有更高的可靠要求,这样就需要在计算机OS基础上再附加对存储、通讯各方面的安全保护机制。这些是所有车载控制器都需要实现的能力。同时为了让控制器能够正常运行,还需要提供时钟同步,日志跟踪等服务,另一方面,这一层还需要为上层提供通讯能力,包括但不限于总线数据的收发,提供各软件模块之间的数据交换能力。这一层还会在计算机OS层提供的任务调度基础上,提供更具体的任务包装器以及更细粒度的任务执行管理机制。这一层不做与“自动驾驶”相关的工作,一样可以用于开发其它车载控制器。
基于L.BSW层我们来实现自动驾驶软件框架L.FW。L.FW这一层需要理解自动驾驶相关的语义,了解自动驾驶各类算法的语义概念和执行特点。能够根据自动驾驶语义分隔出不同的软件框架模型。
各种软件框架能将各类算法模块封装成不同的软件组件,各类框架作为各类组件的运行载体承载,为各类组件提供数据连接机制和调度机制。基础组件是维持框架能够运转的最小集合。自动驾驶软件框架不做具体的“自动驾驶功能“的实现,不做具体自动驾驶算法的实现,它是“算法”的容器。
在 L.APK 这一层,我们分析具体的自动驾驶场景,分解为框架层定义的不同组件类型,组合或扩展现有组件,实现新的组件装入到框架中执行,形成完整的自动驾驶功能或场景的支持能力。这样各个功能组件运行在框架层内,让L2,L3,L4功能都可以基于统一架构来实现。L.APK层包含了各种算法,有感知算法、控制算法,当然感知算法也会进行算法的加速。
对于另外一个维度我们喜欢用切面这个词,它的含义是什么呢?在这层里面信息安全也好,功能安全也好,性能统计也好,其实D轴,L轴里面都有它。在硬件层面有硬件的安全需求和技术实现,OS、中间件往上每一层都有自己功能安全处理的方式。
分解为几个正交的的三个维度方便我们更清晰的理解自动驾驶的软件架构。
前面讲的是一个整体视角,我们还可以换一个局部视角,单纯从算法角度来看。我们知道自动驾驶核心是算法,各种各样的算法,包括感知的算法、融合的算法、控制的算法。这些算法确确实实是自动驾驶的核心。但是这些算法是如何被组合起来的?仅仅把算法做得好,不能被正确调度也是不能够实现完整功能的。
这张图里面我们从三个维度来分析算法所需要依赖的环境。时间的维度,一个算法有开始时间,有结束时间;数据流维度,任何一个算法需要有输入,同时也提供输出;还有资源维度,算法在怎么样一个物理设备上运行。
这里看到有三个平面各自对应含义。FT平面代表的是算法在一定时间内的数据流动。FR平面代表算法数据实际流动的物理或逻辑通道。RT平面代表算法在一定时间内对资源的占用。怎么样对它进行调度这是我们软件框架需要解决的问题。
在软件框架里面,我们把它分成两大部分。一部分是环境模型的框架,环境模型的概念并不新鲜,在L2里面各有各的环境模型的实现。当然当把L3、L4功能堆叠在一起的时候我们需要一个统一的环境模型表达,而且它应该是从低级到高级语义逐渐爬升的过程,越往下语义是越接近于传感器的物理属性,越往上的语义越跟规划更接近,它给出来的实质有交通行驶含义的语义信息,而这些语义信息是被L3以上各种功能按需取用的。
框架里面另外一个是泛化的规划与执行。我们经常会说到全局规划、路径规划、行为预测等各种各样的名词,抽象来讲,任何一个层级的自动驾驶语义都可以抽象为几个简单的因素。
一个是对环境的需求(E),一个规划或计划(Plan),它是抽象的规划概念,规划的输出被某个执行机制执行(X)。举个例子来说,在上图中间部分是抽象语义,它有环境的需求,规划、执行。问题空间A是“驾车从北京到广州”,这个问题空间里,传统意义上讲的局部规划,在这里没有意义,因为问题空间的层次不一样。这个时候对于环境来讲,我们感兴趣的东西不是在GPS某一个点,而是在北京哪一个区。在规划来讲,我们考虑的事情是先进哪个高速,再走多少公里,从哪出去,在这个层级上进行规划。但对于底下问题空间B,驾车通过某一个路口的时候,这个时候对环境的要求就更细了,要感知车道线信息、红绿灯信息、周边车辆信息,规划也做得更细致,一直到减速,起步,怎么通过路口,这个执行机制来讲实时性要求更高。EPX的逐层分解实际上体现了数学上的分形机制,就是说每一层环境感知规划交给这一层的执行机制去执行,这个执行机制内部又有更小一个粒度的EPX体系。
所有的L.FW层的开发都需要基于一个坚实的中间件作为基础。MCU开发中CPAUTOSAR已经非常成熟了,现在要实现更灵活的机制需要在性能域这块用SOA相关模型来做,AP AUTOSAR是很好的解决方案。
但是AP AUTOSAR把C++用在驾驶领域我们是存在敬畏之心的。实际上C++14虽然在这方面做了很多工作,但是还是会发现,你没有办法保证你的程序员,你的团队能够写出真正非常好的C++代码。这是微软和谷歌的两个数据,他们代码库中所有严重安全的漏洞70%是跟内存管理有关。汽车软件开发就会用很多工具分析这个代码,包括AP AUTOSAR标准里面有专门一章C++编程指南,列出一大堆规则,要求你不要这样,不要那样,这些事情你检查的越多,会让深层次的错误隐藏的更深。
还有一个非常现实的问题,这些程序员我从哪里来?熟练的C++14的程序员从哪里来?最近一年大家都在全国抢人,因为人才就这些,新一批还没有培养出来。当我们用AP的时候会发现一个很有意思的问题,大部分汽车软件的程序员从哪来呢?都是学机械的、控制的、电子的,很少有学计算机专业的。原因很简单,因为学计算机专业的人都去互联网了。十年前这些人不会去做汽车软件的,因为那个时候汽车都是MCU,用C就行了。但是当你用AP AUTOSAR的时候需要大量C++程序员,这些C程序员往C++转是可以,但是想很快很熟练,写出没有错误的代码太难了。
我的想法是什么样的?我最近一年大力推广在汽车软件里面使用Rust语言。Rust最近一年知名度非常地高。我知道华为里面有一个非常强大的Rust团队,做了很多事情,只是他们不吱声。
这里有一张图标注Rust在两个轴上的位置,下面是安全轴,这个安全不是指功能安全和信息安全,但是跟它们都有关,更多是讲语言本身的安全,程序本身的安全。纵轴是性能轴,C++和C的是性能方面最高的,没有任何额外的开销,像Java是虚拟机语言,有虚拟机开销。虚拟机语言没办法用在汽车上的,因为都会面临垃圾回收的问题,也就是在某一个时间点,整个程序世界冻结掉,冻结掉之后才能把内存回收回来。各种语言始终面临需要安全和性能之间达到平衡,那用C和C++能够充分发挥硬件所有的性能,但是就要承担内存不安全,可能带来这样那样的问题。
Rust所处的这个位置非常好,性能是最高的,安全性又是最好的。Rust提供了一整套的机制在编译器层级防止你出现内存安全错误。我为这个写过一篇文章《图界Rust所有权与生命周期》,这里有一个非常详尽的描述,这篇文章发布在Rust中文社区杂志里面,连续三个月都是阅读量排名第一,里面有非常详尽的图描述各个方面的情况。
把这样一门新语言引入到汽车里面,其实对于很多人来讲是非常激进的,但是我并不是没有做过这样的事情,而是已经成功实施过这样一些方式。这是一个全自动泊车项目里面使用Rust做的轻量级中间件。橙黄色部分是用Rust写的,整个产品软件出了很多bug不停地修改,唯独这个模块稳如磐石,发布后从来没有出现过严重的错误。
下一步我更希望让AP AUTOSAR和Rust有一个很好的结合,我们可以给AP AUTOSAR C++接口包一层Rust接口,上层用Rust开发提供相应的工具。刚才说C++程序员从哪里来?这里也同样遇到Rust程序员从哪里来?其实现在已经有很多 C++ 程序员、java 程序员、Go 程序员往 Rust 转移。Rust 的特性让 Java 、Go程序员转移比较容易。相反,他们转向 C++ 却很难。
汽车软件领域未来十年需要大量汽车软件人才,我们不能够指望大家都在现有存量人才里面去抢。前天晚宴的时有一个人讲,很多人在创新港附近,两三年时间一年换一个工作,做得事情没有变,工资翻了好几倍,这是目前一个现实情况。我们需要有更好的工具,更好的语言,能让更多的人投入到汽车软件上面来。所以必须扩大汽车软件人才的来源。在这个方案体系上来讲,希望这些层学员写的程序,通过编译器编译的时候就让程序具备了基础的程序安全特性。
目前,未动科技正致力于包括中间件在内的基础系统软件和自动驾驶应用软件的开发,支持L3、L4自动驾驶的落地。
下面是未动科技在本次大会中的精彩瞬间: