2019 教程

本教程将展示网络编辑、可视化交通数据、来自 OSM 的公共交通、停车、netgenerate 等功能!

文件#

视频#

观看 2019 教程

文字记录#

介绍#

欢迎大家参加今年的 SUMO 用户教程。我叫 Jakob,我是 SUMO 的主要开发人员之一。今天,我将向大家介绍 SUMO 的一些新旧特性,关于功能以及如何实现它们。我们将从一个基本场景开始,然后转向更高级的功能。正如我所说,这不是第一个教程。这算是每年会议开始时的一个传统。而且这个教程还有一个非官方的传统。每次我准备这个教程时,我都会尝试展示各种新功能,没人见过的功能,甚至我自己都没怎么试过的功能。所以像往年一样,在准备好教程之后,总会有那么一点忙乱,要让一些实际上还不工作或者无法展示的东西跑起来。 所以在你们拿到的 U 盘上,你们会找到教程幻灯片。如果你们想跟着教程走,之后复现它,你们会找到数据文件。一直实时跟着做可能有点太快了。但如果你们想跟着做,U 盘里也有 SUMO 的最新开发版本,因为今天我要展示的一些东西,在最新的 1.2.0 版本中是无法工作的。所以,尽管我们刚刚听说的 Eclipse 版本非常新且令人兴奋,但它已经过时了,被更新的代码取代了。 如果你们去 SUMO wiki,那里有一个教程页面,下面有 SUMO 用户会议的子部分,你们应该可以在那里找到 2019 年的文件。否则,就出去再拿一个 U 盘之类的。我们没有太多时间做教程。我会尽量说得快一点,点得非常快。但在那之后,有一个“Ask Us Anything”(有问必答)环节。所以任何较大的问题都可以留到那时,我会尽力回答我能回答的一切。好的。 简单概述一下,我们将从一个非常快速的场景生成开始。怎么做?然后我们会看一个场景,就是这个快速生成的场景,看看出现的一些警告,并用 netedit 修复它们。然后我们将不仅查看车辆,还查看一些关于交通的聚合属性,以对模拟场景有一点感觉。然后我会展示公共交通和多模式路由的一些方面。然后对于一些可能最令人兴奋的部分,我们将展示一些可视化的交通需求编辑,因为在过去的 17 年里,用户都必须手动编辑 XML 文件或使用自己的脚本来生成它们。现在是第一个基本上可以可视化的获取需求的版本。然后我会展示一些关于停车的功能,只是非常简短,因为 Lara 会在演示环节展示更多停车功能。然后我会稍微谈谈 netgenerate,也就是合成网络生成。那么我们开始吧。如前所述,要跟上进度,你需要 1.2.0,或者更好的是,最新的开发版本,来运行教程中的一些脚本。你还需要 Python。使用 Python 2 还是 3 真的没关系。大多数时候人们甚至可能不知道两者之间还有什么区别。还有一些文本文件,你可能需要一个好的编辑器来编辑它们。好的。我们开始吧。

osmWebWizard#

当你下载 SUMO 时,你有二进制文件,也许还有一些例子。但你真正需要让模拟运行起来的,基本上是两样东西:一个 SUMO 可以加载的网络,以及你需要的交通定义。也许你还需要基础设施,红绿灯,公交站点,所有这些东西。根据你的数据来源,把这些东西组合起来可能相当困难。但我们为你提供了这个工具,可以让你更快地开始。这就是 OSM Web Wizard,它使用来自 OpenStreetMap 项目的数据。这里谁不知道 OpenStreetMap?好的。你会弄明白的。基本上,它就是地图界的维基百科。所以这里有个小工具。让我们看看它是否能在演示中工作。如果你的 sumo 文件夹在某个地方,那么有一个 tools 子文件夹,里面就有 OSM Web Wizard。如果你安装了 SUMO,你甚至可以在开始菜单里找到它。那么它是做什么的呢?如果你的网络连接实际上是有效的(虽然我可能没有),它会显示一张地图,你可以在上面选择一个区域。然后你还可以选择一些你想要看到的交通元素,卡车、行人、自行车,所有这些东西。我们就在这里继续吧。它看起来会像这样。当你完成了所有你想要的交通特征的选择后,有一个小小的“生成场景”按钮。就是这样。它在后台从 OpenStreetMap 下载数据,处理这些数据,然后给你一个基本的模拟场景。

生成的模拟#

它甚至会打开 sumo-gui 并为你运行那个场景。它真正生成的是一个包含大量文件的文件夹,所有我提到的东西:网络、基础设施、交通,实际上是不同模式的交通,所以有很多文件,还有一个运行所有这些的小配置文件。我来给你看看它长什么样。你也会有这个文件夹,它会被生成,作为以数字零开头的文件夹中的教程文件的一部分。所以让我们看看。这个文件夹叫 "adlershof_wizard",因为这就是我们所在的地方,也是我选择的区域。所以当你运行它时,你会看到类似这样的东西。顺便说一句,抱歉跳过了一个重要提示。我们会录制这个教程。主要是屏幕和我的音频,所以你们应该是安全的。想笑就笑吧。我唯一忘记的是真正开始录制。所以现在应该已经在录制了。再次欢迎大家来到 SUMO 教程。好的。现在,我们这里有什么?我们有一个模拟网络的视图。这里有一列火车在运行,这里是火车站,我们在德国航空航天中心(DLR)。这就是你们进来的地方。这个圆形建筑,就是我们目前所在的地方。再说一遍,据我所知,谁不熟悉这种东西?谁真的需要解释 sumo-gui?太好了。那我就可以说得快一点了。我们稍微运行一下。当然,在这个缩放级别下,车辆非常小。我喜欢做的是把它们变大一点。如你所知,你可以做很多事情让车辆看起来不一样。既然我们在录制这个,所有鼠标点击也都被录下来了。你可以直接看视频,就知道我点了哪里。现在我们有很多车在跑。还是有点无聊。让我们看看它们跑得有多快,只需给它们上点颜色。所以让我们根据速度给汽车上色。这样好多了。现在我们可以看到火车了。它们是蓝色的。它们跑得真快。在十字路口等待的交通是红色的。我们还是没有看到所有东西。所以让我们也让行人突出显示。现在你看到这真的是一个多模式场景,有很多行人在街上跑来跑去。 我们再加一点信息。让我们根据它们在做什么,根据它们的模式来给它们上色。所以如你所见,大多数行人现在被涂成绿色,这意味着他们在四处走动。但也有一些是蓝色的,这意味着他们在使用公共交通。他们正坐在一辆车里。如果我们放大,我们可以在这里看到一个,比如说,抽象的表示。他们都坐在公交车上。当然,这并不完全是他们在公交车里的坐法。我们不模拟公交车的内部,但至少你可以通过点击它们看到有多少人,是哪些人。顺便说一句,这是新功能之一,对乘车人员进行详细、独特的可视化。好的。

