SUMO交通流仿真实战

article/2025/10/6 8:03:32

理解、预测并最终减少城市路网中的交通拥堵是一个复杂的问题。即使了解最简单的单车道情况下出现的交通拥堵, 也是具有挑战性的。SUMO是一个开源平台,可模拟复杂环境中的交通流。在这个教程里,我们将学习如何从零创建复杂的交通流模拟,使用网格上的流量案例研究来做这方面的工作,教程结构如下:

  1. 为什么要研究交通网络中的流量?
  2. 从SUMO开始
  3. 仿真网格网络中的交通流
  4. 关键流量性能指标分析
  5. 仿真现实交通的未来方向

1、为什么要研究交通网络中的流量?

在之前的一篇文章中,我讨论了第一篇论文,该论文最终展示了交通"幻象"冲击波是如何从无到有地产生的,除了驾驶员的互动。

在这里插入图片描述

最近的研究表明,简化自动驾驶车辆之间的交互可能会减少人为场景(如绕圈行驶的车辆)的交通堵塞。但是,当你有多条路时会发生什么,就像在典型的城市道路网中一样?有趣的是,仅仅通过更多的车道或更长的道路增加容量可能不会符合拟的预期。在另一篇文章中我展示了"Braess悖论"如何导致不寻常的结果,即增加城市网络中的道路数量,反而可能会使交通恶化!

在进行基建工程,例如兴建新道路、增加车道、红绿灯等前,必须实事求是地仿真交通流量,使项目有最好的机会成功缓解交通。将音乐会、体育赛事等重大活动或机场和医院等公共建筑纳入场景时,情况变得更加复杂。在不远的将来,重要的是要仿真网联车辆和智能交通技术创新的影响,以最好地发挥其在简化交通流量方面的潜力。

2、从SUMO开始

交通仿真似乎属于交通流研究人员或工程承包公司的细分社区。例如,Anylogic、VISSIM和Aimsun是提供交通流建模解决方案的公司。 但是,SUMO 是公开的,并且很容易上手。

有多种方法来安装SUMO,但我更喜欢使用pip安装SUMO以及Python库,以便与SUMO交互。

python -m pip install sumo

就是这样!现在,让我们开始创建交通流量的首次仿真!

3、仿真网格中的交通流

在城市规划中,网格相当普遍。在 SUMO 中,我们设置了一个 5x5 网格,每条道路长度为 200 米,并设置了 3 条车道,如下所示:

netgenerate — grid — grid.number=5 -L=3 — grid.length=200 — output-file=grid.net.xml

接下来,我们使用位于SUMO主目录(sumo->tools)中的tools文件夹中的 randomTrips.py,为一定数量(示例中使用 200 辆车)的车辆生成随机行程。开始和结束时间表示车辆进入仿真的时间。我选择了 0&1,这意味着所有车辆在仿真的前 1 秒进入仿真。Period表示车辆的到达率。

randomTrips.py -n grid.net.xml -o flows.xml — begin 0 — end 1 — period 1 — flows 200

接下来,我们使用 SUMO 的 jtrrouter 生成单个车辆的路线,时间从 0 到 10000。

jtrrouter — flow-files=flows.xml — net-file=grid.net.xml — output-file=grid.rou.xml — begin 0 — end 10000 — accept-all-destinations

最后,为简单起见,我们希望保持恒定的车辆密度。最显而易见的方法是车辆随机驾驶,而不是退出仿真。为此,我们使用曼哈顿交通模型,在曼哈顿交通模型中,遇到交叉路口的车辆会根据设定的概率选择直行、左路或右行。在 SUMO 中默认情况下,车辆一旦到达目的地就退出仿真。但是,SUMO也有曼哈顿模型的实现,使用连续变道Python脚本。

generateContinuousRerouters.py -n grid.net.xml — end 10000 -o rerouter.add.xml

接下来,我们创建一个SUMO配置文件,以便在 SUMO 中运行仿真,该文件是具有某些属性的.xml文件,包含网络文件的名称、路由文件和其他变道文件,供车辆在仿真中停留,直到仿真完成。我们定义输出文件,以便在交通仿真期间存储详细的车辆信息。

<configuration><input><net-file value=”grid.net.xml”/><route-files value=”grid.rou.xml”/><additional-files value=”rerouter.add.xml”/></input><time><begin value=”0"/><end value=”10000"/></time><output><fcd-output value=”grid.output.xml”/></output>
</configuration>

最后,我们将在终端中运行如下仿真。Peroid表示保存数据的时间间隔 - 100 表示每 100 个时间步保存车辆信息,即速度和位置。

sumo-gui -c grid.sumocfg — device.fcd.period 100

