Disim 高速公路模擬器/建立高速公路網路
為 Disim 建立地圖非常直觀且容易。作為一個例子,你可以檢視檔案 maps/default.map 和 maps/loop.txt。
以下是它的工作原理。地圖檔案應該以以下序言開頭
$NAME,The map name $LANE_WIDTH,3.5
這表示地圖的名稱和顯示的車道寬度。如果此行不存在,則預設車道寬度為 3.5 米。然後,你可以根據交通流的方向宣告你的高速公路段。每個段以一條必填行開頭
$SEGMENT,straight,X
表示一條長度為 X 米的直線段,或者
$SEGMENT,circular,X,Y
表示一條左端車道半徑為 X 米、角度跨度為 Y 度的圓形段。如果 Y 為正,則車道將向右轉,如果為負,則向左轉。
接下來,你可以選擇性地指示你的段是否應該在左側或右側包含入口車道
$TYPE,entry,[left|right]
或者左側或右側的出口車道
$TYPE,exit,[left|right]
第二個引數 [left|right] 是可選的(預設值為 right)。
然後,你可以指定該段的速度限制
$SPEED,X
其中 X 是以公里/小時為單位的速度限制。
然後,必須使用以下方法宣告要從先前段保留的車道數量和新車道數量(用於入口段和出口段)
$NUM_LANES,X,Y
其中 X 是要保留的車道數量,Y 是新車道數量。在某些情況下,可能需要在沒有入口段或出口段的情況下,從一個段更改為另一個段的車道數量。在這種情況下,可以將段型別宣告為 none,[left|right],以便能夠指定車道位於先前段的左側或右側,例如
$TYPE,none,left $NUM_LANES,2
這將以先前段左側的 2 個車道繼續高速公路。
最後,如果你的段是入口段,你可以使用以下方法指定特定車道的入口率
$LANE,X,Y
其中 X 是車道索引(0 是最左邊的車道,1 是最左邊的車道右側的車道,...),Y 是以車輛/小時為單位的入口率。
車道可以具有不同的標記(例如虛線或實線)
$LEFT_MARKING,X,Y,Z,[broken|solid] $RIGHT_MARKING,X,Y,Z,[broken|solid]
其中 X 是車道索引,Y 是起始位置,Z 是結束位置。
最後,如果你決定要在此段放置道路感測器,你可以使用以下方法宣告一個名為 name 的感測器
$DENSITY_SENSOR,name,X,Y,Z
記錄交通密度(以車輛/公里為單位),其中 X 是車道索引,Y 是感測器的入口位置,Z 是出口位置(如果段是直線,則 X 以米為單位,如果為圓形,則 X 以度為單位)。或者
$SPEED_SENSOR,name,X,Y
記錄以公里/小時為單位的時間平均速度資料,其中 Y 是探測器在該段的位置。或者
$FLOW_SENSOR,name,X,Y
記錄以車輛/小時為單位的流量。感測器每分鐘對交通資料進行平均,並將此值轉儲到日誌檔案中(如果將選項 --record 傳遞給 Disim)。
你也可以在道路上放置執行器,例如交通燈
$TRAFFIC_LIGHT,name,X,Y
或可變限速標誌
$SPEED_LIMIT,name,X,Y
另外,如果你想建立一個閉環,可以使用
$CLOSE_THE_LOOP
在檔案末尾將第一個段與最後一個段連結起來。
以下是完整的語法,其中方括號 [] 表示必填選項,花括號 {} 表示可選文字,圓括號 () 和星號 * 將表示式組合在一起,因此 (x)* 表示 x 可以重複任意次數。
$NAME,[name of the map]
{$LANE_WIDTH,[width of the lanes in meters]}
(
$SEGMENT,[straight/circular],[length/radius in m]{,[angle span in degrees, it can be negative]}
{$TYPE,[entry/exit/none]{,[left/right]}}
{$SPEED,[speed in km-h]}
$NUM_LANES,[number of kept lanes]{,[number of new entry/exit lanes]}
{$LANE,[lane id 0:left-most, 1, 2],[entry rate veh-hr]{,[name]}}
{$LEFT_MARKING,[lane id 0:left-most, 1, 2],[from position in m/degrees],[to position in m/rad],[broken/solid]}
{$RIGHT_MARKING,[lane id 0:left-most, 1, 2],[from position in m/degrees],[to position in m/rad],[broken/solid]}
{$DENSITY_SENSOR,[name],[lane id 0:left-most, 1, 2],[first loop detector position in m/degrees],[second loop detector position in m/degrees]{,[log/nolog]}}
{$SPEED_SENSOR,[name],[lane id 0:left-most, 1, 2],[loop detector position in m/degrees]{,[log/nolog]}}
{$FLOW_SENSOR,[name],[lane id 0:left-most, 1, 2],[loop detector position in m/degrees]{,[log/nolog]}}
{$TRAFFIC_LIGHT,[name],[lane id 0:left-most, 1, 2],[position in m/degrees]}
{$SPEED_LIMIT,[name],[lane id 0:left-most, 1, 2],[position in m/degrees]}
)*
{$CLOSE_THE_LOOP}
目前,在解析地圖時沒有進行任何驗證,因此當給出錯誤的地圖時,Disim 將非常不優雅地退出。
我們將構建右側縮圖上可見的高速公路

我們觀察到這條高速公路由 4 個段組成
- 一個圓形段(左上角),2 個車道,左端車道半徑為 50 米。
- 一條長度為 100 米的直線段。
- 另一個圓形段,3 個車道,第 3 個車道是附加車道(不是新的入口)。
- 另一個 3 個車道的直線段。
我們將地圖命名為:一個示例
讓我們從序言開始
$NAME,An example
然後讓我們新增第一個段
$SEGMENT,circular,50,90 $TYPE,entry,left $NUM_LANES,0,2 $LANE,0,3000 $LANE,1,3000
該段是圓形的,半徑為 50 米,角度跨度為 90 度。由於它是我們高速公路的第一個段,因此它是一個建立 2 個車道的入口。兩個車道的入口率均為每小時 3000 輛車。
第二個段是對先前段的簡單繼續
$SEGMENT,straight,100 $NUM_LANES,2
該段是直線段,長度為 100 米。它有 2 個車道。
第三個段稍微複雜一點。它有 3 個車道,第 3 個車道(新車道)位於先前段的右側(或者說它的最左端車道連線到先前段的左側)。
$SEGMENT,circular,50,-180 $TYPE,none,left $NUM_LANES,3
它是一個圓形段,半徑為 50 米,角度跨度為 180 度,向左側轉彎(因此為負號)。它最左端的車道是先前段最左端車道的繼續(嘗試使用 $TYPE,none,right 進行測試),它有 3 個車道。
最後一個段是一個簡單的 3 個車道段,繼續先前段,並作為高速公路的出口
$SEGMENT,straight,100 $TYPE,exit $NUM_LANES,0,3
它的型別是 exit,出口後繼續保留的車道數量為 0,出口的車道數量為 3。
最終的地圖檔案 example.map 如下所示
$NAME,An example $SEGMENT,circular,50,90 $TYPE,entry,left $SPEED,120 $NUM_LANES,0,2 $LANE,0,3000 $LANE,1,3000 $SEGMENT,straight,100 $NUM_LANES,2 $SEGMENT,circular,50,-180 $TYPE,none,left $NUM_LANES,3 $SEGMENT,straight,100 $TYPE,exit $NUM_LANES,0,3
在下一部分,我們將瞭解如何建立新的汽車行為。