规范

本文档侧重于交通仿真的主要组成部分,即包含车道的街道(边)、节点(交叉口)以及带有其路径的车辆。本文档不包含任何关于交通灯、检测器、可视化或类似内容的信息。另一方面,本文档旨在提供精确的描述,作为实现的模板以及输入文件的 XML 模式。因此,有一个包含所有允许属性及其类型(和可能的单位)的表格。如果属性不是强制性的,则也会定义默认值。所有元素和属性的名称仅由字母(小写或驼峰式)和下划线组成。请记住,作为 ID 的属性值应仅由字母、数字、下划线、连字符、点和冒号组成,并以字母或下划线开头(在下文中称为“有效的 XML ID”)。关于人员和多模式仿真集装箱路径规划有本文档的“后续”内容。

车辆 (Vehicles)#

单个车辆不被建模,它始终是处于行程中的车辆,这意味着一旦车辆到达其目的地,它就会从系统中删除,无法再被引用。车辆的物理参数由其类型定义,该类型还定义了其所属的某些车辆类别。车辆由其类型和路径的组合定义,连同指定开始和结束行为的参数。诸如颜色之类的附加参数仅用于可视化目的。车辆可以将路径和停靠点作为子元素。

属性 (Attribute) 类型 (Type) 范围 (Range) 默认值 (Default) 备注 (Remark)
id string 有效的 XML id -
route string 路径或路径分布 id - 必须有此 id 或路径子元素之一
type string vType 或 vTypeDistribution id 默认类型
depart float(s)/string ≥0;"triggered"
departLane int/string ≥0,"random","free" 0 "free" 是被占用最少(按车辆长度总和)的车道
departPos float(m)/string ≥0(2),"random","free","random_free","base" "base" "free" 意味着在出发车道上最接近起点且可以插入车辆的点。"random_free" 强制尝试查找空闲的随机位置,如果失败,则将车辆放置在下一个“空闲”位置。"base" 将车辆的出发位置设置为车辆长度 + eps (eps=.1m),这意味着车辆完全位于出发车道的起点。
departSpeed float(m/s)/string ≥0,"random","max" 0 "max" 指的是插入车辆时可以达到的最大速度
arrivalLane int/string ≥0,"current" "current"
arrivalPos float(m)/string ≥0(2),"random","max" "max"
arrivalSpeed float(m/s)/string ≥0,"current" "current"
  • (2):实际上,负位置目前也是允许的。在这种情况下,该值会加到车道的长度上。这意味着位置是从车道末端开始计算的。超出边界的值(正负)将被静默移动到最近的边界。

流 (Flows)(重复插入)#

重复的车辆插入具有与单个车辆相同的属性和子元素,除了 depart。以下是已知的附加属性:

