交通信号灯中的控制器模块采用基于阶段(stage-based)的控制结构。相位(phase)被定义为在某一时刻所有允许的交通流的集合。然而,北美广泛使用的交通信号控制器采用美国电气制造商协会(NEMA)的相位定义。NEMA 相位由交叉口的特定流向定义。在同一时刻,只要不发生冲突,多个 NEMA 相位可以同时进行。

示例:交叉口的流向被编号。右转通常与相关的直行交通流同时进行。左转流向通常为奇数,直行和右转流向通常标记为偶数。相位 2 和 6 通常位于主干道上。一个交叉口不需要包含所有 8 个相位。
SUMO 现在包含一个兼容 NEMA 相位的控制器模块。NEMA 相位控制器可以执行感应控制或协调感应控制。该模块由美国国家可再生能源实验室(National Renewable Energy Laboratory)的 Tianxin Li 和 Qichao Wang 开发,并由美国能源部车辆技术办公室资助。
NEMA 相位#
我们可以在环-栅(Ring-and-Barrier)结构的 NEMA 图中可视化 NEMA 相位和时序。对于一个控制器,一次只能激活一个环中的一个相位。只要不在栅栏的不同侧,不同环中的相位可以同时激活。当控制器在定周期控制模式下运行时,我们可以毫无问题地将 NEMA 相位时序建模为相应的基于阶段的控制时序。当在信号控制中引入感应控制时,环-栅结构的交通信号控制器比基于阶段的控制器更灵活,因为它允许不同的相位组合。

示例:在上面的 NEMA 图中,我们可以看到相位 1+5、1+6、2+6、3+7、3+8 和 4+8。然而,当相位 1 的交通量很低且相位 1 可能提前结束时,我们将不会看到相位 1+6,而是会看到相位 2+5。
定义新的 NEMA 相位时序#
您可以将 NEMA 相位交通控制器的新定义作为 additional-file 的一部分加载。信号时序可以通过 TraCI 函数 在模拟中更新。在 additional-file 中定义的四路八相位交叉口的交通灯程序如下所示:
<add>
<tlLogic id="2881" offset="10" programID="NEMA" type="NEMA">
<param key="detector-length" value="20"/>
<param key="detector-length-leftTurnLane" value="10"/>
<param key="total-cycle-length" value="130"/>
<param key="ring1" value="1,2,3,4"/>
<param key="ring2" value="5,6,7,8"/>
<param key="barrierPhases" value="2,6"/>
<param key="coordinate-mode" value="true"/>
<param key="barrier2Phases" value="4,8"/>
<param key="minRecall" value="2,6"/>
<param key="maxRecall" value=""/>
<param key="whetherOutputState" value="true"/>
<param key="fixForceOff" value="false"/>
<phase duration="99" minDur="5" maxDur="25" vehext="2" yellow="3" red="2" name="3" state="rrrrrrrrGrrr"/>
<phase duration="99" minDur="5" maxDur="25" vehext="2" yellow="3" red="2" name="7" state="rrGrrrrrrrrr"/>
<phase duration="99" minDur="5" maxDur="30" vehext="2" yellow="3" red="2" name="4" state="GGrrrrrrrrrr"/>
<phase duration="99" minDur="5" maxDur="30" vehext="2" yellow="3" red="2" name="8" state="rrrrrrGGrrrr"/>
<phase duration="99" minDur="5" maxDur="20" vehext="2" yellow="3" red="2" name="1" state="rrrrrGrrrrrr"/>
<phase duration="99" minDur="5" maxDur="20" vehext="2" yellow="3" red="2" name="5" state="rrrrrrrrrrrG"/>
<phase duration="99" minDur="5" maxDur="35" vehext="2" yellow="3" red="2" name="2" state="rrrrrrrrrGGr"/>
<phase duration="99" minDur="5" maxDur="35" vehext="2" yellow="3" red="2" name="6" state="rrrGGrrrrrrr"/>
</tlLogic>
</add>
对于匝道处的交叉口,交通灯程序配置可能如下所示:
<add>
<tlLogic id="2881" offset="10" programID="NEMA" type="NEMA">
<param key="detector-length" value="20"/>
<param key="detector-length-leftTurnLane" value="10"/>
<param key="total-cycle-length" value="120"/>
<param key="ring1" value="1,2,0,4"/>
<param key="ring2" value="0,6,0,4"/>
<param key="barrierPhases" value="2,6"/>
<param key="coordinate-mode" value="true"/>
<param key="barrier2Phases" value="4,4"/>
<param key="minRecall" value="2,6"/>
<param key="maxRecall" value=""/>
<param key="whetherOutputState" value="true"/>
<param key="fixForceOff" value="false"/>
<phase duration="99" minDur="6" maxDur="16" vehext="2" yellow="4" red="1" name="1" state="srrrrrrGGrrr"/>
<phase duration="99" minDur="10" maxDur="67" vehext="2" yellow="4" red="1" name="2" state="srrrrrrrrGGG"/>
<phase duration="99" minDur="10" maxDur="22" vehext="2" yellow="3.5" red="1.5" name="4" state="GGGGGrrrrrrr"/>
<phase duration="99" minDur="10" maxDur="88" vehext="2" yellow="4" red="1" name="6" state="srrrrGGrrrrr"/>
</tlLogic>
</add>

