掌桥专利:专业的专利平台
掌桥专利
首页

测试场景生成源码的编译器和测试场景生成系统

文献发布时间:2023-06-19 10:58:46


测试场景生成源码的编译器和测试场景生成系统

技术领域

本发明实施例涉及自动驾驶技术,尤其涉及一种测试场景生成源码的编译器和测试场景生成系统。

背景技术

随着自动驾驶的发展,对自动驾驶测试的需求呈指数级增长,因此基于模拟仿真的自动驾驶测试将取代数以万计的实际路面测试。

在进行自动驾驶仿真测试过程中,为了提高测试效率,出现了一些自动生成测试场景的源码,例如以可扩展标记语言(Extensible Markup Language,XML)为基础的OpenScenario 1.0。XML本身是以一个根结点的多叉树为表现形式的格式文件。多叉树这种数据结构,本身更加偏重数据的存储,如果用来描述动态测试场景,其格式文件本身的可读性较差,如果没有专用的场景文件编辑工具的话,文件很难被使用人员直接阅读和编辑。

基于上述现状,急需要开发一种便于编辑且可读性强的源码,以及对应的编译器。

发明内容

本发明实施例提供一种测试场景生成源码的编译器和测试场景生成系统,以采用便于编辑且可读性强的源码来生成测试场景,同时开发对应的编译器和系统。

第一方面,本发明实施例提供了一种测试场景生成源码的编译器,包括:集成开发环境、词法解析器、语法解析器和语义分析器;

所述集成开发环境用于获取用于生成测试场景的源码;

所述词法解析器用于对源码进行解析得到正规集;其中,所述正规集包括场景单词、参与者单词、被测路段单词、各行为单词、车辆之间的相对位置单词、行驶车道单词、初始/最终标记位单词、执行手段单词、数值单位单词、执行条件单词、执行顺序单词、参数类型单词、连接单词和符号单词;所述参与者包括本车和目标车;

所述语法解析器用于根据文法规则分析所述正规集,得到各类语句的语法单位;其中,所述语句的类别包括场景表达式、行为函数表达式、所述参与者的定义、参与者的场景级行为时序表达式;

所述语义分析器用于在所述语法单位的基础上增加属性文法,得到语义数据结构;其中,所述属性文法包括场景定义、函数定义、所述参与者的定义和行为定义;

其中,所述语义数据结构在执行时用于:读取路网文件,并根据所述路网文件的被测路段信息,读取被测路段;指定测试场景中的参与者,并加载所述参与者对应的模型;依次确定所述本车和目标车随时间迁移而执行的各行为的信息,所述各行为的信息包括在被测路段上的行为、车辆之间的相对位置信息、行驶车道信息、初始/最终标记位信息和执行手段信息;在所述被测路段上,控制所述参与者按照所述各行为的信息依次执行对应行为,生成测试场景。

第二方面,本发明实施例还提供了一种测试场景生成系统,包括:任一实施例所述的编译器和仿真器;

所述仿真器用于构建所述语义数据结构的行为树,所述行为树包括动作执行顺序、执行条件和参与者的行为;执行所述行为树得到仿真结果,并将所述仿真结果提供给渲染引擎进行渲染展示。

本发明实施例在执行源码经过编译后得到语义数据结构时,首先读取路网文件,并根据所述路网文件的被测路段信息,读取被测路段,自动加载静态场景;在此基础上,指定测试场景中的参与者,并加载对应的模型,实现参与者的加载;进一步的,依次确定参与者随时间迁移的在被测路段上的行为、车辆之间的相对位置信息、行驶车道信息、初始/最终标记位信息和执行手段信息,从而随着时间的迁移依次确定测试场景中各行为,进而在所述被测路段上,控制所述参与者按照所述各行为的信息依次执行对应行为,自动生成测试场景,无需人工参与,提高测试场景的生成效率和准确率。本发明实施例通过依次确定静态场景、参与者以及随时间迁移的行为,通过更抽象,更易读,更容易编辑的源码来生成测试场景,使得测试场景的生成过程便于编辑、可读性强。

进一步的,本发明实施例还提供了用于编译上述源码的编译器,通过集成开发环境获取源码,通过词法解析器对源码进行解析得到正规集,通过语法解析器根据文法规则分析正规集得到各类语句的语法单位,通过语义分析器在语法单位的基础上增加属性文法,得到语义数据结构,从而得到与上述源码适配的编译器,开发完整的测试场景生成流程。

附图说明

图1是本发明实施例提供的一种测试场景生成方法的流程图;

图2是本发明实施例提供的另一种测试场景生成方法的流程图;

图3是本发明实施例提供的本车前方两台目标车的切出行为的示意图;

图4是本发明实施例提供的本车两侧车道有目标车切入的示意图;

图5是本发明实施例提供的测试场景生成源码的编译器的结构示意图;

图6是本发明实施例提供的识别整型数字和浮点数字的状态转换图;

图7是本发明实施例提供的识别标识符的状态转换图;

图8是本发明实施例提供的并联有限自动机的示意图;

图9是本发明实施例提供的抽象语法树的结构示意图;

图10为本发明实施例提供的一种语义数据结构的示意图;

图11为本发明实施例提供的另一种语义数据结构的示意图;

图12是本发明实施例提供的另一种测试场景生成源码的编译器的结构示意图;

图13是本发明实施例提供的一种测试场景生成系统的结构示意图;

图14是本发明实施例提供的一种行为树的结构示意图。

具体实施方式

下面结合附图和实施例对本发明作进一步的详细说明。可以理解的是,此处所描述的具体实施例仅仅用于解释本发明,而非对本发明的限定。另外还需要说明的是,为了便于描述,附图中仅示出了与本发明相关的部分而非全部结构。

