SUMO使用教程Word文件下载.docx
《SUMO使用教程Word文件下载.docx》由会员分享,可在线阅读,更多相关《SUMO使用教程Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
同样的,-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.<
output>
2.
<
netstate-dump
value="
FILE>
"
/>
3.<
/output>
其中FILE是你希望的文件名。
文件里面是这样的,具体是什么我们等会儿转换成csv导入Python之后再看。
netstate>
timestep
time="
TIME_STEP>
>
3.
edge
id="
EDGE_ID>
4.
lane
LANE_ID>
5.
vehicle
VEHICLE_ID>
pos="
VEH_POSITION>
speed="
VEH_SPEED>
6.
7.
...
more
vehicles
if
any
on
this
8.
9.
/lane>
10.
11.
lanes
the
possesses
12.
13.
/edge>
14.
15.
edges
....
16.
17.
/timestep>
18.
19....
next
20.
21.<
/netstate>
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编号、车辆编号等等,下图只是截取了部分。
1.import
pandas
as
pd
2.import
numpy
np
3.data
=
pd.read_csv('
E:
/dump.csv'
sep
'
;
)
4.dataFrame
pd.DataFrame(data)
5.dataNtNd=
dataFrame[['
lane_id'
'
vehicle_id'
]]
7.dataNtNd
dataClearNt.dropna()
9.dataClearNt
dataNtNd.drop_duplicates()
12.dataNtNdSort
dataNtNd.sort(columns='
14.dataNtNdSort.to_csv('
/lc.csv'
16.lane
dataNtNdSort['
]
17.lane=lane.drop_duplicates()
18.lane.to_csv('
/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()
Dim
Dic,
Arr
define
Dic
for
get
matrix
asix,and
to
process
cnt
As
Long
counter
probability
calucatino
i
Long,
r
is
axis
cntSum
sum
of
amount
turn-line
generate
For
2
To
109
j
Cells(i,
7
+
j)
Next
clear
content
Cells(1,
i)
8)
19.
calculate
21.
calaulate
avaliable
line
change
22.
If
Cells(cnt,
2)
Cells(cnt
1,
Then
same
23.
1
24.
End
25.
26.
27.
fill
28.
29.
MsgBox
30.
Set
f
Rows
(1).Find(Cells(cnt,
1))
31.
c
Columns(8).Find(Cells(cnt
32.
33.
Cells(c.Row,
f.Column)
34.
/
35.
Else
36.
f.Column).Value
37.
38.
39.
40.End
最后就是一个这样子的转移矩阵