根据交通调查所得交通量等数据,使用 Sumo 仿真一个交叉口。具体需求为:
在 sumocfg 文件中,除了必须的 net 文件和 rou 文件,还有 additional 文件,这个文件用信号灯的切换。
<configuration xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/sumoConfiguration.xsd">
<input>
<net-file value="mybs.net.xml"/>
<route-files value="mybs.rou.xml"/>
<additional-files value="output_alllight.add.xml"/>
input>
<time>
<begin value="0"/>
<end value="43200"/>
time>
configuration>
net 文件需要使用 netedit.exe 工具手绘一个十字交叉口。并对交叉口渠化方案进行绘制,设置路段限速值,设置信号配时方案。
rou 文件为交叉口路段加载车流。根据要求,分三个时段进行车流加载,分别输入每个 flow
的小时交通量,并为每个 flow
设置 route
,开始时间 begin
和结束时间 end
。根据观测得到的速度数据,为车流设置与车辆运动相关的参数。其中,sigma
与驾驶人操作的随机性有关,length
为车辆长度,minGap
为停车时车辆之间的间隔,maxSpeed
为最大速度,speedFactor
和 speedDev
为控制车速随机的相关参数。
<routes>
<vType id="MorningHighEast" sigma="0.5" length="5" minGap="0.5" maxSpeed="14" speedFactor="1.2" speedDev="0.1" />
<vType id="MorningHighWest" sigma="0.5" length="5" minGap="0.5" maxSpeed="15" speedFactor="1.2" speedDev="0.1" />
<vType id="MorningHighSouth" sigma="0.5" length="5" minGap="0.5" maxSpeed="17" speedFactor="1.2" speedDev="0.1" />
<vType id="MorningHighNorth" sigma="0.5" length="5" minGap="0.5" maxSpeed="13" speedFactor="1.2" speedDev="0.1" />
<vType id="FlatEast" sigma="0.5" length="5" minGap="0.5" maxSpeed="16" speedFactor="1.2" speedDev="0.1" />
<vType id="FlatWest" sigma="0.5" length="5" minGap="0.5" maxSpeed="16" speedFactor="1.2" speedDev="0.1" />
<vType id="FlatSouth" sigma="0.5" length="5" minGap="0.5" maxSpeed="19" speedFactor="1.2" speedDev="0.1" />
<vType id="FlatNorth" sigma="0.5" length="5" minGap="0.5" maxSpeed="15" speedFactor="1.2" speedDev="0.1" />
<vType id="EveningHighEast" sigma="0.5" length="5" minGap="0.5" maxSpeed="15" speedFactor="1.2" speedDev="0.1" />
<vType id="EveningHighWest" sigma="0.5" length="5" minGap="0.5" maxSpeed="12" speedFactor="1.2" speedDev="0.1" />
<vType id="EveningHighSouth" sigma="0.5" length="5" minGap="0.5" maxSpeed="18" speedFactor="1.2" speedDev="0.1" />
<vType id="EveningHighNorth" sigma="0.5" length="5" minGap="0.5" maxSpeed="14" speedFactor="1.2" speedDev="0.1" />
<route edges="-gneE2 -gneE12 gneE14 gneE3"/>
flow>
<route edges="-gneE2 -gneE12 gneE13 gneE0 -gneE22"/>
flow>
<route edges="-gneE2 gneE16 gneE1 gneE19 gneE20"/>
flow>
<route edges="-gneE3 -gneE14 gneE12 gneE2"/>
flow>
<route edges="-gneE3 -gneE14 gneE11 gneE1 gneE19 gneE20"/>
flow>
<route edges="-gneE3 gneE18 gneE0 -gneE22"/>
flow>
<route edges="--gneE22 -gneE0 -gneE13 gneE11 gneE1 gneE19 gneE20"/>
flow>
<route edges="--gneE22 -gneE0 -gneE13 gneE14 gneE3"/>
flow>
<route edges="--gneE22 -gneE0 gneE15 gneE2"/>
flow>
<route edges="-gneE20 -gneE19 -gneE1 -gneE11 gneE13 gneE0 -gneE22"/>
flow>
<route edges="-gneE20 -gneE19 -gneE1 -gneE11 gneE12 gneE2"/>
flow>
<route edges="-gneE20 -gneE19 -gneE1 gneE17 gneE3"/>
flow>
<route edges="-gneE2 -gneE12 gneE14 gneE3"/>
flow>
<route edges="-gneE2 -gneE12 gneE13 gneE0 -gneE22"/>
flow>
<route edges="-gneE2 gneE16 gneE1 gneE19 gneE20"/>
flow>
<route edges="-gneE3 -gneE14 gneE12 gneE2"/>
flow>
<route edges="-gneE3 -gneE14 gneE11 gneE1 gneE19 gneE20"/>
flow>
<route edges="-gneE3 gneE18 gneE0 -gneE22"/>
flow>
<route edges="--gneE22 -gneE0 -gneE13 gneE11 gneE1 gneE19 gneE20"/>
flow>
<route edges="--gneE22 -gneE0 -gneE13 gneE14 gneE3"/>
flow>
<route edges="--gneE22 -gneE0 gneE15 gneE2"/>
flow>
<route edges="-gneE20 -gneE19 -gneE1 -gneE11 gneE13 gneE0 -gneE22"/>
flow>
<route edges="-gneE20 -gneE19 -gneE1 -gneE11 gneE12 gneE2"/>
flow>
<route edges="-gneE20 -gneE19 -gneE1 gneE17 gneE3"/>
flow>
<route edges="-gneE2 -gneE12 gneE14 gneE3"/>
flow>
<route edges="-gneE2 -gneE12 gneE13 gneE0 -gneE22"/>
flow>
<route edges="-gneE2 gneE16 gneE1 gneE19 gneE20"/>
flow>
<route edges="-gneE3 -gneE14 gneE12 gneE2"/>
flow>
<route edges="-gneE3 -gneE14 gneE11 gneE1 gneE19 gneE20"/>
flow>
<route edges="-gneE3 gneE18 gneE0 -gneE22"/>
flow>
<route edges="--gneE22 -gneE0 -gneE13 gneE11 gneE1 gneE19 gneE20"/>
flow>
<route edges="--gneE22 -gneE0 -gneE13 gneE14 gneE3"/>
flow>
<route edges="--gneE22 -gneE0 gneE15 gneE2"/>
flow>
<route edges="-gneE20 -gneE19 -gneE1 -gneE11 gneE13 gneE0 -gneE22"/>
flow>
<route edges="-gneE20 -gneE19 -gneE1 -gneE11 gneE12 gneE2"/>
flow>
<route edges="-gneE20 -gneE19 -gneE1 gneE17 gneE3"/>
flow>
routes>
add 文件用于按要求改变信号灯状态。add 文件中有两个信号配时方案,一个是高峰时期配时方案 High
,一个是平峰时期配时方案 Flat
。根据要求,切换为 High
配时的时间为 0s 和 36001s,切换为 Flat
配时的时间为 7201s。
<additional xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://sumo.dlr.de/xsd/additional_file.xsd">
<tlLogic id="gneJ9" type="static" programID="High" offset="0">
<phase duration="40" state="GGGrrrrrGGGrrrrr"/>
<phase duration="3" state="YYYrrrrrYYYrrrrr"/>
<phase duration="20" state="rrrGGrrrrrrGGrrr"/>
<phase duration="3" state="rrrYYrrrrrrYYrrr"/>
<phase duration="42" state="rrrrrrrrrrrrrGGG"/>
<phase duration="3" state="rrrrrrrrrrrrrYYY"/>
<phase duration="31" state="rrrrrGGGrrrrrrrr"/>
<phase duration="3" state="rrrrrYYYrrrrrrrr"/>
tlLogic>
<tlLogic id="gneJ9" type="static" programID="Flat" offset="0">
<phase duration="19" state="rrrrrrrrGGGGGrrr"/>
<phase duration="3" state="rrrrrrrrGGGYYrrr"/>
<phase duration="23" state="GGGrrrrrGGGrrrrr"/>
<phase duration="3" state="GGGrrrrrYYYrrrrr"/>
<phase duration="19" state="GGGGGrrrrrrrrrrr"/>
<phase duration="3" state="YYYYYrrrrrrrrrrr"/>
<phase duration="27" state="rrrrrrrrrrrrrGGG"/>
<phase duration="3" state="rrrrrrrrrrrrrYYY"/>
<phase duration="27" state="rrrrrGGGrrrrrrrr"/>
<phase duration="3" state="rrrrrYYYrrrrrrrr"/>
tlLogic>
<WAUT startProg="High" id="w1">
<wautSwitch to="Flat" time="7201"/>
<wautSwitch to="High" time="36001"/>
WAUT>
<wautJunction junctionID="gneJ9" wautID="w1">wautJunction>
additional>
将以上四个文件放在同一个文件夹下,并在命令行中切换到该文件夹,输入:
sumo -c mybs.sumocfg
如果想要看到可视化界面,则输入:
sumo-gui -c mybs.sumocfg
同样,将以上四个文件放在同一个文件夹下,并在命令行中切换到该文件夹,输入:
sumo -c mybs.sumocfg -a output_alllight.add.xml
如果想要看到可视化界面,则输入:
sumo-gui -c mybs.sumocfg -a output_alllight.add.xml
如果使用这种方法,那么在 sumocfg 文件中,就不需要写这行代码:
<additional-files value="output_alllight.add.xml"/>
(实际这两种方法是一样的,只不过刚开始只会在命令行中输入 -a
来调用 add 文件,后来才学会像方法一那样在仿真开始之前就把 add 文件写在 sumocfg 的文件 中,这里记录一下)
在 sumocfg 中,将仿真时间改为 300s。(仿真太久车辆轨迹太多,影响绘图效果)
然后,同样在命令行中,将目录切换为你存放文件的目录,输入命令:
sumo -c mybs.sumocfg -a output_alllight.add.xml --fcd-output fcd.xml
接下来是绘图命令:
python38 D:\sumo\tools\plot_trajectories.py fcd.xml -t td -o plot.png -s
绘制效果如图
如果想看的更清楚,可以只绘制一条车流的时空图,使用 --filter-route
选项过滤路径:
python38 D:\sumo\tools\plot_trajectories.py fcd.xml -t td -o plot.png -s --filter-route -gneE2,-gneE12,gneE14,gneE3
选项 -t (–trajectory-type) 支持多种不同的绘图风格:
td: time vs distance
ts: time vs speed
ta: time vs acceleration
ds: distance vs speed
da: distance vs acceleration
当选项 -s 被设置,将打开一个交互图,允许通过各自的线路来识别车辆。
选项 --filter-route EDGE1,EDGE2,… 将只绘制包含给定边集的轨迹。