本发明实施例提供一种测试场景生成源码的编译器,该编译器对生成测试场景的源码进行编译得到仿真器可执行的语义数据结构。该语义数据结构在由仿真器执行时用于生成测试场景。为了便于描述编译器的结构和功能,首先描述基于该源码的测试场景生成方法,也就是语义数据结构在由仿真器执行时所实现的功能逻辑。

本发明实施例提供一种测试场景生成方法,其流程图如图1所示,可适用于在自动驾驶仿真测试应用场景中,搭建测试场景的情况。本实施例对自动驾驶行业应用软件进行改进,通过执行计算机程序优化了测试场景的搭建逻辑,以解决现有技术中存在的问题。该方法可以由测试场景生成装置来执行,该装置可以由软件和/或硬件构成,并一般集成在电子设备中,该电子设备为仿真器。结合图1,本实施例提供的方法具体包括:

S110、读取路网文件,并根据所述路网文件的被测路段信息,读取被测路段。

源码首先描述了路网文件以及其中的被测路段信息,被测路段信息包括被测路段的编号、长度和车道数量,从而在源码编译后再执行时,读取路网文件以及其中的被测路段。

其中,路网文件存储有多个路段,可指定其中一个路段的信息作为被测路段信息。以下示出了本步骤对应的源码以及注释。

set_map("D:\Line4six.xodr"")//地图设置函数表达式,指示了路网文件的存储位置。

path_length(path: p, min_path_length: 0meter, max_path_length:100meter)// 被测路段的长度设置函数表达式,指示了被测路段编号p和长度。

path_min_driving_lanes(p, 2)//车道数量设置函数表达式,指示了被测路段上的车道数量。

可选的,为了区分不同的测试场景,在地图设置函数表达式之前,还包括场景表达式,如下所示:

scenario cut_in//场景表达式,指示测试场景为切入场景。

S120、指定测试场景中的参与者,并加载所述参与者对应的模型;其中,所述参与者包括本车和目标车。以下示出了本步骤对应的源码和注释。

v1: car//第一目标车表达式

v2: car//第二目标车表达式

以上均为参与者(actor)表达式,代表了测试场景中的交通参与者,作为后面“action”表达式描述的动态和静态行为的载体。“actor”的类型可以由车辆,行人,杂项物体等。对于仿真器来说需要能够支持“actor”的数学模型和三维模型。具体的,这些参与者关联仿真器支持的数学模型和三维模型。

可选的,在S120之后还包括将默认的仿真器接口path提供给被测路段(编号p的路段),从而通过仿真器接口导入编号p的路段,便于后续确定各参与者的行为。源码示例如下:

p:path

S130、依次确定所述本车和目标车随时间迁移而执行的各行为的信息,所述各行为的信息包括在被测路段上的行为、车辆之间的相对位置信息、行驶车道信息、初始/最终标记位信息和执行手段信息。

可选的,读取所述本车和目标车随时间迁移而执行的各行为函数表达式,并确定各行为函数表达式指示的信息;所述行为函数表达式包括行为表达式、车辆之间的相对位置函数表达式、行驶车道函数表达式和执行手段函数表达式;

行为表达式指示所述被测路段信息;所述车辆之间的相对位置函数表达式指示车辆之间的相对位置信息,以及初始/最终标记位信息;行驶车道函数表达式指示行驶车道信息,以及初始/最终标记位信息;所述执行手段函数表达式指示执行手段信息,包括速度函数表达式、加速度函数表达式和车道中心偏移量函数表达式,分别指示速度信息、加速度信息和车道中心偏移量信息。也就是说,执行手段信息包括速度信息、加速度信息和车道中心偏移量信息。

需要解释的是,初始标记位信息指示参与者处于初始状态,最终标记位信息指示参与者处于最终状态。

在一应用场景中,本车、第一目标车和第二目标车均匀速行驶在被测路段上。可选的,依次确定所述本车和目标车随时间迁移而执行的各行为的信息,包括:确定所述本车在被测路段上的行为、初始行驶车道信息和速度信息;确定第一目标车在被测路段上的行为、速度信息、与所述本车的初始相对位置信息和初始行驶车道信息;确定第二目标车在被测路段上的行为、速度信息、与所述本车的初始相对位置信息和初始行驶车道信息。下面给出了本步骤对应的源码和注释。

(1)dut.car.drive(path: p)// 本车的行为表达式,指示了本车在被测路段p上的行驶行为。

lane(lane:2, at: start)// 行驶车道函数表达式,指示了本车初始行驶在车道2上。

speed(speed: [15..18]kph)// 速度函数表达式,指示了本车的行驶速度为15kph~18 kph中的任一值。

(2)v1.drive(path: p) with://第一目标车的行为表达式,指示了第一目标车在被测路段p上的行驶行为。

speed(speed: [30..50]kph)// 速度函数表达式,指示了第一目标车的行驶速度为30kph~50 kph中的任一值。

position(distance: [10..30]meter, behind: dut.car, at: start)// 车辆之间的相对位置函数表达式,指示了第一目标车初始位于本车的后面,且与本车的距离为10m~30m中的任一值。

lane(side_of: dut.car, side: left, at: start)// 行驶车道函数表达式,指示了第一目标车初始行驶的车道为本车左侧车道。

(3)v2.drive(path: p) with:// 第二目标车的行为表达式,指示了第二目标车在被测路段p上的行驶行为。

speed(speed: [70..75]kph)// 速度函数表达式,指示了第二目标车的行驶速度为70kph~75 kph中的任一值。

position(distance: [10..30]meter, behind: dut.car, at: start)// 车辆之间的相对位置函数表达式,指示了第二目标车初始位于本车的后面,且与本车的距离为10m~30m中的任一值。

lane(side_of: dut.car, side: right, at: start)// 行驶车道函数表达式,指示了第二目标车初始行驶的车道为本车右侧车道。

可选的,上述3段源码之间的执行顺序是并行的,对于每段源码内部的执行顺序是串行的。

在另一应用场景中,第一目标车切入到本车的前方。可选的,依次确定所述本车和目标车随时间迁移而执行的各行为的信息,包括:确定所述本车在被测路段上的行为;确定所述目标车在被测路段上的行为;确定所述目标车与本车的初始相对行驶车道信息、与所述本车的初始相对位置信息;确定所述目标车的速度信息;确定所述目标车与本车的最终相对行驶车道信息、与所述本车的最终相对位置信息。下面给出了本步骤对应的源码和注释。

(4)dut.car.drive(path: p)// 本车的行为表达式,指示了本车在被测路段p上的行驶行为。

(5)v1.drive(path: p) with:// 第一目标车的行为表达式,指示了第一目标车在被测路段p上的行驶行为。

l1: lane(side_of: dut.car, side: left, at: start)// 行驶车道函数表达式,指示了第一目标车初始行驶的车道为本车左侧车道。

p1: position(time: [0.5..1]second, ahead_of: dut.car, at: start)// 车辆之间的相对位置函数表达式,指示了第一目标车初始位于本车的后面行驶,且行驶的时长为0.5s~1s中的任一值。

speed(speed: [30..50]kph)// 速度函数表达式,指示了第一目标车的行驶速度为30kph~50 kph中的任一值。

l2: lane(same_as: dut.car, at: end)// 行驶车道函数表达式,指示了第一目标车最终行驶的车道与本车相同。

p2: position(time: [1.5..2]second, ahead_of: dut.car, at: end)// 车辆之间的相对位置函数表达式,指示了第一目标车最终位于本车的前面行驶,且行驶的时长为1.5s~2s中的任一值。

可选的,上述2段源码之间的执行顺序是并行的,对于每段源码内部的执行顺序是串行的。

在又一应用场景中,本车和目标车可以继续行进一段距离,可选的,依次确定所述本车和目标车随时间迁移而执行的各行为的信息,包括:确定所述本车在被测路段上的行为,确定目标车在被测路段上的行为和速度信息。面给出了本步骤对应的源码和注释。

(6)dut.car.drive(path: p)// 本车的行为表达式,指示了本车在被测路段p上的行驶行为。

(7)car1.drive(path: p) with:// 第一目标车的行为表达式,指示了第一目标车在被测路段p上的行驶行为。

speed(speed: 40kph)// 速度函数表达式,指示了第一目标车的行驶速度为40kph。

需要说明的是,上述2段源码之间的执行顺序是并行的,对于每段源码内部的执行顺序是串行的。

上述3个场景中的源码之间的执行顺序可以是串行的。上述3个应用场景中的任一应用场景或组合应用场景中的源码,均可以用于生成测试场景。

参见上述描述,通过顺次/并行执行各函数表达式,能够依次确定本车和目标车随时间迁移而执行的在被测路段上的行为、车辆之间的相对位置信息、行驶车道信息、初始/最终标记位信息和执行手段信息,从而确定了随时间演变的动态场景内容。

S140、在所述被测路段上,控制所述参与者按照所述各行为的信息依次执行对应行为,生成测试场景。

将上述静态场景和动态场景结合,并提供给仿真器。通过仿真器渲染被测路段、参与者,以及根据随时间迁移而执行的各行为的信息,逐帧渲染测试场景。

本发明实施例首先读取路网文件,并根据所述路网文件的被测路段信息,读取被测路段,自动加载静态场景;在此基础上,指定测试场景中的参与者,并加载对应的模型,实现参与者的加载;进一步的,依次确定参与者随时间迁移的在被测路段上的行为、车辆之间的相对位置信息、行驶车道信息、初始/最终标记位信息和执行手段信息,从而随着时间的迁移依次确定测试场景中各行为,进而在所述被测路段上,控制所述参与者按照所述各行为的信息依次执行对应行为,自动生成测试场景,无需人工参与,提高测试场景的生成效率和准确率。本发明实施例通过依次确定静态场景、参与者以及随时间迁移的行为,通过更抽象,更易读,更容易编辑的方式来描述测试场景,使得测试场景的生成过程便于编辑、可读性强。

需要强调的是,本实施例的执行依赖于上述源码的逻辑架构,具有以下优点:1)该源码架构使用类似python的高级程序设计语言的语法结构,非常易学并且易于掌握;2)该源码架构可读性好,可维护性强;3)该源码架构远离机器语言,更加侧重场景的动态元素和时间序列本身,即使没有编程经验的人员也可以轻易阅读和编辑。进而,在源码架构有如上创新的基础上,通过执行编译后的源码,使得测试场景的生成过程自动化、便于编辑、可读性强。

