本教程将展示如何调试仿真警告、行人模型、飞行出租车等内容!
文件#
视频#
文字记录#
简介#
大家好,欢迎来到 SUMO 用户大会教程。我是 Jakob Erdmann,我将为大家展示我认为是该系列的第十个教程。请享受。我们今天要涵盖的主题和往常一样,首先是关于 OSMWebWizard 的内容,帮助大家入门,特别是新用户。然后我们将讨论如何查看仿真过程中可能出现的奇怪现象。我们将深入了解 SUMO 中包含的一些行人模型,特别是较新的模型。最后,我们将看看飞行出租车。要跟随本教程,您需要最新的 SUMO 版本,即 1.20.0。您可能需要 Python,数据文件在链接后面,您也可以在 SUMO 文档页面的教程部分找到。那么首先,是 OSMWebWizard。这是我们帮助您通过大约三次点击开始 SUMO 仿真的工具。它是一个 Python 应用程序,如果您安装了 SUMO,可以从开始菜单启动它,或者在 SUMO 工具文件夹中找到它。启动后,它将打开一个网络浏览器并显示一张地图。基本上,这是一个基于 OpenStreetMap 的世界渲染图,您可以在那里选择一个区域、您希望在仿真中看到的交通模式,然后当您点击“生成场景”时,数据将被下载、处理,sumo-gui 将在您的机器上打开,您就可以准备好看仿真了。那么,您在这里配置的内容,正如我提到的,是位置,它将从 OpenStreetMap 数据库中选择相应的数据,并根据选定的交通模式填充随机交通。因此,有汽车、卡车、公交车、摩托车、行人等等。您还可以配置应包含在仿真中的道路类型,例如带或不带轨道,或者仅道路,或者仅行人设施。对于每种交通模式,您可以选择您想要的交通量,以及在网络边界或网络内部生成多少交通量。这是过境交通的比例,即过境交通因子。您还可以选择是否希望在仿真中包含公共交通,场景运行多长时间,这基本上是指交通应插入场景的时间长度。您还可以配置包含建筑物的形状和兴趣点(如树木、邮筒等 OpenStreetMap 中的任何内容)。然后还有一个复选框,可以让您切换到卫星背景,而不是正常的形状。
现在,所有这些文件都将下载到您计算机上的一个文件夹中。如果您下载了教程文件,您可以找到一个名为 0_wizard 的示例文件夹。但今天,我们要看看这里一些复选框的深层含义。所以我们来详细了解一下。过境交通因子。如果您想区分较小和较大的网络,这很有用。如果您有一个小网络,那么可能大部分交通都是过境交通。因此,交通应从网络边界开始,您会希望设置一个较高的过境交通因子值。而如果您有一个较大的网络,那么可以说很多交通将在网络内部开始和结束。因此,过境交通因子不需要那么高。然后是计数设置,您可以为每种模式设置。它表示每小时每公里道路的车辆数。所以在这个例子中,设置为 12,如果您有一个只有一公里道路的网络,那么这将在一小时内给您 12 辆车,这是场景的默认持续时间,3600 秒。但还有更多。如果您启用特定模式,这将触发网络的额外处理。因此,如果您为行人模式选中复选框,那么网络将带有额外的基础设施。这将包括人行道和人行横道。否则,您将没有这些。还有一件事。对于所有 OpenStreetMap 没有记录限速的道路(有时会发生,取决于您在世界上的位置),默认值会有所不同,具体取决于您是否激活了行人。如果您激活了,那么将假定为城市环境。您将有一个默认的道路限速 50 公里/小时,这是针对德国的,在城市环境之外,您有一个更高的限速 100 公里/小时,这是默认值。现在,如果您选择轮船模式,那么 OSM 已知的河流和渡轮路线也将作为网络的一部分导入。如果您选择自行车,那么额外的自行车道将成为您生成网络的一部分。现在,除了这些交通模式之外,还有公共交通复选框。如果您这样做,那么所有在 OSM 中运行的火车、公交车和渡轮都将被导入。它们甚至会获得一个合成的时刻表,因为时刻表不是 OSM 的一部分。这必须由工具链生成。如果您这样做了,那么行人也可以使用公共交通。因此,如果没有公共交通,他们都是步行。但如果您选择了公共交通,那么他们也可以乘坐一条或多条线路到达目的地。如果您在右下角设置“仅汽车”复选框,那么它将只保留汽车的边(edges),如果您还激活了公共交通,则加上公共交通的所有边。现在我们来看一个有趣的设置。如果您选择卫星背景,那么,嗯,将从服务器下载卫星图块,并将其放入您的 SUMO 仿真中。但它也会改变您网络的地理投影。这与通常用于卫星图块的标准有关。问题在于,这种不同的投影并不是地理学家真正喜欢的。直白地说,这是一个糟糕的投影,因为它扭曲了距离。在最坏的情况下,道路可能比应有的长两倍,甚至更糟。所以,只有当您知道自己在做什么,并且真的需要卫星背景时才这样做。然后要准备好您的网络中可能会有错误的距离。最后,左侧交通,嗯,您应该知道何时勾选此选项。例如,如果您在英国,那么您会知道那里的先行权规则与世界其他大部分地区不同。那么勾选此框,您就没问题了。然后,一旦所有这些都生成了,您会看到一个装满文件的文件夹,它们基本上可以分为两组数据。首先,是 SUMO 真正需要运行的东西。这是 SUMO 配置文件,它将所有内容绑定在一起。它可以被 sumo-gui、sumo 甚至 netedit 加载。然后,当然,还有交通网络。以及交通需求。您选择的每种模式都有一个文件。还有行人的交通需求文件。然后是建筑物形状文件。还有一个文件,说明初始视图应如何呈现延迟和颜色设置。第二组文件是如果您想使用不同的选项或不同的交通重建场景时所需的文件。这主要是原始 OSM 数据、用于重建网络的 netconvert 配置。用于重建形状的 polyconvert 配置。以及用于重新生成所有交通和公共交通的批处理文件。现在,让我们看看仿真。
调试警告#
我正在启动 SUMO 配置文件,这与您按“生成场景”时启动的文件相同。所以当我们按播放时,我们可以看到东西在移动,但一切都非常小,所以也许我们可以增加这些东西的大小,为此我进入视图设置(viewsettings),我将车辆更改为以恒定大小绘制,为了更好地理解它们在做什么,我将颜色更改为“按速度”,现在让我们再看一下。所以您可以看到不同颜色的汽车在移动,这些颜色是什么意思?嗯,让我们看一个图例,它告诉我们车辆颜色的含义,所以您可以看到红色的汽车是静止的,黄色和绿色的汽车以不同的速度行驶,蓝色的汽车是这里场景中最快的,它们在一段高速公路上行驶。所以基本上看起来都不错,我们有汽车在移动,没什么异常,如果我们仔细观察,我们甚至可以在网络的这一部分看到一些电车轨道,所以也许等另一辆电车出现,然后我会放大来向您展示。我们还可以看到一些公交车,因为它们的形状与汽车略有不同,所以这里在网络的这一部分有公交车,在某个时刻我们甚至有一辆电车在这里运行,实际上是两辆,这很有趣。好了,所以我们在网络中有汽车,您可以在底部看到 70 辆汽车,但我们也有行人 290 人,那么他们在哪里?让我们更改设置,使行人更突出,所以我把车辆再次变小,现在我增加行人的大小,我也会更改颜色以更好地显示他们在做什么。所以让我们按模式(mode)给它们上色,现在我们在网络中有行人,您可以看到他们在这些道路上以不同的颜色移动,让我们放大。那么这些颜色又是什么意思呢?黄色意味着他们在等车,所以您看到他们在这里的公交车站等车来,绿色是步行,蓝色是乘坐。所以让我们缩小,这里有一些蓝色的人在乘坐公交车,当然还有很多绿色的人在穿过网络步行,还有浅蓝色的,他们正在使用通道设施去公交车站,也许正在过马路或使用一些楼梯去轨道交通站。所以我们网络中有行人。现在我们要做的下一件事是看看一些奇怪的地方,首先,我们只看仿真抛出的警告。我们在 sumo-gui 底部看到的第一个警告是关于公交车站的长度,现在您可以点击警告中的下划线文字,它会带您到该位置,无论是车站还是车道,如果车辆还在该区域,您甚至可以点击跳转到车辆。现在警告是公交车站对于车辆来说太短了,正如您在这里看到的,这确实是一个非常短的公交车站。如果我们想知道确切的长度,我们可以看到它只有 5 米长,从位置 0 开始到位置 5,所以这足够容纳一辆普通汽车,但不够容纳一辆公交车。嗯,这里发生了什么?在现实中,公交车站会覆盖这一部分,但在仿真中这里有一个交叉口,一条支路汇入,只是一条小支路,但仿真将所有这些都视为一个交叉口,目前不可能在交叉口上放置公交车站,因此出于这个原因,公交车站被人为地在 SUMO 中缩短了,这导致了这个警告。现在您需要担心这个吗?不。除非您有多辆公交车想同时使用一个车站,否则这真的不是问题,公交车会在这里停下,行人可以上下车,即使长度较短也没问题。所以基本上这是一个已知的问题,并且按预期工作。让我们再运行一会儿仿真,看看是否会有更多警告(也许)。为了加快仿真速度,我可以降低这里的延迟值,这样它很快就结束了,确实我们有一些更多的警告可以查看。
所以一个人在某条边上(edge)堵塞了,我们再次点击带下划线的位置边 id,看看它在哪里,但现在最好也能看到情况的发展过程,所以我点击时间,它也是一个链接,这里说已设置一个断点,时间比那个时间提前 5 秒,这是一个便利功能,您实际上可以在菜单中设置时间差,它设置为 -5 秒,当您点击一个时间戳时,现在我们可以重新加载仿真并重新运行到那个时间,它会自动在断点时间停止。如果您想查看或编辑断点,也可以通过断点菜单完成,可通过 Ctrl + B 访问断点编辑器。所以现在我们有了这个情况,它将在 5 秒后导致这个警告,所以我将单步执行仿真,您可以使用 D 键或按此步进按钮,现在我们的警告出现了。这是行人,它被堵塞了,可能与这辆车有关,看起来很奇怪,因为显然行人在路上行走,那么这里发生了什么?首先,我将尝试为您可视化行人想要行走的方向,所以我右键单击并选择行走区域路径(walking area path),如您所见,这是行人在交叉口内想要行走的路径,但然后您已经可以看到一些奇怪的形状,我将通过高亮显示使这个奇怪的形状更明显,所以这个人是在一个行走区域上,这是交叉口内的一个区域,但当我在这里右键单击时,我必须选择这个。好了,所以这是一个行走区域,我在这里标记它,我将它添加到选定对象的集合中,这允许我通过将边颜色更改为“按选择”(by selection)来在视觉上更突出地显示它。我想我选错了,所以让我们从选定集中移除这个,再试一次。现在在这一部分,当我右键单击时,我只得到路口(junction),为了获得同一位置的所有对象,我按住 Alt 键,然后再右键单击,所以这是我想要选择的那个区域,现在我们可以更好地看到它有一个非常奇怪的形状,它有这个小三角形,然后那里还有另一个三角形,如果我们想只看到所有这些而没有其他东西,有一个巧妙的技巧,您可以简单地使所有未选定的内容透明,并且也隐藏路口形状,现在您可以看到这是行走区域的形状,在网络生成过程中发生了不好的事情,所以如果我们想消除这个警告,最好的方法是修复网络,我将在下一步向您展示如何做到这一点。所以让我们在 netedit 中看看那个交叉口。为此,我可以直接在原地启动网络编辑器,正如您所见,这个交叉口确实是多个路口的集群,这是来自 OSM 的结果,对于微观仿真来说通常不是很好,有这样一个集群。自动网络转换会尽力合并这些集群,但有时您必须手动完成,所以我切换到选择模式,此按钮或 S 键,您可以在底部看到按下了哪些键,然后我左键单击此路口集群的所有部分,然后将它们合并为一个单一路口。这是联合选定的路口功能 F7,现在这里只有一个点,我想看看几何形状,这是 F5 键“计算路口”(compute junctions),然后我就得到了。现在这个形状好多了,我们看不到任何奇怪的三角形,然而,在修复这个路口的过程中,我们丢失了人行横道。所以让我们也恢复这个。还有另一种模式,就是人行横道模式(crossing mode)。所以我可以按 R 键进入人行横道模式,然后我点击我想添加人行横道的路口。然后我点击所有应该被穿过的人行横道,直到它们都变成亮绿色。然后我创建人行横道或按 Enter 键,效果相同。现在网络修复了。我们完成了吗?还没有,因为我们改变了网络中的边。所以我们必须重建交通。所以您只需运行构建批处理文件,这就是它的用途。但在执行此操作时,请确保在 Windows 上已关闭 sumo-gui,否则它将阻止您覆盖文件。现在,我们进入下一步,我们已经更改了网络,现在当我们在该位置运行仿真时,我们可以看到几何形状看起来好多了。我们还可以看到在该网络部分不再发生行人堵塞。好了。继续。更多奇怪之处。所以我们发现在场景结束时,有很多关于行人错过公交车的警告。所以基本上,他们在场景结束时中止了在公交车站的等待。这种中止是一个便利功能。仿真注意到不再有公交车来了,只有等待的行人。因此自动终止仿真是合理的。但当然,有一个警告。现在,让我们找出为什么这些人错过了他们的公交车。首先,让我们看看输入文件。所以我们选取第一个人。它叫 ped774。我们会在输入文件中找到它。这是场景的一部分。OSMPedestrians.rou.xml。我已经提取了描述这个人正在做什么的相关 XML 代码行。在这一点上,这个人进入场景,它步行到一个公交车站,所以这里它以步行开始,步行在公交车站结束,然后它想乘坐这条线路 160:0 到另一个公交车站,它甚至知道这个人想乘坐哪辆公交车,是这一系列公交车中的第五辆,它在这个时间出发。所以这是计划。然后最后,在到达第二个公交车站后,它应该再次步行到其目的地。但不知何故,这没有奏效。这个人一直在那个公交车站等待,公交车没有来。
所以为了解决这个问题,我们基本上有两种策略。一种是查看仿真生成的输出数据,第二种是查看用户界面,在 sumo-gui 中。我们当然会两者都做。所以看看它们如何相互补充。对于数据驱动的分析,我们将运行仿真并生成输出选项。看起来像这样。如果您有一个命令行窗口,这是 sumo -c,这是配置文件的选项。当然,我们需要一个文件名。就是这样。所以现在,完成之后,我们在这个文件夹中有了一个新文件。这是 tripinfo 输出。它看起来像这样。这是另一个 XML 文件,它保存了仿真中所有汽车和所有行人的信息,并给出了他们所做事情的总结。所以我已经为您复制到了幻灯片上。我们可以看到,这个人所做事情的不同阶段,它在步行,然后它在访问一个公交车站(这是自动生成的),所以您在输入中找不到这个,然后有一个乘坐(ride)和最后的步行,但在这里我们已经可以看到车辆是 NULL,所以没有合适的车辆,出发时间有一个错误值 -1,这是一个错误值,到达也有一个错误值,所以乘坐没有开始,也没有到达。所以下一个步行没有出发或到达。我们可以看到这个人到达车站的时间,到达车站的时间是 3201,而公交车的出发时间是 3156。所以公交车被错过了大约 45 秒。当这种情况发生时,您不讨厌吗?那么为什么会发生呢?嗯,这里的关键信息是速度因子(speed factor)和时间损失(time loss)。这里的速度因子意味着这个人走得比平均水平慢。每个人都会被分配一个因子,一个以 1 为中心、标准差为 0.1 的随机因子。这描述了行人的步行速度,即行人的最大步行速度。所以他们不是都以相同的速度行走。所以这是一个慢行人。其次,还有时间损失。所以一个走得比其期望速度慢的人会相对于其预期损失时间。所以这个人走得更慢。发生这种情况的原因是,除了这个随机速度因子之外,在步行过程中还有一些随机的减速。所以一个行走的人不是以恒定速度行走,而是步行速度有一些变化,这是由 SUMO 选项控制的。基本上这意味着这个人平均只以其最大速度的 90% 行走。这导致了 71 秒的损失,并最终错过了公交车。这就是我们从数据中得到的。但我们也做一个视觉分析,看看这在 sumo-gui 中是什么样子。所以我们知道这个人出发时间是 2519。所以让我们在仿真中跟踪这个时间。我将设置一个断点到出发时间。我们将运行仿真并将其转发到那个时间。所以那是 空格 键,它在运行和停止之间切换。您可以在所有菜单中查看这些热键。现在我想去那个人开始的地方。所以我会找到它。我们可以做的一件事是跟踪它的速度。为此,我右键单击这个人,然后显示参数(show parameter)。实际上,我想我找错了人。因为我们在,让我们看看。这个。显示参数,这里您可以看到我们已经讨论过的速度因子,现在,当我左键单击此图标时,我会得到一个随时间变化的速度图。 让我们跟随速度。我们可以做的另一件事是跟踪这个人。让我们看看,这个人沿着道路快乐地走着,然后有这个额外的阶段,沿着这条细线,这个人到了公交车站,可惜太晚了,这里您可以看到步行速度,您可以看到它随时间变化,这大约是步行速度的 至少这向您展示了如何找到一个人,跟踪一个人并绘制其属性。它仍然错过了公交车。那么我们如何解决这个问题呢?嗯,有几种方法,我们可以做得更好的规划,只是假设行人走路时会更慢,所以默认假设行人以 75% 的速度行走,但我们可以在交通生成中减少这个值,然后所有的时间安排都会有更多的余量。另一个选择是,我们可以在仿真中规划多式联运路线,而不是事先规划,这样我们就知道行人实际的速度是快还是慢,从而规划他们的路线,最后的解决方案是我们可以发送更多的公交车。那么这如何实现呢?对于不同的缓解措施,您都可以在教程文件中的“catch bus”文件夹中找到,嗯,如果我们通常以慢速步行速度进行规划,那么这个特定的人赶上了公交车,但其他人仍然错过了。如果我们在仿真中规划多式联运路线,那么更多的人将能够赶上公交车,但仍然有 2 次错过,如果我们做最后的缓解尝试,那么,嗯,只要我们发送足够的公交车,每个人都可以赶上一辆,因为最终会有一辆下一班公交车。好了,对于最后一个奇怪之处,这个没有产生错误,但它可能仍然让您感到疑惑,所以我们在一小时内指定了交通需求,但仿真在第一个人进入后两个多小时才结束,这是您可以在仿真最后一行看到的内容,这里,仿真在此时间结束,那么是什么花了这么长时间?我们再次可以进行数据驱动的分析,我们可以查看行程信息输出,看看最后到达的是谁,或者我们可以使用 sumo-gui 来查看在仿真结束前谁仍然处于活动状态。所以我们无法在最终画面中看到这一点,因为那时每个人都已被移除,但如果我们设置一个断点到几乎仿真结束,比如时间 7835,然后重新运行它,那么我们就可以看到仍在行走的人。所以让我们找到这些人,我们不想要蓝色的那个,所以让我们让它们更显眼,我们可以把所有东西都放大,我必须根据它们的模式给它们上色,然后我们有这个绿色的人,他正在行走,我们可以弄清楚它在哪里行走,我们可以看到它在整个网络中行走。让我们稍微调整一下夸张程度,让这个更明显,所以您可以看到这是一个蜿蜒穿过网络的路径,所以这是一个非常非常长的步行,这实际上是导致问题的原因,如果我们看得更近一些,我们会发现网络中有一些人工制品导致了这种长距离步行。当然,网络只是柏林这个大城市的一小部分,在我们切断网络的地方,我们切断了一些连接,所以实际上这个人必须绕道绕过这些缺失的边,这发生在两个地方。如果我们看得更近,我们甚至可以发现一个小的连接问题,那里缺少一个人行横道。所以仅仅看这些奇怪之处就教会了您很多关于您的场景以及您可能想要改变的事情,例如,为您想要模拟的内容选择一个更好的边界框。
行人模型#
现在,进入教程的下一步,我想向您展示一些行人模型。因为我们确实讨论了行人和在周围行走的人,现在的问题是,他们实际上是如何行走的?嗯,SUMO 确实提供了不同的行走模型。但首先,让我们描述一下我们想要看的场景。这是五金店的春季大甩卖,每个人都想买园艺用品。我们这里有一个五金店,这里有一个入口,然后是一个大停车场,每个人都必须穿过它。当然,我们非常环保,所以每个人都乘公交车去五金店买东西,所以他们必须穿过整个停车区域。所以要在 netedit 中设置这个,我们必须定义一个人流。以下是操作步骤。所以我在这里启动 netedit,并打开网络。您看到一些背景,我也在这里加载了形状。这里是五金店,还有停车场。那么我们该怎么做?netedit 有三种主要模式,一种用于网络编辑,一种用于交通需求编辑,一种用于数据编辑。现在我们想定义一个人流,我们进入需求模式,即 F3 键。然后我们进入行人模式,P,然后我们定义一个人流。所以是需求和行人模式。热键总是在菜单中。所以 P 将是行人模式。现在我们选择的不是单个人,而是一个人流。我们点击起点边。我们用这个。然后是目的地边,是这个。然后我们定义我们想要的流动类型。让我们不要等间距,而是使用泊松分布,就是这个。然后我按“完成路线创建”(finish route creation),或按 Enter 键。这就是人流。当然,我们可以以相反的顺序做同样的事情,我们会得到另一个人流。所以让我们看看为此生成的文件。当我们将其保存到文件时,我们有两个人流。它们看起来像这样。现在,让我们看看第一个行人模型。它是默认模型,称为“条纹模型”(striping model),因为它将人行道和其他行走空间划分为一些条纹,行人并行行走。所以这是第一个 SUMO 配置。让我们看看它们怎么走。所以您可以看到行人在这里双向行走。颜色是根据角度,但哦不,有一个大堵塞。嗯,它在某个时候确实自己解决了,但真的很混乱。所以,直白地说,这个模型,如果有很多人在很小的空间里,它就有问题。所以它适用于人行横道和人行道,但可能不太适合每个人都想穿过这里的小路。我们能做什么?也许每个人都遵循相同的路径没有意义。所以也许他们应该分散在停车场上。这样会更有意义。所以我们可以设置一个 SUMO 选项,让行人在停车场上随机化他们的路径。让我们看看它是什么样子。所以再次,我们有我们的行人在行走,但为了更好地欣赏他们在哪里行走,我会再次把他们变大。现在,如您所见,他们正在分散开来。而且,他们不会那么快在这个区域堵塞。所以好多了。不幸的是,仍然有这么多交通,他们都必须靠近这些位置。即使他们可以在中间分散开来,许多人也必须经过这条路。所以在仿真 25 分钟后还有一次堵塞。好吧。但这还不是结束。我们可以让行人更聪明一点,让他们总是为迎面而来的交通预留部分道路,所以我们可以设置这个 SUMO 选项来预留一点空间,如果我们看看这个,最终,没有堵塞了。所以他们在利用空间方面只是更谨慎了一点。所以如果您有一个行人交通量不大的典型场景,您不需要这个选项。但对于像这样的场景,设置它很有帮助。只是要知道,它仍然不能保证完全避免任何类型的堵塞。所以如果您用不同的随机种子多次运行此仿真,那么每次运行的行为会略有不同。其中一些运行可能会看到堵塞。这里我们可以看到这次运行没有发生任何堵塞。行人,嗯,您看到他们走得相当直接。让我们再看一次。让我们真正看看他们行走的细节。所以他们在空间上分散开来。他们互相避让。但这里要注意的一点是,他们总是向前走。他们从不后退,即使是为了避让对方。他们可能会侧向移动,但绝不后退。所以让我们看看另一个模型。一个新的模型。它是最近添加到 SUMO 中的 JuPedSim 模型。我们可以在第三个配置中看到这个。要激活这个模型,我们需要设置这个选项:pedestrian model JuPedSim。它看起来是这样的。首先,您会注意到所有适合行走的空间都有一个额外的颜色,只是为了更清楚地表明这里有 JuPedSim 在运行。但您可以在行人设置中禁用此功能。“显示 JuPedSim 网络”(Show JuPedSim network),只需禁用复选框。另外,让我们把行人变大一点。所以您看到他们如何行走。所以再次,这是他们都有相同路径的情况。这里没有随机化。看起来相当流畅。他们没有堵塞。您可能还会注意到它运行得有点慢。因为我这里没有设置任何延迟。但仍然很容易跟踪他们。让我们讨论一下速度,实际上。首先,速度取决于总网络大小。至少对于当前版本的 JuPedSim 是这样。所以最好不要在这里有大的网络。而是切出较小的部分。我们最近了解到速度减慢的原因之一。所以未来可能会消失。但我们这里仍然有一个优势,就是只有一个小网络。只需要多大就多大。即便如此,条纹模型的运行速度大约是真实时间的 6000 倍,而这里的模型运行速度是真实时间的 10 倍。所以。是的。两者之间有一个 600 的差异因子。不幸的是,这个模型还有另一个缺点。这就是它还不能与汽车或交通信号灯交互。所以目前只适用于纯行人仿真。我们计划改变这一点,也增加交互。现在,为了好玩,如果我们也做路线随机化,所以我们将行人分散在整个停车场上,那么,我们可以看到一些更有趣的互动。在一个角落这里。所以转发到一个有趣的情况。在 10 分钟,等待它,现在如果您仔细观察,我们可以看到行人确实在互相互动,他们有时会后退,他们跳着小舞。所以您看到这真的是一个不同的模型在里面。它不再是条纹模型了。当然,他们在避让对方。好了。我们完成模型了吗?还没有。SUMO 还有一个模型。它叫做非交互模型(non-interacting model)。所以它真的非常快,甚至比条纹模型快十倍。在这个模型中,行人跳过路口,他们不与任何东西交互。当然,它不会堵塞。那么什么时候您想这样做呢?嗯,主要是如果您对公共交通之类的东西感兴趣,并且您希望将不同的乘坐阶段与一些粗略的步行时间估计连接起来。所以如果您对步行本身不感兴趣,只对行人做的所有其他事情感兴趣,那么您可以使用非交互模型来加快速度。这就是行人模型的全部内容。
飞行出租车#
进入下一个主题,飞行出租车。正如我们之前讨论的,这个场景有几个障碍,这是由于网络的切断以及中间有一条运河和一条高速公路造成的。所以许多行人必须步行或绕远路才能到达目的地。嗯,在这种有这些长距离绕行的情况下,我们有一个理想的试验台来测试未来的出行方式。所以飞行出租车,它们可以直接越过障碍物,拥有快速高效的路线到达目的地。所以我将带您完成所有需要的步骤来模拟飞行出租车。现在,第一步,有一个小问题我们必须解决。因为目前,SUMO 中的出租车,它们确实需要使用出租车车辆类别(taxi vehicle class)。它们还不能是飞机。所以我们要做的第一件事是移除所有道路上的出租车许可,因为我们希望我们的出租车飞行。我们不希望它们在道路上行驶。所以首先,我们想要一个出租车无法行驶的网络。为此,有一个小的 Python 脚本,叫做 patchVClasses.py,甚至在教程文件夹的 flying_taxi 文件夹中有一个批处理文件供您运行。它是 buildnet 批处理文件。接下来我们做的是使用 netedit 在网络中定义起飞和着陆区。所以让我们来做这个。让我们加载网络。所以我挑选了几个点,总共三个。这些着陆区看起来是这样的。它们基本上是断开的边,只允许出租车通行。所以如果您想创建这样一个边,您可以进入创建边模式。然后您设置许可。所以在这种情况下,首先不允许所有东西。然后只允许出租车。然后我们可以创建一条边。就是这样。也许我们也想改变边的宽度。所以默认宽度是,嗯,实际上是 3.2 米。这里我设置为 6 米。所以现在,让我们让这个更明显,让我们找到网络中所有允许出租车的边,总共三条边。为了使它们突出,我们可以使用这个视觉缩放功能。您可以看到这里这些是为我们飞行出租车分布良好的飞行、着陆和起飞区。
下一步。我们必须定义停靠点。嗯,我们想称它们为空中停靠站,但 SUMO 中没有这个,所以它基本上是一个公交车站,用于空中巴士,飞行巴士。所以我们在每条这样的边上放置一个公交车站。这可以在附加模式 -> 公交车站 -> 点击中完成。然后我们必须通过定义一个通道(access)元素将其连接到行人网络。所以我们首先点击公交车站。然后点击人行道。这就是我们的通道。我们对所有着陆和起飞边都这样做。然后将公交车站保存到一个文件。现在我们要做的第三件事。SUMO 中还没有飞行模式。所以我们将创建平面边,将每个点,嗯,每个着陆和起飞边与这些边中的其他边连接起来。为此也有一个 Python 脚本。用于在特定边之间构建一个完全连接的图。这是文件夹中的另一个批处理文件。实际上是 buildnet2。它运行构建完整图,所以是 buildnet2.bat。好了。这是第三步。对于第四步,我们定义出租车。嗯,在网络中运行的飞行出租车。这又是需求模式。我们定义车辆。嗯,首先,我们定义一个新的车辆类型。所以我们在这里创建一个新类型。我们更改属性。所以让我们这是一个出租车。但让它至少看起来像一架飞机。这里。也许我们想更好地适应飞机的宽度。看我想要哪些值。长度和宽度。六米。是小的。好了。现在我们有了出租车类型。我们可以创建该类型的车辆。我们把它放在这里。注意所有允许此出租车行驶的边都是绿色的,所有不允许的边是青色的。这是一个冲突。放在这里,按回车,我们就有了它。当然,我可以这样做多次,如果我想在网络中有多架飞机。现在,第五步。我们希望所有行人都能使用新的出租车模式。到目前为止,他们只能步行和使用公共交通。但出租车是另一回事,因为它不按时刻表运行。所以我们必须更改生成交通需求的文件,即构建批处理文件。我在这里高亮了我们要做的所有更改。在行人的属性中,我们添加了出租车模式。在加载的附加文件中,我们添加了公交车站、空中停靠站,并保存到一个文件。然后我们需要设置两个选项,定义人们可以在哪里上下出租车。所以我们将其设置为 ptStops 的值,这意味着所有公共交通站点,如公交车站。当然,我们还需要调整网络名称,因为当我们修补网络时,我们给了它一个新名称。然后我们可以生成新的行人需求。让我们看看运行批处理文件后它是什么样子。正如我们所看到的,有一些行人。现在他们想步行,然后乘坐出租车。所以让我们看看仿真。最好把行人变大。所以您可以看到第一架空中出租车在这里。您可以看到行人,他们被接走并飞往目的地。哇!他们飞来飞去。嗯,我们满意吗?还不完全是。一旦仿真完成。首先,我们看到实际上有堵塞。看看这个堵塞。但最重要的是我们看到,在仿真结束时,有很多人中止了等待出租车。有些停止了。那么。这背后的原因是什么?让我们讨论一下。在我们现在使用的设置中,每辆出租车只运送一名乘客,运输能力不足。这意味着许多乘客不得不在仿真结束时中止他们的飞行,不得不中止等待飞行。那么我们能做什么?我们可以允许拼车。所以让我们每辆出租车至少运送四个人。实现这一点的方法是,要么为个人定义一个组,同一组的每个人可以共享一辆出租车,但我们可以简单地为所有人设置一个默认组。所以他们都在同一个组,他们都可以拼车。如果我们这样做,它运行得更好。只有 12 人无法登机。所以效率高得多。但我们还可以做其他事情。因为出租车的默认调度算法,它试图非常公平。它试图按人到达车站的顺序为他们服务。所以先到先得。这可能导致浪费的飞行。因为一架飞机可能空机起飞去接另一个先到的人。所以我们可以将调度算法更改为称为贪婪最近(greedy closest)的算法。这在出租车资源上更有效,因为它让每辆出租车接走最近的人。如果我们这样做,那么几乎每个人都能赶上他们的航班。最重要的是,服务效率大大提高,平均等待飞行时间减少了 3 分钟。所以您可以看到,为了让出租车服务高效,您可以做很多事情。我们也可以从输出中得到这个。如果仿真写入行程信息文件,那么我们可以使用 SUMO 附带的这个工具,attributeStats.py 工具,它告诉我们行人的旅行时间是如何分布的。所以我们可以看到不仅平均总体旅行时间下降了,而且最大旅行时间也下降了,因为所有本应长途步行的人现在可以快速飞行。我们还可以得到一个小图,SUMO 附带另一个 Python 工具,可以从输出文件生成这些图,如果您想看看它是如何工作的,教程文件夹中有一个批处理文件调用此工具,这里我们可以在 x 轴上看到旅行时间,在 y 轴上看到计数。所以哪个旅行时间发生了多少次?我们看到没有出租车的版本有很多高旅行时间,而有出租车的版本有更多中等大小的旅行时间。这就是为什么最大值和平均值在飞行出租车仿真中得到改善的原因。所以总之,飞行出租车很棒,如果您能实现它们。我祝您在使用 SUMO 工具开发仿真时获得很多乐趣和成功。在提问之前,请务必阅读文档。但如果您有任何问题或发现任何错误,请报告到此地址或在 GitHub 上提出问题。与我们交流。我们一直在寻找项目合作伙伴。谢谢。
其他会议教程#
查看我们的其他会议教程,此处。