运行上面命令将弹出 SUMO GUI,你可以看到仿真:
在这里插入图片描述

车辆颜色表示其速度从最慢(红色)到最快(绿色)。

4、多次运行交通仿真

手动更改参数并输出文件是相当烦人的。如果你要运行100+次仿真探索不同的参数,如车辆数量,交通是如何变化的,然后的多个运行的统计平均。

为此,我使用操OS模块在命令提示上与python交互:

def initialize(grids=5,lanes=3,length=200):os.system("netgenerate --grid --grid.number=5 -L="+str(lanes)+" --grid.length="+str(length)+" --output-file=grid.net.xml")def single(path,vehicles):os.system(path + "randomTrips.py -n grid.net.xml -o flows.xml --begin 0 --end 1 --period 1 --flows "+str(vehicles))os.system("jtrrouter --flow-files=flows.xml --net-file=grid.net.xml --output-file=grid.rou.xml --begin 0 --end 10000 --accept-all-destinations")os.system(path + "generateContinuousRerouters.py -n grid.net.xml --end 10000 -o rerouter.add.xml")tree = ET.parse("grid.sumocfg")root = tree.getroot()for child in root:if (child.tag == 'output'):for child2 in child:child2.attrib['value'] = 'grid.output'+str(vehicles)+'.xml'with open('grid.sumocfg', 'wb') as f:tree.write(f)os.system("sumo -c grid.sumocfg --device.fcd.period 100")if __name__ == '__main__':import osimport numpy as npimport analysisfrom matplotlib import pyplot as pltimport xml.etree.ElementTree as ETpath = "C:\\Users\\BLAH\\AppData\\Local\\Programs\\Python\\Python39\\Lib\\site-packages\\sumo\\tools\\"initialize()vehicles_arr=np.r_[np.linspace(10,100,10).astype(int),np.linspace(100,2000,20).astype(int)]for i in range(0,len(vehicles_arr)):single(path,vehicles_arr[i])

5、分析

SUMO xml 输出包含每个时间步的单个车辆时间、位置和速度的信息。我希望分析速度是如何依赖车辆密度,或仿真中的车辆数量 - 基本上在每一个时间步获得速度,然后在仿真的所有车辆上进行平均。

def textify(vehicles):tree = ET.parse("grid.output"+str(vehicles)+".xml")root = tree.getroot()l = 0for child in root:for child2 in child:l += 1c = 0t = 0a = ''speeds = np.zeros(l)times = np.zeros(l)ids = np.zeros(l)for child in root:for child2 in child:# print(child2.tag, child2.attrib)if (child2.tag == 'vehicle'):a = (child2.attrib)speeds[c] = np.float(a['speed'])ids[c] = np.float(a['id'])times[c] = tc = c + 1t = t + 1# print(t)data = np.c_[ids, times, speeds]tt = len(np.unique(data[:, 1]))vel = np.zeros(tt)nc = np.zeros(tt)flux = np.zeros(tt)for i in range(0, tt):w = np.where(data[:, 1] == i)vel[i] = np.mean(data[w, 2])nc[i] = len(w[0])flux[i] = np.sum(data[w, 2])velm = np.c_[nc, vel, flux]np.savetxt('velm'+str(vehicles)+'.txt',velm)

最后,绘制速度 - 密度图,其中每个仿真运行都有单独的密度:

import numpy as np
from matplotlib import pyplot as plt
def plots(vehicles):vel=np.zeros(len(vehicles))nc=np.zeros(len(vehicles))flux=np.zeros(len(vehicles))for i in range(0,len(vehicles)):txt=np.loadtxt('velm'+str(vehicles[i])+'.txt')nc[i] = np.mean(txt[95:100, 0])vel[i] = np.mean(txt[95:100, 1])flux[i]=np.mean(txt[95:100,2])print(nc[i],vel[i],flux[i])fig=plt.figure()plt.plot(nc/3000,vel,'o')plt.plot(nc / 3000, vel, color='k')plt.xlabel('Density')plt.ylabel('Velocity')plt.tight_layout()plt.savefig('vel-density.png',dpi=600)#plt.show()fig=plt.figure()plt.plot(nc / 3000,flux,'o',label='Traffic Simulation')plt.plot(nc / 3000, flux, color='k')plt.plot(vehicles/3000,vehicles*vel[0],'r--',label='No Interaction')plt.ylim(0,2800)plt.legend()plt.xlabel('Density')plt.ylabel('Flux')plt.tight_layout()plt.savefig('flux-density.png', dpi=600)

在这里插入图片描述