图2是本发明实施例提供的另一种测试场景生成方法的流程示意图,在上述各实施例的基础上对各行为的信息的确定过程进行细化,具体包括以下步骤:

S210、读取路网文件,并根据所述路网文件的被测路段信息,读取被测路段。

S220、指定测试场景中的参与者,并加载所述参与者对应的模型;其中,所述参与者包括本车和目标车。

S230、确定多个场景级行为的执行顺序和各场景级行为的执行条件。

场景级行为包括循线、切入、切出和超车中的至少一项;所述执行顺序包括串行执行顺序、并行执行顺序和混合执行顺序中的至少一项;所述执行条件包括执行时长、执行触发条件和执行结束条件中的至少一项。

其中,场景级行为是凌驾于参与者的行为之上的行为,通过本车和目标车的行为综合构成。一个测试场景包括至少一个场景级行为,一个场景级行为包括参与者的至少一个行为。可选的,混合执行顺序定义了一个行为需要在另一个行为发生前或者发生后多长时间内发生。执行触发条件和执行结束条件均可以是时间点或者车辆之间的设定位置关系。

示例性的,读取场景行为根表达式和场景级行为时序表达式,确定多个场景级行为的执行顺序和各场景级行为的执行条件。下面给出了本步骤对应的源码和注释。

