循环驾驶

在本教程中,我们将使用 netedit 构建一个简单的环形路网,并使用重定向器 (rerouters) 让车辆循环行驶。所有定义文件都可以在 ***<SUMO_HOME>***/docs/tutorial/circles 目录中找到。

本教程可以仅使用 netedit 完成,也可以通过自己编写 XML 文件来生成需求数据。下文将对这两种方法进行说明。

使用 XML 文件的步骤#

构建路网#

不建议使用 XML 文件构建路网,因此我们将在此步骤中使用 netedit。首先打开 netedit 并创建边以形成闭合环路。为此,按 Ctrl + N 创建新路网,然后按 e 进入边编辑模式。现在创建一个闭合的边环路(你可以考虑在编辑模式选择框右侧勾选“链式 (chain)”,见图)。

结果应或多或少如图所示。重要的是环形形状。现在将路网保存到某处(Ctrl + Shift + S),放在一个空目录中(我们将该位置称为 baseDir)。使用 circles.net.xml 作为创建的路网文件名。

创建车辆并运行 SUMO#

baseDir 中创建两个空文本文件,分别命名为 circles.rou.xmlcircles.sumocfg。这些文件将定义我们的车辆和运行配置。

首先,我们编辑 circles.rou.xml 并定义一个包含五辆标准乘用车的车辆流。文件内容应如下所示:

<routes>
   <vType id="car" type="passenger" length="5" accel="3.5" decel="2.2" sigma="1.0"/>
   <flow id="carflow" type="car" beg="0" end="0" number="5"/>
</routes>

有关如何定义流 (flow) 和车辆类型 (vType) 的进一步说明,请参阅相关文档页面:流定义车辆类型

要将路线文件和生成的路网文件与 SUMO 一起使用,我们需要编辑配置文件 circles.sumocfg,以告诉 SUMO 在哪里查找车辆和路网定义:

<configuration>
    <input>
       <net-file value="circles.net.xml"/>
       <route-files value="circles.rou.xml"/>
    </input>
</configuration>

现在让我们尝试使用刚刚创建的配置启动 sumo。为此,要么双击配置文件 circles.sumocfg(在 Windows 下,如果安装使用默认设置),要么在终端中切换到 baseDir 并在那里输入 sumo -c circles.sumocfg 来启动 sumo(带图形用户界面)。(如果这无法启动 sumo,你可能需要将 SUMO/bin 目录添加到你的 PATH 中,或者设置环境变量 SUMO_HOME (方法))。

第一次尝试运行模拟

第一次尝试运行模拟

成功了吗?没有。

让我们看看 GUI 底部的消息窗口(见上图),以查明出了什么问题(顺便说一句:消息窗口通常是设置模拟时非常有用的信息来源,如果遇到问题,请先查看它)。

它显示:Error: The route for flow 'carflow' has no edges. 这意味着 SUMO 不知道我们在 circles.rou.xml 中声明的流中的车辆应该从哪里移动到哪里。为了解决这个问题,我们需要添加属性 tofrom,并为流提供相应的边 ID。

边的 ID 可以在 netedit 中检查和修改:打开你的路网文件 circles.net.xml,按 i 进入检查模式。左键单击任意边并将其重命名为 edge1(见下图)。左键单击另一条边并将其重命名为 edge2。然后保存你的路网(Ctrl + S)。

在 netedit 中重命名边

在 netedit 中重命名边

现在我们在 circles.rou.xml 中的流添加起始边和终点边:

 ...
    <flow id="carflow" type="car" beg="0" end="0" number="5" from="edge1" to="edge2"/>
 ...

让我们再次尝试运行 SUMO。窗口现在应该显示你之前在 netedit 中创建的路网(见下图),你可以点击播放按钮 (Image:icon_play.png) 或步进按钮 (Image:icon_step.png) 来开始模拟。如果你使用 Image:icon_play.png,请确保调整连续模拟步骤之间的动画延迟时间值(标记为“Delay (ms):”的字段,见图)。否则 SUMO 将尽可能快地运行模拟,你可能根本看不到任何动静。(注意该图使用了工具栏中表示下拉菜单的“真实世界 (real world)”样式。)

在环形路网上运行五辆车

在环形路网上运行五辆车

车辆将从 edge1 的起点行驶到 edge2 的终点,然后离开路网(附带说明:你可以通过流的附加参数控制出发和到达的位置,参见流定义)。当所有车辆离开路网时,模拟结束。

循环重定向#

现在让我们让车辆在赛道上一遍又一遍地循环行驶。为此,我们将创建一个重定向器 (rerouter)。

由于在 SUMO 中附加元素不被视为路网的元素,我们必须在一个单独的文件(“附加文件”)中指定它们。在 baseDir 中创建并打开文件 circles.add.xml,并添加以下 XML 代码(详见 Rerouter/Assigning a new Destination):

<additionals>
    <rerouter id="rerouter_0" edges="edge1">
        <interval end="1e9">
           <destProbReroute id="edge2"/>
        </interval>
    </rerouter>
    <rerouter id="rerouter_1" edges="edge2">
        <interval end="1e9">
           <destProbReroute id="edge1"/>
        </interval>
    </rerouter>
</additionals>

然后我们必须告诉 SUMO 将重定向器包含在模拟中,方法是在配置 circles.sumocfg 中添加一行。在 <input> 标签内添加一个子项:

<additional-files value="circles.add.xml"/>