示例:一个仅包含相位 1、2、4 和 6 的匝道交叉口。相位 4 控制来自匝道的交通流。
<tlLogic> 属性#
以下属性/元素在 tlLogic 元素中使用:
| 属性名称 | 值类型 | 描述 |
|---|---|---|
| id | id (字符串) | 交通灯的 id。这必须是 .net.xml 文件中现有的交通灯 id。通常交通灯的 id 与路口 id 相同。可以通过右键单击受控交叉口前的红/绿条来获取名称。 |
| type | NEMA (字符串) | 此值应保留为 NEMA 以激活 NEMA 相位控制器模块 |
| programID | id (字符串) | 交通灯程序的 id。 |
| offset | int | 偏移量(秒)。默认为 0。仅当控制器处于协调模式时有效。偏移量的参考取决于控制器机柜类型,可通过下面的 cabinentType 参数配置。 |
<param> 属性#
以下参数用于设置 NEMA 图和控制器行为:
| 参数键 | 值类型 | 描述 |
|---|---|---|
| detector-length | int | 非左转车道停车线检测器的长度(米)。注意,检测器可以由自定义检测器替换。此参数用于快速生成停车线检测器设置。 |
| detector-length-leftTurnLane | int | 左转车道停车线检测器的长度(米)。注意,检测器可以由自定义检测器替换。此参数用于快速生成停车线检测器设置。我们在此处设置此参数是因为通常左转车道上的停车线检测器与直行车道的长度不同。 |
| total-cycle-length | int | 周期长度(秒)。 |
| ring1 | string | 环 1 中的相位编号,用逗号 (',') 分隔。如果相位不存在,请填写 0。 |
| ring2 | string | 环 2 中的相位编号,用逗号 (',') 分隔。如果相位不存在,请填写 0。如果栅栏的一侧没有任何相位,请重复环 1 中该侧的相位。 |
| barrierPhases | string | 一组需要一起结束的相位,用逗号 (',') 分隔。这定义了一个栅栏。通常是相位 4 和 8,即 "4,8"。 |
| coordinate-mode | bool (true 或 false) | 默认为 false。如果控制器处于协调模式,则为 true。 |
| barrier2Phases | string | 一组需要一起结束的相位,用逗号 (',') 分隔。这定义了另一个栅栏。如果处于协调模式,这组相位是协调相位。通常是相位 2 和 6,即 "2,6"。 |
| minRecall | string | 一组相位,用逗号 (',') 分隔,无论相应的检测器是否被激活,这些相位都会被激活。相位激活的持续时间将在该相位的 minDur 和 maxDur 之间。例如,"2,6"。如果未设置,该值将默认为 "1,2,3,4,5,6,7,8"(所有现有相位都会被调用)。 |
| maxRecall | string | 一组相位,用逗号 (',') 分隔,无论相应的检测器是否被激活,这些相位都会被激活。相位激活的持续时间将是该相位的 maxDur。如果您将所有相位都设置为 maxRecall,控制器将表现为定周期控制器,绿灯时间为各相位的 maxDur。如果未设置,该值将默认为空 ("")。 |
| fixForceOff | bool (true 或 false) | 如果为 true,控制器将处于固定切断模式。这允许非协调相位使用先前相位未使用的时问。如果为 false,控制器将处于浮动切断模式。默认 false |
| whetherOutputState | bool (true 或 false) | 是否记录信号相位变化事件。这可用于生成自动化交通信号绩效措施 (ATSPM)。如果未设置,该值将默认为 false。 |
| show-detectors | bool (true 或 false) | 它控制生成的检测器在 sumo-gui 中是可见还是隐藏。所有交通灯的默认值可以通过选项 --tls.actuated.show-detectors 设置。也可以通过在 GUI 中右键单击交通灯来切换此值。 |
| controllerType | string (TS2 或 Type 170) | 它控制所使用的控制器类型。NEMA TS2 控制器将协调的 offset 参考到第 1 个协调相位的开始。Type 170 控制器将协调的 offset 参考到协调相位黄灯的开始。TS2 偏移量已针对 Econolite 软件在环控制器进行了验证。默认 TS2。 |
| latchingDetectors | string | 传递一个相位字符串(如 "1,2,3,4")将导致这些相位中的检测器保持开启状态,直到该相位被服务完毕,无论车辆是否离开检测区域。默认 ""。 |
| crossPhaseSwitching:X | string | X 是一个相位编号。例如,key="crossPhaseSwitching:2" value="5" 将导致相位 5 的检测器在相位 2 处于活动状态时向相位 2 报告。默认为无交叉相位切换。 |
<phase> 属性#
每个相位使用以下属性定义:
| 属性名称 | 值类型 | 描述 |
|---|---|---|
| duration | 时间 (int) | 此属性默认为 99,不影响控制。相位的持续时间将根据交通感应动态变化,并受 minDur 和 maxDur 的约束。 |
| minDur | 时间 (double) | 相位的最小绿灯时间。 |
| maxDur | 时间 (double) | 相位的最大绿灯时间。在协调模式下,它是分割时间减去该相位的黄灯和全红时间。 |
| vehExt | 时间 (double) | 感应相位的车辆延长秒数。 |
| yellow | 时间 (double) | 相位的黄灯时间。 |
| red | 时间 (double) | 相位的红灯清空时间。 |
| name | int | NEMA 相位编号。 |
| state | string | state 属性定义了与相位相关的允许交通流。最好从 netedit 设置。您可以从 交通信号灯 -> 信号状态定义 找到更多信息。 |
在模拟期间更改时序#
某些信号时序参数可以通过 TraCI 在模拟期间更新。
- traci.trafficlight.setNemaOffset(tlsID, offset): 偏移量将通过缩短或延长协调相位的绿灯时间来调整,以便协调相位的结束与偏移量匹配。建议逐步更改偏移量以模拟过渡时间。
- traci.trafficlight.setNemaMaxGreens(tlsID, maxGreens): 通过给出 8 个数字来设置每个 NEMA 相位的最大绿灯时间。对于不存在的相位必须使用时间 0。
- traci.trafficlight.setNemaSplits(tlsID, splits): 工作原理类似于 setNemaMaxGreens,但在为每个相位设置最大绿灯时间之前减去红灯和黄灯时间。
- traci.trafficlight.setNemaCycleLength(tlsID, cycleLength): 当您更新分割时间/最大绿灯时间时,周期长度可能会改变。您需要设置新的周期长度以使新的时序正常工作。
NEMA 相位控制器中所有信号时序参数的更新将在当前周期结束后发生。
配置错误#
可能会引发以下错误:
- the phases before barrier X from both rings do not add up: 解释待补充
- Ring X does not add to cycle length: 解释待补充
要模拟配置错误的控制器,可以通过设置 <param key="ignore-errors" value="true"/> 来忽略这两个错误。
出版物#
该控制器的实现和验证在以下论文中进行了描述:Schrader, M.; Wang, Q.; Bittle, J. Extension and Validation of NEMA-Style Dual-Ring Controller in SUMO. SUMO Conf Proc 2022, 3, 1-13.