do serial()://场景行为根表达式do和串行执行顺序表达式serial,指示了其内场景级行为(start_behind_dut、change_lane、go_on)串行执行。

start_behind_dut: parallel(duration: [1..5]second)://并行执行顺序表达式parallel,指示了其内行为(未示出)为并行执行,且执行时长为1s~5s中的任一值。

change_lane: parallel(duration: [2..3]second):// 并行执行顺序表达式parallel,指示了其内行为(未示出)为并行执行,且执行时长为2s~3s中的任一值。

go_on: parallel(duration: 5second):// 并行执行顺序表达式parallel,指示了其内行为(未示出)为并行执行,且执行时长为5s。

S240、在各场景级行为中,依次确定所述本车和目标车随时间迁移而执行的各行为的信息。

下面给出了生成测试场景的完整源码,并指出了各场景级行为的执行顺序,以及各场景级行为中本车和目标车的行为的执行顺序。

1. scenario cut_in:

2. set_map("D:\Line4six.xodr"")

3. path_length(path: p, min_path_length: 0meter, max_path_length:100meter)

4. path_min_driving_lanes(p, 2)

5. v1: car

6. v2: car

7. p: path

8. do serial()://场景行为根表达式do和串行执行顺序表达式serial,指示了其内场景级行为(start_behind_dut、change_lane、go_on)串行执行。

9.start_behind_dut: parallel(duration: [1..5]second)://场景级行为start_behind_dut下的并行执行表达式parallel,指示了其内行为(dut.car.drive、v1.drive、v2.drive)并行执行。

10. dut.car.drive(path: p)

11. lane(lane:2, at: start)

12. speed(speed: [15..18]kph)

13. v1.drive(path: p) with:

14. speed(speed: [30..50]kph)

15. position(distance: [10..30]meter, behind: dut.car, at:start)

16. lane(side_of: dut.car, side: left, at: start)

17. v2.drive(path: p) with:

18. speed(speed: [70..75]kph)

19. position(distance: [10..30]meter, behind: dut.car, at:start)

20. lane(side_of: dut.car, side: right, at: start)

21. change_lane: parallel(duration: [2..3]second)://场景级行为change_lane下的并行执行表达式parallel,指示了其内行为(dut.car.drive、v1.drive)并行执行。

22. dut.car.drive(path: p)

23. v1.drive(path: p) with:

24. l1: lane(side_of: dut.car, side: left, at: start)

25. p1: position(time: [0.5..1]second, ahead_of: dut.car, at:start)

26. speed(speed: [30..50]kph)

27. l2: lane(same_as: dut.car, at: end)

28. p2: position(time: [1.5..2]second, ahead_of: dut.car, at:end)

29. go_on: parallel(duration: 5second): //场景级行为go_on下的并行执行表达式parallel,指示了其内行为(dut.car.drive、v1.drive)并行执行。

30. dut.car.drive(path: p)

31. v1.drive(path: p) with:

32. speed(speed: 40kph)

上述源码还包括:函数参数表达式(包括带参数类型和无参数类型,如speed:[30..50]kph和path: p),函数参数值表达式(如[1.5..2]second),变量定义表达式(如5~7条源码)。

值得说明的是,行为函数表达式包括行为表达式和修饰符表达式(如23~28条源码),或者仅包括行为表达式(如22、30条源码)。修饰符表达式(如24~28条源码)描述了车辆之间的相对位置、行驶车道和执行手段,包括车辆之间的相对位置函数表达式、行驶车道函数表达式和执行手段函数表达式。修饰符表达式与行为表达式之间用连接单词with连接。

S250、在所述被测路段上,控制所述参与者按照各场景级行为的执行顺序和执行时长,执行对应的场景级行为。

S260、在执行对应的场景级行为时,控制所述参与者按照所述各行为的信息依次执行对应行为,生成测试场景。

下面结合上述8~32条源码,详细描述S250和S260。

在被测路段上串行执行开始行驶(start_behind_dut)、切入(change_lane)和继续行驶(go_on)这3个场景级行为。在执行start_behind_dut时,本车在被测路段p的车道2上行驶,行驶速度为15kph~18 kph中的任一值;同时,第一目标车在被测路段p的车道1(车道2的左侧车道)上,从本车后面10~30米中任一值处开始行驶,行驶速度为30kph~50 kph中的任一值;同时,第二目标车在被测路段p的车道3(车道2的右侧车道)上,从本车后面10~30米中任一值处开始行驶,行驶速度为70kph~75 kph中的任一值。本车、第一目标车和第二目标车的行驶时长相同,且均为1s~5s中的任一值。

start_behind_dut结束后开始执行change_lane,本车保持在被测路段p上行驶。同时,第一目标车开始位于本车的左侧车道(即车道1),然后行驶到本车前面并维持0.5s~1s的任一值,接着以30kph~50 kph中的任一速度值行驶,则第一目标车会超过本车一端距离。然后,第一目标车行驶到本车车道(即车道2)上,且位于本车前面并维持0.5s~1s的任一值。change_lane的执行时长为1s~5s中的任一值。

change_lane执行结束后,开始执行go_on,本车保持在被测路段p上行驶。同时,第一目标车以40kph的速度在被测路段p上行驶。本车与第一目标车的行驶时长为5s。

本实施例通过确定多个场景级行为的执行顺序和各场景级行为的执行条件,在各场景级行为中,依次确定所述本车和目标车随时间迁移而执行的各行为的信息,从而灵活设置各场景级行为的执行顺序和条件,方便测试场景的扩展,同时便于源码的阅读和编辑。

在上述实施例和下述实施例中,在所述读取路网文件,并根据所述路网文件的被测路段信息,读取被测路段之前,还包括:读取场景编号、场景描述和数值描述;解析所述场景编号得到道路类型、被测路段、本车行为、目标车类型、目标车位置以及目标车行为;解析所述场景描述得到静态环境信息;根据所述道路类型、被测路段、本车行为、目标车类型、目标车位置、目标车行为和静态环境信息,从代码库中选择字段,并合并字段和对应的数值描述得到源码;对所述源码进行编译,并执行编译后的目标代码。在执行编译后的目标代码的过程中,实现上述任一实施例提供的测试场景生成方法,例如,读取路网文件,并根据所述路网文件的被测路段信息,读取被测路段;指定测试场景中的参与者,并加载所述参与者对应的模型;其中,所述参与者包括本车和目标车;依次确定所述本车和目标车随时间迁移而执行的各行为的信息,所述各行为的信息包括在被测路段上的行为、车辆之间的相对位置信息、行驶车道信息、初始/最终标记位信息和执行手段信息;在所述被测路段上,控制所述参与者按照所述各行为的信息依次执行对应行为,生成测试场景。

可选的,场景编号的命名编号规范为X-X.XX-XX-X-XXX.X-XX-00,每位编号所代表含义依次为道路类型、被测路段、本车行为、目标车类型、目标车位置、目标车行为以及目标车行为补充。示例性的,命名规范如下所示:

1)道路类型:H-高速,K-快速路,C-城市道路,P-停车场。

