概述
SUMO入门(六) - 交通灯
Simulation/Traffic Lights
通常,NETCONVERT 和 NETGENERATE 在计算网络期间为交叉口生成交通信号灯和程序。 尽管如此,这些计算出的程序通常与现实中的程序不同。
要使用真实的交通灯程序提供模拟,可以使用其他程序定义运行SUMO / SUMO-GUI。
此外,SUMO / SUMO-GUI允许加载定义,描述一组交通灯何时以及如何从一个程序切换到另一个程序。
两者都将在以下子章节中讨论。 另一种可能性是在NETEDIT中直观地编辑交通灯计划。
自动生成的TLS程序
– 所有交通信号灯都以固定周期生成,默认周期时间为90秒。可以使用选项 –tls.cycle.time 更改此设置。
– 所有绿色阶段之后是黄色阶段。黄色阶段的长度是根据进入道路的最大速度计算的,但可以使用选项 –tls.yellow.time 进行自定义
– 如果交叉路口的速度低于70km/h的阈值(可通过选项 tls.minor-left.max-speed 进行配置),则允许左转弯与迎面而来的直线交通同时发生但必须屈服。这被称为 green minor ,并在状态定义中用 小写 g 表示。否则,左转流必须使用受保护的左转相位(见下文)。如果由于没有专用的转弯车道而无法建造这样的车道,则无论如何都允许绿色小车,但会发出警告。
– 实际上,通常存在所有流都是红灯以允许清空交叉口的相位。 SUMO默认不构建这些相位。要使每个绿色相位都以全红色相位开头,可以使用选项 –tls.allred.time
默认的 4-arm 交叉口(layout opposites)
默认情况下,程序生成4个绿色相位:
– 直行相位
– 左转相位(仅当有专门的左转车道时)
– 与第一个方向正交的直行相位
– 与第一个方向正交的左转相位(仅当有专用的左转车道时)
根据上面说明的默认时序,绿色阶段通常持续31秒。
如果节点类型设置为 traffic_light_right_on_red 而不是 traffic_light,则在所有相位允许从所有侧面右转(在进入当前具有绿灯的交通流之前停止之后)。
交叉口 layout incoming
– 交叉口的每个进入edge都有一个单独的绿色相位,允许所有方向移动
– 如果节点类型设置为 traffic_light_right_on_red 而不是 traffic_light,则允许同时兼容的右转弯
其他交叉路口
– 如果在十字路口有超过4条道路相遇,则会生成其他绿色相位
– 如果在交叉路口会合的道路在转弯流上具有最高的道路优先级,则可以生成 layout incoming 而不是 layout opposites
– 如果交通灯路口没有任何冲突的道路,则默认情况下不会出现红色相位。通过设置选项 –tls.red.time 可以生成单个红色相位
利用有关交通需求的知识改进生成的计划
为了获得动态适应需求的交通灯,使用选项 –tls.default-type 启动网络。这将自动生成启动的交通灯。要转换现有的 .net.xml 文件以启动所有交通信号灯,请执行以下步骤:
netconvert -s orig.net.xml --plain-output-prefix plain
netconvert -e plain.edg.xml -n plain.nod.xml -x plain.con.xml -o updated.net.xml --ignore-errors.edge-type --tls.default-type actuated
工具 tlsCycleAdaptation.py 可用于修改绿色阶段持续时间以适应给定的交通需求。
tlsCoordinator.py 工具可用于修改程序偏移,以便为给定的交通需求生成绿波。
定义新的TLS程序
您可以将交通灯的新定义作为 additional-file 的一部分加载。 加载后,将使用最后一个程序。
可以通过 WAUTs / TraCI 在程序之间切换。 此外,可以使用 GUI上下文菜单 在它们之间切换。
additional-file 中红绿灯程序的定义类似如下:
<additional>
<tlLogic id="0" programID="my_program" offset="0" type="static">
<phase duration="31" state="GGggrrrrGGggrrrr"/>
<phase duration="5" state="yyggrrrryyggrrrr"/>
<phase duration="6" state="rrGGrrrrrrGGrrrr"/>
<phase duration="5" state="rryyrrrrrryyrrrr"/>
<phase duration="31" state="rrrrGGggrrrrGGgg"/>
<phase duration="5" state="rrrryyggrrrryygg"/>
<phase duration="6" state="rrrrrrGGrrrrrrGG"/>
<phase duration="5" state="rrrrrryyrrrrrryy"/>
</tlLogic>
</additional>
注意:
要开始使用,您可以从 .net.xml 文件中复制要编辑的所有交通灯的 tlLogic 元素,并将它们放入新文件中。 然后,您只需要更改 programID 属性,即可修改和加载程序。
< tlLogic > 属性
tlLogic元素中使用以下属性/元素:
< phase > 属性
使用以下属性定义每个相位:
信号状态定义
相位状态中的每个字符描述交通信号灯的一个信号的状态。
请注意,单个车道可能包含多个信号。例如一个用于车辆左转,一个用于直行车辆。这意味着信号不控制 lanes,而是links,即每个连接一个进入交叉口的通道和一个从该交叉口输出的通道。
在SUMO中,实现了信号和链路之间的一对一依赖关系,这意味着每个信号可以控制多个链路,尽管 NETCONVERT 或 NETGENERATE 生成的网络通常每个链路使用一个信号。
使用 SUMO-GUI 可视化设置中的 “show link tls index” 选项,或 .net.xml 文件中 < connection > 元素的相应 linkIndex 属性,可以获取哪个红绿灯信号控制哪些链接的信息。
使用以下信号颜色:
示例:当前状态为“GrGr”的交通灯。 最左边的字母“G”对链接0的绿灯进行编码,对于链接1为绿色,对于链接2为绿色,对于链接3为红色。通过在SUMO-GUI中激活show link tls index 展示链接号。
默认link索引
对于控制单个交叉路口的交通信号灯,NETCONVERT生成的默认索引以 顺时针方式 编号,从12点钟位置的0开始,在直接连接和左转弯之前右转。行人过路处总是在最后分配,也以顺时针方式分配。
如果引入红绿灯以便单个程序控制多个交叉口,则每个交叉口的排序保持一致,但索引会根据输入文件中受控交叉口的顺序增加。
以编程方式访问索引
可以使用任一方法访问TLS link 索引:
– sumolib 使用 tls.getConnections()
– TraCI 使用 traci.trafficlight.getControlledLinks()
触发交通灯
基于时间差
SUMO支持基于间隙的驱动交通控制。这种控制方案在德国很常见,并且只要检测到连续的交通流,就可以延长交通相位。在检测到车辆之间有足够的时间间隔后,它会切换到下一相位。这允许在相位之间更好地分配绿灯时间,并且根据动态交通状况而影响周期持续时间。
要使用这种类型的控件,<tlLogic> 元素需要接收属性 type =“actuated”。它还需要使用 phase-属性 minDur 和 maxDur而不是 duration 来定义每个相位的允许持续时间范围(如果这些值相等,或仅给出duration ,则该相位将具有恒定持续时间)。
可以使用附加参数来进一步配置控制算法。这些可以在<tlLogic>-Element 中给出,如下所示:
<tlLogic id="0" programID="my_program" offset="0" type="actuated">
<param key="max-gap" value="3.0"/>
<param key="detector-gap" value="2.0"/>
<param key="show-detectors" value="false"/>
<param key="file" value="NULL"/>
<param key="freq" value="300"/>
<phase duration="31" minDur="5" maxDur="45" state="GGggrrrrGGggrrrr"/>
...
</tlLogic>
max-gap描述了连续车辆之间的最大时间间隔,该间隔将导致当前相位延长(在限制范围内)
detector-gap确定(自动生成的)探测器和停止线之间的时间距离(以秒为单位)(在每个车道的最大速度下)
如果show-detector设置为true,则生成的检测器显示在SUMO-GUI中
参数 file 和 freq 具有与常规感应回路检测器相同的含义
示例值是这些参数的默认值
基于时间损失
类似于车辆之间的时间间隙控制,相位延长也可以由具有时间损失的车辆的存在触发。 具有此驱动类型的TLS可以定义如下:
<tlLogic id="0" programID="my_program" offset="0" type="delay_based">
<param key="detectorRange" value="100" />
<param key="minTimeLoss" value="1" />
<param key="file" value="NULL"/>
<param key="freq" value="300"/>
<param key="show-detectors" value="false"/>
<phase duration="31" minDur="5" maxDur="45" state="GGggrrrrGGggrrrr"/>
...
</tlLogic>
这里,detectorRange指定从停止线测量的上行检测范围(以米为单位)。默认情况下(如果参数未定义),假设基础 E2 detector 完全覆盖第一个接近通道。
一旦车辆进入探测器范围,就会累积车辆的时间损失。如果其累计时间损失超过minTimeLoss(当前默认值为1秒)的值,则如果它处于活动状态,则请求相应绿灯相位延长。
车辆的瞬时时间损失定义为 1-v / v_max,其中v是其当前速度,v_max是允许的最大速度。
信号方案和通行权规则之间的相互作用
每个交通信号灯交叉口都有一个优先交叉口的通行权规则。当关闭红绿灯时(在SUMO-GUI中右键单击红绿灯或加载“关闭”程序),这一点就变得很明显了。
当定义具有同时冲突的绿色流的信号计划时(通过使用g和G状态),该优先级交叉点的通行权规则起作用。只有当通行权规则强制来自g流的车辆屈服于G流时,这些信号计划才能正常工作。在大多数情况下,默认信号计划正确设置了此关系。
但是,在引入新的g / G关系时,只有通过将网络和新的信号计划加载到NETCONVERT中来确保正确性,从而更新路权规则。
加载新程序
在如上定义了tls程序之后,它可以作为 additional_file 加载;当然,单个附加文件可能包含多个程序。
可以将单个tls的多个程序加载到模拟中。将使用最后加载的程序(除非使用WAUT描述不同地定义)。如果附加程序的所有子键描述相同的tls,则它们必须不同。
假设上面定义的程序放在一个名为 tls.add.xml 的文件中,它可以像这样加载到SUMO / SUMO-GUI中
sumo -a tls.add.xml …<other options for network and routes>
还可以通过给 programID 赋值 off 来加载关闭tls的程序。
<tlLogic id="0" type="static" programID="off"/>
用于导入TLS程序的工具
来自现实世界的交通灯系统通常不以SUMO交通灯描述的形式到达。主要区别在于SUMO定义了一个新的<phase>,只要任何受控信号改变其状态,交通工程师就可以区分相位和相位转变。
为了比手动编辑XML更容易导入,<SUMO_HOME>/tools/tls 中存在一些工具。
tls_csv2SUMO.py:此工具简化了描述,因为它允许定义每个受控边对边连接的相位持续时间。由于其他信号变化自动完成,因此划分成较小的SUMO相位。
tls_csvSignalGroup.py:此工具进一步简化了描述,因为它允许定义每个信号组的绿灯相位的开始和结束时间(实际上最多2个绿灯相位),并自动添加过渡阶段(黄色,红色 - 黄色)。分成较小的SUMO相位也是自动完成的。
或者,NETEDIT可用于使用图形用户界面编辑程序。
修改现有的TLS程序
要修改红绿灯的程序,通常需要加载新程序。但是,在特殊情况下,只应修改偏移量,也可以为现有的交通灯ID和programID指定新的偏移量:
<additional>
<tlLogic id="0" programID="0" offset="42"/>
</additional>
使用相同的控制器控制多个交叉口
在SUMO中,交通灯控制器可以同时控制任意数量的交叉口。这可以通过以下方法之一完成:
– 使用NETCONVERT构建网络时,为.nod.xml文件中的一组节点定义相同的tl属性(控制器ID)
– 在NETEDIT中为多个节点设置相同的tl属性
– 使用NETCONVERT构建网络时设置选项–tls.join。这将自动加入距离默认距离20m附近的节点的交通信号灯(可通过设置选项tls.join-dist 进行自定义)。
注意,在这种情况下,每个相位的状态向量将与受控交叉口的总数一样长。此外,connections 的 tls索引 将与 link索引 不同(因为后者以每个交叉口的0开始,而tls索引在控制器内是唯一的)。
定义信号组
在SUMO中,在受控交叉口的每个车道到车道的连接都被分配了一个名为link tls index的索引。该索引用于通过查找状态向量中该索引处的字符代码来确定每个阶段的状态。
通过设置可视化选项show link tls index,可以在SUMO-GUI中显示链接索引。默认情况下,链接索引对于每个连接都是唯一的,并且从北方开始以顺时针方式分配。在定义联合TLS时,索引按受控联结的顺序继续编号。
每个连接的tls索引可以在 .tll.file 中自由分配,也可以通过在 NETEDIT 中设置属性linkIndex来自由分配。通过为多个连接分配相同的索引,它们形成一个信号组并始终显示相同的状态(仅仅因为它们引用相同的状态索引)。
定义程序切换时间和过程
在实践中,tls通常在一天中使用不同的程序,也可能在工作日和周末使用。可以使用WAUT(“Wochenschaltautomatik”〜每周开关自动化的简称)加载程序之间切换时间的定义。
鉴于tls知道四个节目 - 两个用于工作日,两个用于周末,从22:00到6:00,夜间计划将被使用,并且从6:00到22:00日计划,已经定义的程序,命名为“weekday_night”,“weekday_day”,“weekend_night”,“weekend_day”。为了描述切换过程,我们必须首先描述切换,假设我们的模拟从星期一0.00(second 0)运行到星期一0.00(second 604800):
<WAUT refTime="0" id="myWAUT" startProg="weekday_night">
<wautSwitch time="21600" to="weekday_day"/> <!-- monday, 6.00 -->
<wautSwitch time="79200" to="weekday_night"/> <!-- monday, 22.00 -->
<wautSwitch time="108000" to="weekday_day"/> <!-- tuesday, 6.00 -->
... further weekdays ...
<wautSwitch time="453600" to="weekend_day"/> <!-- saturday, 6.00 -->
... the weekend days ...
</WAUT>
The fields in WAUT have the following meanings:
and the fields in wautSwitch:
另外,必须给出关于哪些tls应由WAUT切换,如下:
<wautJunction wautID=“myWAUT” junctionID=“RCAS” [procedure=“Stretch”] [synchron=“t”]/>
Here, the attributes have the following meaning:
可以将多个tls分配给单个WAUT。 理论上也可以将几个WAUT分配给单个交叉口,但实际上并没有这样做。
additional-file中的完整定义如下所示。 它将触发交通灯逻辑X的程序S1和S2之间的切换,其初始程序称为0。
<additional>
<tlLogic id="X" type="static" programID="S1" offset="0">
<phase duration="50" state="Gr"/>
<phase duration="50" state="rG"/>
</tlLogic>
<tlLogic id="X" type="static" programID="S2" offset="0">
<phase duration="30" state="Gr"/>
<phase duration="80" state="rG"/>
</tlLogic>
<WAUT startProg="0" refTime="100" id="w1">
<wautSwitch to="S1" time="300"></wautSwitch>
<wautSwitch to="SS" time="800"></wautSwitch>
</WAUT>
<wautJunction junctionID="X" wautID="w1"></wautJunction>
<additional>
交通灯性能评估
自动检测器生成工具
有些工具可用于生成用于评估交通灯的检测器。所有这些都位于<SUMO_HOME> / tools / output 中。
注意:启动的交通信号灯不需要添加检测器定义,因为它们生成自己供内部使用的检测器。
generateTLSE2Detectors.py 生成一个包含区域检测器的文件。 All lanes incoming into an intersection are covered with these detectors.
generateTLSE3Detectors.py 生成一个包含多入口/多出口检测器的文件。Detectors are built for each edge incoming to the traffic light. All lanes of each of these edges are covered with exit points.
在这两种情况下,必须使用选项 –net-file <FILE>(或-n <FILE>)来提供网络。
可以使用选项 –output <FILE>(或-o <FILE>)给出包含要生成的检测器定义的文件,对于区域检测器,默认为“e2.add.xml”;对于多入口/多出口探测器,默认为“e3.add.xml”。
默认情况下,generateTLSE2Detectors.py生成的区域检测器将其度量写入“e2output.xml”;generateTLSE2Detectors.py生成的多入口/多出口检测器将其度量写入“e3output.xml”。
可以使用选项 –results-file <FILE>(或-r <FILE>)更改两个脚本的输出文件名。
生成报告的频率默认为60秒。可以使用选项 –frequency <INT>(或-f <INT>)更改它。
通过TraCI控制交通灯
TraCI提供各种控制交通信号灯的功能
通过TraCI实现自适应控制的常见模式是加载程序,其中所有绿灯具有一个长的持续时间(即1000s)以避免SUMO切换,然后使用 setPhase() 函数适当地切换到下一阶段。这种方法的好处是,SUMO可以自动处理黄色和全红色阶段,控制脚本只是确定当前绿灯相位的持续时间。
To implement controllers with branching phase transitions,相位属性 next 可以用于指示下一相位。This is useful when adding additional transition phases to the end of a fixed cycle program.
有关控制交通信号灯的教程可以在 Tutorials#TraCI_Tutorials 中找到。
最后
以上就是尊敬往事为你收集整理的SUMO入门(六) - 交通灯的全部内容,希望文章能够帮你解决SUMO入门(六) - 交通灯所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复