路网基础概念:从零开始理解SUMO的路网结构

做交通仿真,第一件事就是搞清楚路网。很多新手一上来就急着跑仿真,结果路网画得乱七八糟,后面调参数调到头秃。我个人习惯是,先把路网的几个核心概念吃透,后面才能游刃有余。

今天我们就来聊聊SUMO路网里最基础的四个东西:节点(Node)、边(Edge)、车道(Lane)和连接器(Connection)。最后再带你看看.net.xml文件到底长什么样。

1. 节点(Node)与边(Edge):路网的骨架

说白了,路网就是一张图。节点是路口,边是路段。你想想看,城市道路是不是就是这个逻辑?

节点(Node):代表交叉口、道路端点或者道路形状变化的点。每个节点有一个唯一的ID,还有x、y坐标。在SUMO里,节点还分好几种类型:

  • priority:有优先权的交叉口(默认类型)
  • traffic_light:信号灯控制的路口
  • right_before_left:让行规则路口
  • dead_end:死胡同或道路终点
  • unregulated:无管制路口
我的经验:刚开始做项目时,我经常把节点类型搞混。有一次把信号灯路口设成了priority,结果仿真里车全堵在那谁也不让谁。嗯,这个坑我替你们踩过了。

边(Edge):连接两个节点的路段。每条边有一个ID,还有from和to属性,指向两个节点。边可以设置车道数、限速、是否允许某种车辆通行等。

举个简单的例子,一个十字路口需要5个节点(4个入口+1个中心节点)和4条边。但实际项目中,一个复杂路口可能有十几个节点,每条边还要分段。

2. 车道(Lane)属性:细节决定成败

每条边由若干车道组成。车道是车辆真正行驶的地方。每个车道有这些关键属性:

属性 说明 示例值
id 车道唯一标识,格式为"边ID_车道索引" edge1_0, edge1_1
index 车道索引,从0开始(最右侧为0) 0, 1, 2
speed 车道限速,单位m/s 13.89(约50km/h)
length 车道长度,单位m 100.0
width 车道宽度,默认3.2m 3.5
allow/disallow 允许/禁止的车辆类型 allow="passenger"
注意:车道索引从0开始,0是最右侧车道。这个和国内靠右行驶的习惯一致。我曾经见过有人把索引搞反了,结果所有车都在最左侧车道逆行。

3. 连接器(Connection)与转向:车怎么走全靠它

节点和边搭好了骨架,车道画好了线,但车怎么从一个车道走到另一个车道?这就靠连接器了。

连接器(Connection)定义了车辆在节点处的转向行为。每个连接器包含:

  • from:来自哪条边
  • to:去往哪条边
  • fromLane:来自哪个车道
  • toLane:去往哪个车道
  • dir:转向方向(s=直行, l=左转, r=右转, t=掉头)
  • state:信号灯相位(如果是信号灯路口)

举个例子,一个标准的十字路口,每个入口有3条车道(左转、直行、右转),那么每个入口需要3个连接器分别对应3个转向。4个入口就是12个连接器。

核心要点:连接器是路网中最容易被忽略但最关键的部分。没有连接器,车到了路口就不知道往哪走,直接卡在那。

4. 路网文件(.net.xml)结构解析

SUMO的路网文件是XML格式的,后缀是.net.xml。我刚开始看这个文件时觉得头大,但其实结构很清晰。下面是一个简化版的例子:

<?xml version="1.0" encoding="UTF-8"?>
<net version="1.16" junctionCornerDetail="5">
  
  
  <junction id="J1" x="0.0" y="0.0" type="priority"/>
  <junction id="J2" x="100.0" y="0.0" type="priority"/>
  <junction id="J3" x="100.0" y="100.0" type="traffic_light"/>
  
  
  <edge id="E1" from="J1" to="J2" priority="1">
    <lane id="E1_0" index="0" speed="13.89" length="100.0"/>
    <lane id="E1_1" index="1" speed="13.89" length="100.0"/>
  </edge>
  
  <edge id="E2" from="J2" to="J3" priority="2">
    <lane id="E2_0" index="0" speed="11.11" length="100.0"/>
  </edge>
  
  
  <connection from="E1" to="E2" fromLane="0" toLane="0" dir="r" state="M"/>
  <connection from="E1" to="E2" fromLane="1" toLane="0" dir="s" state="M"/>
  
  
  <tlLogic id="J3" type="static" programID="0" offset="0">
    <phase duration="30" state="GGGrrr"/>
    <phase duration="5" state="yyyrrr"/>
    <phase duration="30" state="rrrGGG"/>
    <phase duration="5" state="rrryyy"/>
  </tlLogic>
  
</net>

文件结构其实就三大部分:

  1. 节点区:所有junction标签,定义路口位置和类型
  2. 边区:所有edge标签,每个edge里包含lane子标签
  3. 连接区:所有connection标签,定义转向关系

如果路口有信号灯,还会有tlLogic标签定义信号灯方案。

实用技巧:实际项目中,我很少手写.net.xml。一般都是用netedit画图,或者用netconvert从其他格式转换。但理解这个文件结构很重要,因为调试时经常要手动改一些参数。

5. 知识体系总览

下面这张图帮你理清今天讲的所有概念之间的关系:

路网基础概念体系 .net.xml 路网文件 节点 (Node/Junction) 边 (Edge) + 车道 (Lane) 连接器 (Connection) 节点属性 • id: 唯一标识 • x, y: 坐标位置 • type: 路口类型 车道属性 • index: 车道索引 • speed: 限速 • length: 车道长度 连接器属性 • from/to: 起止边 • fromLane/toLane • dir: 转向方向 三者关系 节点连接边 → 边包含车道 → 连接器定义车道间的转向关系

这张图把今天讲的内容串起来了。你看,路网文件在最顶层,下面分三个分支:节点、边+车道、连接器。每个分支都有自己的属性,最后三者配合才能让车辆正常行驶。

我个人觉得,理解这三者的关系是做好交通仿真的第一步。很多人在调参数时发现车不走、乱走或者堵死,90%的原因都是这三者没配好。

避坑指南:我曾经在一个项目中,路网看起来没问题,但车就是不走。查了两天,发现是一个连接器的fromLane写错了,指向了一个不存在的车道。这种错误在手动编辑.net.xml时特别容易犯。

好了,今天的内容就到这里。记住这三个核心概念,后面我们讲路网编辑工具和参数调优时,你会发现自己上手特别快。

可可精品资料库