tls

tlsCoordinator.py#

此脚本通过修改信号灯偏移量来协调信号灯以适应给定的交通需求。调用示例:

python tools/tlsCoordinator.py -n net.net.xml -r routes.rou.xml -o tlsOffsets.add.xml

这将生成文件 tlsOffsets.add.xml,该文件可加载到 sumo 中:

sumo -n net.net.xml -r routes.rou.xml -a tlsOffsets.add.xml

Note

建议在所有信号灯具有相同周期时长的 .net.xml 文件上运行此脚本。自版本 0.25.0 起这是默认设置,但旧网络应重新构建。

Caution

路线输入必须包含带有 <route> 子元素的 <vehicle>。不支持流 (Flows) 和行程 (Trips)。

tlsCycleAdaptation.py#

此脚本根据韦伯斯特 (Webster) 公式修改周期长度和绿灯相位持续时间,以最佳适应给定的交通需求。调用示例:

python tools/tlsCycleAdaptation.py -n net.net.xml -r routes.rou.xml -o newTLS.add.xml -b begin_time

这将生成文件 newTLS.add.xml,该文件可加载到 sumo 中:

sumo -n net.net.xml -r routes.rou.xml -a newTLS.add.xml

信号参数,如最小绿灯时间、损失时间、黄灯时间、最大和最小周期,可以通过选项进行调整。选项 -R 用于将最大周期长度限制为给定值,而选项 -u 使用计算出的最大周期长度作为所有交叉口的周期长度。使用选项 -e 将仅调整绿灯时间分配。

Caution

路线输入必须包含带有 <route> 子元素的 <vehicle>。不支持流 (Flows) 和行程 (Trips)。出发时间 = 'triggered' 的车辆不被考虑。

Note

开始时间不是强制性的。但是,如果未给出开始时间,则开始时间将是给定路线文件中的最早出发时间。考虑从开始时间起 1 小时内的流。如果给定路线文件中的整个时段少于 1 小时,流将按比例放大为 1 小时的流。如果时段长于 1 小时且未给出开始时间,则将使用 1 小时的峰值流。

备注#

此脚本中的计算基于静态小时交通流。因此,流模式(例如,车辆仅在前 10 分钟到达)在韦伯斯特方程中无法反映。相应地,建议的信号时序计划可能与微观模拟中的交通状况不对应。选项中的几个参数可能需要根据给定的用例进行调整。以下列出了一些有助于获得正确结果的备注。

  • 小时流 (Hourly flow): 目前,此脚本仅考虑对应于基本韦伯斯特方程的一小时流。因此,需要给出开始时间以便从路线文件中获取正确的流。否则,使用默认的开始时间 = 0,结束时间则为 3600 秒。如果给定的时段长于 1 小时,建议首先找出高峰小时开始时间并在脚本中使用。如果给定的时段少于 1 小时,此脚本仍会将相应的流视为小时流。计划从给定的路线文件中缩放/提取小时流。
  • 交叉口交通流分配 (Allocation of the movements at intersections): 在基本韦伯斯特方程中,临界流是根据给定的信号组计算的。因此,通常来说,相同方向且在同一绿灯相位内的流会被累加。然后根据相应流允许使用的车道数计算通行能力。相应地,可以识别每个信号相位的临界流组。此脚本执行相同的操作。如果直行和右转交通流在交叉口共享同一绿灯相位,并且在微观模拟中它们只能分别使用一条车道(即没有直行和右转共用的车道),则直行交通流的通行能力将被高估。为避免这种情况,最右侧车道需要设置为右转和直行的共用车道。
  • 车道通行能力 (Lane capacity): 在此脚本中,通行能力由选项饱和车头时距 (saturation-headway) 控制。默认情况下,饱和车头时距设置为 2 秒。因此,默认通行能力为 1800 辆/车道/小时,这通常适用于较长的路段。如果任何两个交叉口之间的距离非常短,例如城市区域中的 500 米,则预期通行能力将低于默认通行能力。需要考虑增加饱和车头时距以调整车道通行能力。
  • 当前考虑的道路使用者 (Currently, the considered road users (veh.type)) 包括小汽车 (car)、卡车 (truck)、挂车 (trailer)、公交车 (bus)、长途客车 (coach)、轻便摩托车 (moped)、摩托车 (motorcycle)、自行车 (bicycle)。使用 PCE(小汽车当量)作为流单位。
  • 信号灯同步 (Synchronization of traffic signals): 此脚本一次仅处理一个交叉口的信号时序优化,不同步所有交叉口的信号灯。因此,如果信号计划之间存在任何冲突,可能会产生较差的结果。可以使用脚本 tlsCoordinator.py 来协调信号灯。

tls_csv2SUMO.py#

此工具需要程序定义和要转换到的 SUMO 网络:

python tools/tls/tls_csv2SUMO.py <TLS_CSV> <NET>

它将生成的 TLS 定义打印到标准输出(可以将其管道传输到文件)。

