本文档侧重于交通仿真的主要组成部分,即包含车道的街道(边)、节点(交叉口)以及带有其路径的车辆。本文档不包含任何关于交通灯、检测器、可视化或类似内容的信息。另一方面,本文档旨在提供精确的描述,作为实现的模板以及输入文件的 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",则会在下一次尝试时重新计算。参数按以下顺序评估:
- 确定车道
- 确定位置(即使车道和位置都设置为 "free",如果我们无法在所选车道上找到空闲位置,我们不会选择不同的车道)
- 确定起始速度(如果位置是 "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' 大于或等于目的地点,车辆将在该步骤中被移除。
