3. 路网构建与编辑
在SUMO交通流仿真中,路网(Network)是一切交通行为发生的物理载体。无论是微观车辆跟驰、宏观交通流分析,还是信号灯配时优化,都依赖于一个拓扑正确、属性合理的路网文件(.net.xml)。虽然SUMO提供了从OSM(OpenStreetMap)导入路网的自动化工具,但在实际工程中,我们经常需要手工构建或精细编辑路网——例如,新建一条园区内部道路、调整某条匝道的限速、修正交叉口的转向连接关系,或是为仿真场景添加特定的车道功能。NETEDIT(Network Editor)是SUMO官方提供的图形化路网编辑工具,它允许用户以所见即所得的方式绘制节点(Node)和边(Edge),并精确配置车道数、限速、连接关系等核心属性。本章将系统讲解使用NETEDIT手工构建路网的全流程,从基础概念到高级配置,帮助读者建立对SUMO路网数据模型的深刻理解。
上图展示了NETEDIT构建路网的核心链路:从底层的数据模型(Node/Edge/Connection)出发,通过图形化编辑工具进行绘制与属性配置,最终生成可供SUMO仿真引擎直接加载的.net.xml文件。整个流程环环相扣,任何一个环节的疏漏都可能导致仿真运行失败或结果失真。接下来,我们将深入剖析每个环节的具体操作与原理。
3.1 路网数据模型与NETEDIT界面认知
核心原理:SUMO的路网本质上是一个有向图(Directed Graph),由节点(Node)和边(Edge)构成。节点代表道路的交叉口、端点或形状变化点,边代表连接两个节点的有向道路段。每条边可以包含多条车道(Lane),车道是车辆实际行驶的物理单元。连接关系(Connection)则定义了车辆如何从一条边的某条车道转向另一条边的某条车道,这是交叉口通行逻辑的核心。NETEDIT将这些抽象概念可视化,用户通过鼠标操作即可完成对路网拓扑的增删改查。
操作流程:启动NETEDIT(在SUMO安装目录下执行netedit.exe或通过命令行netedit),界面主要分为三个区域:左侧的层级列表(Hierarchy)、中央的编辑画布(Canvas)、右侧的属性面板(Attribute Panel)。在编辑画布中,右键选择“Add Node”即可在点击位置创建节点;选中两个节点后,右键选择“Add Edge”并依次点击起始节点和终止节点,即可创建一条有向边。默认情况下,新创建的边包含一条车道,限速为50km/h。
| 界面区域 | 功能说明 | 常用操作 |
|---|---|---|
| 层级列表 | 显示当前路网中的所有节点、边、连接、交通信号灯等元素 | 点击元素可快速定位并选中 |
| 编辑画布 | 路网的可视化编辑区域,支持缩放、平移、选择 | 滚轮缩放、中键平移、左键选择 |
| 属性面板 | 显示并编辑当前选中元素的详细属性 | 修改车道数、限速、节点类型等 |
priority(优先通行)、traffic_light(信号灯控制)、right_before_left(右侧先行)等,选择合适的节点类型可以大幅减少后续连接关系配置的工作量。
3.2 节点(Node)属性设置与类型选择
核心原理:节点属性决定了交叉口的通行规则和几何形状。最重要的属性是type,它定义了车辆通过该节点时的路权分配逻辑。例如,priority类型节点要求来自次要道路的车辆让行主要道路车辆;traffic_light类型节点则完全由信号灯控制通行。此外,节点的x和y坐标定义了其地理位置,radius属性影响交叉口的几何形状(用于绘制转弯车道)。
判断方法:选择节点类型时,需根据实际道路情况判断:若交叉口有明确的信号灯,则选择traffic_light;若为无信号灯但主路优先,则选择priority;若所有方向车流量相当且无信号灯,则选择right_before_left。对于道路的起点和终点(即路网的边界),通常使用dead_end类型,表示车辆在此处无法继续行驶。
<node id="intersection_1" x="1000.0" y="2000.0" type="traffic_light"/>
<node id="road_start" x="0.0" y="2000.0" type="dead_end"/>
案例拆解:假设我们要构建一个十字交叉口,东西方向为主干道(限速60km/h),南北方向为支路(限速30km/h)。我们创建四个节点:交叉口中心节点center(类型为priority),以及四个方向的端点节点(类型为dead_end)。在NETEDIT中,选中中心节点,在属性面板中将type改为priority,并设置priority属性为-1(表示该节点本身不定义优先方向,由连接关系决定)。然后,我们创建四条边:east_approach(从东端点指向中心)、west_approach(从中心指向西端点)等。这样,一个基础的十字路口拓扑就完成了。
dead_end误设为priority,会导致车辆在路网边界处产生不必要的让行行为,甚至造成仿真死锁。务必在创建节点时明确其角色。
3.3 边(Edge)属性配置:车道数、限速与方向
核心原理:边是道路的抽象,其属性直接决定了道路的通行能力与速度。关键属性包括numLanes(车道数)、speed(最大允许速度,单位m/s)、oneway(是否单向)、spreadType(车道分布类型,如center表示车道以道路中心线对称分布,right表示车道向右偏移)。在SUMO中,速度单位是m/s,而日常习惯使用km/h,换算关系为1 m/s = 3.6 km/h。
操作流程:在NETEDIT中选中一条边,右侧属性面板会显示其所有属性。修改numLanes为2,则道路变为双向两车道(若oneway为false)。修改speed为16.67(对应60km/h),则限速生效。对于单向道路,将oneway设为true,此时该边只允许车辆从from节点驶向to节点。
| 属性名 | 类型 | 默认值 | 说明 |
|---|---|---|---|
| numLanes | int | 1 | 车道数,必须大于0 |
| speed | float | 13.89 (50km/h) | 最大速度,单位m/s |
| oneway | bool | false | 若为true,则车辆只能沿from→to方向行驶 |
| spreadType | enum | right | 车道分布方式:center/right/roadCenter |
| priority | int | -1 | 道路优先级,用于无信号交叉口的路权判断 |
实战场景:在构建高速公路匝道时,通常需要设置spreadType="center"以保证车道关于道路中心线对称,同时将oneway设为true以模拟单向行驶。例如,一条匝道限速40km/h(即11.11m/s),车道数为1,则配置为<edge id="ramp_1" from="node_a" to="node_b" numLanes="1" speed="11.11" oneway="true" spreadType="center"/>。在NETEDIT中,这些修改会实时反映在画布上,方便用户直观检查。
3.4 连接关系(Connections)的配置与信号灯联动
核心原理:连接关系定义了车辆在交叉口内的行驶轨迹。一条连接由from(起始边)、fromLane(起始车道索引,从0开始)、to(目标边)、toLane(目标车道索引)以及dir(方向:s直行、l左转、r右转、t掉头)组成。在NETEDIT中,选中一个节点后,可以进入“连接模式”(按快捷键C),此时画布上会显示所有可能的转向箭头,用户只需点击箭头即可创建或删除连接。
操作流程:以十字路口为例,假设东进口(edge_east)有两条车道(索引0为左转车道,索引1为直行+右转车道),北出口(edge_north)有两条车道。我们需要创建以下连接:edge_east的车道0 → edge_north的车道0(左转),edge_east的车道1 → edge_north的车道1(直行),edge_east的车道1 → edge_south的车道0(右转)。在NETEDIT中,进入连接模式后,点击对应的转向箭头即可自动生成连接,并自动分配dir属性。
<connection from="edge_east" fromLane="0" to="edge_north" toLane="0" dir="l" state="m"/>
<connection from="edge_east" fromLane="1" to="edge_north" toLane="1" dir="s" state="m"/>
<connection from="edge_east" fromLane="1" to="edge_south" toLane="0" dir="r" state="m"/>
案例拆解:当节点类型为traffic_light时,连接关系还需要与信号灯相位(Phase)关联。在NETEDIT中,选中信号灯节点,点击“编辑信号灯”按钮,进入信号灯编辑器。在这里,我们可以定义多个相位,每个相位包含一组允许通行的连接。例如,相位A允许东西方向直行和右转,相位B允许东西方向左转,相位C允许南北方向直行和右转,相位D允许南北方向左转。每个相位需要设置持续时间(Duration)和状态(State)。信号灯与连接关系的正确联动是确保交叉口无冲突通行的关键。
from和to,而忽略了fromLane和toLane的对应关系。例如,左转车道必须连接到目标道路的最左侧车道,否则车辆会跨越实线,导致仿真中出现不合理的变道行为。务必在连接模式下仔细检查每条连接的起始和终止车道索引。
3.5 路网校验与常见错误排查
核心原理:路网构建完成后,必须进行校验以确保其逻辑正确性。NETEDIT内置了实时校验功能,会在画布底部显示错误和警告信息。常见的错误包括:节点坐标重叠、边没有连接到节点、连接关系缺失(导致某些转向无法实现)、车道数不匹配(例如,两条相连道路的车道数不一致,且未设置合理的车道扩展)。
判断方法:在NETEDIT中,可以通过菜单“Processing” → “Check Network”来运行完整校验。校验结果会列出所有错误(Error)和警告(Warning)。错误必须修复,否则SUMO无法加载路网;警告则可能导致仿真行为不符合预期,建议也一并处理。常见的警告包括:限速突变(相邻道路限速差超过20km/h)、节点间距过小(小于5米)等。
| 错误类型 | 典型原因 | 解决方案 |
|---|---|---|
| Disconnected edge | 边的from或to节点不存在 | 重新连接边到有效节点 |
| Missing connection | 交叉口存在未定义的转向 | 在连接模式中补全所有允许的转向 |
| Lane mismatch | 连接的两条车道索引超出范围 | 调整连接的车道索引或增加车道数 |
| Speed discontinuity | 相邻道路限速差异过大 | 调整限速或增加过渡路段 |
实战场景:假设我们构建了一个环形交叉口(Roundabout),但仿真时车辆在环岛内频繁停车。通过NETEDIT的校验功能,我们发现环岛内的连接关系虽然存在,但state属性被错误地设置为“m”(手动控制),导致车辆必须停车等待。修正方法是将环岛内连接的状态改为“M”(默认允许通行),并确保环岛入口的让行规则正确。这个案例说明,连接关系的state属性(m/M表示手动/自动,y表示让行,s表示停车)对仿真行为有直接影响。
3.6 从NETEDIT到仿真:导出与验证
核心原理:完成路网编辑后,需要将路网保存为.net.xml文件。NETEDIT支持直接保存(File → Save),也可以导出为其他格式。保存后,建议使用SUMO自带的命令行工具netconvert进行二次校验,命令为netconvert --sumo-net-file output.net.xml --validate。该命令会输出详细的校验报告,包括节点数、边数、连接数以及潜在问题。
操作流程:在NETEDIT中,点击“File” → “Save Network As...”,选择保存路径和文件名。保存后,打开终端,执行以下命令:
netconvert --sumo-net-file my_network.net.xml --validate --output-file my_network_checked.net.xml
如果校验通过,会生成一个my_network_checked.net.xml文件。然后,我们可以使用SUMO-GUI加载该文件,进行可视化验证。在SUMO-GUI中,可以查看路网的3D视图、检查每条车道的连接关系、模拟车辆行驶,从而直观地发现潜在问题。
案例拆解:某项目中,我们手工构建了一个包含5个交叉口、12条道路的园区路网。在NETEDIT中完成绘制后,使用netconvert校验发现3个警告:其中两个是限速突变(从30km/h直接变为60km/h),一个是一条边未设置priority属性。我们根据警告信息,在限速突变处增加了一段过渡道路(限速40km/h),并为缺失优先级的边设置了合理的优先级值。重新校验后,警告清零。随后在SUMO-GUI中加载路网,模拟了1000辆车在早高峰时段的运行,未出现死锁或异常停车现象,验证了路网的正确性。
netconvert的二次校验功能。通过本章的学习,读者应能够独立完成从空白画布到可仿真路网的全过程。在实际项目中,建议先绘制小规模路网进行验证,再逐步扩展,以降低排错难度。