正如你所看到的,随着密度的增加,速度会降低。这是因为仿真中的车辆越多,拥塞越多,导致行驶速度降低。这是我们大家在高速公路上看到的东西,尤其是在高峰时段。

交通仿真中另一个常用的参数是通量。正如我在上一篇文章中所讨论的,通量衡量每次通过给定点的车辆数量,是衡量车辆吞吐量的指标。通量公式为:
在这里插入图片描述

上述公式汇总长度 L 内的所有车辆的速度,以及车道数量 n_l。

在低密度下,每辆车基本上都是在限速行驶,因此通量会随着密度的直线增加(下面图中的红线)。但是,在密度较高时,车辆不能在限速行驶,在某一点上,以较小的速度行驶的每辆车都会抵消车辆数量较多的影响,从而减少通量。在特征密度(此模拟中为 +0.1= 0.2)之上,会出现交通堵塞,并且通量随着密度降低而减小。
在这里插入图片描述

6、仿真真实的交通

我已经演示了如何使用 SUMO+Python 在具有代表性的网格中设置基本的交通仿真和合奏运行。然而,这绝不是对城市交通网络的全面仿真。在最近的一项研究中,利用OpenStreetMap和OSMnx,发现了城市网格的一些特点。SUMO 包括通过将 OpenStreetMap数据转换为 SUMO.net文件来仿真城市街道网络中的流量。

但是,除了现实城市网络上的仿真之外,还有校准这些交通仿真以匹配日常交通模式的问题。为了与日常生活中看到的详细交通模式相匹配,人们需要考虑进入道路的人的起伏,他们何时进入,何时/何地离开。这是一个极其复杂的问题,因为不可能知道每一个车辆的轨迹。现在,许多车辆将 GPS 数据传输给 INRIX 和 HERE这样的公司。Google和Apple等公司利用手机数据来获得稀疏的位置和速度信息。但是,这只能提供整个人口的一小部分信息。交通流是一个高度非线性的问题:这意味着小的变化可能会产生极端的后果。

同时,我们希望交通流仿真结果在不同的初始条件下是可靠的。结果应清楚地表明,对于各种情况,建议的项目是否具有显著的交通流改善。拥有详细的大规模交通仿真是一项挑战,这些仿真在可行的时间内运行,并且是现实的。

在 SUMO 页面上,只有少数这样的现实场景。页面顶部如下文字:

构建一个场景包含很多工作。如果你已经构建了一个 可以共享的SUMO 场景,请与我们联系。
希望交通运动数据的民主化、计算资源的日益可用以及开源交通流建模平台将使这些大型仿真更加容易访问。


原文链接:SUMO交通流仿真实战 - BimAnt


http://chatgpt.dhexx.cn/article/KRrLLBQX.shtml

相关文章

python交通流预测算法_一种高速公路交通流预测方法与流程

本发明涉及智能交通领域,更具体地,涉及一种高速公路交通流预测方法。 背景技术: 随着社会经济的不断增长,国内汽车的拥有量越来越多,高速公路车流量急剧上升,从而导致高速公路上车辆拥堵愈发严重。现有方法采用径向基函数神经网络训练网络参数的算法,在粗略搜索过程中容…

交通流特征工程小技巧与思考

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、交通流是什么&#xff1f;二、特征工程是什么&#xff1f;三、处理数据时的一些小技巧四、一些常用的机器学习python库总结 前言 小编最近参与了一些工程方…

初等模型---交通流和道路通行能力

交通流的基本参数及其特性 为明确和简单起见&#xff0c;这里的交通流均指由标准长度的小型汽车在单方向的。 道路上行驶而形成的车流,没有外界因素如岔路、信号灯等的影响。 借用物理学的概念&#xff0c;将交通流近似看作一辆辆汽车组成的连续的流体&#xff0c;可以 用流量、…

交通流理论 第一章 绪论

第一章 绪论 1.1 交通流理论研究的内容和意义 交通流理论是运用物理学和数学的定律描述交通特性的交通工程学基础理论之一&#xff1b;道路设施可以分为两类&#xff1a;连续流和间断流设施。连续流设施为机动车流提供了相对连续的运行环境&#xff0c;几乎没有强制性阻断干扰…

数学小游戏:原创字谜几则

昨天晚上躺在床上发呆&#xff0c;想了几则数学字谜。下面每个式子都对应一个英文单词&#xff0c;例如的意思就是tank。 你能猜出多少个来呢&#xff1f; 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.

纵横字谜的答案

1.问题描述 输入一个r行c列(1<r,c<10)的网格&#xff0c;黑格用”*”表示&#xff0c;每个白格都填有一个字母&#xff0c;如果一个白格的左边相邻的位置或者边上相邻的位置没有白格&#xff08;可能是黑格&#xff0c;也可能除了网格边界&#xff09;&#xff0c; 则称…

