4. 使用netedit绘制路网:从零搭建你的第一个十字路口

好,咱们正式开始动手了。前面讲了SUMO的安装和基础概念,现在轮到核心工具——netedit。说实话,我第一次打开netedit时也有点懵,界面看着挺朴素,但功能是真不少。别急,跟着我一步步来,半小时你就能画出一个带红绿灯的十字路口。

4.1 netedit界面:别被它朴素的外表骗了

启动netedit很简单,终端里敲一行命令就行:

netedit

或者你想直接打开一个已有的路网文件:

netedit mynetwork.net.xml

界面一出来,你可能会想:「就这?」嗯,我当年也是这反应。但用久了你会发现,它其实挺顺手的。咱们快速过一下核心区域:

  • 主画布:中间那块最大的区域,路网就在这上面画。鼠标滚轮缩放,按住中键平移。
  • 左侧工具栏:这是灵魂所在。从上到下依次是选择、编辑、创建道路、创建连接、创建交通信号灯等等。我习惯把常用功能记个快捷键,效率翻倍。
  • 右侧属性面板:选中一个元素后,这里会显示它的详细参数。车道数量、速度限制、信号灯相位……全在这调。
  • 底部状态栏:显示当前鼠标坐标、选中元素信息。调试时很有用。
小技巧:按 Ctrl + D 可以复制选中的道路或节点。我在搭建大型路网时经常用这招,省了不少重复劳动。

4.2 绘制十字路口:从两条路开始

咱们的目标很明确——画一个标准的十字路口。操作其实就三步:

  1. 创建道路:点击左侧工具栏的「创建道路」按钮(或者按快捷键 E)。然后在画布上点一下,拖拽,再点一下,一条路就出来了。我建议你先画一条水平方向的,再画一条垂直方向的。
  2. 调整节点:两条路交叉的地方会自动生成一个节点(junction)。选中它,右侧属性面板里可以调整交叉口的类型。默认是 priority(优先规则),咱们后面要改成信号灯控制。
  3. 连接车道:这一步很多人会忘。选中交叉节点,点击工具栏的「创建连接」按钮(快捷键 C),然后依次点击进入车道和驶出车道。说白了,就是告诉SUMO:「车辆从这条路进来,可以从哪条路出去。」
注意:连接没做好,车辆到了路口就会直接消失或者卡住不动。我曾经调试一个项目,车辆总是在路口凭空消失,查了半天才发现是连接漏了一条车道。嗯,这种坑踩过一次就记住了。

4.3 设置车道数量与方向:别让车挤在一起

默认创建的道路只有一条车道,而且双向通行。现实中哪有这么寒酸的路?咱们来改改。

选中一条道路,右侧属性面板找到 numLanes 参数。比如我想改成双向四车道:

  • numLanes:设为 2(每个方向2条车道,总共4条)
  • speed:限速,单位是m/s。比如 13.89 对应50km/h
  • oneway:如果勾上,这条路就变成单行道了

方向怎么控制?其实是通过 spreadType 参数:

参数值 含义
center 道路中心线居中,车道向两侧展开(默认)
right 车道全部在中心线右侧(靠右行驶)
left 车道全部在中心线左侧(靠左行驶)

国内靠右行驶,所以一般用 right。我个人习惯在画路网前就把这个统一设好,免得后面一条条改。

4.4 添加交通信号灯:让路口有序通行

十字路口没有红绿灯?那不乱套了。在netedit里加信号灯非常简单:

  1. 选中交叉口的节点
  2. 右侧属性面板找到 type,从下拉菜单选 traffic_light
  3. 点击「编辑信号灯」按钮,进入相位编辑器

相位编辑器里,你可以看到默认的相位方案。一般包含四个阶段:

  • 相位1:东西直行 + 右转(绿灯)
  • 相位2:东西左转(绿灯)
  • 相位3:南北直行 + 右转(绿灯)
  • 相位4:南北左转(绿灯)

每个相位可以设置时长(duration)和黄灯时间(yellow)。我一般这样设:

相位1: 绿灯30秒, 黄灯3秒
相位2: 绿灯15秒, 黄灯3秒
相位3: 绿灯30秒, 黄灯3秒
相位4: 绿灯15秒, 黄灯3秒
经验之谈:实际项目中,信号灯配时是个大学问。我曾经在一个城市交通项目中,光调信号灯相位就花了两天。建议你刚开始先用默认值跑起来,后面再根据仿真结果慢慢优化。

4.5 导出路网文件:保存你的劳动成果

画完了,记得保存。netedit默认保存为 .net.xml 格式,这是SUMO的标准路网文件。

操作路径:File → Save Network As...,或者直接按 Ctrl + S。我建议你养成随手保存的习惯,毕竟……嗯,软件崩溃这种事谁都遇到过。

导出的文件长这样:

<?xml version="1.0" encoding="UTF-8"?>
<net version="1.19" junctionCornerDetail="5" limitTurnSpeed="5.50">
    <location netOffset="0.00,0.00" convBoundary="0.00,0.00,200.00,200.00" />
    <edge id="gneE0" from="J0" to="J1" priority="1">
        <lane id="gneE0_0" index="0" speed="13.89" length="100.00" shape="0.00,-3.00 100.00,-3.00"/>
        <lane id="gneE0_1" index="1" speed="13.89" length="100.00" shape="0.00,3.00 100.00,3.00"/>
    </edge>
    ...
</net>

看到没?每条车道、每个节点、每个信号灯的配置都清清楚楚写在这里。后面咱们写Python脚本做参数调优时,就是直接改这个文件。

4.6 本章知识体系一览

下面这张图帮你梳理了本章的核心逻辑。从界面操作到文件导出,每一步都是环环相扣的:

netedit 路网绘制核心流程 ① 界面熟悉 工具栏 · 属性面板 · 画布 ② 绘制道路 创建节点 · 连接车道 ③ 参数配置 车道数 · 方向 · 限速 ④ 信号灯配置 相位设置 · 时长调整 ⑤ 导出文件 .net.xml 格式保存 ✅ 可仿真的路网 每个步骤都可在 netedit 中实时预览,方便反复调整

好了,到这一步,你已经掌握了netedit的核心操作。画一个十字路口、配上车道参数、加上信号灯、导出文件——这套流程在后面的章节中会反复用到。我个人建议你多练几次,试着画不同形状的路口,比如T型路口、环岛。熟能生巧嘛。

避坑指南:我曾经在导出文件时忘记检查连接关系,结果仿真时车辆全堵在路口不动。后来我养成了一个习惯——每次导出前,先按 F5 刷新一下路网,看看有没有报错。这个小动作帮我省了不少调试时间。

下一章,咱们会把这个路网文件用起来,开始跑第一个交通仿真。到时候你就知道,今天画的这个十字路口,到底能不能正常工作。