本次攻略二重點(diǎn)介紹幾種常用的創(chuàng)建SUMO仿真的方式彭雾,其中包括離線下載路網(wǎng)方式临庇、手動(dòng)程序輸入方式酪碘、netedit編輯等形式;其中包含單點(diǎn)交叉口休蟹、復(fù)雜路網(wǎng)等情況。
攻略二中所有涉及路網(wǎng)如果有需要的日矫,請(qǐng)關(guān)注小白交通筆記赂弓、私聊小白、小白會(huì)將路網(wǎng)壓縮包發(fā)給你哪轿。
攻略二的涉及內(nèi)容較多盈魁,都是干貨,如果有什么不懂的可以在交流區(qū)提問或者私聊小白提問缔逛。
1 工具創(chuàng)建方式
1.1 osmWebWizard.py 工具小白安裝的sumo版本是1.3.1版本的,osmWebWizard.py的位置為sumo-1.3.1-> tools -> osmWebWizard.py 工具
1.2 用python打開osmWebWizard.py并運(yùn)行
運(yùn)行之后會(huì)在瀏覽器上顯示以下頁面
1.3 選擇想要截取的位置
將Berlin換成小白所在的成都
點(diǎn)擊上圖的Select Area备埃,呈現(xiàn)下圖效果姓惑,圖中框的位置就是想要截取的部分褐奴,框的大小可以調(diào)節(jié)。
點(diǎn)擊圖中的汽車標(biāo)志可以調(diào)節(jié)汽車的數(shù)量于毙,需要添加什么可以在下圖勾選敦冬。
1.4生成仿真網(wǎng)絡(luò),點(diǎn)擊Generate Scenario
在tools目錄下會(huì)生成一個(gè)文件夾
1.5可視化效果將osm.sumocfg用sumo-gui打開
將osm.sumocfg用sumo-gui打開
視頻效果詳見小白交通筆記公眾號(hào)
2 程序語句創(chuàng)建路網(wǎng)方式
溫馨提示:SUMO官方文檔中手動(dòng)操作的小例子(可以動(dòng)手試試):
https://sumo.dlr.de/docs/Tutorials/Hello_SUMO.html
學(xué)習(xí)內(nèi)容來自于:https://www.youtube.com/watch?v=9MyIABer_NY&list=PLIeBSAsZdO66ujAgQW9lv8cW34t647hEH&index=2
2.1手動(dòng)創(chuàng)造節(jié)點(diǎn)唯沮、路段和車輛路徑分配
簡(jiǎn)單路網(wǎng)網(wǎng)絡(luò)示意圖(包含節(jié)點(diǎn)脖旱、路段、路段之間由節(jié)點(diǎn)連接)介蛉,此種方式創(chuàng)建時(shí)需要節(jié)點(diǎn)坐標(biāo)萌庆。
2.1.1創(chuàng)建網(wǎng)絡(luò)
本人在這一步是一般是先創(chuàng)建一個(gè)文件夾,此時(shí)文件可根據(jù)個(gè)人喜好命名币旧,本人命名為part1example践险,在文件夾進(jìn)行下列文件的創(chuàng)建。
溫馨提示:以下文件任何程序編輯中都可得到,本人常用的是python巍虫、Notepad++彭则。
創(chuàng)建網(wǎng)絡(luò)需要進(jìn)行以下四個(gè)步驟:
(1)創(chuàng)建節(jié)點(diǎn)文件(.node.xml)
(2)創(chuàng)建路段文件(.edg.xml)
(3)創(chuàng)建路段類型文件(.type.xml)
(4)創(chuàng)建網(wǎng)絡(luò)文件(.net.xml)根據(jù).node.xml、.edg.xml占遥、.type.xml
(5)創(chuàng)建車輛路徑文件(.rou.xml)
1.創(chuàng)建節(jié)點(diǎn)文件(.node.xml)
<nodes>
<node id="n1" x="-500" y="0" type="priority"/>
<node id="n2" x="-250" y="0" type="traffic_light"/>
<node id="n3" x="-150" y="200" type="traffic_light"/>
<node id="n4" x="0" y="0"/>
<node id="n5" x="150" y="200"/>
</nodes>
本人在Notepad++中編輯以上語句俯抖,保存時(shí)文件名定義為下圖所示。
id表示節(jié)點(diǎn)的名字, x瓦胎、y為節(jié)點(diǎn)坐標(biāo)芬萍,type為節(jié)點(diǎn)類型:"priority"表示車輛按照讓行規(guī)則通過節(jié)點(diǎn)、"traffic_light"表示在此節(jié)點(diǎn)創(chuàng)建信號(hào)燈(具體的信號(hào)配時(shí)相位還需要根據(jù)實(shí)際情況調(diào)整搔啊,這里創(chuàng)建的是初始相位配時(shí))担忧。
官方文檔關(guān)于node文件的定義:
https://sumo.dlr.de/docs/Networks/PlainXML.html#node_descriptions
2.創(chuàng)建路段文件(.edg.xml),定義路段時(shí)只需要將相應(yīng)的節(jié)點(diǎn)進(jìn)行連接
<edges>
<edge from="n1" to="n2" id="1to2" type="3L45"/>
<edge from="n2" to="n3" id="2to3" type="2L15"/>
<edge from="n3" to="n4" id="3to4" type="3L30"/>
<edge from="n4" to="n5" id="out" type="3L30"/>
</edges>
官方文檔關(guān)于edges文件的說明:https://sumo.dlr.de/docs/Networks/PlainXML.html#edge_descriptions
溫馨提示:其中type中的屬性也可以在.ege.xml文檔中直接創(chuàng)建坯癣。
3.創(chuàng)建Type文件瓶盛,類似于路段屬性文件
<types>
<type id="3L45" priority="3" numLanes="3" speed="45"/>
<type id="2L15" priority="3" numLanes="2" speed="15"/>
<type id="3L30" priority="2" numLanes="3" speed="30"/>
</types>
其中type中的屬性也可以在.ege.xml文檔中直接創(chuàng)建,官方文檔關(guān)于type文件的定義:https://sumo.dlr.de/docs/SUMO_edge_type_file.html
4.創(chuàng)建網(wǎng)絡(luò)文件(.net.xml)根據(jù)(.node.xml)示罗、(.edg.xml)惩猫、(.type.xml)
netconvert --node-files my_nodes.nod.xml --edge-files my_edge.edg.xml -t my_type.type.xml -o my_net.net.xml
合成.net.xml文件的步驟為:
打開start-command-line(詳見攻略一)
打開以后的頁面
輸入cd/d加你文件夾的完整路徑
我自己的路徑輸入的是:
cd/d E:\pycodes\learning\Simulationsumo\sumolearn\Enpractice\part1example
如下圖
點(diǎn)擊回車
輸入:
netconvert --node-files my_nodes.nod.xml --edge-files my_edge.edg.xml -t my_type.type.xml -o my_net.net.xml
下圖中出現(xiàn)success就是成功了,就是在文件夾里成功得到my_net.net.xml文件了蚜点。
溫馨提示:下圖表示的是netconvert 合成路網(wǎng)最簡(jiǎn)單的一種形式轧房,見開頭小例子
netconvert的官方文檔:https://sumo.dlr.de/docs/netconvert.html
5. 創(chuàng)建車輛路徑文件(.rou.xml)
<routes>
<vType accel="1.0" decel="5.0" id="Car" length="2.0" maxSpeed="100.0" sigma="0.0"/>
<vType accel="1.0" decel="5.0" id="Bus" length="12.0" maxSpeed="1.0" sigma="0.0"/>
<route id="route0" edges="1to2 2to3"/>
<vehicle depart="10" id="veh0" route="route0" type="Bus"/>
<route id="route1" edges="2to3 3to4"/>
<vehicle depart="10" id="veh1" route="route1" type="Car"/>
<route id="route2" edges="3to4 out"/>
<vehicle depart="30" id="veh2" route="route2" type="Car"/>
</routes>
這種方式只是作者定義的方式。一般是先定義車輛類型绍绘,然后定義具體車輛路徑奶镶。官方文檔里有各種定義車輛路徑的方式。車輛路徑定義的官方文檔:https://sumo.dlr.de/docs/Definition_of_Vehicles%2C_Vehicle_Types%2C_and_Routes.html
2.1.2創(chuàng)建仿真運(yùn)行的開關(guān)文件
<configuration>
? <input>
? ? ? <net-file value="my_net.net.xml"/>
? ? ? <route-files value="my_routes.rou.xml"/>
? </input>
? <time>
? ? ? <begin value="0"/>
? ? ? <end value="2000"/>
? ? </time>
</configuration>
2.1.3仿真運(yùn)行的兩種方式
下圖表示了我文件夾中根據(jù)上述操作創(chuàng)建的文件
1).命令行操作
sumo -c my_config_file.sumocfg
sumo-gui -c my_config_file.sumocfg
打開start-common-line陪拘,輸入圖中所示的語句
點(diǎn)擊回車厂镇,會(huì)彈出以下界面
2).手動(dòng)操作將my_config_file.sumocfg文件拖到sumo-gui軟件中打開。
溫馨提示:還可以將http://my_net.net文件拖到netedit軟件中打開左刽,進(jìn)行編輯捺信。
2.1.3仿真運(yùn)行效果
視頻中的歌是不小心錄進(jìn)去的,仿真是沒有聲音的
視頻詳見小白交通筆記公眾號(hào)
3 利用OSM創(chuàng)建路網(wǎng)并隨機(jī)分配分配車輛路徑
學(xué)習(xí)內(nèi)容來自于:https://www.youtube.com/watch?v=LWecm_rCPJw&list=PLIeBSAsZdO66ujAgQW9lv8cW34t647hEH&index=3
該節(jié)內(nèi)容遵從以下流程:
(1)搜索下載開放街道地圖(Open Street Map, OSM)
(2)將下載的地圖文件轉(zhuǎn)換為sumo軟件的(.net.xml)文件
(3)添加隨機(jī)出行運(yùn)用python工具
運(yùn)用python工具
python PATH\randomTrips.py -n test.net.xml -rtest.rou.xml -e 50 -l
py PATH\randomTrips.py -n test.net.xml -rtest.rou.xml -e 50 -l
溫馨提示:上述語句中PATH輸入時(shí)需要輸入randomTrips.py所處的實(shí)際路徑欠痴。
(4)建立Configuration file 并運(yùn)行仿真
3.1 下載路網(wǎng)文件
搜索下載開放街道地圖(Open Street Map, OSM)
1.open street map網(wǎng)址:https://www.openstreetmap.org/
2.尋找到合適位置點(diǎn)擊手動(dòng)選擇不同的區(qū)域
上圖中框選的位置就是你要截選的位置迄靠,點(diǎn)擊圖中導(dǎo)出按鈕就得到了map.osm文件,將其重命名為cdnet.osm喇辽,并將cdnet.osm放入到新的文件夾中掌挚,本文命名為part4example。
3.2將下載的地圖文件轉(zhuǎn)換為sumo軟件的(.net.xml)文件
1.打開start-common-line
2.輸入:
cd/d E:\pycodes\learning\Simulationsumo\sumolearn\Enpractice\part4example
這是本人文件夾所在的位置菩咨,大家輸入自己文檔所在的位置就好了吠式。
3.再輸入:
netconvert --osm-files cdnet.osm -o cdnet.net.xml
4.得到的路網(wǎng)形式
3.3 添加車輛路徑
復(fù)制sumo文件夾下tool目錄下randomTrips.py到part4example文件夾舅世。
打開start-common-line,cd/d 轉(zhuǎn)到part4example文件夾(實(shí)際上轉(zhuǎn)一次就好了奇徒,不要把start-common-line 關(guān)閉)
輸入下列語句:
py E:\pycodes\learning\Simulationsumo\sumolearn\Enpractice\part4example\randomTrips.py -n cdnet.net.xml -r cdnet.rou.xml -e 50 -l
得到了cdnet.rou.xml文件
此函數(shù)的官方網(wǎng)址:
https://sumo.dlr.de/docs/Tools/Trip.html
3.4建立Configuration file 并運(yùn)行仿真(仿真運(yùn)行的開關(guān)文件)
<configuration>
? <input>
? ? ? <net-file value="cdnet.net.xml"/>
? ? ? <route-files value="cdnet.rou.xml"/>
? </input>
? <time>
? ? ? <begin value="0"/>
? ? ? <end value="2000"/>
? ? </time>
</configuration>
命名為cdnet.sumocfg并存儲(chǔ)在part4example文件夾雏亚。
3.5 可視化效果
同樣打開這個(gè)仿真還是有以上兩種方式。
視頻詳見小白交通筆記公眾號(hào)
4 為仿真運(yùn)行輸入OD矩陣并分配流量
感興趣的可以結(jié)合這個(gè)視頻和PPT在深入學(xué)習(xí)一下摩钙,官方視頻網(wǎng)址:https://www.youtube.com/watch?v=R6v7wDkvXrk&list=PLIeBSAsZdO66ujAgQW9lv8cW34t647hEH&index=4SUMO
官方文檔:https://sumo.dlr.de/docs/Demand/Importing_O/D_Matrices.html#describing_the_taz
5 利用nettdit編輯路網(wǎng)
1.打開netedit(以典型交叉口為例)
點(diǎn)擊File New Network
圖形化編輯頁面
溫馨提示:編輯路網(wǎng)時(shí)要選中上圖的Network罢低;查看連接效果是點(diǎn)中上圖的Demand
2.下面我簡(jiǎn)述一種創(chuàng)建交叉口的方式,見下視頻
視頻教程詳見小白交通筆記公號(hào)
上述視頻中介紹了一種手繪的交叉口實(shí)操胖笛,SUMO軟件中通過點(diǎn)擊點(diǎn)之間進(jìn)行連線网持,首先被點(diǎn)擊的節(jié)點(diǎn)是進(jìn)口方向,第二次被點(diǎn)擊的節(jié)點(diǎn)是出口方向长踊。
1.節(jié)點(diǎn)屬性修改功舀,采用路網(wǎng)查看工具,點(diǎn)擊節(jié)點(diǎn)
1)第一類節(jié)點(diǎn)身弊,單獨(dú)節(jié)點(diǎn)在下圖左側(cè)欄可以修改節(jié)點(diǎn)的屬性辟汰。常見的是修改id等。
2)共有節(jié)點(diǎn)的屬性也是這樣修改的阱佛。常見的是修改id帖汞,修改type類型。
在下圖左側(cè)欄可以修改路段的屬性凑术。常見的是修改id翩蘸、修改路段長(zhǎng)度、修改路段的車道數(shù)淮逊、修改路段允許的最大車速等催首。
3.修改路段之間的連接關(guān)系,請(qǐng)見視頻
視頻教程詳見小白交通筆記公號(hào)
上述視頻中如果修改完了一個(gè)進(jìn)口道的連接關(guān)系泄鹏,一定要記得保存郎任,否則連接關(guān)系沒有修改完成。如下圖修改完之后命满,點(diǎn)擊OK按鈕涝滴。繼續(xù)去編輯下一個(gè)。
4.接下來根據(jù)上述操作把這個(gè)交叉口變成下圖所示的標(biāo)準(zhǔn)交叉口胶台,請(qǐng)見視頻。
視頻教程詳見小白交通筆記公號(hào)
5.創(chuàng)建.rou.xml文件流量數(shù)據(jù)
車輛類型定義及路徑輸入的官方定義:https://sumo.dlr.de/docs/Definition_of_Vehicles%2C_Vehicle_Types%2C_and_Routes.html車輛輸入在.rou.xml文件中有三種表現(xiàn)形式
1) 每小時(shí)的流量輸入:vehsPerHour=’100’
2)固定時(shí)段的車輛數(shù)輸入:number=’200’
3)單個(gè)車輛自定義:
<vehicle id = “1” type=”type0”/ route=”route0”, depart=”0” color=”1,0,0”>
上文中隨機(jī)車輛路徑分配就是按第三種方式定義的杂抽,小白一般用前二種定義方式诈唬。
寫入車輛路徑時(shí)一定要有兩部分內(nèi)容:
1)車輛的定義:
<vType id="Car0" accel="0.8" decel="4.5" sigma="0.5" length="5" minGap="2.5" maxSpeed="16.67"/>
參數(shù)含義為:車輛類型的名字、最大加速度缩麸、最大減速度铸磅、長(zhǎng)度、最小間隙、最大行駛速度阅仔。還有很多類似的參數(shù)吹散,如果不設(shè)置的話,系統(tǒng)就會(huì)認(rèn)為是默認(rèn)值八酒。當(dāng)然也可以設(shè)置好幾組車輛空民。
2)車輛行駛數(shù)據(jù)(流量數(shù)據(jù))
此交叉口依據(jù)流量表完整.rou.xml文件為:
```
<?xml version="1.0" encoding="UTF-8"?>
<routes>
? <vType id="Car0" accel="0.8" decel="4.5" sigma="0.5" length="5" minGap="2.5" maxSpeed="16.67"/>
? <flow id="E11" type="Car0" color="1,0,0"? begin="0" end= "3600" vehsPerHour='100' departLane="random" departSpeed="max">
? ? <route edges="gneE0 -gneE1"/>
? </flow>
? <flow id="E12" type="Car0" color="0,1,0"? begin="0" end= "3600" vehsPerHour='300' departLane="random" departSpeed="max">
? ? <route edges="gneE0 -gneE2"/>
? </flow>
? <flow id="E13" type="Car0" color="0,0,1"? begin="0" end= "3600" vehsPerHour='200' departLane="random" departSpeed="max">
? ? <route edges="gneE0 -gneE3"/>
? </flow>
? <flow id="W11" type="Car0" color="1,0,0"? begin="0" end= "3600" vehsPerHour='100' departLane="random" departSpeed="max">
? ? <route edges="gneE2 -gneE3"/>
? </flow>
? <flow id="W12" type="Car0" color="0,1,0"? begin="0" end= "3600" vehsPerHour='300' departLane="random" departSpeed="max">
? ? <route edges="gneE2 -gneE0"/>
? </flow>
? <flow id="W13" type="Car0" color="0,0,1"? begin="0" end= "3600" vehsPerHour='200' departLane="random" departSpeed="max">
? ? <route edges="gneE2 -gneE1"/>
? </flow>
? <flow id="S11" type="Car0" color="1,0,0"? begin="0" end= "3600" vehsPerHour='100' departLane="random" departSpeed="max">
? ? <route edges="gneE3 -gneE0"/>
? </flow>
? <flow id="S12" type="Car0" color="0,1,0"? begin="0" end= "3600" vehsPerHour='300' departLane="random" departSpeed="max">
? ? <route edges="gneE3 -gneE1"/>
? </flow>
? <flow id="S13" type="Car0" color="0,0,1"? begin="0" end= "3600" vehsPerHour='200' departLane="random" departSpeed="max">
? ? <route edges="gneE3 -gneE2"/>
? </flow>
? <flow id="N11" type="Car0" color="1,0,0"? begin="0" end= "3600" vehsPerHour='100' departLane="random" departSpeed="max">
? ? <route edges="gneE1 -gneE2"/>
? </flow>
? <flow id="N12" type="Car0" color="0,1,0"? begin="0" end= "3600" vehsPerHour='300' departLane="random" departSpeed="max">
? ? <route edges="gneE1 -gneE3"/>
? </flow>
? <flow id="N13" type="Car0" color="0,0,1"? begin="0" end= "3600" vehsPerHour='200' departLane="random" departSpeed="max">
? ? <route edges="gneE1 -gneE0"/>
? </flow>
</routes>
```
6.創(chuàng)建信號(hào)信控方案
按照標(biāo)準(zhǔn)交叉口進(jìn)行設(shè)置周期時(shí)長(zhǎng)為:122s
右轉(zhuǎn)不設(shè)限
第一相位:東西直行30s(綠燈)+3s(黃燈)
第二相位:南北直行30s(綠燈)+3s(黃燈)
第三相位:東西左轉(zhuǎn)25s(綠燈)+3s(黃燈)
第四相位:南北左轉(zhuǎn)25s(綠燈)+3s(黃燈)
1)基礎(chǔ)概念解釋
圖中 dur是分配的時(shí)長(zhǎng)
State 是以下狀態(tài)的縮寫表示
G表示此車道是綠燈且不讓行
g表示此車道是綠燈且讓行
r表示紅燈
y表示黃燈
state 中字母的個(gè)數(shù)代表交叉口處車道總的連線數(shù),例如上圖所示交叉口有13根連線羞迷。具體含義如下所示界轩。了解了這些字母含義,后續(xù)利用Traci進(jìn)行二次開發(fā)衔瓮,會(huì)順利很多浊猾。
溫馨提示:
操作第一個(gè)相位時(shí)可以右擊鼠標(biāo)更改連線屬性,后面就不要了热鞍。后續(xù)相位右擊鼠標(biāo)更改連線屬性葫慎,這樣操作總是把相位弄錯(cuò),小白到現(xiàn)在不知道什么原因薇宠,知道的同學(xué)希望可以不吝賜教幅疼。相位配時(shí)輸入完成之后,請(qǐng)逐個(gè)檢查昼接,防止錯(cuò)誤爽篷。
2)視頻操作
視頻教程詳見小白交通筆記公號(hào)
從視頻中也可以看出來,調(diào)節(jié)信號(hào)燈是非常繁瑣的事情慢睡,在程序中設(shè)置是一種比較方便的事情逐工,在后續(xù)的攻略中會(huì)繼續(xù)分享小白的筆記。
7.最終效果
視頻效果詳見小白交通筆記公號(hào)
六 總結(jié)
經(jīng)過上述五個(gè)部分漂辐,大家應(yīng)該都知道怎么去建立自己的仿真網(wǎng)絡(luò)了泪喊,由單個(gè)交叉口也可以推廣到多個(gè)交叉口。
接下來小白會(huì)繼續(xù)分享自己sumo學(xué)習(xí)方面的筆記髓涯。
如果有任何問題袒啼,歡迎大家來小白交通筆記一起探討。
更完善的內(nèi)容纬纪,請(qǐng)見小白交通筆記蚓再。