嘉宾简介:
James Zhang
James Zhang,复睿微电子自动驾驶仿真算法专家,毕业于卡耐基梅隆大学,长期专注于机器人与自动驾驶领域仿真研发工作,积累了丰富的仿真平台开发与集成项目经验。
关键词:自动驾驶仿真,特斯拉,仿真软件,车辆动力学,仿真测试工程师,激光雷达
讲座正文:
大家好,我是James Zhang,来自复睿微电子。我曾在国家智能网联汽车创新中心工作,期间和PanoSim有过相应的合作。现在我在复睿微电子,从事的是自动驾驶仿真相关的工作。
今天,我以特斯拉为案例给大家做一个自动驾驶仿真产品的架构分析。前段时间,特斯拉在AI DAY的分享案例中,介绍了自己强大的数据驱动算法的研发流程,其中很大一部分是仿真的相关工作。我希望以特斯拉的这个案例为例,来说一下在特斯拉案例展示的内容之外,仿真产品还会包括什么内容以及仿真工作的现状和展望。
首先,我们来看一下自动驾驶研发面临的问题:数据的缺乏。我给大家列了一些数据难以采集的原因:(一)成本较高,包括时间成本和金钱成本。如果我们派车队来做这个数据采集的话,非常的耗时间和人力、物力。(二)极端场景较难寻找。极端场景(危险工况)对于算法研发来讲是最为重要的,这个也是非常难以获取的。我们可能花了很长的路测时间,但是获取的数据都是一些比较平常的数据,危险场景corner case较难覆盖。(三)法律政策问题。采集车辆可能还好一点,因为有人类驾驶员。测试车辆的话,可能就会涉及一些很棘手的法律的问题。现在各个国家,包括咱们国家的各个地区都有示范区,但是在示范区之外,进行路测可能还不是特别简单。(四)交通是一个很复杂的系统,各国各地区也都不太一样。就我国来说,路况也会比较复杂,人车混行,包括外卖、快递等等。交通参与者行为都比较难以预测,比较复杂。
因此,我们希望仿真能够解决这些困难。也就是说,低成本、快速地生成测试数据。接下来,我们正式进入特斯拉2022 AI DAY所讲述的内容。
一、特斯拉案例分析
特斯拉案例,主要说的是WorldSim,也就是说所有的仿真数据都是纯虚拟的。另外,特斯拉介绍的内容比较聚焦,主要介绍了Simulation World Creator(仿真场景的生成器),包括仿真场景是怎么来的、丰富的随机性等等。虽说纯仿真数据是凭空生造出来的,但其实特斯拉是依靠自己强大的数据链条,从真实的数据中还原出的仿真场景。所以,WorldSim和LogSim的界限会变得日趋模糊。
什么是WorldSim和LogSim?WorldSim是完全虚拟的,数据是生成的。LogSim一般来讲都是根据真实的数据做的测试。比如说,纯LogSim就是直接把传感器在路上采集的数据回放给算法(主要指感知算法)。感知算法对数据的真实性要求较高,如相机数据的真实性、激光雷达数据的真实性,这些恰恰都是在WorldSim中难以百分之百真实还原的数据。所以,LogSim其实就是管理路采数据,把有价值的进行挑选、归类,然后再合成起来给到算法。
特斯拉在2021年的AI DAY中也提到,他们不仅采集了真实的数据,而且还在自己的标签系统中进行了三维的重建,然后再根据这些三维重建的结果,把虚拟的世界建立起来。也就是说,WorldSim和LogSim,特斯拉都有涉及。在WorldSim领域中,他们会建立大量的数字资产,几千种的建筑物、汽车、行人等交通参与者等等三维模型。因此,他们可以快速地造出大量里程测试的测试场景出来。另外,他们会使用真实数据回放给算法这样一个LogSim的方法。
但是,LogSim测试方法有两个原则上需要解决的问题。其一,交互性。LogSim是一个记录好的数据,只能对算法进行某种程度上的开环测试。也就是说,它给算法提供一个输入,我们可以看到算法的输出是怎么样的,但算法的输出没有办法再回馈给本车。而WorldSim可以对算法进行闭环测试,你可以和这个虚拟世界做一个交互。其二,LogSim片段时间是有限的。那么,如何让被测算法达到LogSim开始采集的这个时刻的这个状态呢?这个是很不容易的。比如说,这是一个危险片段,它开始采集的这一刻往往已经在这个危险的时间段了,之前的数据你可能很难获得。这个怎么解决呢?有的厂商会在自己的算法中设置所谓的影子模式,也就是说,感受到危险之后,它会把前后多少时间内的数据都记录下来,然后再播放给算法看,让算法能够有一个充足的反应时间,能够快速地达到LogSim开始时算法所达到的状态。
当然,我们今天所说的主题都是围绕着WorldSim,即我们如何生造这个数据,就不会面临刚才所说的这两个问题。2022年的AI DAY,特斯拉分享了Simulation World Creator,也就是说它的生造数据分了大概三个步骤。Simulation部分承接着Auto Label环节。举例来讲,采集车在旧金山运行,记录各种各样的街景、车道信息,采集回来之后,Auto Label能够某种程度上自动地生成周围街景的标签、语义的信息等等, Simulation基于这个结果给仿真世界提供信息。
首先,生成路网。根据Auto Label的信息,我们知道了道路的边界、环岛、隔离带、路面起伏的信息等等。根据这个边界和起伏信息,可以在边界内生成mesh,然后渲染它的表面材质、车道线信息,这些都是在Houdini(影视特效界和游戏界非常常用的一个视觉效果生产工具)软件中实现的。
其次,从丰富的三维素材库中随机挑选中间隔离带的植被、道路旁的建筑物,以及其他的静态物体,如消防栓、车站、马路牙子上的落叶生成环境。最后,参考一定的地图信息,同时也参考Auto Label的信息生成交通流。有了这些路后,我们知道这些路的信息(直行、转弯)、路与路的连接关系等等。通过地图的信息,把交通灯、交通标志放在地图的相应位置。然后,我们就可以按照规则来生成自动的交通流,将交通参与者放到这个场景中,就运行起来了。
在这三个步骤中,什么东西是真实的呢?通过Auto Label工具链到最后形成的仿真环境,真实的是这个路网的结构。比如说一个旧金山的路网。而这些植被、建筑物等等都是随机生成的(当然这些随机包括一定的规则,让你看上去不会穿帮),但这些东西不是真实的。也就是说,你只能找到旧金山的某一个路口,但是你没有办法找到旧金山某一个具体的建筑物。这个就是和真实的数据有关系和没关系的地方。
仿真的优势在于可以产生随机性,丰富测试场景和数据。像左边随机的六个图,仔细观察的话其实是同一个路口。但对于感知算法来讲,会有更丰富的视觉信息。交通流也是随机,它可以改变某些街道的连接关系,比如说右边这四幅图中的同一个路口,我们看到它从转弯可以变成直行,变成直行和直行加转弯等等。通过修改这些道路的朝向、交通流的方向,就可以产生更多的随机结果。
特斯拉在最后还介绍了一些工程化的东西。总结来说,主要是Auto Label的一些信息,包括Lane Graph、Map Data。用Tile Creator建立三维信息,然后抽象化变成几何、3D的素材存储起来,最终,将这些素材组合起来给到Tile Loader,Tile Loader再给到Unreal Engine(游戏开发引擎)。
二、自动驾驶仿真产品架构分析
接下来我会借助游戏引擎分层的概念来分析自动驾驶仿真产品的架构。第一层是工具层。所谓工具层,即自动驾驶仿真产品是什么?我们把一个自动驾驶仿真产品提供给对方,对方可以拿来做仿真的测试,而测试又可以分为开环测试、闭环测试。比如,提供感知的数据集输入;或者进行算法闭环测试,把感知输入给到算法,然后把算法的控制命令输出再给到仿真环境中的本车;或者进行多智能体联合仿真。如果说你有本车,那本车长什么样?有什么传感器配置?行驶在什么地方?周围车的信息是怎样的?车道的信息怎样……这些都需要进行可配置、可操作。因此,一个仿真产品最外层就是工具层,包括编辑器,比如这里重点列的地图编辑器。如果要做一个具体建筑物、小汽车、行人动画的编辑,可能需要借助第三方软件。所以,一个好的仿真产品不仅要提供自己的编辑器,还要兼容第三方的编辑器。
第二层是功能层。对于自动驾驶仿真产品来说,功能层是最重要的一部分。也就是说我们要借助各种各样的功能来实现我们的目的,包括渲染、车辆的物理属性、动态场景输入输出接口、展示等。比如,我们要进行软件在环测试、硬件在环测试,甚至车辆在环测试等等,就会涉及输入输出接口、实时性的仿真、云平台等等。渲染方面,特斯拉在2021年AI DAY中就强调了自己渲染的强大功能,其利用实时光线追踪技术和Neural Network做出来的。最新一版Unreal引擎(UE5)推出了两大非常强大的功能,一个是做全局光照,另一个做无限细分的细节,和特斯拉展现的能力是一样的。就输入输出接口而言,算法可能会基于各种各样的中间件框架,那是不是对所有中间件的框架都要做支持呢?功能层要不要做这些支持?你可以把产品中的这些信息接口暴露出来,让用户做二次开发适配不同的接口,做不做看你的选择,看需求量的大小。
第三层是资源层。资源包括静态资源、动态资源。在资源层中,我们不仅要管理静态资源和动态资源,还需要负责把这些资源加载进去实时的用起来,在仿真结束的时候,还需要做资源回收。
第四层是核心层。核心层是从功能层或其他层中抽象出来的一些公用的功能(组件、代码),目的是为了快。比如,各种数据结构、数据容器要支持并行计算,怎么处理各种线程、数学计算、物理计算等等。对于仿真产品来说,如果做软件在环,甚至只是为了生成数据集,实时性可能要求不高。但如果做硬件在环仿真,就需要跟上速率、且非常稳定,对实时性会有很高的要求。
最后一层是平台层。仿真软件可能不仅要运行在Windows、Linux系统中,还可能需要在云端、实时机上运行。比如,算法对Simulink依赖较大,可能需要运行在Windows中;算法使用C++、ROS,则对Linux依赖较高;需要多节点并发的需要云平台;做硬件在环、实车在环就需要实时机。因此,不是所有的仿真软件都可以同时兼容很多个集成平台的,这不是很容易达到的一件事情。
我列了几类比较常用的仿真软件,VTD和PreScan是国外商用仿真软件。AirSim和Carla是开源仿真软件。51Sim和PanoSim是国产的商用仿真软件。商用软件和开源软件最大的区别,首先是稳定性,另外就是功能的完善程度,最直观的可以在工具层体现出来。商用软件有很好的手册和工具层界面,能够告诉你可以做什么,不可以做什么,什么东西可以配置,你可以在哪些第三方界面导入其他资源。开源软件的文档往往不是那么充足,如果打开AirSim和Carla(都是基于Unreal),你会看到Unreal的界面,这个编辑起来就会非常麻烦,因为Unreal是开源的,它太通用了。比如我要建立路网,在路网两边生成随机的建筑物,你可能需要摆放每一条车道线、每一个建筑物。如果单从渲染的效果来讲,Carla的效果和特斯拉的差不多,但其实是有着天差地别的。因为特斯拉的仿真场景有自己的真实数据链来支撑,仿真场景的置信度比Carla要高很多。
三、现状和展望
在自动驾驶感知算法中,前些年做的都是2D的算法,仿真对于这些支持其实也是很好的。仿真天然可以知道各种各样的真值,对于算法来讲,你可以把真值提供给仿真,也可以用自己的真值来验证仿真的效果等等。近年来,随着深度学习Transformer的引入,大家逐渐从2D发展到3D、鸟瞰的BEV视角等等。在这些空间中提取特征,相应的对于仿真的要求也会更多。比如,要有3D的包围框、BEV的特征提取、三维占位的提取等等。因此,算法不断的演进,仿真的系统也需要不断的演进。另外,仿真也会提供多个视角、各个传感器,各个方向的传感器的信息。
今天参加2022CIAC大赛的同学比较多,所以想和大家谈一下个人对于自动驾驶仿真工程师岗位的理解。首先需要区分仿真开发工程师和仿真测试工程师。仿真开发工程师呢,就是说产品是怎么研制出来的。有的公司可能不用商业软件或已经成型的东西,就需要自己做工具链,那么可能上面提到的五层你都要了解。仿真测试工程师呢,就是利用工具达成一个测试的目标,你要会用这个仿真软件的工具界面,可能前三层掌握就够了。另外,你可能需要根据给你提供的各种不同的功能做二次开发,做不同的组合达到自己的测试的目的。可能你要负责一些资源,比如做地图、小汽车、行人,让它们看上去更逼真等等。
但这两个岗位的能力需求也有共通的地方。比如说,代码语言,C++、Python、Java、ROS,你都需要知道一点。车辆动力学你可能也需要知道,知道车是怎么样行驶的,车辆动力学的精细程度对测试目标有什么样的影响。对感知算法数据集的采集来讲,没那么重要,但如果是控制算法的话,就需要车辆动力学尽量的精准。若要引入第三方的车辆动力学库或车辆动力学软件做联合仿真,你就不仅需要知道车辆动力学的知识,还要知道各种中间件之间的通讯怎么连接的,若不兼容的话,还需要从它们各自的API中找到解决方案,把它连接起来,让它实时的跑起来。
然后,你可能还需要知道传感器的原理。各种传感器的参数配置,相机、激光雷达、毫米波的信息等等。包括内参,即传感器本身的参数;外参,它们之间的相互位置关系等等。最后,还需要知道一些地图的知识。你要知道自己的车道,要会从自己的位置出发查询一些地图的信息等等,地图有Open Drive格式的静态地图,Open Scenario格式的动态地图,你要会修改、编辑。
总之,对于自动驾驶仿真工程师来讲,对于算法的了解可能不需要那么精通,但可能从算法、车辆、传感器到地图都需要知道一点,这样我们才能很好的了解需求,实现各种功能。
最后再介绍一下我的公司——复睿微电子。复睿微电子是复星主要出资成立的一个自动驾驶芯片公司,产品主要包括两大方面,一个是高性能的座舱处理器,还有就是通用的ADAS和ADAS处理器。我们今年已经组建了两三百人的团队,规模还在逐步扩大。有兴趣的同学可以来联系我,求职或其他探讨都欢迎。