修复网络问题#

这就是这个场景,如果你从很高的层次看,它看起来很好。但让我们稍微看看细节。当我们开始模拟时,我们得到了一些警告。这个警告真的很棒。你甚至无法,它甚至占不满一整行。它说的是一个感应式交通信号逻辑,有一个非常非常长的 ID,以及对缺少检测器的不满,没有控制检测器。还有一些其他的警告。一些红绿灯实际上——不,这都是——没有控制检测器。然后是关于公交站太短的警告。好的。让我们理解一下这里发生了什么。基本上模拟运行良好。我们甚至可以点击这些警告看看,哦,这把我们带到了一个看起来非常有趣的十字路口。嗯,交通正在通过这些十字路口。看起来不算太糟。实际上交通很少。这个十字路口本可以有更多的交通。但不知何故,模拟并不满意。好的。我们还看到这里有很多奇怪的线。这些应该是自行车通过十字路口的标记。但如你所见,它们并不在你期望看到自行车标记的地方。它们基本上到处都是。那么,让我们进入教程的下一步,详细看看那个网络。好的。那么进入下一个文件夹。只是为了向你展示如何到达那个地方。我们有关于十字路口的这些警告。如果我点击那个,我会跳到那个十字路口。现在我想在图形网络编辑器中查看网络的同一部分。所以我已经到了正确的地方。我按下 Ctrl + T 或者菜单按钮“在 netedit 中打开”,这就是我看到的。我已经注意到有一些奇怪的自行车道穿过这个十字路口或进入这个十字路口。我可以从颜色判断这些是给自行车用的。实际上还有这些小自行车符号。所以我认为这里发生的是,那些把数据输入 OpenStreetMap 的人,他们以一种有点奇怪的方式建模。他们在那里放了一些额外的边,而他们本可以说这条路旁边有一条自行车道。 OSM 数据模型在这里相当灵活。他们没有以一种网络导入器可以轻松处理的方式进行编辑。所以我们得到了一个奇怪的十字路口。让我们把它去掉。所以我只是删除了这些多余的边。我是这样做的,你们可以从录像中看出来,我按了 D 进入删除模式,然后我点击了这些东西。然后我用 F5 键重新计算网络。哎呀,那是什么?现在有奇怪的行人过街处。这些可能是为这些多余的自行车边生成的。所以让我们也把它们去掉。颜色告诉你它们基本上处于无效状态。所以修复或删除它们是个好主意。好的。所以这已经看起来好一些了。现在让我们看看信号计划。因为那个信号计划是为所有那些自行车边而建的。也许它现在状态不太好。我按了 T 进入红绿灯模式。现在我可以点击它。在左窗格中我看到了信号计划。是的,它有相当多的阶段,嗯,它们对我来说看起来有些多余。例如,有一个阶段是大多数行人过街处是激活的。还有另一个是那样的。是的,这看起来不太对。所以现在最简单的事情就是重新生成红绿灯,因为我们改变了拓扑结构。 对于那些使用 SUMO 一段时间并不得不处理红绿灯的人来说,总是存在一个问题:什么时候该重新生成,或者编辑器应该什么时候重新生成红绿灯?你改变了一些连接,也许你不想丢失你在编辑上所做的所有工作。所以在当前状态下,编辑器相当保守。如果你删除东西,它会尽量保留你之前工作的部分,这现在导致我们需要手动重新生成红绿灯,因为刚才的猜测很糟糕。所以我们删除红绿灯。现在我们必须重新生成这个。也许我得先解释一个小问题。那些警告信息,不仅仅是针对任何类型的红绿灯,而是针对感应式红绿灯,这意味着 SUMO 会自动添加一些检测器,红绿灯根据这些检测器上的检测来切换。所以这是一个智能红绿灯。不仅仅是固定的周期,而是对交通做出反应的,这对于自动生成的场景通常是个好主意,因为模拟无法知道你将放入什么交通或者随机交通会做什么。所以这些感应式红绿灯,它们对你放入的任何交通都能做出智能反应。嗯,在大城市,至少在德国,超过 50% 的十字路口都有这种感应装置,所以做这个猜测并不太糟。只是交通运行得更好。好的。 所以我们现在想做的是,我们想在这里重建一个感应式红绿灯。所以,首先,我进入检查模式按钮 I,点击那个十字路口并将其重新配置为红绿灯。然后由于某些原因(可能以后会改变),我必须再点击一次。现在我在这里得到了一个额外的小字段,我可以控制红绿灯的类型。这个字段只对红绿灯节点可用。所以我将它切换到“actuated”(感应式),现在,让我们再次进入红绿灯模式,看看这个新的信号计划。如你所见,它比之前的要短得多。你可能之前没注意到,其中一些阶段有额外的属性。快速问一下。你们中有谁在 SUMO 中使用过这些感应式红绿灯?好的。相当多。所以在这里你控制这些感应阶段的最小和最大持续时间。当然,黄灯阶段和所有人都有红灯的阶段不是感应的。它们有固定的持续时间。但主要的绿灯阶段,它们有感应的持续时间。如果你仔细看,你可以看到有两个额外的列。我想我也应该在这里加一个标题行。来真正显示这些列是什么。一个是分配名称。基本上是给那个阶段一个人类可读的任意名称,这可能使理解红绿灯的情况更容易。至少比只有一个从 0 到 12 或其他的运行索引更容易。另一列是分配后续阶段的索引。因为你可能想模拟有分支转换的红绿灯。那么你真的需要明确说明某个阶段之后是哪个阶段。这就是这个新列的用途。如果你们对此有疑问,可以在教程后问我。或者在“Ask Us Anything”环节。好的。所以现在我们把这个十字路口修好了。还有一件事要解释。但首先我会保存这个并在模拟中向你们展示。好的。 所以我保存网络 (Ctrl + S),然后重新加载仍然打开的模拟。耶!大多数警告都消失了。所以...还有一个关于另一个十字路口的警告。但这个已经修好了。但再说一次,这些警告到底是关于什么的?它们是关于控制检测器的。所以也许看看它们会很好。为此,你可以在 SUMO 配置中设置一个额外的选项。我很快给你看看那是什么。所以...在所有这些文件中,你们大多数人可能都知道,有一个打开模拟的配置文件。我只需添加另一个选项。让我们再看一下。现在突然我们看到了所有这些实际上负责控制红绿灯的检测器。我们还看到另一件不幸的事。放置这些检测器的代码总是把它们放在进入十字路口的第一个车道上。所以如果你在十字路口前有一些非常短的边,效果就不太好。所以让我们也修复一下这个。至少对于这个十字路口。所以有一个快速修复方法。如你所见,在这一小行中,有一个十字路口。我们只需把它变成一个几何点。我们就搞定了。但现在我们做了一件危险的事。我们改变了网络拓扑。网络中实际上少了一条边,因为我们把它们合并了。但既然我们使用的是 WebWizard 生成器,我们可以为场景重新生成交通。还有一个小脚本可以做到这一点,它已经由 WebWizard 生成了。它重新生成所有东西。但不幸的是,我们用的是 Windows。在 Windows 上,你不能直接覆盖一个仍在应用程序中加载的文件。所以我们必须关闭模拟。重新构建它。所以万一你们忘了,我也把它放在幻灯片里了。你们必须关闭 sumo-gui 才能重新生成交通。好的。 所以让我们再看一下。现在你可以看到所有的检测器都离十字路口有一个合理的距离。嗯,实际上,我们得放多一点交通才能真正看到效果,因为现在,所有这些阶段可能都在以它们的最小持续时间运行。并且没有哪个阶段因为感应式红绿灯的逻辑而延长。好的。所以我们除掉了一些警告。同时,我们对 SUMO 中的感应式红绿灯有了更多了解。还有一些其他的警告,嗯,它们相似但不同。这里有一个说对于某个阶段,检测器不知道该怎么做。而这个阶段,嗯,让我们在编辑器中快速看一下这个阶段。我把它打开在正确的位置。它说的是阶段六。就是这个。这是一个只有从侧面方向转弯的阶段。所有行人都可以自由通行。所以基本上可能发生的情况是,有很多行人交通。所有这些转弯的车都得等着。所以感应式红绿灯的逻辑,它试图防止阶段保持开启很长时间的情况。所以它说“我真的不知道在这里用感应式红绿灯该怎么做”。这就是警告的内容。我们可以修复这个,例如,通过说,在这个阶段,只用于转弯运动。我们禁止这些地方的行人移动。然后,当然,他们就有真正的绿灯了。哦,不是那个。那个。那些。所以这将是修复这个问题的一种方法。警告就消失了。现在,因为编辑网络如此有趣,让我们看看最后一个警告。嗯,这看起来像是一个非常有趣的多模式十字路口。我们将通过做一些需要为许多来自 OpenStreetMap 的十字路口做的事情来修复它。我将尝试为那些可能没有遇到这个问题的人解释一下。所以 OpenStreetMap 中的网络模型,它通过许多、许多、许多更小的十字路口来建模这些复杂的十字路口,这些十字路口在某种程度上是相互连接的。即使这个代表 SUMO 中一个十字路口的圆圈,在原始的 OpenStreetMap 数据文件中也是由一、二、三、四、五、六、七、八、九个十字路口组成的。所以这里已经进行了一些处理。但显然还不够。所以我认为这里应该是一个十字路口。那么我们如何在 netedit 中修复这个呢?我们进入选择模式(我按了 S,你们可以从录像中知道),然后我将使用 F7 键将所有这些十字路口合并成一个。所以现在我们有一个了。既然我在这里,我可以顺便修复一些其他东西。我们谈到了短边,这是不幸的。现在我们还有什么?我们这里有一条边,一条多余的边,实际上只是一条人行道,根据我的经验。但在这里,它被设置为自行车道,这导致了十字路口上许多有趣的连接拓扑。让我们阻止自行车在这里行驶。所以这是你可以编辑的边的众多属性之一。既然我们在这里,让我们稍微移动一下几何结构,让它看起来更真实一点。所以当你详细查看十字路口时,相当重要的一点是,不仅十字路口的中心和形状的几何结构是什么,还有边进入十字路口的点是什么。你可以用 netedit 非常容易地编辑这些。所以在我们更改了这里的权限之后,让我们再做一件事。让我们重置所有连接并重新计算它们,因为如果我们不这样做,这里会有很多奇怪的连接。所以让我们重置所有这些并重新计算它。同时,让我们也重新生成红绿灯。哦,看起来还行,我猜。 好的。所以连接十字路口,是修复 OpenStreetMap 网络的一个重要概念。哦,我得做什么?我得做什么?绝对要重新生成交通,因为我通过连接十字路口并删除边来修复了拓扑。所以你们知道该怎么做了。 我们如何知道一个红绿灯是使用固定控制器还是感应控制器?这类信息不在 OpenStreetMap 数据中。所以现在,这是你在网络转换脚本中输入的参数之一,你说,默认情况下,所有十字路口要么是固定的,要么是感应的。然后之后,你可以手动重新分配类型。但导入器没有办法知道。所以,是的。我的意思是,这可能会改变,因为它们总是在变化。人们正在向 OpenStreetMap 输入新数据。希望他们也会把这类信息放进去。但到目前为止,他们还没有。 你说得对。但话说回来,人们把大量非常详细的数据放进去,他们肯定没有在街上打印出来。他们不知怎么设法做到了。所以,我们也许可以这样做。我们也可以添加数据。所以,现在,如你所见,我加载了模拟。还是不满意。好的。我知道这里发生了什么。这个十字路口的连接相当奇怪。所以,从这里可以看到,实际上有一条额外的车道用于转弯运动。但它只用于驶向这条边,这条边实际上是一条服务边,公交车可以通行。所以这并不完全奇怪,但它仍然不是应有的方式。所以,让我们修复一下。好的。这样好多了。所以这是按 C 进入连接模式,然后点击几下修复那些连接。啊,没有警告了。我现在很高兴了。好的。关于这个就这么多。现在,当我们运行模拟时,当然还会有新的关于这些公交站太短的警告。但这很容易修复。你只需,嗯,实际上,我会给你看。我会给你看。好的。所以,让我们看看一些公交站。所以这里,十字路口被奇怪地拉长了,没有足够的空间放公交站。还有另一个非常短的边,公交站放不下的情况。还有某个地方...我甚至不知道为什么那里的公交站这么短。所以,快速修复这个,然后我们终于可以有一个没有警告的网络了。我谈到了操纵边进入十字路口的位置。所以,我在这里非常小心地做这个。这将使十字路口小得多,然后就有空间放公交站了。嗯,也许我应该显示公交站。那样编辑起来会容易得多。所以我加载它们。Ctrl + A 加载基础设施文件。所以,让我们也编辑这些。这看起来对吗?是的,看起来对。这个现在看起来也好多了。还有一个公交站在某个地方。是哪个?也许是这个。看起来不算太糟。让我们把它变大一点。好的。当然,有菜单可以保存所有这些。但我会用快捷键,你们可以在录像中找到。Shift + Ctrl + ACtrl + S。 好的。现在我们有了大的站点。最后,在运行场景的前几秒时没有警告了。嗒-哒!太棒了。好的。所以,这些是我想为你们展示的关于在 netedit 中编辑网络的第一批内容。当然,这些不是特别重要的事情。它们不是破坏场景的事情。但通常,关注小细节,查看警告信息,看看那里发生了什么,是值得的。因为最终可能会是个问题。当然,那时你可以看看堵塞发生在哪里,你就知道问题所在了。好的。继续教程的下一部分。让我们可视化一些交通数据。

