SUMOlympics

本教程将为不同的交通模式设置一场竞赛(集体百米冲刺)。您将学习如何在 netedit 中创建专用车道和(非常简单的)交通信号灯,使用不同的车辆类别来定义车辆类型,并为不同类型创建交通流。所有文件也可以在 <SUMO_HOME>/docs/tutorial/sumolympics 目录中找到。

本教程是基于 PTV Group 设计的 VISSIM 场景 进行的重构。

构建路网#

打开 netedit,创建一个新路网,通过按 e 进入边(edge)创建模式,并在编辑区域点击两个不同的位置来添加一条边。切换到检查模式(按 i),点击边的起点(即您第一次点击的位置)。现在在左侧检查器面板中标有 pos 的文本框中输入 0,0(见图)。对边的终点做同样的操作,将其位置设置为 1000,0。现在将您的路网保存为 sumolympics.net.xml(按 Ctrl + Shift + S)。

现在我们有一条长路,这将是我们比赛的舞台。比赛的参与者将是交通模式,即公共汽车、有轨电车、自行车、乘用车和行人。它们应该在并排的不同车道上行驶。因此,我们必须为每种模式添加车道。为此,右键单击该边,并在上下文菜单中将鼠标悬停在“添加受限车道(add restricted lane)”上。这将显示三种特殊用途车道的选择:人行道(Sidewalk)、自行车道(bike lane)和公交车道(Bus lane)。为每种类型添加一条车道。

为了创建有轨电车,我们在同一上下文菜单中点击“复制车道(Duplicate lane)”来添加一条新车道。对于该车道,我们必须将允许的车辆类别限制为有轨电车。为此,首先取消选中工具栏中编辑模式下拉菜单右侧的“选择边(select edges)”框(模式应仍设置为“(i)检查”)。然后单击新创建的车道,并在检查器面板中单击“允许(allow)”按钮。这将打开一个包含所有可能车辆类别的复选框的对话框。取消选中除“rail_urban”之外的所有选项,然后单击“接受”。现在编辑剩余车道的允许权限(当前允许所有车辆类别),并将其保留给“passenger”类别(即乘用车)。对于自行车道,我们需要修改其宽度以允许在后续操作中超车。为此,如上所述选择自行车道,然后在检查模式下,在左侧面板中将其宽度更改为 2.1 米。

现在让我们分割该边,为参赛者创建一个起点:在边的任意位置右键单击,然后从上下文菜单中选择“在此处分割边(Split edge here)”。然后单击创建的节点(在 SUMO 术语中,这已经是一个_路口_)。在 pos 字段中将其 x 坐标设置为 900,y 坐标设置为 0,就像上面创建边时一样。实际上,我们为参赛者创建了一条 100 米的跑道,以及每种竞赛模式的 900 米待命区。现在再次选中“选择边(select edges)”复选框,并将两条边重命名为“beg”和“end”(在检查器面板中)。保存您的路网(Ctrl + S)。

定义竞赛车辆(类型和流)#

作为下一步,我们将定义竞赛车辆类型以及若干这些车辆,组织为_流(flows)_。

使用 XML#

打开一个名为 sumolympics.rou.xml 的新文件,并插入以下车辆类型定义:

<routes>
    <vType id="pkw" length="5" maxSpeed="50" accel="2.6" decel="4.5" sigma="0.2" speedDev="0.2" vClass="passenger"/>
    <vType id="bus" length="15" maxSpeed="30" accel="1.2" decel="2.5" sigma="0.1" speedDev="0.1" vClass="bus"/>
    <vType id="tram" length="40" maxSpeed="13" accel="0.8" decel="0.5" sigma="0.1" speedDev="0.1" vClass="rail_urban"/>
    <vType id="bike" length="1.8" width="0.8" maxSpeed="7.5" accel="0.8" decel="1.5" sigma="0.5" speedDev="0.5" vClass="bicycle"/>
    <vType id="pedestrian" length="0.3" width="0.5" maxSpeed="2.0" accel="0.2" decel="1.5" sigma="0.2" speedDev="0.2" vClass="pedestrian"/>
</routes>

请查看车辆类型属性描述以获取这些定义的详细信息,以及此页面了解行人信息。

