SUMO使用教程.docx

上传人:b****6 文档编号:7070614 上传时间:2023-01-16 格式:DOCX 页数:23 大小:964.33KB
下载 相关 举报
SUMO使用教程.docx_第1页
第1页 / 共23页
SUMO使用教程.docx_第2页
第2页 / 共23页
SUMO使用教程.docx_第3页
第3页 / 共23页
SUMO使用教程.docx_第4页
第4页 / 共23页
SUMO使用教程.docx_第5页
第5页 / 共23页
点击查看更多>>
下载资源
资源描述

SUMO使用教程.docx

《SUMO使用教程.docx》由会员分享,可在线阅读,更多相关《SUMO使用教程.docx(23页珍藏版)》请在冰豆网上搜索。

SUMO使用教程.docx

SUMO使用教程

SUMO使用教程

(一)

SUMO是一款交通仿真软件,其余可自行XX。

教程一主要展示一下如何运行一个仿真实例。

当然,这只是实现方法中的一种。

准备:

1.SUMO软件

2.osm地图文件

SUMO可去官网下载,解压后就可以使用,图形界面软是在解压后bin文件夹下的sumo-gui.exe。

使用前最好设置环境变量SUMO_HOME。

其实不设置似乎也可以使用,但是会有警告。

刚刚接触,笔者也并不知道这一环境变量的作用。

SUMO_HOME的内容就是安装文件的位置,也就是bin文件夹的上一级目录。

SUMO解压之后,作重要的是bin文件夹下的程序和tools文件夹下的程序。

bin文件夹下大部分是可执行文件,但是并不像普通的可执行文件一样打开,而是需要用命令行打开,换句话说,整个功能程序并没有被包装起来,这是出于可裁剪和可维护性角度考虑的。

tools下的工具则更多的是用phyton写的。

osm是一种地图信息文件,可以去openstreetmap官网下载。

网址:

http:

//www.openstreetmap.org/

仿真准备:

SUMO的仿真至少需要两个文件:

1.道路文件,或者叫路网文件(net.xml),就是对行车道路的描述文件;2.需求文件(rou.xml),或者叫做车量行驶文件,用来描述车流量的行为。

当然,更加高级的仿真可以加入别的文件,比如车辆描述文件,地形文件。

目前我们只有一个osm地图文件,所以我们要用SUMO的工具生成路网文件和需求文件。

.xml文件的生成。

bin文件夹下面有一个netconvert.exe文件,顾名思义,这个东西就是用来转换net文件的。

命令行如下:

netcovert--osm-filesshangrao_china.osm-o.xml。

netcovert就是可执行文件,也可以认为是一个工具,作为一个转换工具,必须有输入输出,所以--osm-filesshangrao_china.osm就是输入部分,那么--osm-files是什么意思呢?

这一部分是描述输入文件的属性,就是osm文件。

后面的-o.xml就是输出部分,同样-o是output的意思,表示这是输出文件。

执行完毕之后,就发现多了一个文件了。

如此这般,我们就获得了传说中的net.xml,也就是网路文件了。

2.rou.xml文件的生成

rou.xml文件描述的是车流量或者说行驶规则的文件,规则自然前边万化,所以,SUMO提供了一个工具,可以随机生成这种需求。

工具放在sumo\tools\trip文件夹下。

名字叫做radomTrips.py。

random就是随机的意思,而trip是SUMO中的一个术语,就是表示车辆从一个条公路行驶到另外一条公路的过程,可以结束会旅程吧。

同样的,-n.xml表示输入,-n表述输入的类型是net类型,其实-n等价于--net,-n是一种简写的方式。

后面的-l-e600是随机工具的配置,就像随机数生成函数需要一个种子一样。

后面输出的命令就一目了然了。

这是生成的文件

但是,这样的一个过程生成的是一个旅程随机过程文件,而我们需要的是一个rou.xml文件。

所以,最后,我们把随机的旅程和道路信息结合起来就获得了车流文件(rou.xml)了。

我们要用到的工具是bin文件夹下的duarouter.exe。

不知道这个文件为什么这么命名,dua不明何意。

这样的命令行想必很容易理解。

两个输入,一个输出。

所以,最后得到了这些文件。

3.配置文件

为了仿真方便,我们写一个仿真的配置文件,这一类配置文件可以直接被sumo-gui使用

稍微了解xml语言和会一些英语的同学应该能明白大概。

将之前生成的net.xml和rou.xml文件作为输入。

后面time标签就是对仿真时间的一些设置。

最后的最后,我们应该有的是上面这些文件。

用sumo-gui打开sumo.cfg文件之后,点击开始仿真(绿色)箭头之后就可以开心的看仿真效果了。