这将向我们的路网添加两个(目的地)重定向器,使车辆绕圈行驶,直到给定的结束时间(即直到一亿秒过去)。实际上,每个重定向器将更新进入其边(由其 edge 属性指定)的每个车辆的目的地,并将其设置为 destProbReroute 元素的 id 属性中给出的边。因此,一旦车辆进入 edge1(其当前目的地),其目的地将更新为 edge2,反之亦然,当进入 edge2 时,它将被重定向到 edge1,从而遵循循环路线。

循环重定向

循环重定向

使用 netedit 的步骤#

构建路网#

在 netedit 中构建路网的步骤已在上面说明。请在创建路网后返回以继续教程。

创建车辆并运行 SUMO#

首先我们必须按 F3 将模式更改为“需求 (demand)”,然后按 r 切换到“创建路线 (create route)”模式。我们可以选择通过点击“连续边”或“非连续边”来创建路线,后者将查找给定非连续边之间的最短路径。对于此测试,我们将选择最后一个选项。我们可以通过点击 ID 框来更改路线的“id”。在这种情况下,我们将保留默认的“id” route_0

首先,我们必须点击路线的第一条边(让我们取上方的一条边),然后点击路线的最后一条边(让我们选择下方的一条边)。一条连接两条边的橙色路径已被创建。要创建路线,我们必须按“创建路线”按钮或 Enter 键。可以使用“中止创建”按钮或按 Esc 键来中止路线创建。

创建路线

使用 netedit 创建路线。

现在我们必须创建一个将沿此路线行驶的车辆流。为此,我们按 V 进入车辆模式,然后在车辆列表中选择“流 (over route)”。我们将“id”(flow_0)和“开始时间 (begin)”(0)保留为默认值。如果我们滚动浏览列表,我们会发现更多的流属性。在这种情况下,我们想模拟 5 辆车依次行驶,因此我们将“结束时间 (end)”设置为 0,将“数量 (number)”设置为 5。要创建流,我们只需点击我们创建的路线,一辆车辆就会出现在路线的起点。

最后一步,我们必须通过按 Ctrl + Shift + D 并输入文件名(本例中为 circles.rou.xml)来保存所有创建的需求元素(路线和流)。

创建流

使用 netedit 创建流。

保存路线后,我们可以按 Ctrl + T 使用 sumo-gui 运行模拟。更改延迟(例如更改为 100)以便能够看到车辆行驶,并点击播放按钮 (Image:icon_play.png)。正如我们所看到的,五辆车从第一条边行驶到给定的最后一条边,然后消失。在下一步中,我们将看到如何使用重定向器让它们循环行驶。

打开 sumo-gui

打开 sumo-gui。

循环重定向#

让我们回到 netedit 添加重定向器。首先切换到路网模式(F2),然后按 A 进入附加编辑模式。从左侧的“附加元素 (Additional element)”下拉菜单中选择 rerouter。我们需要添加两个重定向器:

  • 第一个重定向器将放置在我们路线的最后一条边上,并具有指向我们路线第一条边destProbReroute 元素。因此,当车辆到达最后一条边时,它们不会消失,而是会继续行驶到第一条边并完成循环。
  • 第二个重定向器将位于我们路线的第一条边上,并具有指向最后一条边destProbReroute 元素。因此,当车辆到达第一条边时,它们将被重定向到路线的最后一条边,即第一个重定向器所在的位置,这样车辆就会一遍又一遍地循环行驶。

要添加第一个重定向器,我们必须通过右键单击边来检查我们路线最后一条边的“id”。在本例中,边 id 为 edge2。从列表中选择 id,然后再次左键单击该边。重定向器已创建。现在我们必须添加一个 destProbReroute 元素。选择重定向器并右键单击它。从列表中选择“打开重定向器对话框 (Open rerouter Dialog)”。

我们点击添加按钮 (Image:add.gif) 以添加一个新的间隔 (Interval)。我们将保留默认间隔(0 到 3600 秒),但你可以根据需要更改它。现在我们通过点击右上角窗口的添加按钮添加一个新的 destProbReroute。第一个重定向器必须将车辆发送到 edge1,因此我们必须双击默认边来更改它。现在我们只需点击两次接受,我们的重定向器就添加好了。

创建重定向器

创建第一个重定向器。

现在不要忘记添加第二个重定向器。为此,我们将遵循相同的步骤,但要记住替换边。

创建两个重定向器后,我们通过按 Ctrl + Shift + A 并输入文件名(本例中为 circles.add.xml)将它们保存到一个附加文件中。现在我们可以再次按 Ctrl + T 运行模拟以打开 sumo-gui 并点击播放按钮 (Image:icon_play.png)。现在车辆将循环行驶,直到给定的结束时间(3600 秒)。

运行模拟

运行模拟。

练习#

以下是一些扩展此玩具示例的简单想法:

twoloops.png

具有两个环的路网

  1. 在 netedit 中添加更多车道和另一个具有更快车辆的车辆流,以观察 SUMO 的超车行为。
  2. 添加一个滑板车流并使用子车道模型来观察 SUMO 的子车道模型。
  3. 添加另一个环路(见图),并通过概率性选择目的地为每个车辆触发下一个环路(Rerouter/Assigning a new Destination),观察在两个环路连接处的合流。
  4. 插入更多车辆,降低模拟时间步长,并尝试观察走走停停波,试验不同的跟车模型,按速度为车辆着色。

如果你为练习创建了解决方案,请将它们发布在此页面上!

返回 教程