列车模拟 (Train Simulation)#
本页描述了在 SUMO 中进行列车模拟的相关内容。与单纯的车辆模拟相比,构建包含列车的多模式模拟场景需要采取额外的步骤。
构建列车模拟路网 (Building a network for train simulation)#
铁路 (Railways)#
铁路可以从 netconvert 支持的所有输入格式导入。
当从 OSM 导入时,铁路将自动配置为相应的车辆类别(即 rail)。
在 netedit 中从头构建路网时,可以通过将边属性 'allow' 设置为 rail 来建模铁路。
关于支持其他常见铁路数据交换格式,请联系开发者。
平行轨道 (Parallel Tracks)#
如果铁路有平行轨道,必须将其建模为不同的边元素,而不是具有多个“车道”的单一边。
OSM#
类型 (Types)#
从 OSM 导入时,默认通过 <SUMO_HOME>/data/typemap/osmNetconvert.typ.xml 区分以下铁路类型:
- tram (有轨电车)
- subway (地铁)
- light_rail (轻轨)
- rail (铁路)
- highspeed (高速铁路)
电气化 (Electrification)#
当铁路电气化时,车辆类别 rail、rail_electric 和 rail_fast 允许在此行驶。否则,仅允许车辆类别 rail。
用途 (Usage)#
通过加载附加的类型映射文件 <SUMO_HOME>/data/typemap/osmNetconvertRailUsage.typ.xml,可以导出边类型的附加用途信息:
- main (干线)
- branch (支线)
- industrial (工业)
- military (军事)
- test (测试)
- tourism (旅游)
这将导致复合边类型 ID,例如 railway.rail|usage.main。
轨道编号 (Track numbers)#
本地轨道编号(主要在火车站)作为边参数 track_ref 导出。这些值显示在边参数对话框中,也可用于着色(按参数着色,按街道)。
双向轨道使用 (Bidirectional track usage)#
在现实中,所有轨道在需要时都可以双向使用,但许多铁路在大多数时间仅单向使用。在 SUMO 中,必须显式启用双向轨道使用。这简化了路由,因为铁路在大多数时间仅会按其首选方向使用。
双向轨道使用通过两条几何形状完全相反且使用属性 spreadType="center" 的边进行建模。这将导致车道几何形状完全重叠。这些边被称为叠加(superposed)边(或称为双向铁路边)。在 .net.xml 文件中,这些边用 bidi="<REVERSE_EDGE_ID>" 标记,但这是一个生成的属性,用户不应设置。
当在双向轨道的两端放置铁路信号时,它们将限制轨道一次只能在一个方向上使用。
sumo-gui 中的双向铁路#
双向轨道的可视化具有独特的样式和专用设置。
在 netedit 中处理双向轨道#
- 要显示构成双向轨道的两条边,请激活边可视化选项 spread bidirectional railways/roads(参见可视化设置)。两条边将绘制得更窄并带有侧偏移,以便两者都可见而不会重叠。
- 在使用连接模式定义双向轨道之间的连接时,强烈建议这样做,否则很难区分受影响的边。
- 预定义的 GUI 设置方案 'rail' 会自动激活 spread ... 设置。
- 要查找(并高亮显示)所有双向轨道,请使用属性选择并搜索属性 bidi,其值为 1。
- 创建双向轨道如此处所述。
双向路网中的路由 (Routing in bidirectional networks)#
当火车轨道可以双向使用时,列车在网络中搜索路径时有相当大的自由度。为了减少冲突(当两辆车想要在相反方向使用同一轨道时),可以定义每条轨道的首选方向并将其纳入路由决策。 有两种方法可以实现这一点。它们在网络准备阶段工作方式相同,但在模拟期间的效果不同。 下面将讨论这两种方法。
使用优先级因子 (Using priority-factor)#
此方法适用于纯铁路模拟,因为它使用的选项会影响模拟中的所有车辆,并可能对道路交通产生不利影响。 它的优势在于简单,因为只需要一个选项。
为了表达路由偏好,首选方向和首选侧的边可以分配更高的优先级值(使用边属性 priority)。
当设置选项 --weights.priority-factor FLOAT(适用于 sumo 和 duarouter)时,该值将在路由期间被考虑。
在默认选项值 0 时,路由时忽略边优先级。当设置正值时,优先级最低的边的估计行驶时间会受到惩罚因子 1 + FLOAT(其中 FLOAT 是选项参数)的影响,而优先级最高的边则不受惩罚。中等优先级的边将根据以下代码受到中间惩罚:
MinEdgePriority : 所有边的最小优先级值
MaxEdgePriority : 所有边的最大优先级值
EdgePriorityRange = MaxEdgePriority - MinEdgePriority
relativeInversePrio = 1 - ((edgePriority - MinEdgePriority) / EdgePriorityRange)
effort = traveltime * (1 + relativeInversePrio * PriorityFactor)
Note
如果列车或道路车辆仅在模拟外部进行路由,此方法也可以用于组合模拟(通过分别对列车和汽车进行路由,并仅对列车路由使用该选项)。
使用 routingType 和偏好定义 (Using routingType and preference definitions)#
此方法适用于多模式模拟,其中道路和铁路车辆必须在同一模拟中进行路由。 它还允许区分细粒度的路由偏好(即,遵循默认方向的常规铁路服务与可以在任何方向使用任何轨道的特殊服务车辆之间)。
为了表达路由偏好,每条铁路边应根据其作为主方向还是反主方向的状态设置其 routingType。虽然 routingType 可以是任意字符串值,但现有的 netconvert 工具支持设置 routingType,该值取 '4' 到 '0' 之间的字符串值,其中 '4' 对应于主方向,'0' 对应于主方向的反向(中间值表示对方向性的不同确定程度)。
每个 routingType 在路由期间的效果通过从附加文件加载 <preference> 元素来表达:
在路由期间,具有给定 routingType 的边的估计行驶时间除以适用于给定 vClass (或 vType) 的优先级值。
以下示例与设置选项 weights.priority-factor 1 具有相同的效果(但仅适用于 vClass rail)。
<additional >
<preference routingType="4" vClasses="rail" priority="1"/>
<preference routingType="3" vClasses="rail" priority="0.8"/>
<preference routingType="2" vClasses="rail" priority="0.67"/>
<preference routingType="1" vClasses="rail" priority="0.57"/>
<preference routingType="0" vClasses="rail" priority="0.5"/>
</additional>
以下示例与设置选项 weights.priority-factor 3 具有相同的效果(但仅适用于 vTypes train1 和 train2)。
<additional >
<preference routingType="4" vTypes="train1 train2" priority="1"/>
<preference routingType="3" vClasses="rail" priority="0.57"/>
<preference routingType="2" vClasses="rail" priority="0.40"/>
<preference routingType="1" vClasses="rail" priority="0.31"/>
<preference routingType="0" vClasses="rail" priority="0.25"/>
</additional>
设置边优先级和 routingType (Setting edge priority and routingType)#
priority 和相应的 routingType 值可以由用户分配,也可以由 netconvert 根据以下说明启发式计算。
请注意,在这两种启发式方法中,每条铁路边都会设置其 priority 属性,并且其 routingType 将设置为等于数值优先级值(转换为字符串)。
基于部分受限方向性的优先级 (Priority from partially restricted directionality)#
如果路网中的某些轨道是单向的,则可以使用它们来定义主方向,并且该属性可以根据几何形状(平直度)和拓扑结构(道岔)外推到路网的其余部分。这是通过设置选项 --railway.topology.direction-priority 来完成的。分配的优先级值为:
- 4: 单向轨道
- 3: 双向轨道的主方向
- 2: 未确定的主方向(来自不同方向的单向轨道的平直延续)
- 1: 未确定的主方向(没有来自单向轨道的延续)
- 0: 双向轨道的主方向的反向
基于部分定义值的优先级 (Priority from partially defined values)#
如果路网中的某些轨道具有定义的优先级值(按照惯例,值为 0 和 4),则可以使用它们来定义主方向,并且该属性可以根据几何形状(平直度)和拓扑结构(道岔)外推到路网的其余部分。这是通过设置选项 --railway.topology.extend-priority 来完成的。分配给其他路网边的优先级范围也如上所述为 1 到 3。
从 OSM 导入双向轨道 (Importing bidirectional tracks from OSM)#
当从 OSM 导入路网时,标记为 railway:preferred_direction:both 的铁路会自动作为叠加边导入。
处理双向铁路网络中的问题 (Handling Problems in bidirectional railway networks)#
通常,从 OSM 导入的铁路网络在双向轨道使用方面是不完整的。一个例子是终端轨道,列车只能通过反转方向离开。netconvert 提供了几个选项来处理此问题:
- --railway.topology.output <FILE>: 识别有问题的轨道(以便手动更正)。
- --railway.topology.repair: 通过分析铁路网络拓扑并添加双向轨道自动修复问题。
- --railway.topology.repair.minimal: 应用自动修复,但仅限于加载的公共交通线路运行所需的修复。
- --railway.topology.repair.connect-straight: 允许在相反方向的铁路以直角相遇的地方进行双向铁路使用。
- --railway.topology.repair.stop-turn: 在所有加载的站点添加掉头连接(以启用方向反转)。
- --railway.topology.all-bidi: 使所有轨道都可双向使用。
- --railway.topology.all-bidi.input-file: 从文本文件加载边 ID,并使这些轨道可双向使用。(每行一个边 ID,可选地以 'edge:' 作为前缀,如在 netedit 创建的选择文件中一样)。
铁路信号 (Rail Signals)#
定义 (Definition)#
节点类型 rail_signal 可用于定义实现自动闭塞系统的信号。
当使用双向轨道时,铁路信号默认会影响两个行驶方向。这可以在 netedit 中更改,或者通过使用带有属性 uncontrolled 的连接文件进行修补。
导入 (Import)#
当从 OSM 导入铁路网络时,什么算作铁路信号的规则可以自定义,以适应本地数据库的详细程度。
通过设置 netconvert 选项 --railway.signals.discard,可以从网络中删除所有信号。
启发式生成 (Heuristic generation)#
通过设置 netconvert 选项 --railway.signal.guess-by-stops,可以根据加载的公共交通站点生成附加信号。 站点可以从输入(即 OSM)加载,也可以使用选项 --ptstop-files 加载。
对于每个公共交通站点,最多将添加两个信号:
- 一个在站点边的末端(除非该节点恰好是道岔)
- 一个在站点边的起点或上游至少 200 米的上游边(除非该节点恰好是道岔)
两个信号之间的最小距离 200 米可以通过选项 --osm.stop-outout.length.train 自定义。
铁路道口 (Rail Crossings)#
节点类型 rail_crossing 可用于定义铁路道口。在这些节点处,列车始终拥有通行权,道路车辆会收到红灯,直到接近的列车之间出现安全间隙。
当从 OpenStreetMap 导入路网时,铁路道口会自动导入。对于其他输入数据源,道口可能需要通过附加的 xml 文件指定,或在导入后通过 netedit 设置。
铁路道口参数 (Rail Crossing Parameters)#
可以在附加文件中定义以下参数来配置铁路道口的时序和行为(如下例)。时间值以秒为单位。
- time-gap : 触发关闭道口的接近列车的时间间隔(默认 15)
- space-gap : 触发关闭道口的接近列车的空间间隔(默认 -1,表示禁用此检查)
- min-green-time : 当另一列列车接近时,打开道口的最小绿灯时间(默认 5)
- opening-delay : 列车通过道口后,打开序列开始前的时间(默认 3)
- opening-time : 打开道口所需的时间(由红黄状态 'u' 指示)(默认 3)
- yellow-time : 关闭道口所需的时间(默认 3)
设置参数时,id 表示铁路道口连接点的 ID,programID 始终为 '0'。
<additional>
<tlLogic id="C" programID="0">
<param key="time-gap" value="15.0"/>
<param key="space-gap" value="-1.0"/>
<param key="min-green-time" value="5.0"/>
<param key="opening-delay" value="3.0"/>
<param key="opening-time" value="3.0"/>
<param key="yellow-time" value="5.0"/>
</tlLogic>
</additional>
里程标 (Kilometrage, Mileage, Chainage)#
边支持属性 distance,表示边起点相对于某个参考点的线性参考方案中的距离。当距离度量沿边的前进方向减小时,通过使用负号表示距离值。
沿边的距离值计算为:
|edgeDistance + vehiclePos|
边距离从 OSM 导入,也可以在 netedit 中沿路线设置。
距离值可以使用选项 --fcd-output.distance 写入 fcd-output。然后可以使用 plot_trajectories.py 和代码 k(即 -t kt)进行绘图。距离也可以在 sumo-gui 中可视化(按距离对边着色)。
Note
目前不支持负距离值(等待引入另一个属性)。
建模列车 (Modelling Trains)#
有一个专用于列车的跟驰模式,可以通过在 <vType> 定义中设置 carFollowModel="Rail" trainType="<TYPE>" 来激活。trainType 的允许值为:
- Freight (货运)
- ICE1
- ICE3
- RB425
- RB628
- REDosto7
- NGT400
- NGT400_16
- MireoPlusB
- MireoPlusH
- custom (自定义)
这些类型模拟了特定列车的牵引力和滚动阻力。要表示任意列车的行为,可以使用 "custom" trainType(见下文)。 或者,可以使用任何其他跟驰模型,并配置适当的加速/减速参数。
使用表格数据的自定义动力学模型 (Custom dynamics model with tabular data)#
vType 属性 speedTable、tractionTable 和 resistanceTable 可用于指定牵引力和阻力的自定义插值表。
每个属性被解释为一个表列,其中行定义了对应速度下的牵引力和阻力。
速度必须以 m/s 为单位,而牵引力和阻力以 kN 为单位。中间值通过线性插值获得。
示例:
<vType id="0" vClass="rail" carFollowModel="Rail" trainType="custom"
speedTable="0 2.78 5.56 8.33 11.11 13.89 16.67 19.44 22.22 25 27.78 30.56 33.33"
tractionTable="300 300 263 179 135 108 90 77 67.5 60 54 49 45"
resistanceTable="2 4 8.5 14 22 31 41.5 54 68 83.5 111 120 140"/>
使用参数化曲线的自定义动力学模型 (Custom dynamics model with parameterized curves)#
vType 属性 maxPower 和 maxTraction 可用于根据以下公式指定给定速度(以 m/s 为单位)的牵引曲线:
traction_kN = min(maxPower / speed, maxTraction
vType 属性 resCoef_quadratic、resCoef_linear 和 resCoef_constant 可用于根据以下公式指定给定速度(以 m/s 为单位)的阻力曲线:
resistance_kN = resCoef_quadratic * speed * speed + resCoef_linear * speed + resCoef_constant
示例:
<vType id="0" vClass="rail" carFollowModel="Rail" trainType="custom" maxPower="2350" maxTraction="150"
resCoef_quadratic="0.00028" resCoef_linear="0.00003" resCoef_constant="1.670"/>
属性
列车时刻表 (Train Schedules)#
列车时刻表的定义方式与任何其他类型的公共交通相同。

由 plotXMLAttributes.py 生成。
列车交互 (Train Interaction)#
当在带有铁路信号的网络上模拟列车时,列车只有在该区段(信号之间的边区段)没有其他列车时才会进入一个闭塞区段。当没有铁路信号或多个列车被插入同一闭塞区段时,它们将根据其跟驰模型自动保持安全距离。当使用 carFollowModel="Rail" 时,列车将始终与前车保持足够的距离,以便即使前车立即停车也能安全停车。
反转方向 (Reversing Direction)#
如果满足以下所有条件,列车将反转方向:
- 列车头部位于普通边上(不在交叉口/铁路道岔上)
- 整列列车位于允许双向使用的铁路上
- 列车速度低于 0.1 m/s
- 列车在当前边上没有进一步的停靠点
- 列车路线中的后续边是其当前所在边的反向边
-
存在从当前列车边到反向边的“掉头”连接
Note
当使用选项 --ptstop-output 导入公共交通站点时,所有带有公共交通站点的双向边都将具有必要的掉头连接,因此有资格进行反转。
Caution
由于无效的站点分配(即分配了反向站点),可能会发生不希望的列车反转。可以使用工具 checkReversals.py 来搜索意外的反转。
分段运行 (Portion working)#
列车可以在停靠点进行拆分和连接(分开和耦合)。如果一个人或集装箱乘坐的列车被拆分或连接,并且希望继续乘坐新部分,则其计划中需要一个单独的 <ride> 或 <transport> 元素。模拟中不会因此发生登车或装载延迟。
拆分列车 (Splitting a train)#
要拆分列车,可以使用以下输入定义。列车的后半部分被定义为一个新车辆,其出发值为 split。被拆分的列车必须在其停靠定义中定义 'split' 属性,引用后半部分的 ID。
<vType id="train" vClass="rail"/>
<vType id="splitTrain" vClass="rail" length="50"/>
<trip id="t0" type="train" depart="0.00" from="a" to="c">
<stop busStop="B" duration="60.00" split="t1"/>
</trip>
<trip id="t1" type="splitTrain" depart="split" from="b" to="e">
<stop busStop="B" duration="60.00"/>
</trip>
以这种方式定义时,一旦第一部分到达停靠点,列车的后部将作为新的模拟车辆创建。停止后,列车的前半部分将以缩短的长度继续行驶。
如果被拆分的车辆(使用 depart="split")使用属性 departPos="splitFront",它将被插入到前端,而保留其 ID 的部分将位于后部。
连接两列列车 (Joining two trains)#
要连接两列列车,它们必须在近距离内停止(即在同一个 <busStop> 或 <trainStop>),然后其中一列被移除(称为连接列车),另一列变长(称为继续列车)。
继续列车需要一个带有属性 triggered="join" 的停靠点。默认情况下,该列车只有在另一列列车与其连接后才会继续其路线,并无限期等待此条件。
但是,通过设置停靠点属性 extension,可以中止等待触发条件(就像任何其他条件一样)。
连接列车需要一个带有属性 join="VEH_ID" 的停靠点,其中 VEH_ID 表示继续列车的 ID。
连接操作包括使连接列车到达并从模拟中消失,并根据连接列车的长度使继续列车变长。连接操作必须满足以下条件:
- 继续列车已满足其停靠持续时间(由属性
duration和until定义) - 连接列车已满足其停靠持续时间(由属性
duration和until定义) - 列车在以下两种方式之一中距离很近:
- 继续列车的尾部与连接列车在同一车道上,并且它们之间的间隙小于连接列车的 minGap +1m
- 连接列车的尾部与继续列车在同一车道上,并且列车之间的间隙小于继续列车的 minGap +1m
以下是连接两列列车的示例定义:
<vType id="train" vClass="rail"/>
<vType id="splitTrain" vClass="rail" length="50"/>
<trip id="t0" type="splitTrain" depart="0.00" from="a" to="c">
<stop busStop="B" duration="60.00" triggered="join"/>
</trip>
<trip id="t1" type="splitTrain" depart="30" from="d" to="b">
<stop busStop="B" duration="5.00" join="t0"/>
</trip>
Caution
如果连接的列车在前面并且覆盖多个边,那么这些边必须都与继续列车的路线匹配。此外,连接列车应在其路线的最后一条边上设置连接停靠点。
铁路信号行为 (Rail Signal Behavior)#
铁路信号自动执行以下安全功能:
- a) 守卫直到下一个铁路信号的轨道(信号闭塞),以便一次只有一列列车可以进入该区段。这可以防止追尾碰撞。
- b) 守卫轨道,使来自不同分支(侧翼)的车辆不能进入同一区段。这可以防止侧翼碰撞。
- c) 守卫轨道,使车辆不能同时进入双向区段。这可以防止迎头碰撞。
- d) 防止在双向区段上发生死锁。
功能 a) 对应于铁路信号的“经典”安全行为(PZB)。当设置选项 --railsignal-moving-block 或将单个信号配置为参数 moving-block(见下文)时,功能 a) 被禁用,列车将使用其配置的跟驰模型(即 'Rail')进行距离保持。这类似于 LZB 安全系统在使用极短虚拟闭塞时的情况。
要将信号切换到移动闭塞模式,可以加载以下附加文件:
<additional xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://sumo.dlr.de/xsd/additional_file.xsd">
<tlLogic id="gneJ8" programID="0">
<param key="moving-block" value="true"/>
</tlLogic>
</additional>
参数 moving-block 也可以在运行时通过 traci.trafficlight.setParameter 更新。
时刻表约束 (Schedule Constraints)#
此外,铁路信号可以强制执行列车排序,以确保可以保持站点的计划顺序。 要利用此功能,可以从附加文件加载以下元素:
<railSignalConstraints id="A">
<predecessor tripId="t0" tl="D" foes="t1" limit="2"/>
<predecessor tripId="t0" tl="C" foes="t2"/>
<insertionPredecessor tripId="t3" tl="E" foes="t4"/>
</railSignalConstraints>
前置约束 (predecessor constraint)#
此约束定义给定的车辆 ID(或 tripId)只有在某个其他具有给定 ID 或 tripId 的车辆('foe')通过信号 'tl' 之后,才能通过当前信号。该敌对车辆必须是最后一个通过的车辆,或者必须是在切换绿灯时最后 'limit' 辆车之一。
插入前置约束 (insertionPredecessor constraint)#
此约束定义给定的车辆 ID(或 tripId)只有在某个其他具有给定 ID 或 tripId 的车辆('foe')通过信号 'tl' 之后,才能被插入到通向当前信号的闭塞区段。该敌对车辆必须是最后一个通过的车辆,或者必须是在切换绿灯时最后 'limit' 辆车之一。
约束属性 (Constraint Attributes)#
| 属性名称 (Attribute Name) | 值类型 (Value Type) | 描述 (Description) |
|---|---|---|
| tripId | id (string) | 该约束适用的车辆的 'tripId' 参数或车辆 ID |
| tl | id (string) | 铁路信号的 ID |
| foes | ids (string list) | 必须先通过 tl 的一个或多个车辆的 ID,父铁路信号才允许 tripID 通过 |
| limit | int | 在约束为 tripId 求值之前,在 foes 之后可以通过 tl 的中间车辆数量。默认值:给定 foes 的数量。(设置高数值除了内存使用外没有缺点,但设置低数值可能会导致约束无限期阻塞 tripId,因为通过的敌对车辆的 ID 被后来的列车覆盖了) |
| active | bool | 此约束是否处于活动状态(非活动约束仍可通过 TraCI 检索) |
约束生成 (constraints generation)#
约束可以使用工具 generateRailSignalConstraints.py 生成,该工具使用带有定义时刻表的站点的路线文件。
死锁 (Deadlocks)#
如果等待另一列列车的列车之间的关系图形成一个环,则没有列车可以前进,模拟处于死锁状态。 铁路信号的默认行为是预测大多数此类问题,并防止列车通过信号,如果该移动会形成死锁。 但是,默认逻辑仅处理涉及两列或三列列车(以及少数涉及四列列车的情况)的最常见情况。
- 死锁可能由四列或更多列车的相互作用引起。
- 信号逻辑无法防止涉及加载的信号约束的死锁。
为了解决死锁问题,模拟提供了多种策略,如下所述。
死锁检测 (Deadlock detection)#
通过设置选项 --time-to-teleport.railsignal-deadlock TIME,如果涉及的车辆之一等待了给定的 TIME,则检测死锁。 如果还设置了选项 --deadlock-output FILE,则任何检测到的死锁都将写入给定文件。
Note
建议同时设置选项 --time-to-teleport -1 以禁用基于等待时间的传送,因为列车有时可能比汽车等待更长时间(汽车默认在 300 秒后传送)。
死锁解决 (Deadlock resolution)#
如果检测到死锁,等待时间最长的车辆将被传送到下一个可用的网络边以打破死锁。 如果设置了选项 --time-to-teleport.remove,车辆将从模拟中移除。
通过设置选项 --time-to-teleport.remove-constraint,将停用涉及死锁的约束以打破死锁,而不是传送或移除车辆。在处理约束时,强烈建议使用此选项。否则无效。
如果设置了选项 --deadlock-output FILE,则停用的约束也将包含在记录的死锁中。
死锁预防 (Deadlock prevention)#
为了防止在不使用约束的情况下发生的复杂死锁,可以将先前模拟中记录的死锁作为附加文件加载。 这将有选择地向铁路信号逻辑添加额外的检查,以防止记录的死锁中涉及的任何信号之间发生死锁情况。
Caution
死锁文件必须在任何列车加载之前加载(仅当列车使用选项 --additional-files 加载时才会出现问题)。
TraCI#
铁路信号和铁路道口可以使用函数 traci.trafficlight.setRedYellowGreenState 进行控制。也可以使用 traci.trafficlight.setProgram(tlsID, "off")" 将其关闭。在任一情况下,都可以通过重新激活默认程序 "0" 来恢复正常操作:traci.trafficlight.setProgram(tlsID, "0")。
列车可以像汽车一样使用 traci.vehicle 函数进行控制。 此外,以下函数可用于铁路信号:
- traci.trafficlight.getBlockingVehicles(tlsID, linkIndex): 返回从信号上游最近车辆的角度来看,阻塞给定 tls-linkIndex 后续闭塞区的车辆列表。
- traci.trafficlight.getRivalVehicles(tlsID, linkIndex): 返回从信号上游最近车辆的角度来看,也希望进入给定 tls-linkIndex 后续闭塞区的车辆列表(无论优先级如何)。
- traci.trafficlight.getPriorityVehicles(tlsID, linkIndex): 返回从信号上游最近车辆的角度来看,也希望进入给定 tls-linkIndex 后续闭塞区的车辆列表(仅优先级更高的车辆)。
约束 (Constraints)#
约束可以通过 TraCI 查询和修改:
getConstraints(tlsID, tripId=""): 返回给定铁路信号的约束列表。如果 tripId 不为 "",则仅返回具有给定 tripId 的约束。否则,返回所有约束。getConstraintsByFoe(foeSignal, foeId=""): 返回以给定铁路信号 ID 作为其 foeSignal 的约束列表。如果 foeId 不为 "",则仅返回具有给定 foeId 的约束。否则,返回所有约束。addConstraint(tlsID, tripId, foeSignal, foeId, type=0, limit=0): 添加具有给定值的约束(类型 0 是前置约束,1 是插入前置,2 是敌对插入,...)。swapConstraints(tlsID, tripId, foeSignal, foeId): 反转给定约束并返回为避免死锁而创建的新约束列表(通过交换)。removeConstraints(tlsID, tripId, foeSignal, foeId): 移除具有给定值的约束。任何输入组合都可以设置为 "" 以充当通配符过滤器。updateConstraints(vehID, tripId=""): 如果具有给定 vehID 的车辆不再通过相应的铁路信号(即重新路由后),则移除与给定 tripId 相关的任何约束。- 如果 tripId 为空字符串,则使用车辆的当前 tripId 参数。
- 如果 tripId 在受重新路由影响的路线部分中发生了变化,则必须为涉及的每个单独的 tripId 调用一次该函数。
可视化 (Visualization)#
列车 (Trains)#
铁路车厢、机车的长度以及车厢之间的间隙可以使用以下通用 vType 参数进行配置:
- locomotiveLength (机车长度)
- carriageLength (车厢长度)
- carriageGap (车厢间隙)
- carriageImages (车厢图像)
这些参数控制 sumo-gui 中使用 'simple shapes' 样式绘制车辆时列车的外观。
默认情况下,列车的前端将通过较暗的车厢颜色和前挡风玻璃指示。这可以通过设置 locomotiveLength="0" 来禁用。
参数 carriageImages 接受逗号分隔的图像文件名列表,以便在使用车辆样式 'raster images' 时启用不同的图像。
路网 (Network)#
默认情况下,铁路轨道在 sumo-gui 中以独特的样式显示:
- 放大时,渲染轨道和枕木而不是填充形状(可通过可视化设置 show rails 配置)
- 不显示转弯箭头
- 不绘制指示通行权的白条
- 不显示连接点形状,组成铁路道岔的内部边始终可见(可以通过将连接点着色设置为除 uniform 之外的任何方案来更改)
- 交通灯(铁路信号)指示器向右偏移绘制,以指示信号应用的方向
- 对于组成双向轨道的每对边,只绘制一条以避免伪影。要使两条边都可见(即为了选择或以其他方式与该边交互),可以激活 Streets 选项卡中的可视化设置 spread bidirectional railways/roads
- 预定义的 GUI 设置方案 "Rail" 可用于激活以下有助于诊断铁路模拟的设置
- spread bidirectional railways/roads
- 按类型对连接点着色(使铁路信号更明显)
- 恒定的连接点大小(放大时使铁路信号更大)
- 显示车道方向(否则很难判断单向轨道的方向)
- 车辆显示为简单形状,以确保铰接式列车形状跟随曲线
信号 (Signaling)#
铁路信号状态在 sumo-gui 中显示为红色或绿色条,向行驶方向的轨道右侧偏移。偏移量表示信号应用的移动方向。
以下对象在其上下文菜单中提供额外信息,以帮助理解信号切换:
- rail_signal / tlLogic(可通过右键单击红/绿条访问)
- req driveway: 最近接近车辆请求的 driveWay
- blocking: 阻塞所请求 driveWay 的敌对车辆列表
- blocking driveways: 阻塞所请求 driveWay 的敌对 driveWay 列表
- rival: 接近敌对 driveWay 的潜在敌对车辆列表
- priority: 接近敌对 driveWay 并已获得优先于接近所请求 driveWay 的车辆的敌对车辆列表
- constraint: 适用于最近接近车辆并导致此信号显示红色的 railSignalConstraint 的描述
- vehicle (车辆)
- driveways: 该车辆当前占用的 driveWay 列表
- lane (车道)
- param:insertionBlocked:VEHICLE_ID: VEHICLE_ID 请求的 driveWay,当前插入被阻塞
- blocking DRIVEWAY_ID: 阻塞具有 DRIVEWAY_ID 的插入 driveWay 的敌对车辆列表
- driveWays blocking DRIVEWAY_ID: 阻塞具有 DRIVEWAY_ID 的请求 driveWay 的敌对 driveWay 列表
Note
街道着色模式 按插入积压 有助于识别当前插入被阻塞的轨道。
抽象路网 (Abstract Networks)#
道路网络最常根据其在笛卡尔空间中的实际布局进行建模。此类网络的所有距离和角度都与地理地图的距离和角度成比例。
在铁路领域,使用示意图(也称为抽象)网络代替(或补充)地理网络通常很有用。 此类抽象网络可以更轻松地在单个屏幕上查看所有轨道和道岔,而无需缩放和平移。SUMO 通过以下方式支持使用抽象地图:
- 所有道路和轨道都可以具有与其视觉长度不同的自定义“长度”值。这允许将网络的可视化与其模拟行为(关于行驶距离)分开。
- sumo-gui 支持通过使用选项 -n geo.net.xml -N abstract.net.xml 加载网络的抽象地图和地理地图。两个网络必须具有完全相同的拓扑结构,并且仅在几何形状上可能不同。
- 用户可以通过热键 Ctrl + K 或设置街道可视化设置 secondary shape 在任一几何形状的可视化之间切换。
- 所有包含几何信息的输出(即 fcd-output)将根据使用选项 -n 加载的网络。
- 工具 abstractRail.py 可用于将地理铁路网络转换为抽象铁路网络。
输出 (Outputs)#
铁路模拟提供与行车线(Fahrstraßen)相关的可选输出。
railsignal-block-output#
通过设置选项 --railsignal-block-output FILE,将写入一个输出文件,其中包含每个行车线/信号闭塞的信息。
| 元素/属性名称 (Element / Attribute Name) | 值类型 (Value Type) | 描述 (Description) |
|---|---|---|
| driveway / id | id (string) | 行车线的 ID。解释见下文 |
| driveway/ vehicle | id | 首次使用此行车线的列车 ID |
| driveway / edges | list of edgeIDs | 首次使用此行车线的车辆的完整路线 |
| forward / lanes | list of laneIDs | 直到下一个信号或网络边界的车道列表 |
| bidi / lanes | list of laneIDs | 与此行车线冲突的对向车道列表 |
| flank / lanes | list of laneIDs | 与此行车线冲突的侧翼车道列表 |
| conflictLinks / signals | list of strings | 与此行车线冲突的短信号链接名称列表 ( |
| foes / driveways | list of driveWay ids | 敌对行车线列表。如果任何敌对行车线被占用(除非存在该敌对行车线的 <siding> 定义且侧线当前可用),则列车不得进入该行车线。 |
| sidings / foe | driveWay id | 以下 <siding> 元素列表适用的敌对行车线 |
| siding / start | edgeID | 侧线开始的边 |
| siding / end | edgeID | 侧线结束的边 |
| siding / length | float | 侧线长度(米)(如果列车长度大于侧线长度,则列车不得使用侧线) |
| deadlock / foes | list of driveWay ids | 可能与当前行车线一起造成死锁的敌对行车线列表。如果所有敌对行车线都被占用,则不得进入当前行车线(仅当<deadlock> 元素加载到模拟中时才存在) |
行车线 ID (Driveway IDs)#
- 普通行车线:
<RAIL_SIGNAL_ID>.<INDEX> - 出发行车线:
<JUNCTION_ID>.d<INDEX> - 子行车线 (Teilfahrstraße):
<DRIVEWAY_ID>.<INDEX>
railsignal-vehicle-output#
通过设置选项 --railsignal-vehicle-output FILE,将写入一个输出文件,其中包含每个行车线的占用信息。 该文件提供车辆进入或离开行车线的时间。
| 元素/属性名称 (Element / Attribute Name) | 值类型 (Value Type) | 描述 (Description) |
|---|---|---|
| driveWay / id | id (string) | 以下 <entry> 和 <exit> 元素适用的行车线 |
| subDriveWay / id | id (string) | 以下 <entry> 和 <exit> 元素适用的行车线 |
| entry / id | id (string) | 进入行车线的车辆 ID |
| entry / time | float or HH:MM:SS | 车辆进入行车线的时间 |
| entry / reason | string | 进入行车线的原因 |
| exit / id | id (string) | 离开行车线的车辆 ID |
| exit / time | float or HH:MM:SS | 车辆离开行车线的时间 |
| exit / reason | string | 离开车行线的原因 |
其他 (Miscellaneous)#
- 铁路时刻表的错误检查可以使用工具 checkStopOrder.py 完成。
- 工具 scheduleStats.py 可用于检查模拟列车行为在准点率和站点间预期行驶时间方面与加载的铁路时刻表的吻合程度。
局限性 (Limitations)#
- 目前无法对单个铁路车厢/耦合/解耦进行建模
- 远方信号(Vorsignale)未建模。相反,列车表现得好像始终对下一个主信号具有完全可见性
- 铁路道岔的延迟未建模
- 铁路信号后的重叠(Durchrutschweg)(如果违反红灯信号,可保证安全),目前未被铁路信号安全评估建模
- 假设每个信号和每个铁路道岔后都有计轴器,因此部分行车线(Teilfahrstraßen)以最有效的方式使用
- 长列车的拉伸和缩短未建模
- 列车反转(调车)的操作限制未建模。列车可以根据其定义的路线反转,并在任一方向以正常速度/加速度移动(受铁路信号安全规则约束)。
