admin 管理员组

文章数量: 1086019


2024年4月20日发(作者:进制转换方法除了求余)

SUMO使用教程(一)

SUMO是一款交通仿真软件,其余可自行百度。教程一主要展示一下如何运行一个

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

准备:

软件

地图文件

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

。使用前最好设置环境变量SUMO_HOME。其实不设置似乎也可以使用,

但是会有警告。刚刚接触,笔者也并不知道这一环境变量的作用。SUMO_HOME的内容

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

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

件夹下大部分是可执行文件,但是并不像普通的可执行文件一样打开,而是需要用命令行

打开,换句话说,整个功能程序并没有被包装起来,这是出于可裁剪和可维护性角度考虑

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

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

/

仿真准备:

SUMO的仿真至少需要两个文件:1.道路文件,或者叫路网文件(),就是

对行车道路的描述文件;2.需求文件(),或者叫做车量行驶文件,用来描述车流量

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

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

文件。

文件的生成。

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

文件的。

命令行如下:

netcovert --osm-files shangrao_ -o 。

netcovert就是可执行文件,也可以认为是一个工具,作为一个转换工具,必须有输

入输出,所以--osm-files shangrao_就是输入部分,那么--osm-files是什么

意思呢?这一部分是描述输入文件的属性,就是osm文件。后面的-o

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

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

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

文件的生成

文件描述的是车流量或者说行驶规则的文件,规则自然前边万化,所以,

SUMO提供了一个工具,可以随机生成这种需求。工具放在sumotoolstrip文件夹下。

名字叫做。random就是随机的意思,而trip是SUMO中的一个术语,

就是表示车辆从一个条公路行驶到另外一条公路的过程,可以结束会旅程吧。

同样的,-n 表示输入,-n表述输入的类型是net类型,其实-n

等价于--net,-n是一种简写的方式。后面的-l -e 600是随机工具的配置,就像随机数生

成函数需要一个种子一样。后面输出的命令就一目了然了。

这是生成的文件

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

文件。

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

了。我们要用到的工具是bin文件夹下的。不知道这个文件为什么这么命

名,dua不明何意。

这样的命令行想必很容易理解。两个输入,一个输出。所以,最后得到了这些文件。

3.配置文件

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

使用

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

文件作为输入。后面time标签就是对仿真时间的一些设置。

最后的最后,我们应该有的是上面这些文件。用sumo-gui打开文件之后,

点击开始仿真(绿色)箭头之后就可以开心的看仿真效果了。

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

(似乎透露了输入法)

(这车可以再丑一点吗)

SUMO使用教程(二)

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

真。其实,仔细一看之后,这些生成的文件和配置文件本质上都是xml文件,换句话说,

我们完全可以自己用一个记事本编辑这些文件。

首先是文件。作为一个道路文件,抽象成图之后,其实就是由节点和边构

成,所谓的节点,映射到物理世界就是十字路口或者三叉路口,反正就是两条路的交汇处,

而边就是道路。换句话说,只要我们有了节点和边就可以得到文件。

我们先编写和,然后将其结合,而不是直接写出,这有

一点模块化和封装的思想在里面。

这是一个简单的文件。node文件的node标签里面有四个属性,id,x,

y,type。

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

id就是交叉路口的名字,x,y是交叉口的坐标,不像opencv或者显示屏驱动一下,

这里的坐标就是左下角是原点。

type属性复杂一些:

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

Vehicles have to wait until vehicles right to them have passed the

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

• traffic_light: 交叉口被交通灯控制着

• right_before_left: 来自右边的车辆优先通过

Vehicles will let vehicles coming from their right side pass.(还是不知道)

文件

下面是一个简单的文件:

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

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

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

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

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

共有12个nodes,所以如上图所示。根据坐标,可以知道左下角是node1,下边

中间的是node2,类型分别为traffic_light和priority,所以下面展示的是不一样的。

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

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

SUMO使用教程(三)

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

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

vehicle标签下面有一个子标签route,vehicle标签指的就是一辆车,而route则是

这辆车将行驶过的路径。vehicle标签的id属性就是车辆的名称,depart就是出现在仿

真中的时间。我们修改一下这个文件,变成容易观测:

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

vehicle除了id和depart属性外,还有别的属性,譬如:type。这个就是车辆的类

型。

这里就定义了一个vType标签,并且吧vehicle0的type设置为type1.这时候保存

之后运行仿真,发现车辆就会有点不一样哦~

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

SUMO使用教程(四)

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

1.用josm打开osm文件。josm在windows下可以用jar版的或者windows安装

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

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

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

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

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

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

SUMO使用教程(五)

再来讨论一下SUMO仿真需要的文件。官方资料给的图:

从根部往上看,用于仿真的需要文件和文件。而文件则由

上面四种文件产生。分别是nod,edg,typ,con,各自的含义就是node,edge,

type,connection。

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

这样的话描述就比较简单了。至于connection,就是车道合并的规则。SUMO默认是向

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

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

举个例子:

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

当然啦,这四个文件并不是必须的,比如type文件可以内置在edge里面,当然,

当公路条数比较多而且很多参数一样的时候这样会比较麻烦。con文件既然有默认的选项,

