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] 中测试的内容。它不是一个真实的程序计划,仅用于演示脚本的使用。
我们有一个由信号灯控制的简单四路交叉口,见下图。
图:示例交叉口
现在,我们为该交叉口定义两个不同的程序。第一个:
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 后获得以下程序:
图:转换后的程序

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] |
关键字的顺序可能与上面显示的不同。定义每个周期第二个绿灯时间(关键字 on2 和 off2)是可选的,关键字本身也是可选的。
每个信号组单个绿灯相位的示例#
[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 给出)。每对值定义了一个感应范围的开始和结束。每对值之间的差异对应于 minDur 和 maxDur 之间的差异,因此也是可能的长度扩展。
[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>
