跳转到内容

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

下一步是什么?

[编辑 | 编辑源代码]

下一部分,我们将了解如何创建新的汽车行为。

华夏公益教科书