如何使用驾驶场景应用程序在Matlab中创建场景

335 阅读9分钟

如何使用驾驶场景应用程序在Matlab中创建场景

驾驶场景设计器的应用是用来设计合成驾驶场景的。这些场景是用来测试自动驾驶系统的。该工具主要应用于开发自动驾驶汽车,因为人们可以用这个工具箱创建所有的场景。

这些应用包括创建道路并向其中添加演员。道路上的移动部分就是演员。你可以使用拖放的界面来添加场景。

此外,你可以为你的小我汽车添加雷达和传感器。小我车是你在考虑周围因素的情况下试图自动驾驶的汽车。这些传感器可以生成线路边界,并将你的车保持在边界内。

在本教程中,我们将看到如何使用这个应用程序来创建场景。我们将直接从工具箱和从命令窗口以编程方式创建场景。所有这两种不同的场景创建都需要这个工具箱。

先决条件

要跟上本教程,你将需要

  • 安装[MATLAB]。
  • 正确理解[MATLAB]的基础知识。

驾驶场景

为什么是这个应用?

如果你想测试传感器的算法,传统上,你必须通过驾驶汽车在不同的环境中收集测试数据。然后你会把这些数据带入Matlab进行分析。

收集数据的整个过程很耗时,需要更多的精力。这个设计师的应用程序让你更快地测试你的算法。你可以创建场景来收集数据,而不是开车到处去收集测试数据。

在设计器应用程序中创建的场景可以包含道路的所有可能成分。例如,它可能包括路标、行人、车道边界和车辆。此外,你还可以虚拟设置场景并模拟传感器检测。

然后,这些变量被导出到Matlab,以测试你的传感器算法。

让我们走过这个应用程序,看看它是如何工作的。

首先,这个应用程序在Matlab的应用程序部分。你可以通过两种方法找到它。

方法1:点击Matlab窗口顶部的App部分。

Apps

  • 点击下拉箭头,定位到汽车部分。
  • 在汽车部分,选择Driving Scenario App

Driving scenario app

  • 双击该应用程序以打开它。

方法2:或者,你可以在命令窗口中执行drivingScenarioDesigner 命令。这个命令会自动打开该应用程序。当你打开该应用程序时,显示将如下图所示。

App window

你可以在驾驶场景应用程序中添加道路和可移动的物体,称为演员。有不同类型的演员,但一个演员的选择取决于你想做什么。演员有诸如汽车、卡车、自行车和障碍物等。

该应用程序被分为三个部分。这三部分是

  1. 演员/道路
  2. 情景画布,和
  3. 以自我为中心的视图。

演员/道路部分显示道路的属性或你所添加的演员。我们使用场景画布来添加我们的场景。它充当了应用程序的工作空间。

Egocentric部分是你的场景作为现实出现的地方。这个部分使它们以更实际的形式出现。

在场景画布上添加场景

我们将首先在我们的场景画布上添加一条道路。要添加一条道路,请点击应用程序顶部栏的add road 。然后,将光标移到场景画布上。

点击起点,即第二个点,做出你想要的形状,然后点击enter 。下面的图片中显示了一个例子。

Adding roads

当你点击进入时,你就有了。

The road

添加道路后,在道路/演员部分给出道路描述。例如,我们的道路有四个中心,宽度为六米。中心是创建道路时的端点数量。

我们还可以向我们的道路添加演员。我们要添加的角色是车辆/汽车。要添加汽车,你必须指定你的自我汽车。一辆小我汽车是由自动驾驶系统控制的汽车。

你添加到场景画布中的第一辆车默认为小我车。之后你可以改成你想要的任何演员。

要在场景画布中添加汽车,请点击actors ,然后选择你喜欢的演员。之后,你把光标开到你想在路上的位置。

Adding cars

由于这些是自动驾驶汽车,你必须创建一个way point 。一个航点是汽车将遵循的特定车道。当创建一个场景并涉及一个演员时,如果不添加一个航点,你就不能运行这个程序。

在添加航点时,每辆汽车都有其航点。右键单击你要添加航点的汽车/卡车,选择add way point 。它将创建一个光标,使你能够创建这个航点。

在这之后,你可以运行模拟程序,看看它是如何工作的。我们可以看到程序按照我们的意愿运行。

Running program

这个程序允许你为你的模拟添加任何你需要的属性。另外,你也可以通过编程添加这些属性。

以编程方式添加情景

案例场景

假设你想添加一个两辆车相距十米的场景。你可以指定车辆的速度。这些车可以以恒定的速度或不同的速度移动,这取决于你希望它们是怎样的。

在这种情况下,第一辆车将以4米/秒的速度移动,另一辆以7米/秒的速度移动。