最后的最后的最后,上两张图:

(似乎透露了输入法)

(这车可以再丑一点吗)

SUMO使用教程

(二)

在教程一当中,我们用了osm和SUMO的工具,生成了一些列文件,最后得以仿真。

其实,仔细一看之后,这些生成的文件和配置文件本质上都是xml文件,换句话说,我们完全可以自己用一个记事本编辑这些文件。

首先是net.xml文件。

作为一个道路文件,抽象成图之后,其实就是由节点和边构成,所谓的节点,映射到物理世界就是十字路口或者三叉路口,反正就是两条路的交汇处,而边就是道路。

换句话说,只要我们有了节点和边就可以得到net.xml文件。

我们先编写nod.xml和edg.xml,然后将其结合,而不是直接写出net.xml,这有一点模块化和封装的思想在里面。

1.nod.xml。

这是一个简单的nod.xml文件。

node文件的node标签里面有四个属性,id,x,y,type。

(新浪博客竟然无法显示xml文件,只能截图了)

 

id就是交叉路口的名字,x,y是交叉口的坐标,不像opencv或者显示屏驱动一下,这里的坐标就是左下角是原点。

type属性复杂一些:

priority:

车辆必须等待,直到它们右侧车辆完全通过路口。

Vehicleshavetowaituntilvehiclesrighttothemhavepassedthejunction(并不知道这要表达什么。

• traffic_light:

交叉口被交通灯控制着

• right_before_left:

来自右边的车辆优先通过

Vehicleswillletvehiclescomingfromtheirrightsidepass.(还是不知道)

 

2.edg.xml文件

下面是一个简单的edg.xml文件:

要注意的是,edge文件对于节点有两个方向,当只存在一个方向的时候,就是单行线。

笔者不禁想起家乡坑爹的单行线。

3.有了这两个文件之后,可以用netconvert转换成net.xml。

同样的,node文件和edge文件作为输入,而net.xml作为输出。

最后,我们可以用SUMO-gui看一下地图,

共有12个nodes,所以如上图所示。

根据坐标,可以知道左下角是node1,下边中间的是node2,类型分别为traffic_light和priority,所以下面展示的是不一样的。

edge的numlane都是2,所以都是双车道。

到这里,笔者提出了一个问题,像自己家附近单车道管制的地方怎么仿真?

 

SUMO使用教程(三)

这次主要来看一下需求文件的内容,也就是rou.xml文件的构成。

打开上次教程生成的rou.xml文件之后,可以看到大部分内容是这样的:

vehicle标签下面有一个子标签route,vehicle标签指的就是一辆车,而route则是这辆车将行驶过的路径。

vehicle标签的id属性就是车辆的名称,depart就是出现在仿真中的时间。

我们修改一下这个rou.xml文件,变成容易观测:

保存之后仿真,就可以很好的看到结果。

vehicle除了id和depart属性外,还有别的属性,譬如:

type。

这个就是车辆的类型。

这里就定义了一个vType标签,并且吧vehicle0的type设置为type1.这时候保存之后运行仿真,发现车辆就会有点不一样哦~

当然啦,vType还有别的一些属性,具体可以看官方文档。

 

SUMO使用教程(四)

osm文件下载之后并没有交通灯,挺头疼的,目前只找到了手工加入的方法。

1.用josm打开osm文件。

josm在windows下可以用jar版的或者windows安装版本的。

理论上jar的稍稍会卡一点,但是不用安装,大家可以XX自己去官网下。

打开osm地图后,选择公路的连接点,可以一个一个点击,也可以拖出矩形框多选择几个。

在右侧的界面中,会显示选中的连接点的id,似乎不能复制这些id略微有点头疼。

2.根据这些id编辑nod.xml文件。

3.最后,用netconvert合成nod文件和之前没有交通灯信息的net.xml文件。

重新配置net文件命后Reload之后,就可以看到效果了。

 

SUMO使用教程(五)

再来讨论一下SUMO仿真需要的文件。

官方资料给的图:

从根部往上看,用于仿真的需要rou.xml文件和net.xml文件。

而net.xml文件则由上面四种文件产生。

分别是nod,edg,typ,con,各自的含义就是node,edge,type,connection。

node和edge之前都讲过了,type也比较简单,就是对edge的类型做个一个封装,这样的话描述就比较简单了。

至于connection,就是车道合并的规则。

SUMO默认是向右合并。

也就是说,当三车道变成二车道的时候,右对齐,左边两个车道变成一个车道。

当然啦,并不是所有的道路都是右对齐的,所以就有了这一文件的产生。

举个例子:

这样就可以实现L2公路与L12公路连接的时候,0车道和0,1车道对齐。

当然啦,这四个文件并不是必须的,比如type文件可以内置在edge里面,当然,当公路条数比较多而且很多参数一样的时候这样会比较麻烦。

con文件既然有默认的选项,当然就不是必须的了。

有了四个文件,我们怎么一气呵成生成net文件呢?

infact,写这样一个配置文件就可以了,文件的后缀名是.netc.cfg

netconvert–cXXXX.netc.cfg

最后,只要敲一下这样命令行,让netconvert执行这个配置文件就可以成功生成net.xml文件了。

 

SUMO使用教程(六)

今天一直在设置SUMO中的交通灯,但是官方文档对具体配置文件的编辑说的很详细,但是怎么导入到其中就一笔带过了,根据上下文猜测,数次尝试也不行,最后曲线救国,毕竟所有的网路信息,包括交通信号灯的默认设置信息都在里面,所以直接修改net.xml文件或许可以实现。

果不其然,在测试的net文件中,发现了下面这样一段代码:

很显然,这一段就是对node5节点上的交通信号灯的完全描述。

tlLgic节点中id就是node的id,所以说,交通信号灯其实适合node一一对应的。

type就是交通信号灯的属性,是动态的还是静态的。

动态的就是用API接口利用Phyton编程实现。

这里我面用静态的。

programID这个就是这段交通信号灯硬编码的id,也就是说,其实交通信号灯在仿真过程中是可以改变的,而就是根据这个programID来确定需要改变的方向。

offset就是这段编码启动的时间。

接下来就是phase这个子标签了。

一个十字路口的红路灯的每一个不同情况都叫做一个相位,所有的相位按照顺序合在一起就是一个周期,所以说,对交通信号灯编辑,本质上就是编辑各个相位,并对其进行组合和时间设置(duration).

从上往下我们依次观察每一个相位如下:

 

 

 

 

 

     

改变相位时长(duration)就可以改变红绿灯改变的速率。

改变相位状态,就可以控制每个相位信号灯的不同通行状况。

 

SUMO使用教程(七)

这次的教程主要说明net.xml文件中connection标签的作用。

偷个小懒,用官方文档来说明。

随便写一个十字路口的nod文件和edge文件之后,用netconvert(默认配置)生成的net文件效果是这样的:

用记事本或者ue打开net文件之后,会发现在文件后面部分有好多标签,这些标签是干什么的呢?

大家要记住一句话,net.xml文件是对网路的全描述,就像html和浏览器的关系一样,sumo软件自身不含有任何内容。

我们更改一下connection标签如下:

然后就会发现横向的道路的路标发生了变化,而纵向的还是默认设置,变化就是只能右拐弯和直行。

原因很简单,横向的edge分别叫做1si和2si,上面的connection标签只允许1si往2o和3o两个edge行驶,所以就少了一种车道的方向。

在connection标签中,没有提到的行驶路径会被认为是不允许的。

除了可以设置edge的允许方向之外,对于edge内部的lane也是可以设置的,这样可以认为规定变道的规则。

 

SUMO使用教程(八)

好久没更新SUMO的博客了。

今天来看一下之前生成的一个Trips文件。

下面这个就是随机生成的Trips问价的部分截图,trip,中文意思就是旅程,其实就是车辆走过的轨迹。

之前我们在router文件里面定义了车辆行驶的路径,很显然,相当费力气,需要一条一条的去规划,但是在trip文件中,我们只需要说明起始点就可以了,SUMO的duarouter.exe工具会自动计算最优化路径,并且生成router文件。

这也就是为什么在教程一中我们randomTrips生成的是trip文件而不直接是router文件的原因。

不可否认,SUMO的模块化工作是做的很细致的。

这是我用于测试的一个trip文件,从徐汇区一个小区域左下端开始,自动规划后行驶到上端。

但是,似乎用trip文件有一个问题,就是一个trip标签只能有一辆车。

其实还有一个flows文件,这个文件可以设置走同一条路径的车辆数,可以等间隔的从指定起点发车。

 

从SUMO的输出文件中获得队列转移矩阵

SUMO的功能是很强大,不过可视化和后期期望结果的多样性似乎就不太如人意了。

本次我们利用SUMO的dump仿真输出文件来获取一个队列转移矩阵(lanechangeratematrix)。

这一矩阵在优化中有着很重要的地位。

1.首先来看一下dump文件

在仿真配置文件中的output部分加入下面这样的语句,就会生成dump文件

[html]viewplaincopy

1.   

2.   " />  

3.  

其中FILE是你希望的文件名。

文件里面是这样的,具体是什么我们等会儿转换成csv导入Python之后再看。

[html]viewplaincopy

1.  

2.   ">  

3.      ">  

4.         ">  

5.            " pos="" speed=""/>  

6.  

7.            ... more vehicles if any on this lane ...  

8.  

9.           

10.  

11.         ... more lanes if the edge possesses more ...  

12.  

13.        

14.  

15.      ... more edges ....  

16.  

17.     

18.  

19.... the next timestep ...  

20.  

21.  

2.dump文件转csv

dump文件是xml格式的,其实也可以用BeautifulSoup和python联合来处理,但是,这样比较繁琐,至少在程序上是这样的。

况且,sumo自带的tools里面有xml2csv的程序,可以好好利用一下。

在sumo,tools文件夹下面的xml子文件夹,里面有一个xml2csv.py的python程序,可以在命令行中运行它。

就像这样就可以了。

[python]viewplaincopy

1.  

如果dump文件比较大,需要等等待一些时间。

特别注意,dump.xml需要和python文件同文件夹下。

3.python处理

获取csv,那么之后的处理就方便多了。

我们可以轻易的把csv文件导入到python,利用python强大的pandas和numpy模块处理。

导入之后,查看一下,发现dump中含有的信息还是很多的,比如仿真时间、edge编号,lane编号、车辆编号等等,下图只是截取了部分。

 

[python]viewplaincopy

1.import pandas as pd  

2.import numpy as np  

3.data = pd.read_csv('E:

/dump.csv',sep = ';')  

4.dataFrame = pd.DataFrame(data)  

5.dataNtNd= dataFrame[['lane_id','vehicle_id']]  

6.  

7.dataNtNd = dataClearNt.dropna()  

8.  

9.dataClearNt = dataNtNd.drop_duplicates()  

10.  

11.  

12.dataNtNdSort = dataNtNd.sort(columns='vehicle_id')  

13.  

14.dataNtNdSort.to_csv('E:

/lc.csv')  

15.  

16.lane = dataNtNdSort['lane_id']  

17.lane=lane.drop_duplicates()  

18.lane.to_csv('E:

/lane.csv')  

上面的python代码,从dump文件生成的csv文件中截取了需要的字段,同时做了一些数据清理工作。

最后,生成lc.csv文件用于计算队列转移矩阵的值,lane.csv文件用于形成矩阵的行列坐标。

当然啦,这里我们只是生成了两个csv文件,而没有直接生成矩阵。

原因是转移矩阵要求在excel中展现,而且之前有写过vba程序,所以这里python只是做一个数据清洗,毕竟几百万条的记录,直接用excel处理,电脑就挂了。

4.excelVBA生成矩阵

把生成的数据,按照上图,相同间隔相同空行放置。

从左往右前两列为python导出的cl.csv中的数据,要把列名删除。

H列就是生成的lane.csv中的数据。

位置正确之后,我们就可以利用excel的VBA自动实现了。

VBA代码如下。

[vb]viewplaincopy

1.Private Sub Workbook_Activate()  

2.    'Dim Dic, Arr 'define the Dic for get the matrix asix,and Arr to process the Dic  

3.    Dim cnt As Long 'the counter for the probability calucatino  

4.    Dim i As Long, r As Long 'i is the counter  for get the matrix axis  

5.     

6.    Dim cntSum 'the sum of the amount of the turn-line  

7.      

8.     'generate the matrix  

9.    For i = 2 To 109  

10.        For j = 2 To 109  

11.            Cells(i, 7 + j) = ""  

12.        Next j  

13.    Next i  

14.      

15.    'clear the matrix content  

16.    For i = 2 To 109  

17.      Cells(1, 7 + i) = Cells(i, 8)  

18.    Next i  

19.      

20.    'calculate the probability  

21.    For cnt = 2 To r 'calaulate the amount of the avaliable line change  

22.        If Cells(cnt, 2) = Cells(cnt + 1, 2) Then   'the same vehicle  

23.            cntSum = cntSum + 1  

24.        End If  

25.    Next cnt  

26.      

27.    For cnt = 2 To r 'fill the matrix  

28.        If Cells(cnt, 2) = Cells(cnt + 1, 2) Then  

29.            'MsgBox r  

30.            Set f = Rows

(1).Find(Cells(cnt, 1))  

31.            Set c = Columns(8).Find(Cells(cnt + 1, 1))  

32.              

33.            If Cells(c.Row, f.Column) = "" Then  

34.               Cells(c.Row, f.Column) = 1 / cntSum  

35.            Else  

36.                Cells(c.Row, f.Column) = Cells(c.Row, f.Column).Value + 1 / cntSum  

37.            End If  

38.        End If  

39.    Next cnt  

40.End Sub  

最后就是一个这样子的转移矩阵

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 幼儿教育 > 幼儿读物

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1