大型干货现场预警
基于我对自动驾驶测试的理解,来谈一谈自动驾驶系统上跑的程序是如何做测试的,欢迎专业人士指正交流。
自动驾驶系统做测试时大致分为以下四个阶段:
1.仿真测试;2.代码审查;3.功能测试;4.性能测试
四个阶段的测试确保交付出去的产品能满足自动驾驶的需求。
1.模拟测试
模拟测试让开发代码的工程师脱离真实的车辆环境,验证自身的算法。
代码开发工程师根据场景需求,将代码开发完成后,验证自己的代码没有逻辑漏洞,会使用仿真软件进行代码的模拟测试。
目前可用于自动驾驶模拟测试的开源模拟器有:基于C++开发的,以及基于Python开发的和,还有@Udacity无人驾驶课程中所用到的模拟器等。这些模拟器需要开发者自己去搭建对应的开发环境,场景相对单一,技术支持相对较少,比较适合个人开发者。
商用的自动驾驶模拟器。这种模拟器不仅可以提供丰富的场景库、能较好地模拟传感器(相机、雷达等)的特性,还具有相对完善的技术支持,以帮助开发者快速上手。这种模拟器有、等。
也有各种自动驾驶公司自行设计的模拟器,像Waymo(前Google无人车团队)开发的 CarCraft 。
模拟测试大致分为以下几个步骤,我借用 PreScan 的视频说一下模拟测试是怎么做的,真实的开发流程和视频比较接近。
更换封面
01:35 视频尚未发布,暂时无法播放
①搭建场景
根据自动驾驶汽车所需要实现的功能,搭建场景,这里的场景既可以高速公路,也可以是城区道路。
如果要完成城区道路的自动驾驶模拟,就需要搭建地图(地面类型,多车道,道路拓扑等),并加入交通参与者(车、人、运动路径等),交通标志(信号灯、地标、施工)等必要信息。
②添加车载传感器
根据实车所装备传感器,给要模拟的汽车添加诸如摄像机、Radar、Lidar等传感器。同时设置传感器的各种参数(探测最大距离、精度等),使仿真环境中的传感器参数与现实中使用的尽可能一致。
③添加算法
这里就是代码开发工程师需要注意的部分。将算法导入到模拟环境中,使车辆能正常驶过该场景,而不至于与其他物体碰撞。下图是AEB(紧急制动)的Simulink模型。
④仿真测试
搭建好场景以及添加算法后,就可以开始仿真测试了。根据仿真测试的结果即可验证编写的算法是否能够发布到测试组。也可以基于仿真测试的结果,修改算法或调节参数。
不仅开发工程师会用模拟器进行模拟测试,测试工程师也可以基于模拟器设计出更多复杂且极端的场景,来测试算法的普适性和极限。
2.代码审查
代码审查是测试工程师拿到代码后做的第一份工作。每份交付出去的代码都要符合一定的编码规范。大家聚在一起,逐行审阅每一段代码,开始互怼。
每次代码审查环节,都会让我不自觉地想到这张图。
开发工程师每一行代码的变量命名、函数命名甚至空行都要严格限定,这样做的目的是保证代码风格的一致性,才能保证其他同事接触到代码时,能快速看懂。除了命名等格式,测试工程师还会对代码中的判断、循环语句做审查,以此判断这些代码是否有效、有必要等。
目前国外最著名的当属Google推出的编码规范.比如C++编码规范,及;国内的比较著名的当属BAT和菊厂的规范了,网上很容易查到。
下图是CSDN上的某位大神做的Google C++代码规范的简洁版。
图片出处:CSDN博客
代码审查中除了人工审查外,还有专门的自动化测试工具,比如Understand、WinRunner、Selenium等,用以辅助测试人员发现代码中的漏洞。
3.功能测试
开发工程师和测试工程师互怼的代码审查环节结束后,就要开始把代码放在车上跑,功能测试开始。
虽然代码通过了模拟测试,但此方式只能验证算法的逻辑没有问题。功能测试就是为了确保代码在真实的场景中也能顺利通过考验。
测试工程师需要协调车辆,协调测试场地,模拟出需求定义时的场景,让交通参与者以规定的速度在场景中运行。然后启动软件,开始记录自动驾驶汽车上各传感器的信号和视频数据。
功能测试时,通过控制变量,使自动驾驶汽车能以不同的车速,通过设定的场景。
控制的变量既可以是自身车辆的速度,也可以是交通参与者的速度、方向等。功能测试通过广泛的测试,可以尽可能多地涵盖大部分交通场景。
每通过一此测试,测试工程师就会在小本本上做下标记,进行下一个测试项。当遇到测试不通过时(这是常有的事),测试人员会将在汽车上收集到的各种信号和视频打包,拿回去和开发工程师共同分析出错的原因。
测试失败的用例会录入到、或BugFree等Bug管理系统中,由于追踪和管理Bug,提高解决Bug的效率。
4.性能测试
汽车的工作环境是十分复杂的,功能测试只能保证自动驾驶系统能在理想环境下完成场景要求的任务。
比如城区道路的AEB(紧急制动)测试,功能测试时最高可能就测到80km/h。可一旦场景变成了高速,由于没有做80km/h以上的测试,谁也无法保证车速到达120km/h时,汽车紧急制动时能否停下。
因此性能测试必不可少。性能测试是为了满足场景需求之外的更高要求;也可以说性能测试的目的是为了知道当前系统的极限,为自动驾驶系统功能做冗余。
自动驾驶领域有一个很有意思的性能测试和蔚来汽车的测试团队有关。他们打破了一个世界纪录——无人驾驶汽车的最高时速257km/h。之前这个纪录是由奥迪保持的241.4km/h。
这个测试的国内关注度不高,墙内居然没找到相关视频。于是我到Youtube上把它搬运过来,视频全长4分43秒,可以直接从1:30开始观看,链接如下:https://www.bilibili.com/video/av16006652/,流量告急的小伙伴直接往下看图。
他们的性能测试情况如下:
测试工程师先让专业的赛车手在测试场中跑了一遍,记录了一组无人驾驶汽车需要跟踪的GPS点,也就是一串无人驾驶的轨迹点。
之后将这段轨迹点输入到自动驾驶系统中,让车手坐在车上,自动驾驶跑一遍,确保赛车能按正确的轨迹从起点跑到终点。
随后车手下车,关闭车门。然后远程启动自动驾驶系统,自动驾驶的表演开始。
测试过程中可以看到无论是直线还是弯道,赛车均保持了较高车速。
就这次性能测试来说,蔚来用世界纪录告诉我们,他们有一个牛X的自动驾驶测试团队,敢于挑战这种极限。
我司在自动驾驶高速路段做性能测试时,也尝试过把车速设置为150+km/h。得到的结论是速度越高,外界环境(比如横风)对车辆的影响呈指数增长,对控制算法和系统的稳定性要求极高。就算有专业的驾驶员在司机驾驶座上随时准备接管车辆,也不要轻易尝试。
一般情况下,国内的自动驾驶系统测试到144km/h就算是极限了,毕竟自动驾驶系统也要按照基本法,不是么?
以上提到的性能测试只是举了车速这一个简单的例子,当然还有其他的性能测试,比如自动驾驶系统的工作温度、交通参与者的蛇皮走位等都可以是性能测试的某个指标。
以上仅粗略介绍了自动驾驶系统的测试方法,实际操作时比以上过程更繁琐。测试是一项大工程,需要调动的人力、物力太多,而且从测试开始到测试通过,周期很长。
所以呀,不要得罪测试人员,要不然他们测出来的 Bug 能砸死你,信不信?
欢迎关注本文知乎作者:
本文暂时没有评论,来添加一个吧(●'◡'●)