可视化交通数据#

所以,当然,模拟是在可视化交通。你看到了车辆。还有什么可看的?也许你想看一些聚合数据。也许你想看看所有车辆实际去了哪里。它们从哪里开始?它们去了哪里?在很长一段时间里,在 SUMO 中做这件事出奇地尴尬。所以我们让它变得容易了一点。当然,你仍然需要一些聚合的输出文件。但然后你可以在模拟中显示它们。那么,我们怎么做呢?我为你们准备了一些东西。所以,要获得某些类型的输出,你仍然需要更改配置并加载一些其他文件来配置输出。所以,在这个 SUMO 配置中,我们不仅加载了形状和站点。我们还加载了这个边数据 XML 文件,它基本上是说,嗯,为边保存一些数据,并在整个模拟过程中一次性保存。而且,如你所见,你可能不知道,你现在也可以为行人存储数据。这是这里的新功能,这个检测行人定义。所以当我们运行模拟时,它将记录这些文件。再次,让我们看看这些文件名。这里说要记录这个,在这个文件中,edgeData_vehicles。当你运行模拟时,这就是你得到的文件。一个给车辆,一个给行人。现在,我们有了我们的模拟。现在我们可以加载这个边数据进行可视化。让我们,嗯,让我们实际加载裸网络。所以,你可以单独加载网络,为了一个非常干净的外观。现在,让我们显示记录的数据。所以,这里有一个新的菜单项,“打开边数据”。我启动了模拟,然后我很快关闭了它,它覆盖了文件。所以,嗯,现在我必须运行它。 抱歉。但这让我有机会向你们展示更多关于你们能得到的东西。当然,你们可以以批处理模式运行 sumo,这通常会快一点。最近,它也会在开始时告诉你实际运行的是哪个版本。所以你可以看到这是比上一个 1.2.0 版本多出 280 次提交。我们也会把这个存储在输出文件中。应该差不多完成了?是的。好的。我们稍后会处理这些消息。但现在,我们得到了一些不错的统计数据。我们看到有多少车辆,多少行人,以及他们都做了什么。他们走路,他们乘车,其中一些人,他们确实错过了公交车,非常字面意思。但现在我们有了文件,我们可以看看那些。当然,所有东西都有快捷键。这个是 Ctrl + U。然后它至少告诉你它找到了多少属性。像密度、行程时间、等待时间这样的东西,所有这些,但它还没有显示出来。所以,这你必须在街道的可视化设置中配置。我们按边数据给它们上色。让我们按在该街道上行驶的车辆数量来上色,嗯,实际上是进入该街道的车辆数量。好的,我们必须配置我们想要的颜色。所以,它会自动做这个。它只是扫描整个数据范围。所以,交通量最大的边,它们有 242 个参与者。但实际上,低数字对我们来说不感兴趣,-1 表示没有数据。所以让我们做另一个彩虹。我们只显示至少有 1 辆车的边,或者比如说至少有 3 辆车的边。好的,所以这是用一个新的小开关重新配置这些颜色的另一种方式。现在,我们至少可以看到这是模拟中交通的主要场所。外面有一点交通。但也许我们也想看到数字。我很高兴地告诉你,我们可以。有一个小控件。嗯,当我们放大时,这个是可用的。当我们缩小时就不太好用了。但有一个按钮可以解决这个问题。所以,让我们让文本大小保持不变。这样至少不会造成太多视觉混乱。现在,我们真的可以看到数字了。例如,这条边上有 191 辆车。所以,这是 SUMO 可以帮助你查看数据的新功能之一。当然,你也可以查看里面的其他值,比如选定边上的等待时间。 好的,有什么问题吗?没有,稍后问我。当然,你也可以用同样的方式加载行人数据。在这些幻灯片上,我向你们展示了它会是什么样子。你已经可以看到这是来自行人的,因为网络密集得多。他们走在所有这些汽车无法通行的小边上。这里你有那些相关的控件来获取数字,并且不让它们太大。好的。

