2. 多车道直路交通流仿真与车道变换观察

任务目标

在SUMO中构建一条双车道直线道路,分别以不同期望速度投放两股车流,使车辆因速度差异产生跟驰压力并触发自动换道行为;同时通过SUMO自带的感应线圈(E1)与车道区域检测器(E2)采集交通流参数,验证换道对车道利用率与速度分布的影响。

环境与依赖

  • SUMO 1.18.0 或更高版本(含 sumo-gui、netedit、python/tools)
  • Python 3.8+(仅用于启动仿真与解析输出,非必须)

实现步骤

本案例使用SUMO的XML定义文件直接构建场景,共需4个文件:路网(.net.xml)、路由(.rou.xml)、附加检测器(.add.xml)以及SUMO配置文件(.sumo.cfg)。路网通过netedit或netconvert生成,这里直接给出可复现的构建命令与文件内容。

1. 生成双车道直线路网

使用netconvert从文本定义生成路网,避免手工编辑。创建 edge_def.txt:


    lanes,length,maxSpeed
    edgeA,2,500,13.89
    edgeB,2,500,13.89

执行命令:

netconvert --node-files=nodes.nod.xml --edge-files=edges.edg.xml --output-file=network.net.xml

其中 nodes.nod.xml 定义两个节点(起点/终点),edges.edg.xml 定义两条相向边。为简化,使用单向双车道直路:起点n1到终点n2,单条边road含2车道。

nodes.nod.xml

<nodes>
    <node id="n1" x="0.0" y="0.0" type="priority"/>
    <node id="n2" x="500.0" y="0.0" type="priority"/>
</nodes>

edges.edg.xml

<edges>
    <edge id="road" from="n1" to="n2" numLanes="2" speed="13.89"/>
</edges>

生成路网:

netconvert --node-files=nodes.nod.xml --edge-files=edges.edg.xml --output-file=network.net.xml --no-internal-links

2. 定义不同速度的车辆流

创建 routes.rou.xml,定义两类车辆:慢车(slow,期望速度10 m/s)与快车(fast,期望速度20 m/s)。快车从后方接近慢车时,因跟驰模型(默认Krauss)产生减速压力,从而触发换道至左侧车道超越。

<routes>
    <vType id="slow" maxSpeed="10.0" color="1,0,0"/>
    <vType id="fast" maxSpeed="20.0" color="0,0,1"/>

    <flow id="slow_flow" type="slow" begin="0" end="100" number="20">
        <route edges="road"/>
    </flow>
    <flow id="fast_flow" type="fast" begin="0" end="100" number="30">
        <route edges="road"/>
    </flow>
</routes>

3. 配置检测器采集交通流参数

创建 detectors.add.xml,在道路中部(x=250m)放置两个E1感应线圈(每车道一个)和一个E2车辆流失效检测器(覆盖整条道路断面),用于统计流量、平均速度与车道占用率。

<additional>
    <e1Detector id="det_lane0" lane="road_0" pos="250.0" freq="10.0" file="lane0_out.xml"/>
    <e1Detector id="det_lane1" lane="road_1" pos="250.0" freq="10.0" file="lane1_out.xml"/>
    <e2Detector id="det_all" lane="road_0" pos="250.0" length="50.0" freq="10.0" file="all_out.xml" friendlyPos="true"/>
</additional>

说明:E2检测器需指定起始车道与长度,这里从车道0的250m处向后覆盖50m路段,统计该路段内所有车道的车辆(SUMO的E2默认统计所有车道)。

4. 仿真配置文件

创建 sim.sumocfg:

<configuration>
    <input>
        <net-file value="network.net.xml"/>
        <route-files value="routes.rou.xml"/>
        <additional-files value="detectors.add.xml"/>
    </input>
    <time>
        <begin value="0"/>
        <end value="120"/>
    </time>
</configuration>

运行与可视化验证

  1. 启动GUI仿真:sumo-gui sim.sumocfg,点击运行按钮,观察车辆行为。
  2. 换道观察:快车(蓝色)在接近慢车(红色)时,应自动从车道0(右侧)换至车道1(左侧)超越,超越后视情况返回原车道。可在GUI中右键车辆查看其当前车道与速度。
  3. 数据输出:仿真结束后,打开 lane0_out.xml、lane1_out.xml 与 all_out.xml,查看每10秒间隔的流量、平均速度与占用率。

通过条件

  • 仿真运行无报错,车辆正常从n1驶向n2并在120s内全部离开路网。
  • 在GUI中至少观察到3次明显的换道超越行为(快车从车道0变至车道1再变回)。
  • 检测器输出文件中,车道1(左侧车道)的平均速度高于车道0(右侧车道),且车道0的占用率高于车道1——这直接证明慢车聚集在右侧车道,快车利用左侧车道超越,交通流参数与换道行为一致。

常见问题

  • 若车辆不换道:检查vType中是否设置了laneChangeModel(默认LC2013即可),或增大快车流量/速度差(如将快车速度提至25 m/s)。
  • 若E2检测器无数据:确认friendlyPos已设置,且检测器长度未超出道路边界。
车道0(右侧/慢车道) 车道1(左侧/快车道) 慢 快 E1/E2检测器(x=250m处) 换道超越 → 行驶方向

上图示意了双车道直路上快车(蓝)从右侧车道向左换道超越慢车(红)的过程,黄色竖线为检测器安装位置。实际仿真中换道点由SUMO的LC2013模型根据速度差与安全间隙自动决策。