属性 (Attribute) 类型 (Type) 范围 (Range) 默认值 (Default) 备注 (Remark)
begin float(s) ≥0 仿真开始时间
end float(s) ≥begin 仿真结束时间
vehsPerHour float(#/h) >0 -
period float(s) ≥0 -
number int(#) >0 -

"vehsPerHour" 和 "period" 最多必须给出一个。如果给出了其中之一,则不允许定义 "period" 和 "end"。车辆在时间间隔内均匀分布。插入的车辆数量(如果未给出 "no")等于 ("end"-"begin")/"period" 四舍五入到最接近的整数,因此如果 "period" 足够小,可能根本没有车辆。此外,"period"=3600/"vehsPerHour"。第一辆车(如果有)总是在时间 "begin" 创建。创建的车辆的 id 为 "flowId.runningNumber"。

类型 (Types)#

类型定义物理参数,如长度、加速度、减速度和最大速度,并给出该类型车辆所属的类别列表。所有这些参数对于同一类型的所有车辆都是相同的。

属性 (Attribute)

类型 (Type)

范围 (Range)

默认值 (Default)

备注 (Remark)

id

string

有效的 XML id

-

此属性是强制性的。

vClass

string

类别 id 列表

空列表

accel

float(m/s2)

≥0

2.6

decel

float(m/s2)

≥0

4.5

sigma

float

0≤sigma≤1

0.5

length

float(m)

>0

5

车辆的物理长度

minGap

float(m)

>0

2.5

该车辆与前车之间的最小间距

maxSpeed

float(m/s)

>0

70

color

<COLOR>

用于此类型车辆的颜色。

tau

float

>0

1

carFollowModel

string

尚未实现 (见 #663")

laneChangeModel

string

"DK2008", "LC2013", "JE2013"

"LC2013"

用于车道变换行为的模型

speedFactor

float/distribution

>0

1

驾驶员将从路标读取的速度乘以该因子以估算“实际”最大允许速度

speedDev

float

≥0

0

速度因子的标准差(已弃用,支持使用真实分布)。

emissionClass

string

P_7_7

排放类别,参见 Models/Emissions

probability

float

>0

1

仅在分布中有用

guiShape

string (enum)

"unknown"

此车辆的渲染方式

width

float

>0

2.0

车辆宽度 [m](仅用于绘制);

imgFile

string

用于渲染此类型车辆的图像文件(应为灰度图以允许功能着色);

osgFile

string

用于渲染此类型车辆的 3D 模型文件 - 内部实验分支;

personCapacity

int

≥0

4

车辆可运送的人员数量(不包括自动驾驶员)

containerCapacity

int

≥0

0

车辆可运送的集装箱数量

boardingDuration

float

≥0

0.5

人员登车所需的时间

loadingDuration

float

≥0

30.0

将集装箱装载到车辆上所需的时间

有一个默认类型定义为 id "DEFAULT_VEHTYPE",具有上述所有默认参数,可以重新定义一次,但前提是它之前未被使用(无论是通过车辆还是作为 refId)。重新定义默认类型不会更改定义新类型时的默认值,这意味着 <vType refId="DEFAULT_VEHTYPE"/> 可能与 <vType/> 不同。

speedFactor 的分布目前只能指定为 "norm(mean, dev)" 或 "normc(mean, dev, min, max)",这会导致车辆的值从具有给定均值和标准差的标准正态分布中抽取(第一种情况),并带有可选的截止值(第二种情况)。在有截止值的情况下,该值仍将从给定的正态分布中抽取,但如果不在给定范围内,则将重复抽取(注意:对于非常窄的间隔,这可能导致执行时间过长)。

类型分布 (Type distributions)#

类型分布定义了车辆类型的概率分布。它们应至少有两个 vType 子元素,尽管只定义一个子元素也是有效的。所有车辆类型子元素也可以在分布之外被引用。子元素的概率之和应大于零。

属性 (Attribute) 类型 (Type) 范围 (Range) 默认值 (Default) 备注 (Remark)
id string 有效的 XML id - 此属性是强制性的

类别 (Categories)#

类别定义车辆类别,如汽车、卡车、公交车,但也可以在此处建模高度、宽度和重量类别(在某种程度上)。类别的唯一目的是确定车辆是否允许(或倾向于)在特定街道或车道上行驶。

属性 (Attribute) 类型 (Type) 范围 (Range) 默认值 (Default) 备注 (Remark)
id string 有效的 XML id -
description string 类别的描述 - 仅用于文档和可视化目的

节点 (Junctions)#

严格来说,节点(交叉口)需要一个唯一的 id,这使得它们可以被起始或结束于此的街道引用。由于我们的网络始终嵌入平面中,因此它们还需要 x 和 y 坐标。如果由 netconvert 确定的类型不正确,则可以给定一个类型。

属性 (Attribute) 类型 (Type) 范围 (Range) 默认值 (Default) 备注 (Remark)
id string 有效的 XML id -
x float(m) -10^6<x<10^6 -
y float(m) -10^6<y<10^6 -
type string priority, right_before_left, traffic_light - 如果未给出值,netconvert 会尝试通过启发式方法确定类型

街道 (Streets)#

街道需要一个唯一的 id、一个起始节点和一个结束节点。由于节点嵌入平面中,因此长度是可选的,如果未给出,则计算为起始节点和结束节点之间的欧几里得距离。平面上可能有更多的点(不是节点)来描述街道的形状或计算其累积距离。长度必须严格为正(不为零)。这意味着如果起始节点和结束节点相同,则必须显式给出长度,或者至少需要一个形状节点位于与起始/结束节点不同的位置。可选地,可以给出车道数量(默认为 1,或者默认为街道定义中的车道元素数量)。如果作为属性给出的车道数量小于车道子元素的数量,则是错误。所有可以给车道的参数也可以给街道,并作为相应车道参数的默认值。允许在边上行驶的最大速度以 m/s 为单位给出。

属性 (Attribute) 类型 (Type) 范围 (Range) 默认值 (Default) 备注 (Remark)
id string 有效的 XML id -
refId string 另一个边 id - 所有属性和子元素都从给定的边复制,并且可以被覆盖
from string 节点 id -
to string 节点 id -
function string normal,internal,ramp normal 不能作为输入给出,仅出现在生成的网络中
length float(m) ≥0 -
numLanes int >0 - 必须有此属性或车道子元素之一
speed float(m/s) >0 -
departLane int 0≤departLane<numLanes 0

车道 (Lanes)#

车道具有最大允许速度,以及允许、禁止和首选车辆类别的列表。允许列表默认为所有车辆类别,禁止列表默认为无。如果车辆的类别列表不包含禁止列表中的任何成员,并且包含允许列表中的某些成员,则允许其在车道上行驶。

属性 (Attribute) 类型 (Type) 范围 (Range) 默认值 (Default) 备注 (Remark)
index int 0≤index<edge.numLanes 最小的非显式索引
speed float(m/s) ≥0 13.9
allow string 类别 id 列表,all all
disallow string 类别 id 列表 空列表
prefer string 类别 id 列表 空列表

路径 (Routes)#

路径描述了车辆将遵循的路径,也就是说,它们仅由连续的非空街道列表组成。可选地,它们可以将停靠点列表作为子元素。

属性 (Attribute) 类型 (Type) 范围 (Range) 默认值 (Default) 备注 (Remark)
id string 有效的 XML id - 对于在车辆或路径分布内部定义的路径,不允许使用此属性。
refId string 另一个路径 id -
edges string 边 id 列表 -
frequency float >0 1 仅在与路径分布结合使用时有用

路径分布 (Route distributions)#

路径分布定义了路径的概率分布。它们应至少有两个路径子元素。

属性 (Attribute) 类型 (Type) 范围 (Range) 默认值 (Default) 备注 (Remark)
id string 有效的 XML id -

停靠点 (Stops)#

停靠点可以是车辆、路径或人员的子元素。

属性 (Attribute) 类型 (Type) 范围 (Range) 默认值 (Default) 备注 (Remark)
busStop string 有效的公交站 id - 如果给出,则不允许使用 edge, lane, startPos 和 endPos
containerStop string 有效的集装箱停靠点 id - 如果给出,则不允许使用 edge, lane, startPos 和 endPos
parkingArea string 有效的parkingArea id - 如果给出,则不允许使用 edge, lane, startPos 和 endPos
trainStop string 有效的公交站 id ('busStop' 的别名) - 如果给出,则不允许使用 edge, lane, startPos 和 endPos
chargingStation string 有效的chargingStation id - 如果给出,则不允许使用 edge, lane, startPos 和 endPos
lane string 车道 id - 车道 id 的形式为 <edge_id>_<lane_index>。边必须是相应路径的一部分
edge string 边 id - 将使用边上最右侧允许的车道进行停靠,边必须是相应路径的一部分
endPos float(m) ε≤endPos≤edge.length edge.length
startPos float(m) 0≤startPos≤endPos-ε endPos-ε
friendlyPos bool true,false false 是否应自动更正无效的停靠点位置
duration float(s) ≥0 -
until float(s) ≥0 - 路径继续的时间步长
index int, "end", "fit" 0≤index≤路径中的停靠点数量 "end" 在车辆的停靠点列表中插入停靠点的位置
triggered string person,container,join,true,false 或其组合 false 是否人员/集装箱/连接列车可以结束停靠点
containerTriggered bool true,false false 是否集装箱可以结束停靠点(已弃用,请改用 triggered
parking bool true,false triggered 的值 车辆是停在道路上还是停在路边
actType string 任意 'waiting' 在 GUI 和输出文件中为停止的人员显示的活动(仅适用于人员仿真)

如果同时给出了 "duration" "until",车辆将至少停止 "duration" 秒。如果 "duration" 为 0,车辆将减速,使其原则上可以达到速度 0,但不会完全刹车停止,而是会再次开始加速。如果给出了 "until" 而没有给出 "duration",并且车辆在 "until" 定义的时间步长或之后到达停靠点,它甚至不会减速。如果在重复车辆插入(流)的上下文中定义了 until,它将根据车辆创建时间与流的 "begin" 之间的差值递增。如果既没有给出 "duration" 也没有给出 "until",则 "triggered" 默认为 true。如果 "triggered" 显式设置为 false,车辆将永远停止。

Caution

如果 triggered 为 true,则 parking 也将默认设置为 true。如果您随后将 parking 设置为 false,可能会创建死锁,从而阻止仿真终止。

Note

公交站的长度必须至少为 10

车辆如何行驶#

开始之前#

在加载路径时(这不一定与应用程序启动相同),SUMO 会检查路径的连通性以及停靠点的正确放置。如果设置了速度偏差和/或速度因子,它会通过从高斯分布中抽取来计算车辆的速度因子。对最终选择的速度因子应用了一些截止值,以使其处于合理的范围内。它不能大于 speedFactor + 两个标准差,也不能小于 0.2 * speedFactor。如果选择的因子不适用于选择的出发速度,则会重新计算。

在加载车辆时,SUMO 还会检查车辆是否允许在其路径的所有边上行驶,以及所有其他参数是否在允许的范围内。如果发生任何参数范围违规,仿真将立即停止并显示错误消息。(目前仍在讨论是否可以通过命令行选项禁用某些检查,导致车辆在最后一个“有效”边的末端停止。)

出发#

在给定的出发时间,仿真尝试使用给定的参数插入车辆。如果由于会导致碰撞而无法插入,仿真将在下一个仿真步骤重试。如果出发位置和/或出发车道指定了 "free" 或 "random",则会在下一次尝试时重新计算。参数按以下顺序评估:

  1. 确定车道
  2. 确定位置(即使车道和位置都设置为 "free",如果我们无法在所选车道上找到空闲位置,我们不会选择不同的车道)
  3. 确定起始速度(如果位置是 "free" 且速度是 "max",我们不会选择可以达到最高速度的位置,而是选择在之前选择的位置可以使用的最高速度)。

在确定最大速度和插入可能性时,必须考虑上游的下一个车辆和下游的下一个车辆,即使它们位于下一个路段上。因此,可能需要考虑所有进入当前路段或跟随当前路段的路段。

为了尽可能快地用车辆填充仿真,请对车辆使用以下参数:depart="0" departSpeed="0" departLane="free" departPos="random_free" period="0" number="100"。这样,将在时间步 0 在给定路径的第一条边上插入 101 辆车。

行驶#

在每一步,模型计算一个新的目标速度,并相应地加速(减速)车辆。加速度在该步长内是恒定的,使得位置为 s、速度为 v 的车辆在该步长内获得加速度 a 后,在长度为 t 的时间步长后,新位置 s' = s + v*t + a*t^2/2,v' = v + a*t。

停靠点#

车辆尝试在实际停止之前到达停靠区域的最下游位置。只有被其他车辆阻挡了停靠区域的其余部分时,它才会被迫提前停止。停靠持续时间从车辆位置在停靠区域内且速度为 0 的第一步开始计数。这意味着如果车辆在时间步 10 停止(到达区域且速度为 0),并且停靠持续时间为 2,则它将在步骤 11 和 12 停留在那里,并在步骤 13 具有新的速度和位置(前提是没有其他阻挡发生)。

结束#

如果车辆到达最终目的地点,它将从仿真中移除。这意味着如果上面计算的 s' 大于或等于目的地点,车辆将在该步骤中被移除。