可视化轨迹#

另一件可能有用的事情是可视化轨迹,关于车辆的更微观的细节。当然,SUMO 可以写出这些轨迹,这是 FCD 输出(浮动车数据),但如果你想,例如,只获取沿某个网络元素、沿某段边的速度图,就必须小心。所以我们这里得到的新功能之一是使用这个新选项进行输出过滤,你可以选择只记录 FCD 数据的网络元素。然后有一个小工具,你可以用来根据各种质量绘制这些轨迹。你可以绘制速度与加速度的关系图。在这个例子中,我们绘制了 x 值与速度的关系,这是沿一段道路位置的一个很好的代理。所以现在我们基本上已经看到了车辆通常刹车和等待的地方。这些是十字路口。我将向你展示我在网络中使用了哪些边。以及我是如何得到它们的。所以这又是 netedit。正如你从幻灯片中看到的,我从这个文件加载了一些边。我是怎么得到它们的?嗯,通过在 netedit 中使用选择模式选择边。例如,像这样,然后只需将选择保存到一个文件中。所以这很简单。同样,如果你想研究一个十字路口,你可以只选择边,相关的边,然后你就可以得到那个十字路口的漂亮图表。所以这是伴随大约 100 个其他小工具的新小工具之一,除非你已经很好地意识到可能有有价值的东西可以看,否则不容易找到。所以 SUMO 工具文件夹相当满。里面有一些宝贝。好的。

