本文还是继续研究如何用esmini做SIL规控测试。
前方预警:读懂此文,需要熟悉openSCENARIO、驾驶员模型Driver、及C++,Python等知识。
在文章《如何基于esmini做规控SIL测试》中,我简单提到了参考官方文件夹upd_driver下的案例,在openSCENARIO文件中使用UDPDriverController作为主车的驾驶员模型,进而可以让esmini在播放场景的时候可以接受外部的控制算法。文章中第3个视频里,我计算ttc进而决定是否制动就是一个简单的控制算法,当然我也演示了它的效果。数据从esmini到AEB算法再到esmini中,是实现了数据闭环的。但是可能大家都没发现,这个案例中还预留了一个很大的问题:用esmini启动场景时主车没有动。更确切地说,用esmini启动openSCENARIO场景时,主车并没有按照init标签中定义的初始速度行驶。
这里不得不贴出来openSCENARIO场景文件内容:
可以看出来,主车设置驾驶员模型为“UDPDriverController”,而且初始速度为20m/s。但运行的结果是:以esmini运行该文件时,目标车正常行驶,但主车未动。
因此又简单做了几个测试。
测试1:
把主车的驾驶模型的设置删除(即ObjectController标签内的设置),再启动esmini,主车的行为又恢复正常。查阅官方文档,可知不定义驾驶员模型时模型其实它会默认使用DefaultDriver(此时不支持接受外部控制输入)。
测试2:
在以esmini启动openSCENARIO场景文件时,再打开一个终端尝试发送一个非常简单的UDPDriverController的“加速”控制指令,python脚本如下:
这时,主车动了,但是是以openSCENARIO场景文件中定义的初始速度20m/s为起点不断加速。
好了,通过上述测试,我们得出结论:主车用了UDPDriverController会导致初始行为<Init>失效,且需要给一个UDP指令让初始行为再度生效。
我为什么如此纠结这个初始行为的生效与否?
自动驾驶仿真测试场景一般都是大规模跑的,每个场景都需要有两个基本特性:
特性一:场景文件其实就是一个剧本,能按照初始预设的行为讲好一个悲情的故事,比如碰撞。这个剧本用esmini播放,其实只是把剧本搬上了荧幕。
特性二:剧本播放过程中,能随时接受外界的控制,进而控制演员们的行为,阻止悲剧的发生,比如,AEB激活,避免碰撞。
那么现在的问题是,特性一是不满足的,因为主车,也即主角都没有动。故事没法演了。
为了实现“一个场景既能被单独正常播放,也能在必要的时候被算法控制”的效果,倒腾了很久,也问了很多人,直到最后找到两位大神(唐唐和小强),三人一起撸源码,才成功解决问题。以下记录下操作过程。
步骤1、下载官方源码
以版本2.31.3为例:
https://github.com/esmini/esmini/releases/tag/v2.31.3
步骤2、在本地编译
操作过程见官方教程:
步骤3、修改源码如下所示。
其实只是把源码中对输入的驾驶员模式判断给注释掉了。这样就能使场景既能受DefaultDriver控制,也能受UDPDriverController控制。
另外为了防止车辆初速度生效后会越来越慢,需要把一个阻力参数取消,修改如下源码即可:
步骤4、重新编译下源码,重新运行前文的场景
发现车辆初速度恢复正常了。然后,如果接入AEB算法控制,发现也是可以控制的。
最后,说一下自己对官方“UDPDriverController”的理解吧,我觉得它是为了纯自动驾驶(ADS)而设计的驾驶员模型,用它的话,整个过程都需要用算法来进行车辆控制。想要在必要的时候才能接入算法的话(ADAS),可以参考下我上面这个做法。当然也可以有别的办法,毕竟esmini官方还支持好几种控制模型,甚至还支持用户自己开发的控制模型。诸位道友可以自行感悟。
本文完。
往期相关:
相关文章,在仿真秀官网搜索:
自动驾驶仿真|如何基于esmini做规控SIL测试
esmini中的目标有哪些类型
自动驾驶仿真|esmini中如何使用传感器
介绍一款开源的自动驾驶仿真场景播放器:esmini
更多精彩,欢迎持续关注。