2)被测路段:M-主路,R-匝道(R.IR匝道内,R.MR由主路进匝道,R.RM由匝道进主路),T-隧道(T.IT隧道内,T.MT由主路进隧道,T.TM由隧道进主路),S-服务区,F-收费站,P-干路直路,W-干路弯道,C-十字路口,I-环形交叉路口,O-立交桥,F-过街天桥,E-停车场出口,X-停车场入口,L-停车场场内,O-其它。

3)本车行为:LK-循线,LC-变道,SF-路口直行,TL-路口左转,TR-路口右转,RV-倒车,TA-掉头,PI.F-泊车入位(正向), PI.R-泊车入位(倒车),PO.F-驶离车位(正向),PO.R-驶离车位(倒车)。

4)目标车类型:V-四轮机动车,M-两轮机动车,B-非机动车自行车,P-行人,A-动物,T-物体 。

5)目标车位置:EP-本车道前车,EF-本车道后车,TD-目标车道前车,TG-目标车道后车,LP-左车道前车,RP-右车道前车,LF-左车道后车,RF-右车道后车,TDP-目标车道前车的前车,EPP-本车道前车的前车,LPP-左车道前车的前车,RPP-右车道前车的前车,TS-目标车道旁车,TNS-目标车道邻车位旁车 。

(尾缀:.S同向行驶,.O反向行驶,.H水平停车,.V竖直停车)

6)目标车行为:ST-静止,LK-循线,LC-变道,SF-路口直行,TL-左转,TR-右转,CO-穿行,RV-倒车,TA-掉头,AD-逆行,PI.F-泊车入位(正向), PI.R-泊车入位(倒车),PO.F-驶离车位(正向),PO.R-驶离车位(倒车),AM-上方行驶,MT-运动(只适用物体),FL-高空坠落(只适用物体)。

7)目标车行为补充01-99:是补充目标车行为的说明,为可选项。

示例性的,解析H-M-LK-V-EP.S-LK-01,得到高速、主路、循线、四轮机动车、本车道前车同向行驶、循线、匀速。

场景描述对道路类型,被测路段,本车类型,参与者类型、位置、行为,情境,测试功能等信息进行文字说明。可根据此部分描述,解析得到场景初始环境设置信息,即静态环境信息。

数值描述定义了参与者和静态环境的基本数据信息,如纵向初速度,横向初速度,加速度,参与者之间横向距离、纵向距离,偏置率,动作触发时间、动作持续时间、车道宽度、能见度、温度等数据信息。

数值描述采用标量数值和数值范围两种形式来表示参与者行为相关数据,例如,本车初始纵向速度Ve_x0:[50,120](km/h)、车头时距THW:5(s/Veh)等。

在选择代码库字段之前,需要预先建立上述解析结果与代码库字段的代码库,进而从代码库中选择与道路类型、被测路段、本车行为、目标车类型、目标车位置、目标车行为和静态环境信息对应的字段。下面示出了代码库的部分内容:

表1 参与者的类型与代码库字段的对应关系表

表2 目标车位置与代码库字段的对应关系表

代码库中定义了本车和目标车的基本信息和行为信息的数据结构体,还需要将数值描述对应合并至结构体的对应字段中。示例性的,结构体中需要合并数值描述的字段如下:

本车结构体包括字段:本车初始纵向速度Ve_x0(km/h)、本车横向速度Ve_y(m/s)、本车纵向加速度Ae_y(m/s2)、本车变道持续时间t(s)、本车纵轴线与本车道中心线偏置量ΔL1(m)、本车纵轴线与目车道中心线偏置量ΔL2(m)等。

目标车结构体包括字段:初始纵向速度Vo1_x0(km/h)、横向速度Vo1_y(m/s)、纵向加速度Ao1_y(m/s2)、初始纵向速度Vo2_x0(km/h)横向速度Vo2_y(km/h)、纵向加速度Ao2_y(m/s2)、与本车初始相对横向距离Dy0_o1(m)、与本车初始相对纵向距离Dx0_o1(m)、变道持续时间t1(s)、与本车车辆偏置率/人(非机动车)碰撞点(%)、与本车车辆偏置率/人(非机动车)碰撞点(%)、碰撞时间TTC(s)、车头时距THW(s/Veh)。

静态环境信息结构体包括字段:车道宽度Width(m)、纵向坡度Slope(°)、车道数量N(条)、 行驶车道n(左数第n条)、弯道半径R(m)、光照度(lux)、能见度(m)、湿度(%rh)、温度(°)、风力(级)、降雨量(mm)、积雪量(mm)。

在将数值描述对应合并至结构体的对应字段中之后,将各字段按照功能映射为不同的代码块;将各代码块合并得到最终的源码。