公共交通#

让我们谈谈公共交通。我们看到的场景,它已经包含了公共交通。你注意到那些坐在公交车和有轨电车里的小人。我想解释一下这是怎么来的,因为交通大多是随机的。但公共交通是基于数据的。所以 OpenStreetMap 确实包含所有公共交通站点的位置。它还知道连接这些站点的公共交通线路。所以这已经是相当好的数据了。唯一缺少的是一个时刻表,告诉你,嗯,在这个时间点在这个站,然后几分钟后到另一个站。嗯,如果你有一个模拟器,这相当容易。你只需让公交车在模拟中行驶并记录停靠时间。这给了你一个非常基本的时刻表。当然,你仍然不知道真正的发车时间,相对时间,绝对时间,当第一条线路,这条或那条线路开始服务第一个站点时。所以这是你必须修复的东西。但如果你至少想要线路正确并由公交车服务,那么你可以利用,或者实际上向导在后台使用这个 ptlines2flows.py 脚本并生成一个公交时刻表。嗯,在 1.2.0 版本中,它把所有公交车都扔进去,不管它们是白天运行的线路还是夜间运行的线路。但如果你使用最新的开发版本,它已经能分辨出夜间线路在白天不运行。所以你有了更少的多余公交车。然后关于公共交通设施的另一个好处是,那些人,他们被定义为我想去,我想从这里到那里旅行。里面有一个小的多模式路由器,它会判断是走路还是使用一系列公共交通乘坐以最快的方式到达目的地是否合理。这一切都在后台自动发生。所以你在这里看到的是多模式路由的行人交通。部分步行,部分乘公交。好的。

调整公共交通#

但正如我们之前看到的,有些人错过了公交车。那里发生了什么?嗯,这个公共交通场景是为一小时的交通构建的,这也意味着在这些设置中,公交车只运行一小时。所以如果你错过了公交车,它真的走了。再也没有公交车来接你了。所以这是这里发生这种情况的真正原因之一。如果我们以公交车运行时间延长半小时的方式重新配置需求构建脚本,那么每个人都能赶上公交车。所以我可以快速给你看这是在哪里。所以有一个构建脚本。根据你在 Linux 还是 Windows 上运行向导,你会得到一个带有适当引号等的批处理文件。所以在某个时刻,来自 OpenStreetMap 的公共交通数据被导入。并且给出了一个结束时间。所以场景运行到第 3600 秒。在早期版本中,公共交通也运行到 3600 秒。如果你改变这个数字,它就会继续运行。错过了公交车的人仍然可以赶上下一班。所以你仍然可以问,我怎么弄清楚这个?我怎么确定这个场景里实际发生了什么?我想和你们一起快速看一下模拟,看看它是如何工作的。所以首先,让我们得到一个错误信息。让我们快速得到它。上面是模拟延迟。如果你把它设为零,模拟就尽可能快地运行。你看到所有的车都在开。如果你仔细看,你还能看到行人走路和坐公交车。非常好。还有坐有轨电车的。然后最终你仍然有行人在走路,我不想关闭,我这里有警告信息,“一个人在公交车站等待时中止了”好的,我碰巧知道这个 ID 暗示这个人是在模拟的第 3260 秒开始的,所以我将把模拟再次运行到这个时间点。当然,你也可以查看输入文件,看看这个人是什么时候出发的,我会在模拟运行时向你展示怎么做。所以有行人路线,让我们搜索 ID,我们找到了,这是一个行人,它在时间 3260 出发,好的,现在模拟停在那个时间,如果你错过了,我设置了断点,这里是 Ctrl + B,我让模拟在那个时间停止。好的,现在让我们找到那个人,好的,关于这个人我们能发现什么?我们可以发现它要去哪里,所以它正走向这个公交车站,大概是,但我们能发现更多,我们可以显示这个人的计划。所以这是一个相当简单的行程,这个人想走到“Magnusstrasse”站,然后它想坐一辆非常具体的公交车,希望在时间 3494 赶上它,然后坐到“Abtstrasse”,然后走一小段路。所以让我们看看结果如何。所以我们要追踪那个人,嗯,从这里看不清楚,所以我们让它更显眼一点,我们选择这个人,我们说让我们以放大尺寸绘制选定的人,所以这家伙现在更大了——嗯,让它更大——好的,所以许多人中的一个人,它被跟踪了。嗯,看起来不算太糟,但看这里公交车已经来了,哦,刚刚错过了公交车...当这种事发生时你难道不讨厌吗?那么为什么在这里发生呢?在 SUMO 中,行人的速度是根据速度分布设定的,他们不是像机器人一样以相同的速度行走,而是在模拟开始时,每个人都有一个随机数告诉他们你是一个走得快的人,你是一个走得慢的人,而在计算那些时刻表的时候,那个随机数还不可用,时刻表是由另一个应用程序构建的,所以基本上这家伙是一个走得非常慢的人,速度因子是 0.78,所以它就是有点太慢了,赶不上公交车,还有另一种方法可以修复这个——这就是我告诉你们这个的原因——我们也可以在模拟中直接加载那些行人行程,然后这个人就会知道“我是一个走得慢的人,我赶不上这辆公交车”或者也许“我能赶上另一辆”不幸的是,这本该一直工作的东西,但只在开发版本中工作,因为在模拟中,那个特殊的数字直到最近才被忽略,所以如果你有开发版本,你可以使用只运行一小时的公共交通,只有非常少的人会真正错过公交车,因为他们真的很倒霉地在红绿灯处等待,嗯,我想这也不是太不现实。人们确实偶尔会错过公交车。好的。这就是我想告诉你们的关于公共交通数据的内容,现在进入下一个令人兴奋的部分:公共交通编辑。

