第二章 路网文件(.net.xml):路网结构解析、节点与边的关系、使用netedit绘制路网
好,咱们今天来聊聊SUMO里最核心的东西——路网文件。你想想看,没有路网,车往哪儿跑?对吧。这章我会带着你,把.net.xml这个文件彻底看透。别怕,它就是个XML,结构很清晰。
2.1 路网文件的结构:从根节点到细节
一个.net.xml文件,说白了就是一个用XML描述的道路网络。我刚开始接触的时候,直接打开文件一看,好家伙,密密麻麻全是标签。但别慌,它的骨架其实很简单。
最顶层的根节点是<net>,里面主要包含三大块:
- 节点(Nodes):用
<junction>标签表示。你可以把它想象成路口、交叉点。 - 边(Edges):用
<edge>标签表示。这就是连接两个节点的道路。 - 连接(Connections):用
<connection>标签表示。它定义了车辆从一个边到另一个边的转向规则。
嗯,这里要注意,一个完整的路网文件里,还有<lane>(车道)和<type>(道路类型)这些细节。但核心就是节点和边的关系。
核心概念: 节点是点,边是线。点和线构成了路网的骨架。连接则决定了这个骨架怎么“通”。
2.2 节点与边的关系:一张图说清楚
我个人习惯把路网想象成一个“有向图”。节点就是图的顶点,边就是有方向的箭头。为什么要有方向?因为道路是单向的嘛。
咱们来看一个最简单的例子:一个十字路口。
- 有4个节点:东、南、西、北四个入口。
- 有4条边:从每个入口连接到中心路口节点。
- 还有4条边:从中心路口节点连接到每个出口。
你看,一个十字路口,实际上是由8条边和5个节点(4个入口+1个中心)组成的。我在项目中遇到过,很多新手会以为一条边就能代表一条双向道路,其实不是。SUMO里,每条边都是单向的。双向道路需要两条方向相反的边。
为了让你更直观地理解,我画了一张图:
你看,绿色箭头是进入路口的,红色箭头是离开路口的。每个入口节点和路口节点之间,都有两条方向相反的边。这就是SUMO里处理双向交通的方式。
2.3 使用netedit绘制路网:从零开始
好了,理论说完了,咱们来点实际的。怎么画路网?我建议你用netedit,这是SUMO自带的图形化编辑器,比手写XML快多了。
打开netedit很简单,在终端里敲:
netedit
然后就会弹出一个窗口。嗯,第一次打开可能会有点懵,别急,我带你走一遍基本流程。
2.3.1 创建节点
在netedit里,创建节点就是在地图上点一下。你可以在工具栏里选择“创建节点”工具(快捷键是n),然后在画布上点击,一个节点就生成了。
节点有几个重要属性:
| 属性 | 说明 | 我的建议 |
|---|---|---|
| id | 节点的唯一标识 | 用有意义的名称,比如“J1”、“路口A” |
| type | 节点类型(普通路口、交通灯路口等) | 默认是priority,有红绿灯需求再改 |
| x, y | 节点的坐标 | netedit会自动计算,你也可以手动输入 |
小技巧: 创建节点时,按住Ctrl键可以吸附到网格,这样画出来的路网会更整齐。我个人习惯先画一个大概的轮廓,再微调坐标。
2.3.2 创建边
有了节点,接下来就是连接它们。选择“创建边”工具(快捷键e),然后从一个节点拖拽到另一个节点,一条边就生成了。
边也有几个关键属性:
| 属性 | 说明 | 避坑指南 |
|---|---|---|
| id | 边的唯一标识 | 我曾经用数字编号,结果后来改得晕头转向。建议用“from_to”的格式,比如“N1_N2” |
| numLanes | 车道数量 | 默认是1,城市主干道我一般设3-4条 |
| speed | 限速(m/s) | 注意单位是米/秒,不是公里/小时。50km/h约等于13.89m/s |
| priority | 优先级 | 数值越高,车辆越优先通行 |
你想想看,如果一条边有3条车道,那它内部会自动生成3个<lane>标签,每个车道都有自己的id,比如edge_id_0、edge_id_1、edge_id_2。
2.3.3 设置连接
边画好了,车怎么转弯?这就需要设置连接了。在netedit里,选择“连接编辑器”工具(快捷键c),然后点击一个路口节点,就会弹出一个连接编辑窗口。
这个窗口里,你会看到所有进入这个路口的边,以及它们可以转向的边。你可以手动勾选允许的转向。比如,一个十字路口,你可以允许直行、左转、右转,禁止掉头。
注意: 连接设置是仿真能否跑起来的关键。我曾经有一次,忘记设置某个路口的右转连接,结果所有车到了那个路口都停着不动,死活不走。排查了半天才发现是连接没配。所以,画完路网后,一定要检查每个路口的连接是否完整。
2.4 从netedit到.net.xml:导出与查看
画好路网后,保存文件。netedit默认会生成一个.net.xml文件。你可以用文本编辑器打开看看,里面就是你刚才画的所有节点、边和连接。
举个例子,一个简单的十字路口,它的.net.xml文件大概长这样:
<?xml version="1.0" encoding="UTF-8"?>
<net version="1.16" junctionCornerDetail="5" limitTurnSpeed="5.50">
<location netOffset="0.00,0.00" convBoundary="0.00,0.00,100.00,100.00" origBoundary="0.00,0.00,100.00,100.00" projParameter="!"/>
<edge id="E1" from="J1" to="J2" priority="1" numLanes="2" speed="13.89">
<lane id="E1_0" index="0" speed="13.89" length="100.00"/>
<lane id="E1_1" index="1" speed="13.89" length="100.00"/>
</edge>
<edge id="E2" from="J2" to="J1" priority="1" numLanes="2" speed="13.89">
<lane id="E2_0" index="0" speed="13.89" length="100.00"/>
<lane id="E2_1" index="1" speed="13.89" length="100.00"/>
</edge>
<junction id="J1" type="priority" x="0.00" y="0.00" incLanes="" intLanes="" shape="0.00,0.00 10.00,0.00 10.00,10.00 0.00,10.00"/>
<junction id="J2" type="priority" x="100.00" y="0.00" incLanes="" intLanes="" shape="90.00,0.00 100.00,0.00 100.00,10.00 90.00,10.00"/>
<connection from="E1" to="E2" fromLane="0" toLane="0" dir="s" state="m"/>
<connection from="E1" to="E2" fromLane="1" toLane="1" dir="s" state="m"/>
</net>
你看,<edge>标签里包含了车道信息,<junction>标签定义了节点的位置和形状,<connection>标签则定义了转向规则。是不是很清晰?
我个人习惯,在netedit里画完路网后,会手动打开.net.xml文件检查一遍。特别是连接部分,确保没有遗漏。毕竟,工具自动生成的连接不一定完全符合你的预期。
好了,这一章的内容就到这里。路网文件是仿真的基础,你把它搞透了,后面的车流、信号灯什么的,都是水到渠成的事。
本章核心回顾:
- 路网文件由节点、边、连接三要素构成
- 节点是点,边是线,连接定义了线的连通性
- netedit是绘制路网的首选工具,支持图形化操作
- 画完路网后,务必检查连接设置,避免仿真时车辆“卡死”
可可精品资料库