基于MATLAB&SIMULINK开发自动驾驶系统第二十讲程序化创建自动驾驶场景
本讲展示了如何以编程方式创建使用驾驶场景设计器应用程序构建的驾驶场景。通过编程创建场景的不同变体,可以在多种条件下快速测试自动驾驶算法。
要创建驾驶场景的程序化变体,请遵循以下步骤:
1 通过使用驾驶场景设计器应用程序交互式地构建驾驶场景;
2 导出一个MATLAB函数,生成与该场景对应的MATLAB代码;
3 在 MATLAB 编辑器中,修改导出的函数以创建原始场景的变体;
4 调用该函数生成一个代表该场景的drivingScenario对象;
5 将场景对象导入到应用程序中,以仿真修改后的场景或生成其他场景。另外,要在Simulink中仿真修改后的场景,可通过使用Scenario Reader块将对象导入Simulink模型中。
该图是该工作流程的直观表示
20.1在应用程序中构建场景
使用 "驾驶场景设计器 "交互式地建立一个驾驶场景,在此场景中测试的算法。有关构建场景的应用,请关注收藏智驾社公众号。
本讲使用的驾驶场景是基于可以从驾驶场景设计器应用程序中加载的预建场景之一。
在应用程序中打开场景文件。
drivingScenarioDesigner('LeftTurnScenarioNoSensors.mat')
点击 "运行 "来仿真这个场景。在这个场景中,被控车辆向北行驶,直行通过一个十字路口。同时,从十字路口左侧驶来的车辆向左转弯并驶入被控车辆所处车道的相邻车道,处于被控车辆的前方。
为简单起见,本方案不包括安装在被控车辆上的传感器。
20.2导出场景的MATLAB函数
查看并仿真场景后,可以将场景导出到 MATLAB 命令行。从 "驾驶场景设计器 "应用程序工具栏中,选择 "导出">"导出 MATLAB 函数"。导出的函数包含用于生成在应用程序中创建的场景的 MATLAB 代码。打开导出的函数:
open LeftTurnScenarioNoSensors.m
调用这个函数会返回驾驶场景的如下方面:
- scenario--场景中的道路和执行器,以drivingScenario对象的形式返回。
- egoVehicle--场景中定义的被控车辆,以Vehicle对象返回。详见Vehicle函数。
如果场景中包含传感器,那么返回的函数中包含了用于生成传感器的额外代码。如果仿真了包含这些传感器的场景,那么该函数也可以生成这些传感器产生的探测信息。
20.3 修改功能以创建场景变量
通过修改导出的MATLAB函数中的代码, 可以生成单一场景的多种变体。一个常见的变体是以不同的速度测试被控车辆。在导出的MATLAB函数中,将被控车辆的速度设置为每秒10米的恒定值(速度=10)。要生成不同的被控车辆速度,可以将速度变量转换为函数的输入参数。打开包含导出函数修改版的脚本
open LeftTurnScenarioNoSensorsModified.m
在这个修改后的函数中:
- egoSpeed作为一个输入参数被包含在内。
- 速度这个常量变量被删除。
- 为了计算被控车辆的跟踪,用egoSpeed代替了speed。
这张图显示了这些脚本的修改:
要产生额外的变化,可以考虑:
- 修改道路和车道参数,查看对车道探测的影响。
- 修改车辆的跟踪或起始位置。
- 修改车辆的尺寸
20.4 生成程序化场景的调用功能
利用修改后的函数,生成被控车辆以每秒20米的恒定速度行驶的变型场景:
scenario =LeftTurnScenarioNoSensorsModified(20) % m/s
scenario =drivingScenario with properties:
SampleTime: 0.0400
StopTime: Inf
SimulationTime: 0
IsRunning: 1
Actors: [1x2 driving.scenario.Vehicle]
20.5 将修改后的场景导入到应用程序中
要将修改后的场景与修改后的车辆导入到应用程序中,请使用drivingScenarioDesigner函数。指定drivingScenario对象作为输入参数:
drivingScenarioDesigner(scenario)
以前,其他车辆先通过路口。现在,随着被控车辆的速度从每秒10米提高到20米,被控车辆先通过路口。
在应用中处理驾驶场景对象时,请记住这几点:
- 要尝试不同的被控车辆速度,请再次调用导出的函数,然后使用drivingScenarioDesigner函数导入新的drivingScenario对象。该应用不包含导入这些对象的菜单选项。
- 如果的场景包括传感器, 可以通过使用以下语法重新打开场景和传感器:drivingScenarioDesigner(scenario,sensors)。
- 如果对执行器的尺寸进行了重大更改,请确保执行器的ClassID属性与应用中指定的Class ID值相对应。例如,在应用程序中,汽车的Class ID为1,卡车的Class ID为2,如果 在程序上将汽车改为 有卡车的尺寸,更新该车辆的ClassID属性,从1(汽车)到2。(卡车)。
20.6将修改后的场景导入到Simulink中
要将修改后的场景导入Simulink模型,请使用Scenario Reader块。该块从应用程序中保存的场景文件或保存到 MATLAB 工作区或模型工作区的drivingScenario 变量中读取道路和执行器。将Scenario Reader块添加到的模型中,并设置这些参数:
1 将驾驶场景的来源设置为来自工作区。
2 将MATLAB或模型工作区变量名称设置为drivingScenario工作区中的变量名称。
在Simulink中使用drivingScenario对象时,请记住以下几点。
- 当将Source of ego vehicle设置为Scenario时,模型将使用在的drivingScenario对象。该区块根据被控车辆的指定的actorID属性。这个actor必须是一个Vehicle对象(见车辆)。要改变指定的被控车辆,更新被控车辆ActorID参数。
- 当将输出的执行器姿势连接到传感器块时,更新这些块以直接从驾驶场景对象中获取执行器配置文件。默认情况下,这些块使用同一组的所有执行器的配置文件,其中配置文件在块的执行器配置文件选项卡上定义。要从对象中获取配置文件,在每个传感器块的 "执行器配置文件 "选项卡上,设置 "选择"方法将执行器配置文件参数指定为MATLAB表达式。然后,将actor profiles参数的MATLAB表达式设置为调用对象上的actorProfiles函数。例如:actorProfiles(scenario)。