猜字谜 C++

解析&#xff1a; 1.由于五位数*一位数等于六位数 而且万位等于第二位数各位所以A>3 2.D为1-9 3.整式变形为 DDDDDD/AABCAB 我们需判断一个每位数都一样的六位数除以一个3-9中的某个数A 结果需满足 万位等于十位等于A 千位等于个位 且没有余数 answer: #include<iostr…

猜字小游戏

文章目录 猜字小游戏猜字游戏升级版 猜字小游戏 编写程序 运行程序 猜字游戏升级版 编写程序 运行程序

纵横字谜的答案 (UVa232)

纵横字谜的答案 Time Limit:3000MS Memory Limit:0KB 64bit IO Format:%lld & %llu Submit Status Description Crossword Answers A crossword puzzle consists of a rectangular grid of black and white squares and two lists of definitions (or descriptio…

Scratch 教程《元宵猜灯谜》

程序演示 元宵节到了&#xff0c;用Scratch给小朋友做一个猜灯谜游戏&#xff01; 课程引入 青玉案元夕 【宋】辛弃疾 东风夜放花千树&#xff0c;更吹落、星如雨。宝马雕车香满路。凤箫声动&#xff0c;玉壶光转&#xff0c;一夜鱼龙舞。 蛾儿雪柳黄金缕&#xff0c;笑语盈盈暗…

Python 猜字谜游戏

import random WORDS ("python","import","hello","difficult","easy") print("欢迎来到猜单词游戏&#xff0c;请将乱序后的单词组成正确的单词") iscontinue "y" while iscontinue"y" or…

c语言猜字谜(详解)(后附完整源码)

c语言猜字谜 一.游戏前置二.游戏实现1.让电脑生成随机数2.让玩家重复输入3.输赢判断 一.游戏前置 向其他游戏一样&#xff0c;在游戏开始前&#xff0c;我们需要一个菜单让玩家进行选择 所以我们需要以下功能 1.一个能让玩家进行选择的函数&#xff08;switch&#xff09; 2.玩…

猜字谜小游戏

猜字谜小游戏 思路 : 先写一个菜单函数,打印一个菜单,获取用户输入 从菜单函数中调用Game函数 写Game函数里面的内容 从主函数中调用菜单函数 #include<stdio.h> #include<stdlib.h>//里面包含rand函数,system函数 #include<time.h> void Game(void);//声明…

猜字谜游戏

一个非常简单的猜数字游戏&#xff0c;在一个限定的范围内&#xff0c;系统会给出一个随机的未知数&#xff0c;让玩家自己去猜&#xff0c;并且还会根据玩家输入的数给出相应的提示。如下图&#xff1a; 原理很简单&#xff0c;主要通过Random函数构建循环方法&#xff0c;再用…

【Flink】FLink Assigned key must not be null

1.场景1 1.1 概述 flink报错: Caused by: java.lang.NullPointerException: Assigned key must not be null! 具体如下 原因 keyBy的字段不能为null M.参考 Flink运行出现Assigned key must not be null

vuex报错Computed property “xxx“ was assigned to but it has no setter.

当使用vuex存储数据时&#xff0c;常常有这样的需求&#xff1a;输入框显示并动态修改state中的数据。 我们第一个反应就是使用v-model直接绑定state中的数据&#xff0c;虽然确实可以显示和修改&#xff0c;但是控制台会报错&#xff0c;所以不能采取这种方式。 案例如下&…

可编程渲染管线报错 Unity Universal RP asset not assigned

可编程渲染管线报错 Unity Universal RP asset not assigned 解决 1.创建urp资产 创建成功如下图 2.打开Edit > Project Settings… > Graphics 3.设置资产 如果你安装了URP包&#xff0c;当你编写自定义渲染管线时&#xff0c;既是你设置的上图资产也会报同样的错误。…

【Flink】FLink assigned slot xx was removed

1.概述 flink报错 org.apache.flink.util.FlinkException: The assigned slot container_e08_1539148828017_15937_01_003564_0 was removed. at org.apache.flink.runtime

Flink线上问题: The assigned slot container_xxx was removed

Flink线上问题: The assigned slot container_xxx was removed 客户现场使用Flink(on Yarn)进行数据抽取,Source是JDBC,Sink是Kafka,客户反映流程差不多跑10天左右就挂,让我看看. 环境: Flink: 1.5.2 jdk: 1.8.0_25 Hadoop: 2.4.1 jobmanger和TaskManger都分配1G内存 首先…