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
在下一部分,我们将了解如何创建新的汽车行为。