自动驾驶虚拟仿真测试介绍
关于自动驾驶仿真的一些宏观概念,网上找到了篇比较好的文章,在此分享(有较多改动)。希望也能帮到各位志同道合的朋友。
说到仿真测试大家可能会觉得陌生,不过其原理其实已经被广泛采用。比如某人想要开车从北京去上海,但是不知道需要多长时间,于是他做了这样的估算:北京到上海距离s=1200km,开车时速v=120km/h,那么需要的时间为t=s/v=10h;考虑到不是全程高速、中间可能会休息,假设平均时速v’=80km/h会更合理,于是需要的时间为t=s/v’=15h。仿真即是通过一组公式模仿真实世界,或者说使用一个数学模型简化替代真实世界;数学模型的复杂度越高,计算结果与真实世界越相近,但是建模难度越高、计算速度越慢。我们首先考虑真实世界的情况,自动驾驶汽车在开放道路进行测试时,可以用下图来表示:自动驾驶车辆主要由传感器、控制器和执行器构成(当然这主要是指自动驾驶部分,车身、底盘等传统车辆部分暂且不提),驾驶员驾驶车辆在不同的道路、交通和天气环境下接受测试。当然高级别的自动驾驶不需要驾驶员,所以图中用虚线表示。当在仿真环境中模拟其中的不同部分时,可以得到仿真测试的不同手段。列举如下表所示:经常会有人遇到要不要做HIL、要不要买个视频暗箱、要不要买个驾驶模拟器等等疑问,这时如果能先自问这样一个问题应该会有所帮助:我们准备测试的被测对象是什么?如果被测对象仅仅是开发阶段的算法,那只使用MIL/SIL就可以;如果被测对象是要在实车使用的控制器,那可能需要一套HIL设备提前进行测试、提前发现问题。如果不采用视频暗箱、雷达回波模拟器等设备就不能实现测试闭环,那此类传感器信号仿真设备也是需要的。诸如此类,如果能时刻谨记被测对象是什么和测试目的是什么,应该对选择仿真测试手段有很大帮助。仿真测试其实在结构开发领域早已广泛应用。如果说验证一个螺栓强度还可以翻手册、使用公式计算,那么对于一些复杂的零件的强度校核和结构优化,就要借助仿真手段,这就是CAE(Computer Aided Engineering),比如下图中对零件的应力分布计算。CAE手段的使用有效减少了样件的数量,缩短了试验时间,节省了开发成本。这些好处主要是零部件结构开发部门所享受,算法和控制器的开发部门自然很是羡慕。我们可不可以在算法开发阶段就进行测试发现一些低级错误?可不可以在办公室就可以对算法和控制器进行测试,而不是每个版本的新程序都要到实车上测试、在寒冬酷暑的室外调试很久?可不可以在计算机上对真实世界中危险或不易实现的场景进行测试?可不可以在解决bug或算法升版后,对之前的测试场景方便的进行重复测试?V模型是广泛在软件开发和测试中使用流程,如下图所示:V模型要求在开发团队进行不同阶段的开发同时,测试团队编制对应的测试用例,并在开发阶段完成后立即进行测试。这就要求在集成测试、系统测试等暂无完整产品样件的情况下,就开始进行测试。另外,有数据表明,在汽车电控系统的开发过程中,越早发现问题则修正问题的成本越低。在开发的早期,就建立起测试验证的手段,快速高效的发现和解决开发过程中的问题,可以有效减低开发成本、提高开发效率。而在开发的早期进行测试,在暂无完整产品样件的情况下进行测试,就需要仿真手段提供测试环境。自动驾驶汽车是一个新生事物,消费者对其安全性还不够信任。那么,自动驾驶汽车的安全性达到什么水平才能被消费者接受呢?我想其安全水平不低于人类驾驶员,应该是一个最起码的要求。根据RAND公司一份名为《Driving to Safety》的报告,要证明自动驾驶汽车相比于人类驾驶员能够减少20%交通事故死亡率,需要进行约80亿公里的公共道路测试,假设由100辆车组成的车队每年365天每天24小时不间歇的以40km/h的平均速度进行测试,大概需要225年。这个测试时间显然是不现实的。就要求在实车测试之外,寻求其他的方法,大幅缩短测试时间。在虚拟环境下进行大规模的仿真测试,成为了必须选择的方法。比如waymo公司的CarCraft仿真平台中,有25000台仿真车辆同时进行测试,每天总计可进行1200万公里的测试。按照这个速度,完成上面提到的80亿公里的测试,仅需要2年。传感器的感知模块从真实环境中获取信息,并将其转换为原始信号发送给识别模块;识别模块从原始信号中识别出目标,并发出目标列表。比如摄像头的原始信号为图片数据,激光雷达的原始信号为点云数据,识别模块从中识别出前方目标的类型、位置和速度等信息。融合模块对来自不同传感器的目标列表进行处理后,发出统一的目标列表给决策模块。决策模块分析目标列表,对目标未来的状态进行预测,并规划自车的行驶路径。控制模块根据目标行驶路径,发出加速、制动和转向等控制指令,对车辆状态进行控制。根据上面的分析,大体上可以将一个完整的自动驾驶算法分为两个部分:a)感知识别模块,其输入是外部环境,输出是目标列表;b)决策控制模块,其输入是目标列表,输出是对车辆的控制指令。远期的目标,自然是对完整的自己驾驶算法进行仿真测试,不过考虑到近期的实际情况,大致要分为两个发展阶段。在试验室和封闭试验场内对传感器的感知识别模块进行测试,在虚拟仿真环境对决策控制模块进行测试,仿真环境直接向决策控制模块提供目标列表。这主要是因为目前对传感器的建模还有很多局限,从而不能进行有效(甚至是正确)的仿真。比如摄像头输出的图片较容易仿真,但是污渍、强光等特性仿真难度较大;而对于毫米波雷达如果建立精度较高的模型,计算速度较慢,不能满足仿真测试的需求。在试验室和封闭试验场可以对测试环境进行完整的控制和数据记录。比如布置不同类别、位置和速度的行人和车辆,甚至可以对雨、雪、雾和强光的环境要素进行模拟,并将传感器处理输出的目标列表与真实环境进行对比,从而给出对感知识别模块的评估结果和改进建议。这么做的好处是,在传感器建模有很多局限的情况下,依然能够在仿真环境下对决策控制模块进行测试,提前享受仿真测试的优势。在虚拟仿真环境进行高精度的传感器建模,从而对完整的自动驾驶算法进行测试。这样不仅可以在同一环境下进行测试,从而提高测试效率、测试场景覆盖率和复杂度;而且可以对一些基于AI的算法进行端到端的测试。这一阶段的难点,一方面是前面提到的满足测试需求的传感器建模,另外一方面是不同传感器厂家和OEM厂家直接交互的接口很可能不一致(有些情况下可能并不存在)。我们在上一篇《测什么》中用了一张图来概括自动驾驶算法的构成:自动驾驶算法通过各种传感器探测周围环境的状态,进行决策后对车辆进行控制。为了在仿真环境对自动驾驶算法进行测试,需要模拟自动驾驶算法的各种输入,并响应其输出,从而“欺骗”它,让它以为在真实世界工作。为此,对照真实世界,仿真测试平台由交通场景模块、传感器模块、车辆动力学模块和测试管理模块构成。如下图所示:一方面,模拟各种交通场景要素,比如:①高速公路、城市道路等不同的道路结构;②标志标线、护栏、交通灯等道路附属设施;③轿车、卡车、摩托车、行人等交通参与者;④路障、锥桶、遗撒物等临时物体;⑤晴、阴、雨、雪、白天、黑夜等不同的天气。另一方面,模拟不同交通场景要素之间的组合和动态关系,即不同的“场景”。比如:高速公路上,一辆轿车在被测车辆前方快速切入;十字路口黄灯时,一辆卡车在被测车辆前方紧急制动停车。传感器模块用于模拟车辆上安装的各种传感器,从而获得交通场景的状态。一方面,根据传感器种类的不同,模拟不同的信号内容,比如:摄像头传感器输出图像信号,激光雷达传感器输出点云信号,导航传感器输出定位信号。另一方面,根据传感器特性和参数的不同,模拟出其“局限”,比如:传感器的探测范围,摄像头的畸变和炫光,不同材质对激光雷达光线吸收的影响,护栏对毫米波雷达的杂波影响。车辆动力学模块用于模拟车辆本身对自动驾驶算法控制的响应,特别是对加速、制动和转向的响应。车辆动力学模块一般参照真实车辆,由车身、动力传动系统、悬架系统、转向系统、制动系统和车轮等不同的子系统构成。测试管理模块,负责对以上三个部分组成的仿真测试环境的管理,保证仿真测试的效果和效率。一方面,对测试流程进行管理,比如:测试用例的选择、测试的启动和终止、仿真模块的调度。另一方面,对测试数据进行管理,比如:测试用例的更新、测试数据的记录和分析、测试报告的生成。目前常见的仿真测试工具有很多种,根据自动驾驶开发团队的来源,大致可分为如下几个流派:传统主机厂倾向于使用汽车工业的商业软件,使用机器人平台开发自动驾驶算法的团队常常使用ROS/Gazebo,很多擅长计算机图形学的团队基于游戏引擎开发仿真工具。而大规模复杂交通流的仿真需求,则由交通规划领域的软件来满足。比如汽车工业的CarSim、CarMaker、VTD和PreScan,机器人开发的ROS和Gazebo,基于游戏引擎的CARLA、AirSim和LGSVL,以及交通规划软件VISSIM和SUMO。如上一篇《测什么》中所说,一个完整的、精度高的仿真测试平台自然是最终的目标,但是在实际的自动驾驶开发中,团队一定会根据当下的具体需求和成本限制进行选择。比如:如果想采用VISSIM等工具模拟区域交通流,是否有合乎实际的交通调查数据?自动驾驶算法测试使用的车辆动力学模型,是否要与底盘调 教的车辆模型使用一样的精度?等等诸如此类的问题,都需要根据不同的实际情况仔细评估后,再做选择。较低等级(L1、L2)的自动驾驶或者说ADAS,与较高等级(L3、L4)自动驾驶相比,有个直观上比较大的区别是:较低等级的自动驾驶面对的工况复杂度和工况范围比较小,或者说由于驾驶行为的主要由人类驾驶员负责,自动驾驶系统仅需处理有限数量的、确定的工况即可;较高等级的自动驾驶的驾驶行为主要由自动驾驶系统负责,其处理的工况复杂度和工况范围很大,甚至不能提前预知。这种对比,可以用下图做一个示意:ADAS用一个较窄的矩形表示,高等级自动驾驶用一个较大的矩形表示。基于两者的这个差异,较低等级自动驾驶可以使用基于用例的测试方法较好的进行测试,而较高等级自动驾驶则需要使用基于场景的测试方法。基于用例的测试方法,即是预设测试输入和测试过程,通过查看被测算法是否实现预期的功能来评价是否通过测试。比如对ACC的测试,预先设定被测车辆和前车的初始车速,以及前车减速的时刻和减速度,查看被测车辆是否能够跟随减速停车。基于场景的测试方法,即是预设测试输入,但不预先设定测试过程,只设定交通车辆的行为,给予被测算法较大的自由度,通过查看被测算法是否达成预期的目标来评价是否通过测试。比如对直线道路行驶的测试,预先设定被测车辆和前车的初始车速,以及前车减速的时刻和减速度,但是不限定被测车辆是通过减速还是换道超车的方式避免与前车相撞。造成对于不同等级的自动驾驶功能需要使用不同的测试方法的一个原因是:低等级的自动驾驶一般能够分解为简单而独立的功能,可以把单一功能作为被测对象;而高等级的自动驾驶较难分解成简单而独立的功能,只得把整个自动驾驶系统或其相对较大的一部分作为被测对象。若想对自动驾驶功能进行较全面的测试,就需要得到尽可能全面覆盖其真实运行工况的测试场景。为获得这些测试场景,大体上可以有两种思路:1)、通过真实道路数据采集和理论分析等方式,得到不同的场景类型(即功能场景);2)、再分析出这些不同场景类型中的关键参数,并通过真实数据统计和理论分析等方法得到这些关键参数的分布范围(即逻辑场景);3)、最后选取其中一组参数的取值作为一个测试场景(即具体场景)。如下图所示。第二种思路是:采集自动驾驶车辆预定工作区域内的交通流量数据,并将这些数据输入交通仿真工具中产生交通流,并使用该交通流充当自动驾驶车辆的周围交通车辆,实现测试场景的自动生成。![](https://public.fangzhenxiu.com/fixComment/commentContent/imgs/1687350806294_ycs8ld.jpg?imageView2/0)
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2023-06-21
最近编辑:1年前