当然就不是必须的了。

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

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

netconvert –c

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

文件了。

SUMO使用教程(六)

今天一直在设置SUMO中的交通灯,但是官方文档对具体配置文件的编辑说的很详

细,但是怎么导入到其中就一笔带过了,根据上下文猜测,数次尝试也不行,最后曲线救

国,毕竟所有的网路信息,包括交通信号灯的默认设置信息都在里面,所以直接修改

文件或许可以实现。

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

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

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

type就是交通信号灯的属性,是动态的还是静态的。动态的就是用API接口利用Phyton

编程实现。这里我面用静态的。programID这个就是这段交通信号灯硬编码的id,也就

是说,其实交通信号灯在仿真过程中是可以改变的,而就是根据这个programID来确定

需要改变的方向。offset就是这段编码启动的时间。

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

一个十字路口的红路灯的每一个不同情况都叫做一个相位,所有的相位按照顺序合在

一起就是一个周期,所以说,对交通信号灯编辑,本质上就是编辑各个相位,并对其进行

组合和时间设置(duration).

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

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

制每个相位信号灯的不同通行状况。

SUMO使用教程(七)

这次的教程主要说明文件中connection标签的作用。偷个小懒,用官方文

档来说明。

随便写一个十字路口的nod文件和edge文件之后,用netconvert(默认配置)生

成的net文件效果是这样的:

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

是干什么的呢?大家要记住一句话,文件是对网路的全描述,就像html和浏览

器的关系一样,sumo软件自身不含有任何内容。

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

然后就会发现横向的道路的路标发生了变化,而纵向的还是默认设置,变化就是只能

右拐弯和直行。原因很简单,横向的edge分别叫做1si和2si,上面的connection标签

只允许1si往2o和3o两个edge行驶,所以就少了一种车道的方向。在connection标

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

除了可以设置edge的允许方向之外,对于edge内部的lane也是可以设置的,这

样可以认为规定变道的规则。

SUMO使用教程(八)

好久没更新SUMO的博客了。

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

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

是车辆走过的轨迹。之前我们在router文件里面定义了车辆行驶的路径,很显然,相当

费力气,需要一条一条的去规划,但是在trip文件中,我们只需要说明起始点就可以了,

SUMO的工具会自动计算最优化路径,并且生成router文件。这也就是

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

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

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

到上端。

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

其实还有一个flows文件,这个文件可以设置走同一条路径的车辆数,可以等间隔的

从指定起点发车。

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

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

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

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

1.首先来看一下dump文件

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

[html] view plain copy

1.

2.

3.

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

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

[html] view plain copy

1.

2.

3.

4.

5. VEH_SPEED>"/>

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

7.

8. ... more lanes if the edge possesses more ...

9.

10. ... more edges ....

11.

12. ... the next timestep ...

13.

文件转csv

dump文件是xml格式的,其实也可以用BeautifulSoup和python联合来处理,

但是,这样比较繁琐,至少在程序上是这样的。况且,sumo自带的tools里面有

xml2csv的程序,可以好好利用一下。

在sumo,tools文件夹下面的xml子文件夹,里面有一个的python

程序,可以在命令行中运行它。

就像这样就可以了。

[python] view plain copy

1. 如果dump文件比较大,需要等等待一些时间。特别注意,需要

和python文件同文件夹下。

处理

获取csv,那么之后的处理就方便多了。我们可以轻易的把csv文件导入到python,

利用python强大的pandas和numpy模块处理。

导入之后,查看一下,发现dump中含有的信息还是很多的,比如仿真时间、edge

编号,lane编号、车辆编号等等,下图只是截取了部分。

[python] view plain copy

1. import pandas as pd

2. import numpy as np

3. data = _csv('E:/',sep = ';')

4. dataFrame = ame(data)

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

6. dataNtNd = ()

7. dataClearNt = _duplicates()

8. dataNtNdSort = (columns='vehicle_id')

9. _csv('E:/')

10. lane = dataNtNdSort['lane_id']

11. lane=_duplicates()

12. _csv('E:/')

上面的python代码,从dump文件生成的csv文件中截取了需要的字段,同时做

了一些数据清理工作。最后,生成文件用于计算队列转移矩阵的值,文件

用于形成矩阵的行列坐标。。当然啦,这里我们只是生成了两个csv文件,而没有直接生

成矩阵。原因是转移矩阵要求在excel中展现,而且之前有写过vba程序,所以这里

python只是做一个数据清洗,毕竟几百万条的记录,直接用excel处理,电脑就挂了。

BA生成矩阵

把生成的数据,按照上图,相同间隔相同空行放置。从左往右前两列为python导出

的中的数据,要把列名删除。H列就是生成的中的数据。

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

VBA代码如下。

[vb] view plain copy

1. Private Sub Workbook_Activate()

2.

he Dic

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

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(, ) = "" Then

34. Cells(, ) = 1 / cntSum

35. Else

36.

um

Cells(, ) = Cells(, ).Value + 1 / cntS

37. End If

38. End If

39. Next cnt

40. End Sub

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


本文标签: 文件 生成 车辆 矩阵