driving = drivingScenario;
veh = vehicle(driving,'ClassID',1','Position',[3 0 0],'Velocity',[-4 0 0],'Yaw',90)

上面的代码添加了你的第一个演员。变量driving ,初始化这个工具箱。接下来,我们使用vehicle() 函数来向你的场景中添加车辆。这个函数接收初始化工具箱的变量scenario,position,velocityyaw

Yaw 是围绕一个轴的摆动。现在,如果你看一下速度,它是负的。这是因为假设运动是沿着Y轴进行的。从原点出发,y轴的值总是负的。

当你执行上面的代码时,你应该得到以下结果。

veh =

  Vehicle with properties:

               ActorID: 1
               ClassID: 1
              Position: [3 0 0]
              Velocity: [-3 0 0]
                   Yaw: 180
                 Pitch: 0
                  Roll: 0
       AngularVelocity: [0 0 0]
                Length: 4.7000
                 Width: 1.8000
                Height: 1.4000
            RCSPattern: [2×2 double]
      RCSAzimuthAngles: [-180 180]
    RCSElevationAngles: [-90 90]
         FrontOverhang: 0.9000
          RearOverhang: 1
             Wheelbase: 2.8000

你可以用下面的代码添加第二辆车。

veh2 = vehicle(scenario,'ClassID',1,'Position',[0 08 0],'Velocity',[0 -7 0],'Yaw',-180)

输出结果将是。

veh2 =

  Vehicle with properties:

               ActorID: 2
               ClassID: 1
              Position: [0 10 0]
              Velocity: [0 -7 0]
                   Yaw: -180
                 Pitch: 0
                  Roll: 0
       AngularVelocity: [0 0 0]
                Length: 4.7000
                 Width: 1.8000
                Height: 1.4000
            RCSPattern: [2×2 double]
      RCSAzimuthAngles: [-90 90]
    RCSElevationAngles: [-180 180]
         FrontOverhang: 0.9000
          RearOverhang: 1
             Wheelbase: 2.8000

为了使我们所创建的场景可视化,我们使用plot() ,如下图所示。

plot(driving);
set(gcf,'Name','Scenario Plot')
xlim([-15 15]);
ylim([-15 15]);

set() 函数为你的场景设置属性。gcf 返回当前图形的句柄,因为这个执行是在命令窗口中进行的。这里的输出是。

Output of the program

我们可以使用chasePlot 来相对放置车辆。你可以使用chasePlot ,创建一个相对的车辆放置。这个情节使你的模拟的自我中心视图。

追逐情节默认显示的是投影透视图。例如,让我们使用chasePlot 函数显示第二辆车的透视图。

chasePlot(v2)
set(gcf,'Name','Chase Plot')

输出如下图所示。

Chase plot

这个输出显示的是离第二辆车有一定距离时的透视情况。从图中看,两辆车之间的距离是10m ,中间有6m

同时包含小我私家车和道路的模拟

在添加道路时,你必须指定道路中心和岸角。岸角是车辆的转弯点,它在这一点上是倾斜的。

当你绘制这些道路中心和岸角时,你会得到道路的边界。为了做到这一点,我们执行下面的代码。

driving = drivingScenario;
Centres = ...
    [  0  40  49  50 100  50  49 40 -40 -49 -50 -100  -50  -49  -40    0
     -50 -50 -50 -50   0  50  50 50  50  50  50    0  -50  -50  -50  -50]';

bankAngles = [3   7   6   9   3  3   8  0   0   4   4    9    6    9    0    0];
road(driving, Centers, bankAngles, 'lanes', lanespec(2));
plot(driving);

road() 函数被用来绘制道路。这个函数将你的方案、岸角和道路中心作为参数。运行这个程序,我们得到以下输出。

Road plot

让我们使用vehicle() 函数添加我们的小我汽车,并将其位置作为参数。

egoCar = vehicle(driving,'ClassID',1,'Position',[80 -40 0.45],'Yaw',30);

带有小我汽车的输出图如下所示。

Ego vehicle added

为我们的演员添加轨迹

正如我们之前所说,我们必须为我们的车辆提供移动的轨迹。我们添加第二辆演员车;这两辆车都被赋予了一个轨迹。为了添加我们的第二辆车,fastCar ,你使用下面的代码。

chasePlot(egoCar);
fastCar = vehicle(scenario,'ClassID',1);

在给出轨迹时,我们指定汽车的直径、道路的偏移量和左右的途径点。偏移线是指与主测量线的短距离。

diameter = 2.9/2;
Offset = [ 0  0  0  0  d  0  0  0  0  0  0 -d  0  0  0  0
              -d -d -d -d  0  d  d  d  d  d  d  0 -d -d -d -d]';

rightWayPoints = Centers + Offset;
leftWayPoints = Centers - Offset;

然后,我们使用repmat() 函数循环计算左右途径点。为了做一个以自我为中心的模拟图,我们使用smoothTrajectory() 函数。

% We loop around the track upto four times.
rightWayPoints = [repmat(rightWayPoints(1:end-1,:),5,1); rightWayPoints(1,:)];
leftWayPoints = [repmat(leftWayPoints(1:end-1,:),5,1); leftWayPoints(1,:)];

smoothTrajectory(egoCar,rWayPoints(:,:), 30);
smoothTrajectory(fastCar,lWayPoints(:,:), 50);

在这里,我们得到。

Figure 1

Figure 2

结论

自动驾驶系统的模拟通过驾驶场景应用程序变得更加容易。你可以使用这个应用程序创建不同的场景。然后,这个工具箱的数据可以导出,并用于改进各种自动驾驶系统的算法。这使它成为一个广泛使用的工具箱。