具体的,第一步:根据源码中静态环境构建标准,将静态环境信息对应的字段和数值描述映射到源码的静态场景部分,参见上述2~4条源码。

第二步:将参与者和被测路段对应的字段映射到源码的变量定义部分,参见上述5~7条源码。

第三步:在串行执行时序下嵌套本车和目标车行为的并行执行时序,并且并行执行时序包括执行时间,参见上述8、9、21和29条源码。

第四步:将本车对应的字段和数值描述映射到源码的本车部分。具体的,设置本车的初始化状态。当本车没有外接自动驾驶算法时,通常设置为匀速巡线运行方式,参见上述10~12条源码。

第五步:将目标车初始化状态时对应的字段和数值描述映射到源码的目标车部分。具体的,设置目标车的初始化状态,参见上述13~20条源码。

第六步:将本车/目标车初始化后对应的字段和数值描述映射到源码的本车/目标车部分。具体的,获取本车/目标车的行为对应的字段,并合并对应的行为参数,完成本车/目标车的行为设置,参见上述22~28条源码、30~32条源码。

第七步:将各代码块合并得到最终的源码。

可选的,本实施例还包括读取图片示例,如图3和图4所示。图片示例可以通过可视化的方式,对当前场景所描述的参与者行为进行直观展示。

本实施例可以根据场景编号、场景描述和数值描述这些可读性较强的信息,自动生成源码,无需编程,节省人工成本和时间。

图5是本发明实施例提供的测试场景生成源码的编译器的结构示意图,包括集成开发环境、词法解析器、语法解析器和语义分析器。

集成开发环境用于获取用于生成测试场景的源码。源码内容详见上述实施例的记载此处不再赘述。

可选的,集成开发环境包括相分离的视图层和业务层。词法解析器、语法解析器和语义分析器分别作为独立进程集成在所述集成开发环境的业务层。因此,集成开发环境将各个具体的业务模块集成进来,提供了一个抽象化的工具,更加便于场景开发人员的使用,提高了生产效率。

集成开发环境的视图层包括图形用户界面(Graphical User Interface,GUI),所述GUI使用跨平台图形用户界面应用程序开发框架(QT框架)编写,能够兼容linux和windows两种平台,针对不同的平台,只需要重新编译源码即可。

可选的,研发人员可以直接在集合开发环境的GUI上手动编写源码,也可以向集成开发环境输入场景编号、场景描述和数值描述,由集成开发环境读取场景编号、场景描述和数值描述;解析所述场景编号得到道路类型、被测路段、本车行为、目标车类型、目标车位置以及目标车行为;解析所述场景描述得到静态环境信息;根据所述道路类型、被测路段、本车行为、目标车类型、目标车位置、目标车行为和静态环境信息,从代码库中选择字段,并合并所述字段和对应的数值描述得到源码。具体详见上述实施例的记载,此处不再赘述。

综上,集成开发环境集成代码编写功能、分析功能、编译功能和源码自动生成功能。集成开发环境采用模型、视图、控制(MVC)框架实现,具有耦合度低、重用性好、可维护性高的特点。

词法解析器用于对源码进行解析得到正规集;其中,所述正规集包括场景单词、参与者单词、被测路段单词、各行为单词、车辆之间的相对位置单词、行驶车道单词、初始/最终标记位单词、执行手段单词、数值单位单词、执行条件单词、执行顺序单词、参数类型单词、连接单词和符号单词;所述参与者包括本车和目标车。结合表3,被测路段单词包括地图单词、被测路段长度单词、车道单词、被测路段编号单词、最短路段长度单词、最长路段长度单词。各行为单词包括场景行为根表达式单词、驾驶行为表达式单词、速度函数名单词、距离函数名单词、行驶车道函数名单词和车辆之间的相对位置函数名单词。车辆之间的相对位置单词包括behind、ahead_of、side_of、same_as和side。行驶车道单词包括车道编号单词。初始/最终标记位单词包括状态单词。执行手段单词包括速度单词、距离单词和时间单词。数值单位单词包括距离单位单词、时间单位单词和速度单位单词。执行条件单词包括执行时长单词。执行顺序单词包括串行执行顺序表达式单词、并行执行顺序表达式单词和混合执行顺序表达式单词(表3未示出)。参数类型单词包括车辆参数单词和路段参数单词。连接单词为with。符号单词包括标点符号、括号、整型数字、浮点数字和标识符等。

源码首先进入词法解析器,通过词法解析器将源码解析为一个个的单词序列,作为后续语法解析器的输入。

可选的,词法解析器具体用于:根据状态转换矩阵表,对源码进行解析得到设定单词序列;所述状态转换矩阵表通过合并所述源码各正规式的状态转换矩阵得到;所述正规式是对所述正规集的形式化描述。

具体的,源码中所有合法单词组成的集合就是正规集,词法解析器的目的就是将正规集中的单词符号都正确无误的解析出来。因此实现词法解析器的第一步就是定义源码的正规集,并为正规集中的所有单词符号分配种别编码与助记符号,最后使用源码的正规式来对正规集进行形式化的描述。表3示出了单词符号/正规式与助记符号的对照表。

表3 单词符号/正规式与助记符号的对照表

上面定义了源码的正规集,并且使用正规式对正规集进行了形式化的描述,接下来就是使用状态转换图来实现源码的正规式。将每一个正规式绘制出状态转换图,即每一个正规式的状态转换图用于识别此正规式描述的正规集。示例性的,图6是本发明实施例提供的识别整型数字和浮点数字的状态转换图,图7是本发明实施例提供的识别标识符的状态转换图。

绘制出每一个正规式的状态转换图后,使用有限自动机对状态转换图进行形式化的描述。这个有限自动机所识别的字符的集合和状态转换图对应的正规式所描述的正规集是等价的。表4示出了识别整型数字和浮点数字的有限自动机,表5示出了识别标识符的有限自动机。

