第二课:路网构建基础——用NETEDIT画出你的第一个十字路口
说实话,很多刚接触SUMO的朋友,第一反应都是去写XML文件来定义路网。我当年也是这么干的,结果折腾了半天,不是车道数对不上,就是连接关系乱成一团。后来我才发现,NETEDIT这个图形化工具,才是真正适合人类使用的路网编辑器。
这一课,我们就来亲手画一个最简单的十字路口。别小看这个路口,它是所有复杂路网的基石。你想想看,城市里那些立交桥、环岛,拆开来看,本质上就是多个十字路口的组合。
启动NETEDIT
在终端里敲下这行命令:
netedit
嗯,就这么简单。如果你配置了环境变量,系统会直接弹出NETEDIT的主窗口。我第一次打开时,面对空白的画布还有点懵——这玩意儿怎么用?别急,我们一步步来。
NETEDIT的界面分三块:左侧是编辑工具栏,中间是画布,右侧是属性面板。我个人习惯先把工具栏熟悉一遍,尤其是那几个带图标的按钮,鼠标悬停上去会有中文提示。
绘制道路
点击工具栏上的「创建边」按钮(就是那个像马路一样的图标)。然后在画布上点一下,拖拽,再点一下,一条路就出来了。
我们来画两条交叉的路:
- 第一条:从(-200, 0)到(200, 0),这是一条东西向的主干道
- 第二条:从(0, -200)到(0, 200),这是一条南北向的次干道
画完之后,你会看到两条路在原点处交叉。但这时候它们只是两条独立的线段,还没有形成路口。为什么?因为NETEDIT默认把每条路都当成独立的「边」,交叉点只是视觉上的重叠,并没有逻辑上的连接。
关键概念:在SUMO里,「边」(Edge)是道路的基本单元。两条边交叉的地方,需要手动创建「连接」(Connection),否则车辆会直接穿过去,就像不存在对方一样。
设置车道数
点击选中东西向的那条路(就是横着的那条)。右侧属性面板会显示它的参数。找到「lane数」这个字段,默认是1。我建议改成2——双向两车道,这样更接近真实场景。
南北向的路也改成2车道。改完之后,你会发现路变宽了,画布上出现了两条平行的线。嗯,这就是车道。
这里有个小细节:每条边的车道编号是从0开始的。比如双向两车道,0号车道是正向,1号车道是反向。我在项目中遇到过有人把车道编号搞混,结果车辆全在逆行。所以,记住这个编号规则很重要。
创建连接关系
现在到了最关键的一步——让两条路真正「连起来」。
点击工具栏上的「连接编辑器」按钮(图标是两个箭头对接的样子)。然后点击交叉点,你会看到所有车道的连接关系以表格形式显示出来。
默认情况下,NETEDIT会自动生成一些连接。但自动生成的不一定对,尤其是转弯车道。我建议手动检查并调整:
- 东西向的0号车道(东向西方向),应该能直行、左转、右转
- 东西向的1号车道(西向东方向),同样需要三个方向
- 南北向同理
在连接编辑器里,每个格子代表一个可能的转向。绿色表示已连接,红色表示未连接。你只需要点击格子,就能切换状态。
我的习惯:先把所有直行连接都打开,再处理左转和右转。右转一般不需要信号灯控制,但左转需要。这个在后面的信号灯课程里会详细讲。
添加交通信号灯
选中交叉点(点击路口中心),在属性面板里找到「交通信号灯」选项,勾选它。NETEDIT会自动生成一个默认的信号灯方案。
默认方案通常是两相位:东西向绿灯,南北向红灯,然后反过来。对于简单的十字路口,这个方案够用了。但如果你想要更复杂的相位(比如左转专用相位),就需要手动编辑信号灯计划了。
我曾经在一个项目中,因为默认信号灯方案没考虑行人过街时间,导致路口拥堵严重。后来加了15秒的全红时间,问题才解决。所以,信号灯不是越简单越好,得结合实际需求。
验证路网
画完之后,记得保存。点击「文件」→「保存」,或者直接按Ctrl+S。NETEDIT会生成一个.net.xml文件。
为了确保路网没问题,我习惯用SUMO自带的验证工具跑一遍:
netconvert --sumo-net-file my_intersection.net.xml --validate
如果输出没有报错,恭喜你,第一个十字路口就建好了。如果有警告,也别慌,NETEDIT会告诉你哪里有问题,比如车道连接缺失、信号灯相位冲突等等。
知识体系总览
下面这张图,是我自己总结的十字路口构建流程。你可以把它当成一个检查清单,每次建路网时对照着来:
常见问题与避坑
画了这么多年路网,我踩过的坑还真不少。挑几个典型的说说:
- 车道方向搞反:NETEDIT里,边的方向是从起点指向终点。如果你发现车辆在逆行,检查一下边的方向是不是反了。选中边,属性面板里有个「方向」字段,可以翻转。
- 连接丢失:有时候明明设置了连接,但车辆就是不转弯。这种情况多半是因为连接编辑器里没保存。记住,每次修改连接后,要点一下「应用」按钮。
- 信号灯相位冲突:我曾经设置了一个四相位方案,结果有两个相位同时亮了绿灯,导致路口乱成一锅粥。后来我养成了一个习惯:每次改完信号灯,都用NETEDIT的「模拟」功能跑一遍,看看有没有冲突。
重要提醒:NETEDIT虽然好用,但它生成的XML文件有时候会包含冗余信息。如果你打算手动编辑XML,建议先用NETEDIT生成基础结构,再在文本编辑器里微调。不要完全依赖图形界面,也不要完全手写XML——两者结合才是最佳实践。
好了,这一课的内容就到这里。十字路口画好了,下一课我们就可以往里面放车辆了。不过在那之前,我建议你多画几个不同形状的路口试试——比如T型路口、五岔路口。画得越多,你对NETEDIT的掌握就越熟练。
可可精品资料库