2. 路网生成(一)
各位同学,欢迎来到路网生成的第一讲。
说实话,很多刚接触 SUMO 的朋友,第一反应就是去写 XML 文件来定义路网。我个人觉得,这有点「自讨苦吃」。你想想看,一个简单的十字路口,光节点坐标、车道连接、转向关系,写下来少说几十行代码,还容易出错。
所以,我更推荐新手从 netedit 入手。它是 SUMO 自带的图形化编辑器,所见即所得。今天,我们就用它来手动绘制一个标准的十字路口。
1. 启动 netedit
打开终端,输入命令:
netedit
嗯,就这么简单。你会看到一个空白的画布,左侧是工具栏,右侧是属性面板。
我第一次用的时候,差点被这个界面劝退——太朴素了。但用久了你会发现,它其实很高效。所有核心功能都集中在左侧那几个图标上。
2. 创建道路节点
我们先来画路口的四个方向。在左侧工具栏中,选择 创建边(Edge) 工具(快捷键 e)。
在画布上点击一下,就生成了一个节点。再点击一下,生成第二个节点,同时一条边就自动连上了。
我个人习惯先画一条水平的主干道:
- 从左侧点击,生成节点 A(比如坐标 -200,0)
- 向右移动,在中间位置点击,生成节点 B(坐标 0,0)——这就是十字路口的中心
- 继续向右,生成节点 C(坐标 200,0)
这样,我们就有了从 A 到 B 再到 C 的一条路。
但注意,现在它是一条连续的边。我们需要把中间那个点变成真正的交叉口。怎么做?选中节点 B,在右侧属性面板中,将它的 Type 改为 traffic_light 或者 priority。我一般先设为 priority,后面再调信号灯。
Ctrl 键可以吸附到网格,对齐很方便。
3. 绘制垂直方向的道路
接下来画南北方向的路。还是用 创建边 工具:
- 从节点 B 正上方点击,生成节点 D(坐标 0,200)
- 向下移动,点击节点 B(注意,要点击到已有的节点 B 上,而不是新建一个)
- 继续向下,生成节点 E(坐标 0,-200)
这样,十字路口的雏形就出来了。四条边,一个中心节点。
你可能会问:「为什么我不直接画一条从 D 到 E 的边,穿过 B?」
嗯,这里有个坑。如果你直接画一条穿过 B 的边,SUMO 会把它当成两条独立的边,而不是一个交叉口。我曾经在这个问题上卡了半小时,后来才发现必须让所有道路在同一个节点上相交。
4. 调整车道属性
默认情况下,每条边只有一条车道,而且是双向的。对于城市道路来说,这显然不够。
选中一条边(比如从 A 到 B),在右侧属性面板中:
- 找到 numLanes,改成
2(每个方向两条车道) - 找到 speed,改成
13.89(对应 50 km/h,单位是 m/s) - 找到 oneway,默认是
false(双向),我们保持双向
重复这个操作,把四条边都设置成双向两车道。
5. 设置转向连接
十字路口最重要的就是转向关系。没有它,车辆到了路口只会直行,不会转弯。
在左侧工具栏中,选择 创建连接(Connection) 工具(快捷键 c)。
点击中心节点 B,你会看到所有进入该节点的车道都高亮显示了。然后:
- 点击一条进入车道(比如从西往东的左侧车道)
- 再点击一条驶出车道(比如从北往南的左侧车道)
- 这样,就建立了一个左转连接
你需要为每个方向建立三种连接:直行、左转、右转。一共 12 个连接(4 个方向 × 3 种转向)。
听起来繁琐,但 netedit 有个省力的功能:选中节点后,按 Ctrl + Shift + C,它会自动生成所有可能的连接。我一般先用这个自动生成,再手动微调。
Delete 键即可。
6. 添加信号灯(可选)
如果你想让路口更真实,可以加上信号灯。选中中心节点 B,在属性面板中:
- 将 Type 改为
traffic_light - 在 tlType 中选择
static(固定配时)
SUMO 会自动生成一个默认的信号灯方案。你可以通过 编辑信号灯 按钮来调整相位和时长。
我个人建议,刚开始先用默认方案跑一下,看看效果。等后面学到信号优化时,再回来调整。
7. 保存与导出
画完之后,记得保存。点击 File → Save Network,或者按 Ctrl + S。SUMO 会生成一个 .net.xml 文件。
你也可以导出为图片:File → Export as SVG。这样就能直接用在报告或论文里了。
8. 本章知识体系
下面这张图,帮你梳理了手动绘制十字路口的完整流程:
9. 避坑指南
最后,分享几个我踩过的坑:
- 节点重叠: 画垂直道路时,一定要点击到已有的中心节点上,而不是在旁边新建一个。否则你会得到两个几乎重合的节点,路网看起来正常,但车辆永远不会转弯。
- 车道方向: 双向道路的两条边,方向必须相反。如果两条边方向相同,车辆会逆行。检查方法:选中边,看箭头方向。
- 连接遗漏: 自动生成连接后,一定要检查是否有缺失。我习惯在 SUMO-GUI 里加载路网,放一辆车跑一下,看它能不能正常转弯。
netconvert --sumo-net mynetwork.net.xml --plain-output-prefix mynetwork 导出为纯文本格式,检查节点和边的坐标是否正确。这招帮我发现过好几次坐标写反的低级错误。
好了,手动绘制十字路口就讲到这里。你可以在 netedit 里多练几次,直到能闭着眼睛画出标准的十字路口。下一课,我们会学习如何用脚本批量生成路网,那才是真正提升效率的地方。
可可精品资料库