CSV 描述的格式如下。首先,必须给出三个标题行,分别命名 tls(即网络中 tlLogic 的 id)、程序的子键 (subkey) 以及程序应开始的偏移量(以秒为单位 - 通常为 0):

    key;<KEY>
    subkey;<SUBKEY>
    offset;<OFFSET>

然后,定义程序中的哪个信号(编号)负责哪个连接 (link)。连接可以仅使用传入边 (edge)、仅使用传入车道 (lane) 或者结合传出边/车道来描述。这意味着以下行都是有效的:

    link;<LINK_NUMBER>;<FROM_EDGE>;;0
    link;<LINK_NUMBER>;<FROM_LANE>;;0
    link;<LINK_NUMBER>;<FROM_EDGE>;<TO_EDGE>;0
    link;<LINK_NUMBER>;<FROM_EDGE>;<TO_LANE>;0
    link;<LINK_NUMBER>;<FROM_LANE>;<TO_EDGE>;0
    link;<LINK_NUMBER>;<FROM_LANE>;<TO_LANE>;0

也可以将多个连接分配给单个信号。

然后,给出信号的状态:

<LINK_NUMBER>;<STATES>

状态使用上述信号颜色编码(请注意仅使用小写字母,见下文),用 ';' 分隔。信号相位定义的示例(针对信号 1)可能是:

1;g;g;g;g;y;r;r;r;r;r

请注意,所有已定义连接的状态数必须相同。

现在,我们只需定义相位时间:

time;<TIMES>

时间以秒为单位给出,同样用 ';' 分隔。示例可能是:

time;18;33;3;6;3;3;9;15;90

一个完整的 CSV 描述可能如下所示:

    key;102
    subkey;utopia
    offset;0
    link;1;4643;;0
    link;1;3078;;0
    link;2;3074;;0
    link;2;-6494;;0
    1;g;g;y;r;r;r;r;r
    2;r;r;r;r;g;g;y;r
    3;r;r;r;r;g;y;y;r
    4;g;y;y;r;r;r;r;r
    min;21;3;3;2;20;9;3;2
    time;45;3;3;2;36;9;3;2
    max;78;3;3;2;62;9;3;2

示例#

该示例展示了在 [1] 中测试的内容。它不是一个真实的程序计划,仅用于演示脚本的使用。

我们有一个由信号灯控制的简单四路交叉口,见下图。

图:示例交叉口

tls2csv_example_net.svg

现在,我们为该交叉口定义两个不同的程序。第一个:

key;0
subkey;own1
offset;0
link;1;4si;3o;0
link;1;4si;1o;0
link;1;3si;4o;0
link;1;3si;2o;0
link;2;4si;4o;0
link;2;4si;2o;0
link;2;3si;1o;0
link;2;3si;3o;0
link;3;1si;1o;0
link;3;1si;4o;0
link;3;2si;2o;0
link;3;2si;3o;0
link;4;1si;3o;0
link;4;1si;2o;0
link;4;2si;1o;0
link;4;2si;4o;0
1;g;y;r;r;r;r;r;r;r;r
2;g;g;g;y;r;r;r;r;r;r
3;r;r;r;r;r;g;y;r;r;r
4;r;r;r;r;r;g;g;g;y;r
min;10;3;5;3;3;10;3;5;3;3
time;15;3;5;3;3;45;3;5;3;3
max;30;3;15;3;3;60;3;15;3;3

这意味着我们有四个流:两个南北向(边 3si 和 4si)和两个东西向(边 1si 和 2si)。之所以是两个,是因为我们给相应的左转车辆更长的绿灯时间。键是信号灯的 ID ("0"),子键是我们程序的名称 ("own1")。

第二个程序如下所示:

key;0
subkey;own2
offset;0
link;1;4si;3o;0
link;1;4si;1o;0
link;1;3si;4o;0
link;1;3si;2o;0
link;2;4si;4o;0
link;2;4si;2o;0
link;2;3si;1o;0
link;2;3si;3o;0
link;3;1si;2o;0
link;3;1si;3o;0
link;3;2si;1o;0
link;3;2si;4o;0
link;4;1si;4o;0
link;4;1si;1o;0
link;4;2si;3o;0
link;4;2si;2o;0
1;g;y;r;r;r;r;r;r
2;g;g;g;y;r;r;r;r
3;r;r;r;r;g;y;r;r
4;r;r;r;r;g;g;g;y
time;31;16;6;16;31;16;6;16

我们使用以下命令转换这些程序定义:

python tools/tls/tls_csv2SUMO.py lsa_def.csv,lsa_def2.csv input_net.net.xml

并在将它们加载到 sumo-gui 后获得以下程序:

图:转换后的程序

program_own1.png program_own2.png

tls_csvSignalGroups.py#

将 csv-tls 描述转换为 SUMO 可以读取的附加文件(反之亦然)。此工具与 tls_csv2SUMO.py 的不同之处在于它基于信号组,这种方式更接近交通工程师使用的典型表示形式。它接受每个信号组的绿灯时间,并据此创建 sumo tls 表示形式。将两个 csv-tls 描述转换为附加文件 tls.add.xml 的调用示例:

