跳轉到內容

Disim 高速公路模擬器/建立高速公路網路

來自 Wikibooks,開放世界的開放書籍

解釋語法

[編輯 | 編輯原始碼]

為 Disim 建立地圖非常直觀且容易。作為一個例子,你可以檢視檔案 maps/default.mapmaps/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 將非常不優雅地退出。

我們將構建右側縮圖上可見的高速公路

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

下一步是什麼?

[編輯 | 編輯原始碼]

下一部分,我們將瞭解如何建立新的汽車行為。

華夏公益教科書