自动驾驶仿真|如何基于esmini做规控SIL测试?
大家好,我是李慢慢。
此前曾发表过一篇文章:
介绍一款开源的自动驾驶仿真场景播放器:esmini
文章中描述了如何下载、安装、及使用esmini工具,用它进行openDRIVE地图查看,和openSCENARIO场景播放。当时已然对这个工具赞不绝口了,因为它开源、安装简单、秒打开、支持三维旋转、缩放、支持录制和回放等功能。
然而就在前不久的茶话会的交流中,得到高人点拨,才知道esmini的强大远不止如此,它还可以用来做算法测试,尤其是规控算法的逻辑验证。
既然esmini已经可以播放openSCENARIO场景了,那么距离SIL测试还有两个问题要解决。先来解决第一个问题,如何将外部的算法控制指令,输入仿真场景内,用来控制主车的行为。这里我们借用官方的案例。在这个名叫“testUDPDriver.py”的脚本起始部分就讲述了如何使用它。打开两个终端,第一个用esmini打开一个场景,第二个是运行本脚本。
./bin/esmini --window 60 60 800 400 --osc ./scripts/udp_driver/two_cars_in_open_space.xosc
注意2:在windows中运行的话,需要把“/”改为“\”;--osi是指定要运行的openSCENARIO场景文件;python ./scripts/udp_driver/testUDPDriver.py --id 0 --id 1
这个脚本将打开一个可以操作的界面,通过拖动滑块,可以操控主车0或者目标车1的位姿、油门、刹车、转向等行为。再来解决第二个问题,从场景里拿到信号。这里我们依然借用官方的案例。这个名叫“testUDPDriver-print-osi-info.py”的python脚本,打开它其实就可以在开头看到它的使用方法,简单解释下,就是打开两个终端,其中一个运行一个OpenSCENARIO的场景,另一个运行当前代码。效果就是打印出来场景里的一些信息。./bin/esmini --window 60 60 800 400 --osc ./scripts/udp_driver/one_car_on_road.xosc --osi_receiver_ip 127.0.0.1
--osi_receiver_ip是指定OSI仿真接口UDP数据包的发送地址;后续可以写一个UDP接收程序,丛这个端口拿到仿真中的数据。
python ./scripts/udp_driver/testUDPDriver-print-osi-info.py
注:上述的输出内容,都是通过OSI接口(Open Simulation Interface)来获得的,想知道通过这个接口能获得哪些信号,使用者还需要详细去学习一个这个行业标准哦。esmini提供的OSI的proto-pb库如下:接下来,将上述过程串起来,形成闭环,为此我简单做了个的demo。
为了方便演示,我这边计划用Python写一个AEB的算法脚本,该脚本通过udp从场景里拿到目标车的位置,并计算主车撞击目标车的时间ttc,当该时间小于2s时,输出制动指令给主车。
我的预期效果是:如果我不加入AEB控制算法,将发生车辆追尾;如果加入AEB控制算法,主车将制动。相比于简单的demo,SIL批量测试可能又会出现新的需求需要解决。需求1、esmini支持多少种目标类型,可以私人定制化扩展吗?需求2、大量case测试过程中如何隐藏窗口,结果分析时又如何回放单个case数据?需求7、openSCENARIO中的DefaultDriver和UDPDriver之间的如何实现无缝切换?
鉴于文章不能写的又臭又长,上述问题还是留待后续更新好了。欢迎有经验的小伙伴前来讨论,共同进步。