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>
运行与可视化验证
- 启动GUI仿真:
sumo-gui sim.sumocfg,点击运行按钮,观察车辆行为。 - 换道观察:快车(蓝色)在接近慢车(红色)时,应自动从车道0(右侧)换至车道1(左侧)超越,超越后视情况返回原车道。可在GUI中右键车辆查看其当前车道与速度。
- 数据输出:仿真结束后,打开
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已设置,且检测器长度未超出道路边界。
上图示意了双车道直路上快车(蓝)从右侧车道向左换道超越慢车(红)的过程,黄色竖线为检测器安装位置。实际仿真中换道点由SUMO的LC2013模型根据速度差与安全间隙自动决策。