python tools/tls/tls_csvSignalgroups.py -n net.net.xml -i tl1.csv,tl2.csv -o tls.add.xml

相反方向,可以将 sumo 网络中所有 tls 的 csv-tls 描述模板写入给定目录并手动完成:

python tools/tls/tls_csvSignalgroups.py -n net.net.xml -m .

它还提供了一种机制,将附加文件 tls.add.xml 或包含在 net 文件 net.net.xml 中的 TL 逻辑直接转换为 csv-tls 表示形式。将附加文件 tls.add.xml 转换为 csv-tls 表示形式的调用示例:

python tools/tls/tls_csvSignalgroups.py -n net.net.xml -i tls.add.xml -r --group

csv 输出文件(每个找到的 TL 逻辑一个)被写入当前工作目录,并命名为 tlID_programID.csv。可以使用 --output 参数在前面加上额外的文件前缀。添加参数 --group 时,将在所有检查的 TL 逻辑中具有相同信号状态的信号组将被合并。

Caution

从附加文件 tls.add.xml 转换为 csv 在某些情况下可能是有损的,因为仅支持有限的感应信号灯子集。如果设置了 minDur 属性,则记录从相应周期秒数到 duration 秒后的相位结束之间的时间。

输入 csv 文件包含由方括号中的标题分隔的输入块。块 [general] 设置与信号程序相关的一般信息,如 tls ID、程序 ID、周期时间 [s] 和偏移时间 [s]。也可以提供 0..n 个可选参数。块 [links] 列出了信号组与 sumo 中交叉口连接之间的关系。该关系由相应信号组控制的边/车道构建。目标边/车道可以省略。最后一个块 [signal groups] 包含绿灯时间和信号组属性的表格。该表使用带有以下关键字的标题行及其含义:

标头 (Header) 描述 (Description)
id 信号组 id,参见块 [links]
on1 周期内第一个绿灯时间的开始时间(信号状态绿) [s]
off1 周期内第一个绿灯时间的结束时间(信号状态绿) [s]
on2 周期内第二个绿灯时间的可选开始时间(信号状态绿) [s]
off2 周期内第二个绿灯时间的可选结束时间(信号状态绿) [s]
transOn 绿灯前特殊信号状态(红黄)的持续时间 [s]
transOff 绿灯后特殊信号状态(黄)的持续时间 [s]

关键字的顺序可能与上面显示的不同。定义每个周期第二个绿灯时间(关键字 on2off2)是可选的,关键字本身也是可选的。

每个信号组单个绿灯相位的示例#

[general]
cycle time;60
key;1
subkey;SZP_LeftTurn
offset;0
parameter;key1;value1
parameter;key2;value2
[links]
FZ11;-474_0;
FZ12;-474_1;
FZ21;-472_0;
FZ31;-468_0;
FZ32;-468_1;
FZ41;-470_0;
[signal groups]
id;on1;off1;transOn;transOff
FZ11;0;25;1;3
FZ12;0;35;1;3
FZ21;40;55;1;3
FZ31;0;25;1;3
FZ32;0;35;1;3
FZ41;40;55;1;3

某些组具有两个绿灯相位的示例#

[general]
cycle time;60
key;1
subkey;SZP_2Green
offset;0
[links]
FZ11;-474_0;
FZ12;-474_1;
FZ21;-472_0;
FZ31;-468_0;
FZ32;-468_1;
FZ41;-470_0;
[signal groups]
id;on1;off1;transOn;transOff;on2;off2
FZ11;0;15;1;3;;
FZ12;0;15;1;3;40;55
FZ21;25;35;1;3;;
FZ31;0;25;1;3;;
FZ32;0;15;1;3;40;55
FZ41;25;35;1;3;;

感应信号灯示例#

actuated 设置定义了一个时间列表(以 cycleSeconds 给出)。每对值定义了一个感应范围的开始和结束。每对值之间的差异对应于 minDurmaxDur 之间的差异,因此也是可能的长度扩展。

[general];;;;;;
cycle time;60;;;;;
key;1;;;;;
subkey;SZP_Prio;;;;;
offset;5;;;;;
actuated;5;10
[links];;;;;;
FZ11;-474_0;;;;;
FZ11;-474_1;;;;;
FZ21;-472_0;;;;;
FZ31;-468_0;;;;;
FZ31;-468_1;;;;;
FZ41;-470_0;;;;;
[signal groups];;;;;;
id;on1;off1;transOn;transOff;;
FZ11;0;10;1;3;;
FZ21;15;25;1;3;;
FZ31;30;40;1;3;;
FZ41;45;55;1;3;;

buildTransitions.py#

此工具基于简化的输入创建具有分支信号计划的 tlLogic 定义:命名的绿灯相位和后续绿灯相位名称列表。将构建相应的黄灯和红灯相位,并将 'next' 属性设置为适当的过渡相位。

python tools/tls/buildTransitions.py -d <tlLogic-file> -o <output-file>