本教程展示了交通灯布局、间接左转、TAZ、OD交通、GTFS 等内容!
文件#
视频#
转录#
简介#
再次欢迎大家参加 SUMO 用户大会和 SUMO 教程,这自 2015 年以来已成为传统。大会自 2013 年开始,您现在就可以获取教程文件,我稍后会显示链接,您会注意到这些教程的规模逐年增长。那么我们今天要讲什么?我们将简要介绍进行本教程的先决条件,遗憾的是,这比去年稍微复杂一些。然后我们将讨论一个主要针对初学者的主题,即如何使用 Web Wizard 工具快速获取场景以及如何编辑网络。接着我们将转向更高级的主题,即网络编辑的高级功能,然后是一些令人兴奋的新内容,如何借助起点、终点、城镇和地区图形化定义交通。最后,我们将讨论以 GTFS 格式导入公共交通时刻表,我想我们已经为此承诺了 10 年,终于在本教程中实现了。
要跟随本教程,从运行所有包含的模拟的角度来看,拥有最新的发布版本 1.10.0 就足够了,但如果您还想跟随 netedit 中展示的所有最新功能,那么您应该下载最新的开发版本,并且一定要确保获取非常最新的开发版本,因为即使是昨天的版本仍然有一些问题需要在今天解决。此外,如果您安装了 SUMO,您可能也安装了 Python——如果没有,您将需要它来完成教程的某些部分。 如果您真的要跟随教程进行,您可能需要一个文本编辑器,当然还需要下载文件。它们已经在 wiki 的下载页面上。让我们看看我是否能分享这个。在文档中,您会在其中找到教程页面。链接已经添加好了。好的,那么让我们真正开始内容,由于时间有点紧,您最好稍后跟随教程,现在只听和看展示的内容。
osmWebWizard#
好的,我想介绍的第一个工具是 OSM Web Wizard。它从 OpenStreetMap 这个伟大的开放地图数据存储库下载网络数据和一些与交通相关的数据。如果您安装了 SUMO,那么您的开始菜单中已经有一个 OSM Web Wizard 链接(假设您在 Windows 上操作)。在那里您有几个控件可以生成场景。您可以选择一个区域,当然,为此您可以选择世界上的任何区域。假设您想去任何地方。假设您想去巴黎。然后选择您希望在场景中看到的交通元素。您可以选择是否需要公共交通,或者该区域是否为左侧行驶,最后选择区域。然后模拟将被生成。这意味着来自 OpenStreetMap 的数据将下载到您的计算机上,然后在后台运行各种进程来为您生成场景。然后模拟就会弹出在您的屏幕上,其中包含大量内容,我们将在接下来的幻灯片中详细介绍。
好的。正如我所说,文件被下载并生成。那么首先让我们看一下作为教程一部分构建的模拟,即场景。如果您已经下载了文件,它在 tutorial/01_wizard 文件夹中。就像在向导中点击此按钮时模拟会弹出一样,您可以通过点击 sumoconfig 来启动它。
然后使用这个大的播放按钮启动您的模拟。然后您看到的只是一个计时器在运行,但您必须眯起眼睛仔细看才能看到汽车在移动。通过这个连接您可能甚至看不到。但如果您放大,您会看到网络中有交通在运行,有一个预配置的特定延迟——您可以使用这里的延迟滑块将其减慢或加快。
这就是您的模拟。我们将更仔细地看看它,但首先让我们简要了解一下生成场景时放入您硬盘的所有内容。最重要的是 sumoconfig 文件。它将构成模拟的所有不同组件绑定在一起。即交通网络,通常以 .net.xml 结尾命名,然后是各种用于乘用车、行人、公共交通的交通定义文件。然后是一个用于基础设施的文件,即站点,一些使模拟更具吸引力的文件,建筑物和土地利用的背景多边形,最后是一些关于如何呈现模拟的设置。然后还有一些文件对于运行模拟来说并不是真正必要的,但对于使用不同设置重建场景很重要。
这是原始的 osm 数据,然后是各种配置和批处理文件,我们可能也会在接下来的幻灯片中讨论。
好的。那么让我们再看一下模拟。当我们运行它时,我们在屏幕底部看到有一些警告在这里滚动。我们可能想很快找出这里发生了什么。查看此场景的一种方法是更改可视化的一些设置。
所以我使用此按钮再次放大到整个场景,然后启动图形设置的配置。我想看到的第一件事是所有的汽车。所以我只需稍微增加它们的绘制大小。现在您看到了所有的小黄车。让我们让颜色更具信息性。我们可以根据它们的等待时间给它们上色。所以现在我们看到一些汽车以不同的色调显示,这意味着它们正在等待,这可能是交通问题的迹象。
但它们往往在一段时间后会变回蓝色。所以也许情况并不太糟。相反,让我们根据累积等待时间给它们上色。所以这计算了过去 100 个模拟秒中等待时间占用了多少,而不是实际上有多少汽车一直在等待。所以这里我们有一个巨大的红色区域,这意味着这里发生了堵塞。如果我们放大(这可以通过按住鼠标右键并上下移动鼠标来完成),我们看到在这个交叉口有一个大堵塞,现在问题是为什么?这里发生了什么?我们看到这看起来有点奇怪。有那些红色的条表示交通灯,它们不知何故在交叉口的中间。这一切看起来都很糟糕。所以我想这将是我们使用图形网络编辑器 netedit 修复网络问题的第一个领域。那些跟随去年教程的人可能记得,我们在同一个区域有完全相同的问题,而在初始导入时并没有这个问题。那么与去年相比有什么不同呢?当然,OpenStreetMap 的数据已经更新。在今年,我还没有谈到,但我确实添加了更多的自行车交通。实际上,通过添加自行车交通,从 OpenStreetMap 导入了额外的自行车道。所以这些都是变化,事实证明,是的,添加这些车道改变了一些网络几何形状,然后处理网络的某些功能工作方式不同。
突然,这里的一部分失败了,它没有构建一个漂亮的路口。所以我们将修复这个问题,只是要注意,如果您从 OpenStreetMap 导入数据,这种情况总是可能发生在您身上。好的,那么让我们来修复这个。
网络编辑 - 合并路口#
您可以从这里的菜单启动 netedit。我将使用快捷键 Ctrl + T。我将在模拟中看到它的位置获得网络视图。所以这里的概念是,我们有一个复杂的交叉口,在 OpenStreetMap 数据库中被建模为许多连接在一起的元素。而我们的模拟更希望它只是一个交叉口。所以我们将 netedit 的编辑模式切换到选择模式,只需点击构成这个复杂交叉口集群的所有这些红点。然后我们将使用快捷键 F7 来合并这个。
现在,如果我们想看到路口的实际几何形状,我们可以按 F5 来查看它现在是否已合并到一个区域中。当我们保存这个网络时,我们已经修复了问题。然而,我们不能直接将这个固定的网络用于我们的模拟,因为在生成的交通中,汽车使用了这个复杂集群内部的一些网络元素。所以这些道路现在消失了。所以为了让模拟真正运行,我们必须调用一个由 web wizard 构建的小脚本。
一个小型的交通生成脚本。如果我们双击运行它,它会再次调用构建交通的所有工具。这样它就与网络匹配了。您可以在 02_netedit 文件夹中找到这些结果。然后模拟看起来就大不相同了。所以这里是修正后的路口(或交叉口)。正如您所看到的,使用与之前相同的累积等待时间着色模式,它现在在这个区域工作得很好。所以让我们用数字来说明这个单一修复的重要性。
您可以使用一些生成这些统计信息的选项来运行模拟。您会发现汽车花费的等待时间显著缩短了。所以在之前,模拟中车辆的平均停留时间中,超过一半的时间都损失了。由于站立或行驶非常缓慢而损失的时间,几乎一半的时间是真正站立的。而现在持续时间缩短了,汽车花费的等待时间远没有那么多了。对于有交通灯的城市交通来说,我认为这是一个非常合理的等待时间。是的,看起来不错。好的。所以当您从 OpenStreetMap 导入网络时,您遇到的这类问题通常会导致交通效率降低。所以寻找堵塞是一个很好的启发式方法,看看它们是否可能是由于网络本身的问题造成的。好的。
网络编辑 - 更改交通灯布局#
然后让我们看看我们可以做的另一种修复,因为并非所有修复都必须提高性能。让我们谈谈交通灯。正如您可能知道的,交通灯计划不是 OpenStreetMap 数据库的一部分。相反,为了我们的目的,我们有工具可以生成合理的信号计划,以使模拟运行,因为没有计划甚至无法运行模拟。所以再次,看看我们在 netedit 中之前看到的这个交叉口,我们可以通过使用此菜单或按字母 T 切换到交通灯模式,这也是有文档记录的。所以只需学习这些助记符,您就会快得多。然后我们可以点击交叉口,我们将在这里看到交通灯计划。我们可以浏览交通灯的不同阶段,我们看到有些阶段是那些……嗯,我不能真正称它们为从北到南,如果您能跟随鼠标,这个方向同时是绿灯,然后有一个左转的阶段,然后实际上电车有自己的阶段,然后我们再次有正交方向的左转阶段。 现在,由于这实际上是德国航空航天中心附近的一个区域,这是一个我很了解的交叉口,我知道这实际上不是正确的信号计划布局。它在现实中看起来不同,我们可以通过更改此交叉口的一些属性来修复它,所以我将离开交通灯模式,改为检查模式,按字母 I,然后我可以查看此交叉口的一些属性,我看到交通灯的布局设置为 opposites 值,这意味着相对的两侧同时获得绿灯,这就是其理念,现在我们可以将其切换到 incoming 布局。这意味着交通灯的每个进入方向都有自己的阶段。所以让我们回到交通灯模式,看看现在的信号计划是什么样的。正如我所说,每个方向都有自己的绿灯阶段,这实际上是这个交叉口在现实生活中的工作方式。 在一些国家,这是默认布局,您实际上可以在 netconvert 程序中设置一个选项,让您的所有布局都采用这种格式,如果这在您的地区更典型的话。您当然会在交通灯及其默认程序的文档中找到所有这些选项的解释。所以让我们在模拟中看看这个,看看它是如何运行的。我们这里有这个。让我们看看阶段是如何切换的。我会稍微放慢速度。现在让我们添加一些模拟延迟,看看它是如何运行的。您可以看到每一侧都获得绿灯阶段。如果我们对这对交通性能的影响做一些测量,我们实际上看到行驶时间增加了。这只是表明,并非每个修复都会使交通流更好。我想,这是您应该预料到的。您如何获得我在上一张幻灯片上展示的那些统计数据?您可以做的一件事是打开一个命令行窗口,以批处理模式运行模拟,这样您就不启动图形应用程序 "sumo-gui",而是只启动 "sumo" 应用程序,然后它将在这里输出所有这些度量,您可以找到这些统计信息作为人类可读的时间值,当然也有选项可以以 xml 输出形式获取这些信息,以便您使用其他工具进行处理,但如果您只想查看这些统计信息,控制台输出通常非常有用。
网络编辑 - 间接自行车转弯#
好的,让我们对网络做更多的修复,我们现在要进入更高级的主题,或者更确切地说是更高级且新颖的,因为我想向您展示一个专门为自行车模拟添加的新功能,这就是间接自行车转弯。让我们在网络中看看这个。我们将离开交通灯模式,去另一个交叉口,在默认视图中您实际上不会看到车辆连接,但您可以使用此按钮激活它们,实际上甚至有一个快捷键 Alt + 5,现在您有了所有那些穿过交叉口的有趣线条,您在这里可以看到有一些自行车转弯以单个弧线穿过交叉口,特别是对于大型复杂交叉口,这通常不是交通规划者想要的,因为这很危险,我想骑自行车的人也不会想要这样,所以自行车在现实生活中通常做的是执行间接转弯操作,这意味着它们首先直行穿过,这样做的好处是不必穿过那么多交通线,然后它们在角落等待再次直行穿过。如果您想在模拟中实现这一点,请激活此复选框 indirect,如果您现在使用 F5 按钮或重新计算功能重建所有几何形状,您可以看到我们现在有了不同的连接形状。实际上这里有一个小的等待点。您可能能看到,这里的这条虚线。有一个等待点,自行车在那里等待交通灯切换到适当的阶段。所以让我们在模拟中看看这个。
您已经看到这些了。嗯,实际上您可以看到它们在这里。自行车正在等待,然后一旦灯切换,它们就移动过去。如果您想检查那个交通灯,或者更确切地说是使其更可见,您也可以再次使用这里的按钮更改可视化设置,并禁用交叉口形状的绘制。您将看到甚至有小的交通灯来指示进行间接转弯的骑车人的状态。所以这是交通灯的新功能。您实际上可以做的不是逐个点击这些连接,而是使用 netedit 的高级选择和过滤机制来对许多自行车连接进行此更改。由于选择模式是如此有用,我想向您展示一些细节。
所以,我们可能想做的第一件事是考虑一个特定的区域。如果我们能选择特定区域中的所有连接就好了。当您在选择模式(按字母 S)下按住 Shift 键时,您可以进行矩形选择,但这样您会得到选择中的所有对象。所以按 Esc 返回。相反,您可以锁定所有元素,然后只解锁连接。这是进行选择过滤的新功能之一。让我们,既然我已经做完了,我会回去解锁所有元素。所以,我们现在可以看到选择了 1000 个连接,但也许这些是行人或汽车的各种连接。
让我们只寻找自行车连接。所以我们通过选择 allow 属性来细化我们的选择。我们要做的是我们不想添加,我们只想保留匹配这些属性的所有连接。所以,我在这里打出来。所以我们想将选择过滤到所有允许自行车的连接。实际上,只允许自行车。所以,现在连接少多了,正如您在这里看到的。所有那些从自行车道开始或结束的连接都在其中。但我们还没有完成,因为我们的混合中也有一些直行连接。所以让我们再过滤一些。按连接的方向过滤。
那就是,直行。我们的连接更少了。现在,实际上,那是错误的。我们要过滤转弯,左转。所以我回到我的选择,更改这里的字母。现在我有了转弯。我要做的是我可以回到检查模式,点击其中一个选定的对象。它告诉我实际上有 22 个东西在我的检查中,我可以让它们都变成间接的。嗯,实际上这,是的,这完成了工作。好的。这就是我想向您展示的。选择模式有非常强大的工具来处理选择。它允许您编辑许多元素的属性。好的。我们已经在模拟中看到了这个。好的。现在让我们进入教程的下一个部分。在网络编辑之后,我们必须处理交通。
交通#
Web Wizard 工具创建的原始场景主要是随机交通。这是因为没有适用于全世界的良好交通数据源。所以我们可以将其与向导集成。因此,我们使用随机交通来为每个人构建一些东西。所以汽车,它们有随机的起点和终点,然后它们只是根据当前的交通状况使用最快的路线。对于公共交通,我们在 OSM 中确实有一些数据,因为它包含路线,即沿着行驶的网络元素列表以及站点。甚至可能是同一线路的连续公交车或电车之间的时间间隔,但我们没有时间。所以场景中的公共交通是合成的,因为它使用了来自 OpenStreetMap 的所有数据,然后它猜测特定线路的开始时间,然后从一个小的背景模拟中推导出所有其他时间安排。所以这是在模拟中获得交通时刻表的一种合理方式,但它肯定不是正确的时刻表。然后是人员,同样,他们有随机的起点和终点,但他们使用“最快”的多式联运路线,这意味着他们可以步行,也可以使用一系列步行和乘坐公共交通工具的组合。 去年,我们讨论了使用本地交通量统计数据来重新定义我们的交通场景。如果您对此感兴趣,我建议您查看去年的教程,但今年我们将采用不同的方式。我们将使用 OD 矩阵。这是起讫点矩阵的缩写,它基于我们模拟中区域的定义。然后我们定义从一个区域到另一个区域的交通,使用某种过程,该过程说,嗯,实际上,如果您想从这个区域开始,那么我会为您选择该区域中的一个起始边。所以这是一个两步过程,但这些指标很强大,因为它们可以与现有的区域定义一起使用,并且它们通常是可用的,因为,也许不经常,但它们是可用的,因为其他人收集了这类数据。 这就是我们要为汽车交通所做的,然后我们将用实际的 GTFS 数据(通用交通馈送规范)替换合成的公共交通时刻表,该规范适用于许多地方,但并非世界上所有城市都有。所以是 OD 交通。
来自 OD 矩阵的交通#
有一个工具,称为 od2trips,是 SUMO 工具箱的一部分,它使用交通区域的定义以及一个指标定义,该定义说明从每个区域到每个其他区域有多少次出行。所以我们需要做的第一件事是定义一些区域。现在,您可以在 netedit 中手动执行此操作,在 TAZ 编辑模式下,TAZ 代表交通分析区,交通分配区,您实际上可以绘制这样一个区域并为许多区域执行此操作。但这通常不是您想做的。要么您可以从您拥有的某些数据集加载这些区域。或者也许您只是想以更抽象的方式进行操作。我们将要做的是我们将生成一个区域网格。SUMO 中有一个名为 gridDistricts.py 的工具,我们使用这些参数运行它。一个网络,一个输出文件将指定网格单元的宽度,我们说它应该是一个用于乘用车的网格。您也可以在 04_odtraffic 文件夹中使用批处理文件运行它。当我们这样做时,我们会得到一个看起来像这样的文件。它只是一堆 XML 行,包含形状和组成这些区域的网络元素(即边)的列表。但让我们在 sumo-gui 中看看这个。我们在这里看到的是区域的矩形。它们已被工具分配了随机颜色。然后边根据区域颜色着色,以便更好地查看它们。您可以看到对于这些设置,只有允许乘用车的边实际上是区域定义的一部分。所以这些是我们的区域。
现在我们想定义这些区域之间的交通。好的。所以我们要做的是加载网络。我将再次重新加载这个。然后让我们加载区域。所以您可以通过附加元素来执行此操作。然后就是我们刚刚生成的文件,即网格。这里就是我们的区域。现在我们接下来要做的是,我们想定义 OD 矩阵。为此,我们使用 netedit 的数据模式,该模式用于编辑和可视化与网络相关的数据。去年,我们查看了边和转弯上的统计数据。但我们也定义了这些交通分配区之间的计数或关系。所以让我们进入数据模式 - 这将是 F4 键。然后我们进入 TAZ 模式。首先我们必须做的是定义一个新的 dataSet。我们称之为 "test",我们必须定义该数据相关的时间间隔。所以让我们只使用默认的一小时。现在我们可以定义这些区域之间的关系。现在,如果我们可以点击任何地方而不仅仅是那些细线,可能会更有用。所以有另一个按钮可以做到这一点。现在我们可以定义我们的交通关系。假设我们这里有一个到那里的关系。现在这是通过属性建模的,通过计数属性。所以我只需在这里设置这个属性。我会把它打出来。您也可以用一个小对话框编辑它。现在让我们在这两个区域之间创建一个关系。按 Enter 键确认,现在实际上会有一个按钮您可以点击,而不是记住它是 Enter 键。但这个模式相当新,我们上周做了很多功能。所以只需再过一周左右检查一下。但您可以看到这里的这条线,它定义了关系。
我们也可以检查这个。然后回到属性。如果您为您想要定义的所有关系都这样做,那么您可以保存它并得到一个像这样的文件。让我们看看我们在哪里有它。它实际上是一个非常简单的格式。您也可以通过某种过程生成它。所以这是这两个区域之间的关系,计数值为 1000,针对特定的时间间隔。就是这样。好的。所以现在,正如我之前所说,我们可以使用 od2trips 工具将该区域定义与计数结合起来。有一个批处理文件用于此。然后只是有一个小问题,因为该工具对网络中的连通性一无所知。所以您可能得到一个行程,比如说,结束于这条边。正如您所看到的,这条边没有前驱。所以您无法从任何地方到达那条边。所以其中一些行程实际上无效。为了过滤掉这些,我们可以运行 duarouter 应用程序,它会剔除所有这些错误的行程,并只给您有效的行程。不幸的是,这将数量从 1000 减少到了 964。所以您可能需要补偿,但这样您就有了 OD 交通。让我们在模拟中看看这个。
正如您所看到的,交通都起源于一个区域。然后它移动到另一个区域。所以。这不是一个非常现实的交通定义。对于那个小区域来说,交通量太大了。但它向您展示了交通的起点是分散的,而不仅仅是单个边,您可以用流定义来定义,而是从一个区域到另一个区域的交通。然后您看到它穿过网络。当然,我们保留了公共交通,它仍然在这里运行。这就是来自起讫点矩阵的交通。现在到教程的最后一部分。还有两分钟。
GTFS-导入#
让我们谈谈通用交通规范。这是一种纯文本格式,最初由 Google 引入。现在许多公共交通数据提供商实际上都在发布他们的数据。一个很好的网站是 https://mobilitydatabase.org/,您可以选择一个区域或城市,获取您的 GTFS 文件,通常命名为 "GTFS.zip"。SUMO 现在带来了一个可以导入此数据的工具 (gtfs2pt.py 工具),您给它网络和 GTFS 文件,以及一个日期和输出文件,就可以开始了。我已将所有这些都放在一个 osm 批处理文件 05_gtfs/gtfs_osm.bat 中,如果您想从幻灯片中复制这些命令,请务必小心,有时破折号会被您的演示工具或 Word 或 PowerPoint 等工具破坏,所以如果有疑问,请键入所有这些命令,有时您会遇到有趣的问题,因为它是排版破折号而不是真正的破折号。所以该脚本的作用是生成基础设施,即站点在哪里,并生成组成公共交通的各个车辆,每个都有其实时刻表。
如果您希望人员实际使用该公共交通,那么当然在生成人员时必须将其联系起来。所以,我们之前有这个批处理脚本,用于生成各种交通。现在如果我们谈论 GTFS 事情,我们必须修改该批处理脚本,至少对于人员,以确保它使用刚刚从 GTFS 生成的所有文件。所以请注意这一点。当然,文档中有一个 GTFS 教程,您可以在那里查找所有内容。所以,让我们看看带有 GTFS 交通的模拟。嗯,实际上不行,因为时间到了。所以让我们节省一些时间。
GTFS-导入 - 多式联运行程#
我们可以做的是,我们可以查看当人员使用该公共交通时生成的计划类型。为此,我们在 SUMO 工具中有脚本 analyzePersonPlans.py。它会告诉您,对于原始的 OSM Web Wizard 场景,我们有大约,嗯,有一定数量的步行,然后我们有许多在步行和公共交通之间交替的行程。现在,如果我们进行 GTFS 导入,突然步行的数量增加了。为什么会这样?嗯,我们首先要认识到的是,现在时间突然变得重要了。通常,我们首先从第 0 秒到第 3600 秒生成交通。这是午夜刚过。所以那个时间段没有多少公共交通。所以如果您生成人员,请确保他们在更现实的时间步行。然后您会有更多的步行。您必须考虑的另一件事是日期很重要。所以如果您使用 GTFS 导入工具,您必须设置一个参考日期。在我展示的场景中,由于目前的施工工作,没有电车服务。所以当我们天真地使用当前日期时,许多本应使用电车的人实际上无法使用。所以如果您也设置了适当的日期,那么最终您会再次减少步行的数量。如果它仍然比 WebWizard 情况下的步行多,那很可能是由于合成时刻表,公交车或电车过于集中,所以服务过多,人们过多地使用电车。所以查看时间,查看日期,然后享受您的 GTFS 时刻表。这就是我今天想向您展示的全部内容。如果您有任何问题,请在邮件列表中提问,查看文档并报告您发现的任何错误。非常感谢。
