3、路网构建工具:Netedit图形化编辑器使用、netconvert格式转换工具、netgenerate抽象路网生成器、手动编写.net.xml文件。
路网,是交通仿真的骨架。没有路网,你连车往哪儿开都不知道。
SUMO 里生成路网的方式,说白了就四种:图形化画、格式转换、抽象生成、手写代码。每种都有它的适用场景。我做了这么多年仿真,四种都用过,今天把它们的优缺点和用法一次性讲清楚。
核心观点:没有最好的工具,只有最合适的场景。小路口用手画,大路网用转换,抽象路网用生成器,特殊需求就手写。
3.1 Netedit:图形化编辑器
Netedit 是 SUMO 自带的图形化路网编辑器。你想想看,如果你要画一个只有三四个路口的校园内部路网,用命令行去配坐标?那太傻了。
我个人习惯,小范围路网直接用 Netedit 拖拽完成。启动命令很简单:
netedit
或者指定一个已有的路网文件:
netedit mynetwork.net.xml
界面分三个区域:左侧是编辑工具栏,中间是画布,右侧是属性面板。你可以:
- 添加节点(路口)和边(道路)
- 调整道路形状、车道数、限速
- 设置交通信号灯配时
- 添加检测器、公交站等基础设施
小技巧:按住 Ctrl 键可以多选节点或边。我经常用这个功能批量修改车道数,比一个一个点快多了。
Netedit 的优点是直观,缺点是当路网规模超过 100 个节点时,操作会变得卡顿。所以大路网我不建议用 Netedit。
3.2 netconvert:格式转换工具
这是我最常用的工具。真实世界的路网数据,比如 OpenStreetMap(OSM)、OpenDRIVE、Shapefile,都可以通过 netconvert 转换成 SUMO 格式。
举个例子,从 OSM 导出某城市的路网数据(假设文件名为 city.osm),然后执行:
netconvert --osm-files city.osm -o city.net.xml
就这么一行命令,一个包含几百条道路的路网就生成了。我在项目中遇到过,客户要求仿真整个新区的交通,用 OSM 数据配合 netconvert,一天之内就把路网搭好了。
netconvert 支持的输入格式包括:
| 输入格式 | 参数 | 典型场景 |
|---|---|---|
| OpenStreetMap (.osm) | --osm-files | 城市级路网,最常用 |
| OpenDRIVE (.xodr) | --opendrive-files | 自动驾驶仿真,高精度路网 |
| Shapefile (.shp) | --shapefile-prefix | 政府或规划部门提供的 GIS 数据 |
| MATsim (.xml) | --matsim-files | 跨平台仿真数据复用 |
注意:OSM 数据通常包含很多非机动车道、人行道,转换后需要手动清理。我曾经因为没清理,仿真里自行车在机动车道上乱窜,结果数据全废了。
3.3 netgenerate:抽象路网生成器
有时候你不需要真实路网,只需要一个抽象的路网来测试算法。比如你想测试信号灯配时方案,或者验证某个路由算法,用 netgenerate 生成一个网格路网就够了。
生成一个 5x5 的网格路网:
netgenerate --grid --grid.number 5 -o grid.net.xml
netgenerate 支持三种抽象路网:
- 网格路网(--grid):横平竖直,适合测试信号灯控制
- 蜘蛛网路网(--spider):中心放射状,适合测试中心区交通
- 随机路网(--rand):随机生成节点和边,适合压力测试
你还可以通过参数控制路网密度、车道数、限速等。比如生成一个 10x10 的网格,每条路 3 车道,限速 60km/h:
netgenerate --grid --grid.number 10 --default.lanenumber 3 --default.speed 16.67 -o grid_3lanes.net.xml
注意速度单位是 m/s,60km/h 换算过来就是 16.67m/s。这个细节我刚开始也搞错过,仿真跑起来车速不对,排查了半天才发现是单位问题。
3.4 手动编写 .net.xml 文件
最后一种方式,直接手写 XML。听起来很原始,但有时候这是最灵活的方式。
.net.xml 文件的核心结构包含两部分:
- 节点(junction):定义路口的位置和类型
- 边(edge):定义连接节点的道路
一个最简单的路网,包含两个节点和一条边:
<?xml version="1.0" encoding="UTF-8"?>
<net version="1.19" junctionCornerDetail="5" limitTurnSpeed="5.00">
<location netOffset="0.00,0.00" convBoundary="0.00,0.00,100.00,0.00"
projParameter="!"/>
<junction id="J1" x="0.00" y="0.00" type="priority"/>
<junction id="J2" x="100.00" y="0.00" type="priority"/>
<edge id="E1" from="J1" to="J2" priority="1">
<lane id="E1_0" index="0" speed="13.89" length="100.00"/>
</edge>
</net>
这段代码定义了一条 100 米长的道路,限速 13.89m/s(约 50km/h),连接两个路口。你想想看,如果我要做一个特殊的环形交叉口,或者一个非标准的立交桥,用 Netedit 画半天可能都不对,但手写 XML 可以精确控制每个坐标。
我的建议:手写 XML 适合路网结构简单但要求精确的场景。比如我做过一个测试,需要两条路在特定角度相交,手写坐标比用工具调整快得多。
3.5 四种工具的对比与选择
说了这么多,到底该用哪个?我总结了一张对比表:
| 工具 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|
| Netedit | 小范围路网(<50 节点) | 直观、易上手 | 大路网卡顿 |
| netconvert | 真实路网(城市级) | 数据来源广、自动化 | 需要清理数据 |
| netgenerate | 抽象路网(算法测试) | 快速生成、参数可控 | 不真实 |
| 手写 .net.xml | 特殊结构路网 | 完全控制 | 繁琐、易出错 |
嗯,这里要注意:实际项目中,这四种方式经常混合使用。比如先用 netconvert 从 OSM 转换一个大路网,再用 Netedit 微调局部细节,最后手写 XML 补几个特殊节点。灵活搭配才是王道。
一句话总结:Netedit 画小图,netconvert 转大图,netgenerate 造抽象图,手写 XML 补特殊图。四种工具各有所长,掌握它们,你就能应对 99% 的路网构建需求。
可可精品资料库