3. 路网基础概念
做交通仿真,第一件事就是搞清楚路网。很多新手一上来就急着跑仿真,结果路网画得乱七八糟,后面调参数调到头秃。我个人习惯是,先把路网的几个核心概念吃透,后面才能游刃有余。
今天我们就来聊聊SUMO路网里最基础的四个东西:节点(Node)、边(Edge)、车道(Lane)和连接器(Connection)。最后再带你看看.net.xml文件到底长什么样。
1. 节点(Node)与边(Edge):路网的骨架
说白了,路网就是一张图。节点是路口,边是路段。你想想看,城市道路是不是就是这个逻辑?
节点(Node):代表交叉口、道路端点或者道路形状变化的点。每个节点有一个唯一的ID,还有x、y坐标。在SUMO里,节点还分好几种类型:
- priority:有优先权的交叉口(默认类型)
- traffic_light:信号灯控制的路口
- right_before_left:让行规则路口
- dead_end:死胡同或道路终点
- unregulated:无管制路口
边(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" |
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>
文件结构其实就三大部分:
- 节点区:所有junction标签,定义路口位置和类型
- 边区:所有edge标签,每个edge里包含lane子标签
- 连接区:所有connection标签,定义转向关系
如果路口有信号灯,还会有tlLogic标签定义信号灯方案。
5. 知识体系总览
下面这张图帮你理清今天讲的所有概念之间的关系:
这张图把今天讲的内容串起来了。你看,路网文件在最顶层,下面分三个分支:节点、边+车道、连接器。每个分支都有自己的属性,最后三者配合才能让车辆正常行驶。
我个人觉得,理解这三者的关系是做好交通仿真的第一步。很多人在调参数时发现车不走、乱走或者堵死,90%的原因都是这三者没配好。
好了,今天的内容就到这里。记住这三个核心概念,后面我们讲路网编辑工具和参数调优时,你会发现自己上手特别快。