可视化需求编辑#

我实际上为你们打开了一个交通文件,你们大多数人都知道手动编辑会有多繁琐,它是几兆字节的非常详细的东西,你需要把边、站点等等都放进去,所以没有额外的工具真的很难做到,嗯,即使有工具,如果手动做也还是很难,但至少对于小例子你可以。所以让我们展示一下这是如何工作的。我实际上用 netedit 打开了所有的 xml 文件,这只是表明我通常做什么。好的,所以如你所见,有一个新的超级模式,一个用于在 netedit 中编辑需求的新大按钮,它在工具栏中给了你很多新工具,其中之一是创建新路线——按 R 进入路线模式——在那里你可以点击一个连续边的列表,这仍然相当繁琐,所以我们不那样做,让我们使用不连续的边,让我们只定义从这里到那里的路线。耶!所以这是根据这里采取的假设的最快路线,你也可以在这里放置中间点,然后它会把它们全部连接起来。所以我按 Enter,现在我们有了这条漂亮的路线,这不是很简单吗,好的,既然我们在这里,顺便也定义一个新的车辆类型,那是类型模式,所以我可以创建新类型或复制现有类型,然后为它们定义一个新名称,设置各种参数,然后设置更多参数,因为类型有很多参数,然后让我们为这个创建一个流量,我按 V 按钮进入车辆,我选择类型流量,然后我必须点击这条路线,我有了,让我们设置一些参数,比如说我们给这个上不同的颜色,这样它就能立即被识别,我们想要每小时 300 辆车,实际上为什么颜色变了?,嗯,公平地说,所有这些需求编辑都是在 1.2.0 版本发布之后才部分完成的,而且是在准备这个教程的紧张几周内完成的,所以很多东西仍然是前沿的,还会有补丁和功能到来,所以颜色有点变化我不知道,嗯,你们会注意到这个需求编辑在细节上仍然有点粗糙,但随着更多用户和更多反馈,它只会变得更好。好的,让我们保存它,看看我们刚刚创建了什么,所以手动组合路线、类型和流量本来已经相当繁琐了,现在要在模拟中使用它,当然我们必须更改配置文件以使用新文件,现在我在这里使用一个预设,实际上让我们不使用这个,让我们运行一些交通,好的,我们有这些新车了。很好。它们是流量,它们和常规交通一起运行,最终到达这里 DLR。好的,所以这是对可视化需求编辑功能的一个初步了解。我们也可以,让我们加点料,让我们打开一个需求文件。让我们打开乘客行程文件。希望它不会崩溃。是的,突然网络上满是汽车。你现在看不到的是,但将来你们会看到,有些边上有大量交通。所以这里,如果你点击它,你会看到重叠的元素。有几条行程从那条边开始。这里没那么多。我们可能会沿着边把这些行程分开,以便更清楚地看到不止一个。当然,如果你想同时编辑大量交通,什么是有用的操作仍然不太清楚。例如,如果你想把交通从网络的一个区域转移到另一个区域,也许最好把它们聚合起来。比如说定义交通区域,然后将这些个体交通重新分配回区域,只需改变区域之间的数字。我们仍在思考如何最好地支持用户做到这一点。好的。需求编辑就这么多。问:“这可以用来修改公共交通时刻表吗?” 是的,它已经支持站点。我们将在下一部分看这个。但我认为它仍然不是我们想要的,因为公共交通编辑,比如说,是一个特例。你真的想看一个站点序列,并查看时间如何对齐。而在这里,你可以点击站点元素,但它不是,例如,一个漂亮的表格布局。所以我认为我们需要更多的工具。是的?问:“可以用 netedit 定义人吗?” 我正要说到那个。

可视化需求编辑 - 展望#

那么需求编辑还有哪些要做?有相当多的错误需要修复。我们不得不在网络编辑器的架构上做相当大的改动以适应新模式,甚至深入到我们如何渲染对象的层面,因为突然我们有了这些大的对象,可能跨越整个网络的路线,我们不想一直渲染所有这些,否则会变慢。所以我们不得不做一些深入的更改,这使得快速推进变得困难,因为我们需要小心不要破坏太多东西。所以我们仍然需要大量的错误修复。我们需要有更好的方法来处理编辑器中重叠的对象,我们需要找到好的方法来编辑大数据集,使它们保持可管理。还有一个重要的功能仍然缺失。目前你无法图形化地编辑人。人比车辆更复杂,因为他们多了一个基本层。他们有这些包含不同项目的计划,而这些计划又有它们的属性。所以新的东西,人流量,已经可以工作了,你仍然必须手动创建它。但至少现在我们有了人流量。所以我对此相当满意。大约五、六年来我们一直想要这个。评论:“我们用 python 脚本来生成行人流量” 是的,是的。对于本该从一开始就有的东西的一个变通办法。但确实如此。所以你可以得到人流量。实际上让我们展示一个人流量。所以代码看起来是这样的。这里它只是非常抽象地定义了一个从一条边到另一条边的行程,允许的模式隐含地是步行和可选的公共交通。这是从 DLR 到火车站。当你看这个时,你会看到流量中的一些人实际上会使用公交车,而另一些会根据他们的出发时间使用有轨电车。所以他们并不被迫都做同样的事。 所以流量应该相当明显。他们都在公交车站排队。一些人坐公交车,一些人当有轨电车来时会坐有轨电车。为了让场景在视觉上更有趣,我将公交车和有轨电车的服务率提高了一倍。所以实际上没有那么多公交车在运行。哦,那是有轨电车。你看到了。好的。所以这就是人流量。玩得开心。好的。下一步,看看停车。

停车#

