3、路网构建工具:Netedit图形化编辑器使用、netconvert格式转换工具、netgenerate抽象路网生成器、手动编写.net.xml文件。

路网,是交通仿真的骨架。没有路网,你连车往哪儿开都不知道。

SUMO 里生成路网的方式,说白了就四种:图形化画、格式转换、抽象生成、手写代码。每种都有它的适用场景。我做了这么多年仿真,四种都用过,今天把它们的优缺点和用法一次性讲清楚。

核心观点:没有最好的工具,只有最合适的场景。小路口用手画,大路网用转换,抽象路网用生成器,特殊需求就手写。

SUMO 路网构建四大工具 Netedit 图形化编辑器 拖拽绘制路网 适合小范围、精细调整 netconvert 格式转换工具 OSM / OpenDRIVE → SUMO 适合大范围真实路网 netgenerate 抽象路网生成器 网格 / 蜘蛛网 / 随机 适合算法测试、理论分析 手写 .net.xml 纯文本编辑 完全控制每个节点 适合特殊路网结构 选择建议 小范围精细调整 → Netedit | 大范围真实路网 → netconvert 算法测试 → netgenerate | 特殊结构 → 手写 .net.xml

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% 的路网构建需求。

可可精品资料库