表4 识别整型数字和浮点数字的有限自动机

其中,START表示开始状态,INDENTIFY表示识别状态,INDENTIFY_FLOAT_OR_RANGE表示识别浮点或范围状态

表5 识别标识符的有限自动机

有限自动机是对状态转换图的形式化描述,但是在对其进行程序编码前,还需要将其转换为更加直观的状态转换矩阵,参见表6和表7。

表6 识别整型数字和浮点数字的状态转换矩阵

表7 识别标识符的状态转换矩阵

基于上述整型数字、浮点数字和标识符的识别示例,可以实现每一个正规式的有限自动机和其状态转换矩阵,将所有的有限自动机并行连接在一起,并合并所有的状态转换矩阵。图8是本发明实施例提供的并联有限自动机的示意图,表7示出了识别整型数字、浮点数字和标识符的状态转换矩阵。矩阵的行标表示状态,列标表示字符,中间的数字表示跳转到的状态。

表8 识别整型数字、浮点数字和标识符的状态转换矩阵表

这样在词法解析器初始化的时候,首先读取状态转换矩阵表,后面解析过程中,将当前状态和当前输入字符输入这张表即可查询下一个状态(即表中的数字,代表状态编号),遇到可接收状态即表示识别到了特定的单词符号。

在通过词法解析器得到正规集后,语法解析器用于根据文法规则分析所述正规集,得到各类语句的语法单位;其中,所述语句的类别包括场景表达式、行为函数表达式、所述参与者的定义、参与者的场景级行为时序表达式。其中,行为函数表达式包括行为表达式修饰符表达式,具体详见上述实施例的记载,此处不再赘述。

文法规则采用上下文无关文法进行形式化描述,并使用巴克斯范式来定义所述上下文无关文法;其中,所述文法规则包括场景表达式、地图设置函数表达式、被测路段的长度设置函数表达式、车道数量设置函数表达式、函数参数表达式、函数参数值表达式、变量定义表达式、场景行为根表达式、场景级行为时序表达式、行为函数表达式和修饰符表达式。

下面是源码的部分文法描述规则,其中小写字母字符串为非终结符,大写字母字符串为终结符。

1)场景表达式

stmt_scenario_name:

SCENARIO IDENTIFIER COLON

2)地图设置函数表达式

stmt_function_set_map:

FUNCTION_SET_MAP LEFT_PARENT function_parameter_without_typeRIGHT_PARENT

3)被测路段的长度设置函数表达式

stmt_function_path_length:

FUNCTION_PATH_LENGTH LEFT_PARENT function_parameter_with_typeRIGHT_PARENT

4)车道数量设置函数表达式

stmt_function_path_min_driving_lanes:

FUNCTION_PATH_MIN_DRIVING_LANES LEFT_PARENT function_parameter_without_type RIGHT_PARENT

5)函数参数表达式(无参数类型)

function_parameter_without_type:

IDENTIFIER

| function_parameter_without_type COMMA IDENTIFIER |

6)函数参数表达式(带参数类型)

function_parameter_with_type:

PARAM_TYPE function_parameter_value

|function_parameter_with_type COMMA PARAM_TYPE function_parameter_value

7)函数参数值表达式

function_parameter_value:

IDENTIFIER

| IDENTIFIER UNIT

| LEFT_BRACKET IDENTIFIER RANGE IDENTIFIER RIGHT_BRACKET

| LEFT_BRACKET IDENTIFIER RANGE IDENTIFIER RIGHT_BRACKET UNIT

8)变量定义表达式

stmt_variable:

IDENTIFIER COLON DATATYPE

9)场景行为根表达式

stmt_root_temporal:

DO COLON

| DO SERIAL LEFT_PARENT RIGHT_PARENT COLON

| DO PARALLEL LEFT_PARENT RIGHT_PARENT COLON

10)场景级行为时序表达式

stmt_child_temporal:

IDENTIFIER COLON PARALLEL LEFT_PARENT function_parameter_with_type RIGHT_PARENT COLON

| IDENTIFIER COLON SERIAL LEFT_PARENT function_parameter_with_type RIGHT_PARENT COLON

11)参与者的行为函数表达式(无修饰符表达式)

stmt_drive_without_modifier:

IDENTIFIER DOT DRIVE LEFT_PARENT function_parameter_with_typeRIGHT_PARENT

12)参与者的行为函数表达式(带修饰符表达式)

stmt_drive_with_modifier:

IDENTIFIER DOT DRIVE LEFT_PARENT function_parameter_with_typeRIGHT_PARENT WITH

13)修饰符表达式

stmt_modifier:

IDENTIFIER COLON MODIFIER LEFT_PARENT function_parameter_with_type RIGHT_PARENT

| MODIFIER LEFT_PARENT function_parameter_with_type RIGHT_PARENT

可选的,所述语法解析器具体用于通过递归下降分析器调用各子程序,对所述正规集进行识别、匹配和推导得到各类语句的语法单位;各所述子程序是根据文法规则对各语法单位分别构造的。

在构造语法解析器时,对每一个语法单位构造相应的子程序来对语法单位进行识别,匹配和推导。由于文法定义中包含递归结构,需要构造递归下降分析器,通过子程序间的相互调用实现对各类语句的识别。递归下降分析器根据巴克斯范式将每一条语句解析为一种特殊的数据结构,即抽象语法树,从而实现源码语法的解析,如图9所示。可选的,有了这种数据结构,编译器就可以进入下一步操作,将源码的语义映射为其它格式的文件。

语义分析器用于在所述语法单位的基础上增加属性文法,得到语义数据结构;其中,所述属性文法包括场景定义、函数定义、所述参与者的定义和行为定义。

在语法解析器执行后,源码的每一个语法单位已经被解析出来,接下来需要通过语义分析器在上下文无关文法的基础上增加属性文法,也就是加入源码本身对测试场景描述的语义。