对于每种车辆类型,我们通过在 vType 定义下方(在 <routes> 元素内!)添加以下 <flow .../> 元素来调度和定位车辆流:

        ...
    <flow id="pkw" type="pkw" from="beg" to="end" begin="0" end="0" number="66" departPos="last"/>
    <flow id="bus" type="bus" from="beg" to="end" begin="0" end="0" number="5" departPos="last"/>
    <flow id="tram" type="tram" from="beg" to="end" begin="0" end="0" number="2" departPos="last"/>
    <flow id="bike" type="bike" from="beg" to="end" begin="0" end="0" number="100" departPos="last"/>

    <personFlow id="pedestrian" type="pedestrian" begin="0" end="0" number="100" departPos="-30">
       <walk from="beg" to="end" arrivalPos="-0.1"/>
    </personFlow>
        ...

请注意,行人流(由上面的 personFlow 元素表示)的语法略有不同,原因是行人可以步行或乘坐(例如使用公共交通),这些不同的活动需要传达给 sumo。有关流属性含义的详细信息,请参见流定义部分和行人流

使用 netedit#

我们通过手动将定义写入 XML 文件来创建车辆类型和车辆流,但是这些操作可以直接在 netedit 中进行(并可视化)!为此,您需要选择“需求(Demand)”模式,而不是上面用于创建路网的“路网(Network)”模式。要创建新的车辆类型,请使用“创建类型(Create type mode)”模式。您可以直接在左侧面板中修改主要参数,点击“打开属性编辑器(Open attributes editor)”后可以修改其他参数,如下所示:

关于创建机动化流,您需要使用“创建车辆(Create vehicle mode)”模式。然后在左侧面板的顶部,您可以创建单车或流,有不同的选项。在此处选择“flow (from-to edges)”。然后您可以使用特定的车辆类型,更改 departPos 属性和您想要的车辆数量。然后直接在路网上选择起点和终点边,当一切设置完毕后,点击左侧面板上的“完成路线创建(Finish route creation)”以创建路线和流。

青色用于表示起始边,而浅绿色用于表示选定的终点边。将在流的起始位置添加一个小车辆以在 GUI 中具体化它。您还可以通过使用 netedit 主菜单中的“定位 > 车辆(Locate > Vehicles)”来检查流是否已创建。行人流的创建方式类似,但您需要使用专用的“创建行人(Create person mode)”模式。

第一次模拟#

最后,为了准备模拟,创建一个 SUMO 配置文件(命名为 sumolympics.sumocfg):

<configuration>
   <input>
       <net-file value="sumolympics.net.xml"/>
       <route-files value="sumolympics.rou.xml"/>
   </input>
   <processing>
    <lateral-resolution value="1." />
   </processing>
</configuration>

在这里,我们给出处理参数 lateral-resolution,其值对应于以米为单位的子车道宽度,以实现更真实的行为,使骑自行车者利用整个车道宽度互相超车(参见子车道模型自行车模拟)。通过双击配置文件 sumolympics.sumocfg(Windows)、打开 SUMO GUI 或从终端运行 sumo-gui -c sumolympics.sumocfg 来启动模拟。将步长延迟调整为 100 毫秒,然后按下运行按钮(Image:icon_play.png)。

使用交通信号灯定义起跑信号#

为了进行一场公平而完整的比赛,还有一件事要做:所有参赛者都应被允许在起跑线前自由定位(尽管骑自行车者被排成一排插入,但它们可以通过利用整个车道宽度更密集地分组来取得更好的结果)。

首先,我们使用 netedit 在“beg”和“end”边之间的路口上创建一个交通信号灯:按 t 进入交通信号灯编辑模式。单击路口,然后在左侧面板中单击“创建 TLS(Create TLS)”。在下方,标签 phases 下,为第一阶段输入“rrrrr”(“r”代表红灯)并将其持续时间设置为 100(秒)。这将为骑自行车者提供足够的时间以更密集地分组。对于第二阶段,输入“GGGGG”(是的,“G”代表绿灯)并将其持续时间设置为 1000(即直到模拟运行结束)。现在再次运行模拟,看看自行车如何超越汽车。看到了吗?我们都应该更经常地使用自行车!

如果您在消息窗口中注意到警告(例如“Warning: Missing yellow phase in tlLogic 'gneJ2', program '0' for tl-index 0 when switching to phase 0”),请不要担心。SUMO 会定期检查 tls 阶段的基本一致性,如果存在相交的流,缺少黄灯阶段可能会导致崩溃。但是,这是一种特殊情况,我们显然不需要担心这一点。如果您想了解更多关于交通信号灯控制的信息,请参阅 TraCI 教程 TraCIPedCrossingTraCI4Traffic_Lights,或关于交通信号灯的主要部分。

抓起一些爆米花,开始模拟吧!

返回 教程