前言
在进行交通管理与控制课程学习时,老师突然要我们学习Sumo来进行交叉口仿真。由于本学期已经学习过Vissim,起初有些不情愿,后面了解到Sumo开源,无需付费也不用找一些破解,而且它可以联合python进行仿真,让我一下子来了兴趣。由于网络上相关资料较少,且大多比较抽象,故记录下来以供以后回顾。
初识
在B站看了点视频,网上也找了一些文章,初步对Sumo认识应该是这样:Sumo仿真需要建立路网,有3种方式,一种是去OpenStreetMap上下,一种是自己画,还有一种是编写xml代码。第一种其实很不错,但是网站进不去。第二种有点像Vissim,试了一下还挺方便。第三种就有点繁琐,不过可以练习帮助了解一些属性。
建立路网后,还需要配置文件和路由文件。配置文件就是声明一下仿真需要啥。路由文件里就是仿真最重要的部分了,包括车辆流向、车辆定义等。
sumo文件类型
在sumo官网下载安装sumo后,可以看到它自身带了教程和文档还有一些小案例,可以经常去查看。
刚开始主要用到的是userdoc下的Definition_of_Vehicles,_Vehicle_Types,_and_Routes和SUMO_edge_type_file,可以了解到sumo的点、边、路线、车辆分别都有什么属性。
路网文件
我们先说说路网文件(.net.xml),它里面主要是点、边和其他比如信号灯等说明。可以利用sumo自带的netedit,像Vissim那样直接绘制。
画完之后,可以用pycharm或者vs打开生成net.xml文件,对照自己画的和代码可以帮助我们了解一些点、边的基本属性。
最后的路网长这样(源文件太长了,我就不放出来了,我还设置了红红绿灯和其他东西):
路由文件
再说说路由文件(.rou.xml),这里面主要是定义的车辆和路线。
如下面的代码,就定义了一辆车,id是veh1,进入仿真的时间是1,是一辆出租车,加速度为0.8,减速度为4.5,车长为4,跟驰模型为IDM,最大速度为60,换道模型为SL2015。进入的车道是0号车道(最右侧车道开始是0),进入时的速度随机生成,是从边e走到边-w(这些边是你在画路网的时候自己取的名字)。
<routes>
<vType id="myType" vclass="taxi" accel="0.8" decle="4.5" length="4"
callFollwMode="IDM" maxspeed="60" laneChangeModel="SL2015"/>
<route id="e_st" edges="e -w"/>
<vehicle id="veh1" depart="1" type="myType" departLane="0"
departSpeed="random" route="e_st"/>
</routes>
文档里都是英文,可能直接翻译依然看不太懂,要自己改变值,看看仿真后会出现哪些变化,才能更好地理解这些参数的意义。我这里也做了一些翻译,如下表所示。
配置文件
配置文件的后缀是.sumocfg,里面是对这次仿真的一些说明,说明仿真的路网是哪个,路由是哪个,然后仿真时长是多少。
<configuration>
<input>
<net-file value="learn.net.xml"/>
<route-files value="routes.rou.xml"/>
</input>
<time>
<begin value="0"/>
<end value="1000"/>
</time>
</configuration>
把之前画的路网文件(我这里是叫learn.net.xml)和定义的路由文件(routes.rou.xml)放在同一目录下,用sumo的gui打开配置文件即可实现仿真,我们来看看效果。
仿真如果想看一下效果,记得把Delay开一下(也就是上图左边箭头的右边923,最高是1000),不然太快了.车辆在1秒时候进入了,在最右边车道。
写在最后
sumo其实相对是很友好的,不仅开源,很多文档和案例都附在安装包里了。尽管文档是英文,但是里面的参数都是见名知意的。本文只是最基本的入门,由于我也没学几天,就先写到这里。后面再说说如何生成大量车流,设置信号灯和进行延误评价。