2013年1月20日 星期日

Install sumo on CentOS 6.x (搞定)

懶人包:建議直接換回Ubuntu裝sumo比較快,我已經懶得處理各套件之間衝突的問題了

發現可以成功安裝的方法了,這邊更新一下安裝成功的方式,一樣是在sumo的官方網站下載,下載的是sumo-src-0.16.0.tar.gz,方法如下:
$ tar zxvf sumo-src-0.16.0.tar.gz
$ cd sumo-0.16.0/
$ ./configure
...
...
checking for XERCES... no
checking for main in -lxerces-c... no
configure: error: xerces-lib not found. Specify path with option --with-xerces-libraries=DIR.
因為缺了xerces所以沒辦法裝,在這邊可以下載,為了保險起見,還是抓原始檔自己編譯好。

2012年12月19日 星期三

加入 mUDP mTCP 等 Agent

今天在跑某隻sample script 的時候出現一個錯誤

invalid command name "Agent/TCPSink/mTcpSink"

原來mTCP是由柯志亨先生開發出的Agent,可以在連線中記錄封包的訊息(到底多了哪些訊息我還不清楚,可參考文件),加入的方式如下:

2012年2月14日 星期二

車輛停留時間公式

假設紅綠燈週期:紅燈65秒、黃燈5秒、綠燈60秒,東西向以紅燈開始

車輛從進入RSU到紅綠燈前停下需20秒,從靜止到駛離RSU範圍需要20秒
若車輛進入RSU後沒遇上紅燈,則通過整個RSU範圍需36秒(少掉減速及加速的時間)

故必遇上紅燈的第一個門檻時間則是紅燈時間減掉18秒,也就是說車輛必須在進入路口時就看見綠燈,如果道路口時還是紅燈,車輛會減速,會增加停留在RSU範圍內的時間,所以最快速通過RSU範圍的車輛必定是在剛好變成綠燈的時候仍然保持最高速度,而以最高速度抵達路口的時間就是18秒,而第二個門檻時間則是紅燈時間加上綠燈時間再減掉18秒,一樣車輛必須在進入綠口時仍然看見綠燈,若轉黃燈,車輛會減速,而以最高速度抵達路口的時間就是18秒。

Red lead

Green lead
T(t) :停留在RSU範圍內的時間
R :紅燈時間
Y:黃燈時間
G:綠燈時間
R = G + Y

2012年2月12日 星期日

2012/02/15 預計進度

車輛數據方面:
進入路口之紅綠燈時間點VS在路口停留時間長度
目前車輛在路口時間統計出來的數據分布像這樣,縱軸是車輛進入路口的累計時間,橫軸是車輛進入路口時紅綠燈的時間點,由圖可以知道停留時間會跟進入路口的時間點有關,其中可以發現有兩個門檻值,兩個「必定會碰到紅燈」的門檻時間,被這兩個門檻時間包圍住的中間區段,屬於爭議區,因為在相同的紅綠燈週期進入的不同車輛,有些可能會碰上紅燈,大部分是不會碰上紅燈,所以必須找出方法便認出這些車輛,而爭議區外的車輛,則是要找出公式供RSU在車輛進入範圍時估算停留時間。



TCP傳輸模擬:
計算不同數量節點同時傳輸給RSU的流量,記錄傳輸速度的變化

2011年12月20日 星期二

Ubuntu不要升到11.10

今天手癢把系統升級到11.10,執行nam的時候出現以下錯誤訊息:
nam:

[code omitted because of length]

: version conflict for package "Tcl": have 8.5.10, need exactly 8.4

    while executing

"package require -exact Tcl 8.4"

老實說我找了好幾篇解決方案,講的都是同一招,而且我還看不懂,擷取其中最後一段:
OK, you have the library, so your executable is not looking in the right place for
 it. To list the libraries an executable needs, run the command: ldd executable
Look at the tcl8.4 in the list -- should not have an explicit location, just a name
, so it would get picked up from a normal library search. If it has an explicit loc
ation, and the location does not have the library, put the link there to the tcl8,4.

  If you installed the executable from an Ubuntu package, then report as a bug. If 
you downloaded from a ramdom location on the internet, then this is the sort of pro
blem you'd expect. You can rebuild it yourself, or add the links to your system to 
make these sort of things work. 

不懂其中ldd是什麼指令,還有executable是代表什麼意思,所以就先不要升級吧!

2011年12月1日 星期四

node.sh

#!/bin/bash
stop=1
#####################################################
#             #
# Collecting information       #
#             #
#####################################################
echo 'Set the node-edge file name without extensions:'
read filename
echo "Filename set:$filename"
echo "Set map size "
echo "Set column(x):"
read x
echo "Set row(y):"
read y
echo "Set the length of raod"
read length

#####################################################
#          #
# Producing road network       #
#          #
#####################################################
echo "<nodes>" > $filename".nod.xml"
echo "<edges>" > $filename".edg.xml"
echo "<edges>" > $filename".side.edg"
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!"
#####################################################
#          #
# Convert to net.xml       #
#          #
#####################################################
echo "Convert to net.xml"
netconvert -e $filename".edg.xml" -n $filename".nod.xml" -o $filename".tmp" -v --offset.disable-normalization
echo "Correcting Traffice light phase"
sed -f erase_tls.sed $filename.tmp > $filename.net.xml
rm $filename.tmp
echo $filename".net.xml SAVED!"
netconvert -e $filename".side.edg" -n $filename".nod.xml" -o $filename".side.net" --offset.disable-normalization
#####################################################
#          #
# Create trip file       #
#          #
#####################################################
echo "Set the simulation time(in second)"
read endtime
echo "Simulate from 0s to "$endtime"s."
echo "Create trip file"
~/Dropbox/Graduation/NS2Simulation/sumo-0.13.0/tools/trip/randomTrips.py -n $filename".side.net" -o $filename".trip.xml" -s 19 -b 0 -e $endtime
duarouter  -n $filename".net.xml" -t $filename".trip.xml" -o $filename".rou.xml" -v
echo "Create sumo.tr"
sumo -v -n $filename".net.xml" -r $filename".rou.xml" --netstate-dump $filename".sumo.tr" --vehroute-output $filename".vrou.xml" -b 1 -e $endtime
echo "Set the intensity of viehicles:"
read p
echo "Create mobility tcl file"
java -jar ~/Dropbox/Graduation/NS2Simulation/sumo-0.13.0/tools/traceExporter/traceExporter.jar ns2 -n $filename".net.xml" -t $filename".sumo.tr" -a $filename".act.tcl" -m $filename".mob.tcl" -c $filename".cfg.tcl" -b 1 -e $endtime -p $p
~/Dropbox/Graduation/NS2Simulation/sumo-0.13.0/tools/route/routecheck.py -n $filename".net.xml" $filename".rou.xml" -v
mkdir $filename/
mv $filename.* $filename/
# mv $filename.*.tcl $filename.net.xml $filename.side.net $filename/
# rm $filename.*

用指令使用 SUMO

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