自动驾驶需要什么样的软件平台

(本文写于2018年初,但由于原博客不再维护,原始的Markdown文件也已丢失,于是我重新整理并添加了一些新的内容,再次发布到本博客中)

从2014年开始,互联网公司、传统车企以及大批创业公司纷纷进入自动驾驶领域。因为自动驾驶的5级中(L1-L5从易到难),实现L4/L5级别的难度不是一家公司可以搞得定的,所以在我看来,他们的切入点可以分为两个不同层次,传统车企和少部分创业公司,以及大量的传感器制造商走的是底层的硬件制造和设计路线,即如何改进(或重新设计)整车(或部分硬件模块)以适应驾驶无人化,因为他们具有多年的硬件经验,所以这是他们的强项;互联网公司和大部分创业公司,则走的是高层感知决策规划的路线,这些玩家要么手持大量数据,要么聚集大量算法(以当前最热门的深度学习和人工智能为代表的)人才。当然还有两种路线通吃的玩家,如特斯拉,自己不但设计和制造电动汽车还在此基础了开发了autopilot辅助驾驶套件,但是,特斯拉当前提供的确实辅助驾驶的L2技术,因此不在本文的考虑之列。

虽然自动驾驶是软硬件结合的平台,而且呈现出高度专业化的特点:即使有一天自动驾驶真的成为现实,也很难说需要成百上千万的自动驾驶开发人才,所以这使得它和传统服务器、移动互联网开发有很大的不同。但是我认为它依然遵循经典软件架构的基本模式,即:从计算机发展的历史上看,经典的系统架构,大体上都可以在垂直方向上分成三个不同层次,对于桌面和服务器系统,它们是硬件、系统软件和应用软件;对于移动和手持设备,它们是硬件、移动操作系统(Android,iOS等)和App;甚至对于云计算,我们都可以将其分为服务器、IaaS+PaaS(虽然IaaS和PaaS最初是上下两层,但从最近几年的云服务提供商发展趋势上看,两者的界限已经模糊)和SaaS。在自动驾驶的三层中,上下两层的玩家很多,中间软件平台层当前却不怎么欣欣向荣(其实也有,我未来会从技术角度一一点评),但是软件平台确也是不可或缺的一层。因此,在本文我想重点谈谈在自动驾驶领域,我们到底需要怎样的软件平台。

为了回答这个问题,我先提出另一个问题,对于自动驾驶,我最关心的是什么?毫无疑问,是它的安全性。一辆以超过100km/h的速度行驶在高速公路上的无人车,即使它的机动性能再好,内饰再豪华,娱乐系统再丰富,但是它无法保证安全性,我想也是没有人敢乘坐,因为对安全感的追求已经早已融入到每种动物的基因里,而人类也毫无例外。同时,我们也可以从另外一些侧面说明问题:想想Waymo号称已经路测500万公里,但是为何依然不能落地无人租车服务;打开任何一个自动驾驶的媒体公众号,稍微统计一下里面和安全性有关的文章数量,也许你就能明白。因此从安全性,这个第一性原理出发,不难推导出自动驾驶对软件平台的需求方向。虽说安全保证不能缺少在来自上下游的整车硬件和感知规划算法的配合,但本文中我们仅具体聚焦到软件平台上,我这里将其具体归纳为以下四个方面:

  1. 可靠性:当我们坐在一辆没有司机的汽车中,等于说我们将生命将完全托付给了它。传统软件中的bug可能只会让我们不开心,但是控制汽车的软件中的bug后果真的会要了我们的命。因此无人车上对软件的bug容忍度基本趋近于零,传统软件设计和测试中的鲁棒性理论将在这里发挥巨大的作用,SMT、形式化验证(Formal verification)、模型验证(Model checker),覆盖性测试等方法都在此将发挥作用。

  2. 实时性:来外部的突发事件(如突然钻出的行人)需要被平台及时捕获并得到处理,否则也是及其危险的,这里就需要软件在设计上体现其实时处理的特征。毫无疑问,实时系统(Real-time)对于自动驾驶平台也是极端重要的,而且这里的实时不是指面向用户流畅体验的软实时,而指的是“all or nothing”的硬实时,因此在操作系统层就不能使用Linux这样的无实时保证的操作系统。另外黑莓的QNX在智能手机上未能发展壮大,而自动驾驶对于它来讲可能是更适合的场景(最近百度和黑莓关于QNX的合作也印证了这一点)。

  3. 抗攻击性:自动驾驶软件平台本质上还是软件系统,一旦联网后也同样面临如何防御来自外部的恶意入侵。恶意入侵在无人车领域也不是什么新鲜事,而特斯拉已经被曝出能够被黑客远程启动。如何防漏洞,在我看来是一项系统工程,而且必须贯穿设计、实现、调试和维护等各个环节。我不是这个领域的专家,不过也会不断学习这方面的内容,并且分享我的心得和观点。

  4. 互联性:这里我将自动驾驶软件平台的互联互通分为以下三个角度:

    • 软件平台和远程服务的互联:平台和远程服务,特别是云计算和大数据平台,已经被大家所熟知,具有代表性是利用远程的地图数据实现路径规划,和接入租车平台参与调度等,这需要平台提供完整的网络协议栈以支持,以及高效的网络处理能力,特别对5G网络和NB-IoT等物联网协议的支持,以后应该是平台支持的重点。另外,选择如DDS等有实时性保证的协议和标准,在其他的无人车平台的实践上已经有所探索,而这也是形成端到端的实时的必须的部分。
    • 无人车和其他物理实体的互联;这其实是物联网的典型应用。无人车为了和其他物理实体,如道路、收费站和其他车辆,进行高效地交互,必然需要去中心化地本地通信机制和协议。顺便说一句,利用物联网的技术,很多传统行驶场景中的难题都变得迎刃而解,以后有时间我将专门写一篇文章探讨这些问题。同时,利用区块链技术进行去中心化的身份认证和共识,也是解决信任安全的有效手段之一。
    • 软件平台内部各个模块的互联:现代软件平台必然是采用模块化设计,一个模块的信号消息(摄像头感知)如何能被另一模块(刹车制动)有效接受并得到及时正确的处理。虽说传统操作系统中这些问题已经研究很多(如IPC,message passing等),但是都较少涉及到消息传递的延迟(而较关注于吞吐量),但延迟才是无人车关注的重点,这些都是需要考虑的新问题。

当然,除了安全性的考虑,其他的一些软件平台的必要特性,诸如对硬件的全面支持、良好的模块设计、稳定且一致的文档和API、成熟的工具链和开发环境以及软件生态等, 都是题中应有之义,也都是未来需要逐一考量的方面。但是除了一些专业领域,如航天、飞行和军事等,还没有哪一个通用软件平台应该将安全性提升到如此高度,而这将极大地改变该软件平台的重心。

虽然最近不断有媒体在宣传某某公司将在一年,甚至几个月之内提供无人驾驶服务,但是我依然认同李飞飞教授在2015年的一个观点,L5的自动驾驶仅仅有望在10年内成为现实。因此还有很长的路要走,这反而对于定位于长远未来的软件平台设计来讲是一件好事,提供了充足的时间用来思考、演化、验证和试错。而对于传统软件架构设计、开发的方法论来说,这也是一次自我进化的机会。未来我也将不定期地更新博客,探讨我对自动驾驶软件平台设计的思考,以及它和其他技术、概念融合的一些想法。