这个话题对一些参与者来说非常亲切。也有一些这方面的贡献。所以让我们看看如何对停车进行建模。我们加载我们的网络。实际上,我们也加载我们的流量。我把它放那儿了吗?没有。让我们从上一轮编辑中复制过来。它在那里。只是没看到。那是因为我看错了文件夹。对。所以我们有我们的流量。当我们切换到需求模式时,我们看到这个。比如说所有去德国航空航天中心的交通,他们必须在某个地方停车。所以我们添加一些基础设施。我们添加停车场。为此,我们必须切换回需求模式 -> 附加对象,让我们添加一些停车区域。好的。让我们在这里放一个,再在这里放一个。如果你看卫星图片,实际上会有人停在那个区域,如果你仔细看,你会注意到停在这一边的人,他们实际上会停在路边,在 SUMO 中,你现在可以通过切换定义来建模这个,让我们做更仔细的放置。所以它应该从十字路口前 10 米开始,也许在 50 米处结束。更像这样。也许像这样。对,另一个非常大。让我们做成那样。负数是从边的末端开始算...所以现在我们有两个停车区域,我会给它们其他 ID 以便更易读,还有一件事:我们必须定义路边容量,实际上能停多少辆车,所以我在这里设为 3,对于这个,嗯,我想这是一个通往大型停车区的入口,那个停车区在这里。我可以添加所有这些停车位。实际上,我会向你展示怎么做。但我不想添加所有。所以我可以在这里放很多停车位。应该不需要再点击一次。我得记下这个。不管怎样,你可以详细建模。你甚至可以改变这些停车位的角度,即使它们只是为了可视化。但我不打算费心了。这里也停了 100 辆车。好的。我保存它,作为一个新文件。现在回到需求模式。我希望这个流量在这个停车区域停止。所以我进入站点模式。现在我点击,小心,现在它们试图停在这条车道上。我不想那样。我希望它们停在这个元素上。所以我必须选择一个在停车区域的站点。现在它们可以停在这里了。这看起来已经相当不错了。所以我保存我的需求文件。让我们在模拟中看看。 好的。所以这里我们加载新路线。当我们看里面时,我们看到我把它保存到了错误的文件夹。这是我们看到的。不。见鬼。啊,这就是原因。我把站点保存为路线定义的一部分。不,我不该那样做。所以,再次,站点需要点击对象或从列表中选择。所以我应该点击这个流量元素。不。点击这个车辆。另一件事是路线。好的。所以现在让我们将站点定义为流量的子元素。实际上,两者都可以,这取决于你到底想建模什么。但我想到的是把它作为流量的子元素。好的。现在它移到那里了。很好。当然,我们也必须加载这些新的停车区域。也许最终向导会为我们构建这些配置文件。但也许我们根本不需要它。好的。你认为当我们运行这个时会发生什么?他们会都停进去吗?注意他们是停在路边的,公交车过不来,但是,嗯,只有三个车位。他们该怎么办?他们等待。你可能认为这不现实,嗯,它不是,这是一个模拟。你必须告诉车辆可能的替代方案。例如,在路的另一边停车。现在,为了做到这一点,你可以定义 SUMO 中的特定元素,告诉车辆,嗯,如果你到达这个停车区域并且它满了,那么你可以去这个、这个和这个替代停车区域。定义这些定义相当繁琐,但幸运的是 Lara 提供了一个小工具来自动生它们。这个工具是,嗯,它应该是,不。哦,是的,是的。至少它提到了文件。好的,所以这是一个,因为这个工具,即使是这个工具也需要很多选项。这就是我把对这个工具的调用放在一个额外文件里的原因。所以这是一个使用工具的工具。它生成这些基础设施元素,解释如何重新路由到另一个停车区域。显然它需要停车区域的定义和网络文件,然后是关于有多少替代方案、在什么距离以及所有这些,状态是,级别,或者在这些替代方案中可见的空闲停车位数量,或者它们必须猜测并思考,嗯,我可以开到那里,那里可能有位置。所以这些都是可以用选项控制的事情。当你运行这个脚本时,你会得到这个小文件。嗯,在这个例子中,它不是很大。你可以手写那个。但如果你有一个更大的场景,那么你肯定不想手写出来。所以基本上它告诉你的是,当车辆到达某个边,也就是停车区域的边,并且它们注意到停车区域满了,那么它们将重新路由到另一个停车区域。所以让我们在模拟中看看那个。既然我定义了这个有 100 个停车位,有足够的空间给它们。所以基本上所有人都设法停进去了。这不太公平,因为这个停车区是仅供 DLR 员工使用的。所以如果你们都开车来,你们仍然无法停几百辆车。所以我想这是一种艺术自由吧。好的。所以这只是对停车的一个非常简短的了解。当然,你可以这样做来模拟车辆绕着街区一圈一圈地转,最终找到一个停车区域,或者如果你配置了可见性选项,让它们真的必须猜测下一步去哪里,那么它们可能找不到。而且,这对坐在这些车里的人也有影响,因为也许这些人想去某个地方。如果你停在别处,嗯,那么他们也必须改变他们走路的方式。他们在哪里下车?他们在哪里取车?所以有几个影响。其中大部分已经处理了,但不是全部。但我想你会听到更多,在后面的环节。好的。停车就这么多。继续教程的最后一部分,实际上。

Netgenerate#

让我们稍微谈谈合成网络。所以如你所知,在 SUMO 文件夹中所有这些用于路由、模拟、需求构建的应用程序中,还有一个用于生成抽象网络的工具,叫做 netgenerate。自从这个工具诞生以来,有三种基本类型的网络你可以用它构建:网格网络、蜘蛛网络和随机网络。当然,有大量的参数可以用来调整这些网络。网格大小,它们不必是均匀的长度,所以你可以做成矩形的。蜘蛛网络中的辐条数量,以及随机网络的许多属性。但在过去的一年里,添加了一些新选项,以获得更漂亮的随机网络,更漂亮的合成网络。添加的一件事是自动为这些——实际上是为所有网络——添加转弯车道的能力。甚至还有一些代码可以让车道整齐地对齐,否则很难做到正确。在这个选项中,还添加了一些随机性,所以你可以看到并非所有道路都有相同的车道数。如果你想测试,比如说,交通灯算法或其他类型的算法,或者配置,也许你可以使用随机网络或合成网络,这确实能帮助你获得更大范围的交通场景。另一件你可以用来生成非常漂亮网络的事情是新的随机网格模式。所以它是网格网络和随机网络的混合体,因为随机网络,嗯,它们结构很少。它们看起来不太像道路。有时这没关系。但在视觉上,它们不太令人愉悦。但在这里,我认为随机网格模式相当好地捕捉了道路网络的某些几何特性。然后还有一些选项可以进一步扰动坐标。所以你可以在网络中有一些起伏,甚至在 Z 轴上。但也为了从规则网格中得到轻微的偏移。所以我确信有更复杂的工具来生成道路网络。但你已经可以用 netgenerate 中已有的工具走得很远了。我邀请你们去尝试一下。好的。这些就是我今天想告诉你们的所有事情。接下来是有问必答环节。所以所有你现在无法解决的问题,你可以稍后提问。但我想我们现在也有时间,比如说,再回答 10 分钟的问题。所以如果你们对这个教程或与教程相关的话题有任何问题,请提出来。