根据语义分析,场景级行为时序分为串行、并行和混合时序,并且参与者的行为都是在此时序下构建。因此使用多叉树来构建整个测试场景的数据结构,并且在树中的结点加入相关的属性。以此多叉树作为下一步目标文件生成的基础。图10为本发明实施例提供的一种语义数据结构的示意图;图11为本发明实施例提供的另一种语义数据结构的示意图。

可选的,如图12所示,编译器还包括目标格式映射模块和目标格式生成模块,这两个模块也可以集成在集成开发环境中。其中,目标格式映射模块用于将所述语义数据结构映射为目标格式数据;目标格式生成模块用于将所述目标格式数据写入目标文件。本实施例通过目标格式映射模块和目标格式生成模块将语义数据结构映射为与仿真器适配的文件格式,便于仿真器直接生成测试场景。

在上述实施例中,词法解析器、语法解析器和语义分析器部署于所述编译器的前端,所述目标格式映射模块和目标格式生成模块部署于所述编译器的后端。在不改变前端的情况下,替换不同的后端就可以将源码转换为不同的格式,以适应不同的仿真器需要。

本发明实施例在执行源码经过编译后得到语义数据结构时,首先读取路网文件,并根据所述路网文件的被测路段信息,读取被测路段,自动加载静态场景;在此基础上,指定测试场景中的参与者,并加载对应的模型,实现参与者的加载;进一步的,依次确定参与者随时间迁移的在被测路段上的行为、车辆之间的相对位置信息、行驶车道信息、初始/最终标记位信息和执行手段信息,从而随着时间的迁移依次确定测试场景中各行为,进而在所述被测路段上,控制所述参与者按照所述各行为的信息依次执行对应行为,自动生成测试场景,无需人工参与,提高测试场景的生成效率和准确率。本发明实施例通过依次确定静态场景、参与者以及随时间迁移的行为,通过更抽象,更易读,更容易编辑的源码来生成测试场景,使得测试场景的生成过程便于编辑、可读性强。

进一步的,本发明实施例还提供了用于编译上述源码的编译器,通过集成开发环境获取源码,通过词法解析器对源码进行解析得到正规集,通过语法解析器根据文法规则分析正规集得到各类语句的语法单位,通过语义分析器在语法单位的基础上增加属性文法,得到语义数据结构,从而得到与上述源码适配的编译器,开发完整的测试场景生成流程。

图13是本发明实施例提供的一种测试场景生成系统的结构示意图,包括编译器和仿真器。对编译器的描述详见上述各实施例的记载,此处不再赘述。

仿真器用于构建所述语义数据结构的行为树,所述行为树包括动作执行顺序、执行条件和参与者的行为;执行所述行为树,得到仿真结果,并将所述仿真结果提供给渲染引擎进行渲染展示。

源码的主体是用来描述参与者的行为,其中包含场景级行为的执行顺序和执行条件等,因此需要仿真器构建一个简单可扩展的执行逻辑框架——行为树。构建行为树后,仿真器就可以按一定的仿真频率自上而下、自左向右的依次执行行为树上行为的执行顺序、执行条件和参与者的行为,并将仿真结果输出给渲染引擎进行三维展示。行为树的主要优势就是其更好的封装性和模块性,让测试场景的生成逻辑更加直观。

图14是本发明实施例提供的一种行为树的结构示意图。结合图14,行为树包括根结点(用矩形表示)、并行结点(用矩形表示)、串行结点(用圆形表示)和叶子结点(用椭圆形表示);其中,所述根结点为场景语言结点;所述并行结点包括故事结点、行为启动条件相关结点、动作结束条件相关结点、动作相关结点;所述串行结点包括行为组结点和事件结点;所述叶子结点包括时间条件结点、天气行为结点、更新所有场景数据结点、行为启动条件结点、动作结束条件结点、事件启动条件结点和行为结点。

其中,行为启动条件相关结点包括:行为启动条件结点和条件组结点。动作结束条件相关结点包括:动作+结束条件组结点、动作结束条件组结点。动作相关结点包括:动作集合结点、动作组结点、动作结点、事件启动条件结点、行为集合结点和条件组结点。

并行结点的子结点为并行执行关系,如果并行结点的并行策略是全部(ALL),参见图14,则其下的子结点均要并行执行成功才返回成功;如果并行结点的并行策略是则一(one),则其下有一个子结点执行成功即返回成功。串行结点下的子结点从左向右依次执行,只要遇到一个结点执行失败则不再执行右侧的结点,只有所有子结点均执行成功才返回成功。叶子结点指示了行为树最终要执行的操作,一种作为判断条件(condition)来执行,一种作为车辆行为(Action)来执行。参见图14,带省略号的结点说明可以有无限多个兄弟结点并列存在。

可选的,行为树还包括文字颜色说明结点(未示出),黑色文字代表与系统(Operating System,OS)文件的标签对应,白色文字代表此结点为构造行为树的必要附加节点,在OS文件里无对应标签。具体的,图14中,动作+结束条件组结点、动作集合结点和行为集合结点是行为树的必要附加节点,其它结点与系统文件的标签对应。

注意,上述仅为本发明的较佳实施例及所运用技术原理。本领域技术人员会理解,本发明不限于这里所述的特定实施例,对本领域技术人员来说能够进行各种明显的变化、重新调整和替代而不会脱离本发明的保护范围。因此,虽然通过以上实施例对本发明进行了较为详细的说明,但是本发明不仅仅限于以上实施例,在不脱离本发明构思的情况下,还可以包括更多其他等效实施例,而本发明的范围由所附的权利要求范围决定。

相关技术
  • 测试场景生成源码的编译器和测试场景生成系统
  • 一种自动驾驶仿真测试场景的生成方法及生成系统
技术分类

06120112759026