sumo是用來模擬都市道路的程式,目前最新版本是0.13.1,可以到這邊下載
SUMO
支援的平台有windows、linux、Mac等等,我在mac上是成功安裝0.13.0,目前還沒有打算要換成新版,感覺差異不是很大。
通常sumo都會搭配MOVE的圖形化介面使用,但這對於需要大量產生地圖檔的人很不友善,移動滑鼠的時間就超過實際產生地圖的時間了,在這幾個月找了很多文章還有本身附的說明,終於找到可以使用指令產生地圖的方法了
首先要先產生nod.xml跟edg.xml,也就是路口與道路的設定檔,以下範例是我用來產生一般方格道路,只有十字路口有紅綠燈,外環道路沒有燈號:
node=0
edge=0
side=0
for((i=0;i<y;i++))
do
for((j=0;j<x;j++))
do
if test $i -eq 0 && test $j -lt $((x-1));then
type='priority a'
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+1))'" priority="75" numLanes="2" speed="13.88" />' >> $filename".edg.xml"
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+1))'" priority="75" numLanes="2" speed="13.88" />' >> $filename".side.edg"
edge=$((edge+1))
echo '<edge id="edge'$edge'" from="node'$((node+1))'" to="node'$node'" priority="75" numLanes="2" speed="13.88" />' >> $filename".edg.xml"
echo '<edge id="edge'$edge'" from="node'$((node+1))'" to="node'$node'" priority="75" numLanes="2" speed="13.88" />' >> $filename".side.edg"
edge=$((edge+1))
if test $j -eq 0;then
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+x))'" priority="75" numLanes="2" speed="13.88" />' >> $filename".side.edg"
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+x))'" priority="75" numLanes="2" speed="13.88" />' >> $filename".edg.xml"
else
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+x))'" priority="75" numLanes="1" speed="13.88" />' >> $filename".edg.xml"
fi
edge=$((edge+1))
if test $j -eq 0;then
echo '<edge id="edge'$edge'" from="node'$((node+x))'" to="node'$node'" priority="75" numLanes="2" speed="13.88" />' >> $filename".side.edg"
echo '<edge id="edge'$edge'" from="node'$((node+x))'" to="node'$node'" priority="75" numLanes="2" speed="13.88" />' >> $filename".edg.xml"
else
echo '<edge id="edge'$edge'" from="node'$((node+x))'" to="node'$node'" priority="75" numLanes="1" speed="13.88" />' >> $filename".edg.xml"
fi
edge=$((edge+1))
elif test $i -eq $((y-1)) && test $j -lt $((x-1));then
type='priority b'
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+1))'" priority="75" numLanes="2" speed="13.88" />' >> $filename".edg.xml"
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+1))'" priority="75" numLanes="2" speed="13.88" />' >> $filename".side.edg"
edge=$((edge+1))
echo '<edge id="edge'$edge'" from="node'$((node+1))'" to="node'$node'" priority="75" numLanes="2" speed="13.88" />' >> $filename".edg.xml"
echo '<edge id="edge'$edge'" from="node'$((node+1))'" to="node'$node'" priority="75" numLanes="2" speed="13.88" />' >> $filename".side.edg"
edge=$((edge+1))
elif test $j -eq 0 && test $i -lt $((y-1));then
type='priority c'
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+1))'" priority="75" numLanes="1" speed="13.88" />' >> $filename".edg.xml"
edge=$((edge+1))
echo '<edge id="edge'$edge'" from="node'$((node+1))'" to="node'$node'" priority="75" numLanes="1" speed="13.88" />' >> $filename".edg.xml"
edge=$((edge+1))
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+x))'" priority="75" numLanes="2" speed="13.88" />' >> $filename".edg.xml"
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+x))'" priority="75" numLanes="2" speed="13.88" />' >> $filename".side.edg"
edge=$((edge+1))
echo '<edge id="edge'$edge'" from="node'$((node+x))'" to="node'$node'" priority="75" numLanes="2" speed="13.88" />' >> $filename".edg.xml"
echo '<edge id="edge'$edge'" from="node'$((node+x))'" to="node'$node'" priority="75" numLanes="2" speed="13.88" />' >> $filename".side.edg"
edge=$((edge+1))
elif test $j -eq $((x-1)) && test $i -lt $((y-1));then
type='priority d'
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+x))'" priority="75" numLanes="2" speed="13.88" />' >> $filename".edg.xml"
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+x))'" priority="75" numLanes="2" speed="13.88" />' >> $filename".side.edg"
edge=$((edge+1))
echo '<edge id="edge'$edge'" from="node'$((node+x))'" to="node'$node'" priority="75" numLanes="2" speed="13.88" />' >> $filename".edg.xml"
echo '<edge id="edge'$edge'" from="node'$((node+x))'" to="node'$node'" priority="75" numLanes="2" speed="13.88" />' >> $filename".side.edg"
edge=$((edge+1))
elif test $i -eq $((y-1)) && test $j -eq $((x-1));then
type='priority e'
else
type='traffic_light'
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+1))'" priority="75" numLanes="1" speed="13.88" />' >> $filename".edg.xml"
edge=$((edge+1))
echo '<edge id="edge'$edge'" from="node'$((node+1))'" to="node'$node'" priority="75" numLanes="1" speed="13.88" />' >> $filename".edg.xml"
edge=$((edge+1))
echo '<edge id="edge'$edge'" from="node'$node'" to="node'$((node+x))'" priority="75" numLanes="1" speed="13.88" />' >> $filename".edg.xml"
edge=$((edge+1))
echo '<edge id="edge'$edge'" from="node'$((node+x))'" to="node'$node'" priority="75" numLanes="1" speed="13.88" />' >> $filename".edg.xml"
edge=$((edge+1))
fi
echo '<node id="node'$node'" x="'$((j*length+5))'" y="'$((i*length+5))'" type="'$type'" />' >> $filename".nod.xml"
node=$((node+1))
done
done
#done
echo "</nodes>" >> $filename".nod.xml"
echo "</edges>" >> $filename".edg.xml"
echo "</edges>" >> $filename".side.edg"
echo "$filename.nod.xml $filename.edg.xml SAVED!"
再來使用netconvert 結合nod.xml和edg.xml產生net.xml 地圖檔,這是用來產生路徑的根據,所以如果需要控制車輛起始與結束位置,可以從這邊動手腳。
接下來使用tools裡面的randomTrips.py來產生trip檔,好用來讓duarouter產生路徑檔rou.xml