问答#

问:“关于 OSM WebWizard 只有一个问题:你能改变投影吗?” 答:嗯,WebWizard 工具本身,它总是投影到 UTM 坐标。但你可以,嗯,我给你看。是的,你可以。所以答案是是的,你可以改变它。这个向导生成很多文件。其中一个是这个 netconvert 配置。netconvert 是用于,是的,好的。所以默认情况下,当导入 OpenStreetMap 时,它总是切换到 UTM。但你可以像这样添加一个额外的选项。然后你可以输入一个 PROJ 字符串。就像来自 PROJ 的一个定义字符串。对。我不确定。它来自 PROJ 库。所以它甚至可能适用于一个 EPSG 代码。是的。

问:“有没有办法在停车一段时间后重新上路?你把路改成停车,然后可以从那里再上路。比如停一小时或 15 分钟,然后我们走另一条路?” 答:是的,当然。站点不一定是路线的最后一个元素。你可以在中间停一下,然后去别的地方。所以绝对可以。而且,这对于这些停车区域来说是一个相当相关的问题。如果你停在路边,那么如何继续就很清楚了。你只需继续开。但如果你像这里一样停在路边,那么你实际上必须在路边找到空间。所以如果堵车了,你可能很难重新进入交通流。所以可能存在一种情况,站点在概念上已经结束,所以持续时间已经过了。但汽车仍然必须停在那里,等待一个空隙,如果非常拥堵的话。

问:“支持斜向停车吗?” 答:当然。让我们在这里快速做一下。进入这个模式,检查模式。这里某个地方有一个角度参数。我得让它密度小一点,否则你看不到。所以比如说那是 12 个车位的地方。所以还是有点太密了,但你明白意思。你可以让它有角度,像这样。它方向还是反的,所以你得倒车停。是的。那就再换一个角度。但这主要是视觉上的。因为你可以为这种路边停车设置任意的密度。它不检查物理重叠,只是为了方便在一个小地方添加很多停车位。你可以用这个来模拟一个大型停车设施,它有一个非常小的空间,实际上只是入口,但后面有 500 个停车位。你只需把这个小东西放在路上。

问:“有可能可视化随时间变化的聚合交通吗?” 答:是的。谢谢提问。我本来就想展示这个。所以让我们看看这里。你必须以动态方式保存边数据。默认情况下,我展示的第一个定义,它只是在整个模拟过程中聚合数据。但如果你以不同的频率聚合它,比如说 15 分钟间隔,那么你就会得到一个随时间变化的边数据。当你把它加载到模拟中时,你可以显示这些随时间变化的值。我马上重新生成这个。好的。所以。这个已经运行完了,现在我们可以看看随时间变化的数据,比如说密度...这里密度很低,现在我们运行模拟,如果你仔细看,你会看到数值根据存储的时间值随时间变化。

问:“有没有可能拥有这种数据,既然我们在模拟过程中记录了它们,有没有可能不把它们可视化,而是让它们在周围?比如上次它正在关注的时间” 答:嗯,技术上,我们离那个其实并不远。它还没实现,但应该可以只显示最新的聚合值。是的,再提醒我一次,我会把它记下来。就在 GitHub 上提个 issue,我就知道了。好的?

问:“可以定义异质的人属性吗?可以同时使用不同的人模型吗?” 答:是的,当然。所以人,他们使用与车辆相同的类型属性,你也可以放入类型分布。如果你定义了这个分布,他们可以从分布中抽取。例如,但也可以定义类型中的所有其他东西。所以对于人流量,那么流量的每个元素都会从分布中挑选一个新类型。不,模型是一个全局设置。你必须切换一个或另一个模型。我们计划通过耦合行人模拟器来添加更多行人模型。也许那时我们也会开放同时使用不同模型的可能性。但现在,最重要的用例是全程使用一个模型。所以目前,它是一个全局开关。

问:“可以用 netedit 编辑高程数据吗?” 答:当然,所以让我们看看这个,有几种方法可以做到这一点,例如对于交叉路口,你可以直接设置层级,但在移动模式中也有一个功能,你可以切换到高程,我们将从显示高程值开始,然后我们将显示位置值,然后我们将显示值,然后实际上你可以上下移动几何点,我会切换颜色以便更容易理解。所以比如说我按倾斜度给这个上色,现在你看到我移动了一个几何点,它改变了那个点的角度,所以这是一种添加高程的方法,但通常对于较大的场景,你想从其他地方加载高程数据,但对于小场景,嗯,你可以用这种方式编辑它,当然你也可以数值访问这些值,我的意思是,这些 Z 坐标就在这里,如果你关心确切的数字,你可以把它们加到每个几何点上。

问:“在模拟人时会考虑高程和坡度吗?” 答:嗯,是也不是。是的,它被考虑进去了,因为如果你必须水平和向上走,距离实际上更长,但还没有一个模型说他们会因为上楼梯之类的事情而按比例走得更慢,所以你当然可以做的就是把边切成小段,并在那里设置不同的最大速度,但我猜我们真正需要的是一个更好的行人模型,能考虑到倾斜度这样的事情。

问:“在模拟车辆时会考虑高程和坡度吗?” 答:是也不是。答案和之前一样,因为有一个 KraussPS 模型,坡度实际上会影响加速度,但默认模型忽略了坡度。另外,KraussPS 模型也有缺陷,因为它没有考虑车辆允许的加速度也取决于速度。所以如果路非常陡,车辆就不会启动。而实际上它在低档位下有很大的动力,最终会启动。它会以低档位爬上陡坡,而这在 KraussPS 模型中没有被考虑,这说明了一些问题。它告诉我们,我们还没有对山区进行很多详细的模拟,否则我们就会关心这些事情了。

问:“浮车数据输出中包含横向加速度吗?” 答:令人惊讶的是,你不是今天第一个问我这个问题的人。它将在下一次提交中被放入。