HighwayDetector

本教程描述了如何主要使用 neteditdfrouter 以及一些 Python 工具来设置交通场景;前提是你已经拥有相当不错的模拟地点网络源,并且网络中布设了良好的检测器覆盖,能够提供现实世界中车辆的聚合计数(以及可能的速度)。该教程不仅限于高速公路,但高速公路更常满足这些前提条件。重点更多地在于需求准备和校准,而不是网络调整。 netedit_select_highway.png

选定的边(蓝色)优先级较低,将被丢弃

网络#

假设你已经熟悉从你首选的地图源提取网络,你可以用 netedit 打开你的网络并将其缩减到你感兴趣的区域。假设你有一个 navteq 文件,你可以选择(然后删除)所有优先级小于 -1 的边,将其缩减为高速公路网络。之后,可以使用矩形选择(按住 shift)进一步限制考虑的区域。你可能还想在选项对话框中启用匝道猜测。如果网络是由旧版本的 SUMO 准备的,之后重新计算所有连接可能是个好主意。通过在选择模式下选择所有路口,然后在连接模式下重置它们来执行此操作。可能仍存在无法自动猜测的缺失匝道和异常连接,应在设置基本场景后手动修复。

检测器数据#

定位检测器#

你的最终网络应在许多可用边上设有感应线圈的位置。如果你有检测器的地理坐标位置,通常需要一些手动工作来在网络中定位检测器。一个起点是使用 python sumolib 将位置与网络匹配:

if 'SUMO_HOME' in os.environ:
    sys.path.append(os.path.join(os.environ["SUMO_HOME"], 'tools'))
import sumolib

net = sumolib.net.readNet(<NETFILE>)
detectors = []
for id, lon, lat in <DETECTOR_INPUTFILE>:
    xy_pos = net.convertLonLat2XY(lon, lat)
    # look 10m around the position
    lanes = net.getNeighboringLanes(xy_pos[0], xy_pos[1], 10)
    # attention, result is unsorted
        bestLane = None
        ref_d = 9999.
    for lane, dist in lanes:
        # now process them and determine a "bestLane"
        # ...
                if dist < ref_d:
                    ref_d = dist
                    bestLane = lane
            pos, d = bestLane.getClosestLanePosAndDist(xy_pos)
    detectors.append(sumolib.sensors.inductive_loop.InductiveLoop(id, bestLane.getID(), pos))
sumolib.files.additional.write(<DETECTORFILE>, detectors)

数据收集的数据聚合周期默认为 60 秒。默认输出文件名设置为 none。如果可用,也可以给出检测器类型(source, sink, between)。输出文件示例如下所示。

<additional xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://sumo.dlr.de/xsd/additional_file.xsd">
<e1Detector id=""det0"" lane="262667814#2.7_0" pos="80.2550814486" period="60" file="NUL" friendlyPos="True"/>
<e1Detector id=""det1"" lane="262667814#2.7_1" pos="90.2522181762" period="60" file="NUL" friendlyPos="True"/>
<e1Detector id=""det2"" lane="262667814#2.7_2" pos="91.6879752087" period="60" file="NUL" friendlyPos="True"/>
</additional>

请注意,如果你正在处理大型网络,请安装 python rtree 库,这将极大地加快几何查找速度。根据你的网络和检测器位置数据的质量,你可能不应该总是选择最近的车道,还应考虑车道数量/速度限制是否符合你的预期。初始定位后,你可以将文件作为附加文件加载到 netedit 中进行微调。

处理输入数据#

检测器数据的一种常见格式是聚合到一分钟的时间槽中。dfrouter 可以处理以下格式的文件:

  • 检测器定义

除了上述检测器定义外,还可以应用以下定义。

<detectors xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://sumo.dlr.de/xsd/detectors_file.xsd">
<detectorDefinition id="MQ11Fs1" lane="ErnstRuska2O_0" pos="5.00" type="source"/>
<detectorDefinition id="MQ12Fs1" lane="ErnstRuska2W_0" pos="-5.00" type="between"/>
<detectorDefinition id="MQ13Fs1N" lane="EinsteinN_0" pos="5.00" type="sink"/>
</detectors>
  • 流量数据

必须给出关于检测器 ID、时间以及每种车辆类型数量的数据,而速度数据是可选的。所有数据均以 csv 格式保存。

Detector_id;Time(minutes);Number_of_passenger_cars;Number_of_trucks;Average_speed_of passenger_cars;Average_speed_of_trucks

确定路线#

flowrouter.py (更多信息见 Tools/Detector)#

该脚本基于最大流理论,执行类似于 dfrouter 的流量路由。需要三个强制输入文件,即 SUMO 网络 (.net.xml) 和两个分别指定检测器和流量的文件。检测器的类型(source, sink, in between)可以由脚本检测或从给定的检测器文件中读取。例如,可以如下执行脚本:

tools/detector/flowrouter.py -n net.net.xml -d detector.det.xml -f flow.csv`

此外,还有一些 dfrouter 中没有的选项,用于考虑不同的参数,例如速度、停车设施、流量限制、最大(转弯)流量和车辆类型,以限制路线搜索空间。

dfrouter#

有不同的选项来设置路线搜索/校准条件以及管理输出文件的内容。可用选项及其相应定义可在 dfrouter 中找到。例如,执行调用为:

dfrouter -n net.net.xml -d detectors.det.xml -f flows.csv -o routes.rou.xml`

此外,也可以使用 XML 模式定义 (dfrouterConfiguration.xsd) 来设置配置文件。

检测流量与估计流量的比较#

根据上述方法,可以使用给定的检测器数据估计/生成路线,然后在模拟中用于估计边流量。可以使用两个脚本来检查估计流量在多大程度上对应于多个间隔内的检测流量。

  • flowFromEdgeData.py

该脚本用于比较检测到的边流量和模拟的边流量。后者基于 SUMO 的聚合输出。脚本可以如下执行:

tools/detector/flowFromEdgeData.py -d detectors.det.xml -e edgeData.xml -f detector_flows.xml -c flow_column`

其中 detectors.det.xml 主要定义检测器和边之间的关系;edgeData.xml 是来自 SUMO 的聚合输出;detector_flows.xml 定义检测到的流量数据;flow_column 是在给定检测器流量文件中包含流量数据的列。也可以指定分析间隔以及是否考虑没有数据的检测器。除了每个间隔的基于边的相对误差外,还计算平均路线流量、平均检测流量、平均流量偏差、RMSE 和 RMSPE 作为输出。

  • flowFromRoutes.py

该脚本用于比较检测到的流量和根据预定义的发射流量和路线的路线流量。基本执行调用如下:

tools/detector/flowFromRoutes.py -d detectors.det.xml -e emitters.flows.xml -f detector_flows.txt -r routes.rou.xml`

其中 emitters.flows.xml 定义路线流量;detector_flows.txt 定义检测到的流量数据;routes.rou.xml 定义每条路线的边组成。有选项可以定义分析间隔。除了 flowFromEdgeData.py 中上述提到的输出外,还可以使用相应的选项 --geh--geh-threshold 来获取 GEH 统计数据。

校准数据#

速度校准#