3、创建第一个网络:使用netedit绘制简单十字路口,理解节点(Node)和边(Edge)

好,咱们正式开始动手了。

上一章我们聊了SUMO的核心概念,你可能觉得有点抽象。别急,这一章我们直接打开netedit,亲手画一个十字路口出来。你想想看,一个十字路口,说白了就是两条路交叉嘛。但在SUMO的世界里,这个交叉点叫节点(Node),连接节点的路段叫边(Edge)。

我个人习惯,学任何新工具,第一件事就是先瞎画两笔,把界面摸熟。所以别怕犯错,咱们今天的目标很简单:画一个能用的十字路口,然后跑一辆车上去。

3.1 启动netedit

打开终端(或者命令行),输入下面这行命令:

netedit

嗯,就这么简单。如果你配置好了环境变量,一个图形界面就会弹出来。我第一次用的时候,还傻乎乎地去菜单里找图标,后来发现命令行才是真爱。

界面主要分三块:

  • 画布区:中间最大的空白区域,你就在这里画路网。
  • 工具栏:左边一竖排图标,选模式用的。
  • 状态栏:底部显示坐标、当前模式等信息。

你可能会问,为什么不用鼠标右键菜单?其实netedit的右键功能很强大,但咱们刚开始,先老老实实用工具栏。

3.2 理解节点(Node)和边(Edge)

在SUMO里,路网由两个基本元素构成:

元素 英文名 通俗理解
节点 Node 路的交叉点、端点或形状变化点
边 Edge 连接两个节点的路段,有方向

说白了,节点就是“点”,边就是“线”。但注意,这里的边是有方向的。你画一条边,它默认是从起点节点指向终点节点。这一点我在做项目时吃过亏——有一次画了个单向路,结果车全堵在入口,因为边方向画反了。

核心概念: 一个十字路口至少需要4个节点(四个方向的路口端点)和4条边(四条路段)。但中间那个交叉点本身也是一个节点,所以总共是5个节点、4条边。

3.3 绘制第一个十字路口

好,咱们开始画。请按以下步骤操作:

  1. 切换到“边”模式:点击工具栏上的 Edge 按钮(图标像一条直线)。
  2. 画第一条路:在画布上点击一下,这是起点节点。然后向右移动鼠标,再点击一下,这是终点节点。一条边就画好了。
  3. 画第二条路:同样方法,从下往上画一条垂直的边,让它穿过第一条路。
  4. 自动生成交叉节点:当你画完第二条边时,netedit会自动在两条边的交叉位置生成一个节点。这就是十字路口的中心。

嗯,这里要注意:如果你画的边没有自动交叉,可能是因为两条边没有真正相交。你可以手动调整节点位置,或者用 Move 模式拖动节点。

小技巧: 画边时按住 Ctrl 键,可以强制吸附到网格或已有节点上。我习惯一直按着,这样画出来的路网整齐很多。

3.4 调整节点和边的属性

画完了,但路网还光秃秃的。我们需要给它加点属性。

3.4.1 修改节点类型

双击十字路口中心的节点,弹出属性窗口。找到 Type 字段,默认是 priority(优先权交叉口)。你可以改成:

  • traffic_light:信号灯控制
  • right_before_left:右侧先行
  • allway_stop:全向停车

我个人建议初学者先用 priority,因为最简单。等后面学到交通信号灯再改。

3.4.2 修改边属性

双击一条边,你会看到:

  • numLanes:车道数,默认是1。改成2吧,双向两车道。
  • speed:限速,单位m/s。默认13.89(约50km/h),可以改成11.11(40km/h)。
  • priority:优先级,数字越大越优先。

我曾经犯过一个错:把限速设得太高,结果仿真里的车像飞一样,转弯时直接漂移出去。所以速度别设太夸张,现实一点。

3.5 保存并检查路网

画完后,按 Ctrl+S 保存。netedit会生成两个文件:

  • .net.xml:路网文件
  • .nod.xml 和 .edg.xml:节点和边的原始数据(如果你保存为plain格式)

你可以用文本编辑器打开 .net.xml 看看,里面全是XML标签。但别怕,我们不需要手动改它,netedit会帮我们搞定。

注意: 保存时如果提示“网络未闭合”,说明你的路网有断头路。检查一下所有边的端点是否都连接到了节点上。没连上的话,车开不过去。

3.6 知识体系:节点与边的核心逻辑

为了让你更直观地理解,我画了一张图。这张图展示了节点和边的关系,以及它们如何构成一个简单的十字路口。

节点与边构成十字路口 N1 N2 N3 N4 N0 边E1 (N1→N0) 边E2 (N0→N2) 边E3 (N3→N0) 边E4 (N0→N4) 端点节点 交叉节点 边(有方向)

这张图里,N1到N4是四个端点节点,N0是中心交叉节点。E1到E4是四条边,每条边都有方向。你看,从N1到N0是一条边,从N0到N2是另一条边。这就是SUMO里“边有方向”的含义。

3.7 避坑指南

最后,分享几个我踩过的坑:

  • 节点重叠:有时候不小心在同一个位置画了两个节点,路网会报错。用 Clean Junctions 工具可以合并。
  • 边未连接:画完边后,记得用 Inspect 工具点一下节点,看看连接了几条边。少于2条就是断头路。
  • 方向错误:边默认是单向的。如果你需要双向,在属性里把 spreadType 改成 center,或者再画一条反向的边。

我曾经在一个项目里,画了20个节点的路网,结果因为一个节点没连上,车全堵在起点。排查了半小时才发现。所以,每画几步就保存一下,用 sumo-gui 加载看看效果。

好了,现在你已经会画一个简单的十字路口了。别小看这一步,所有复杂的路网——环岛、立交桥、高速公路——都是从节点和边组合出来的。多画几个路口练练手,你会发现netedit其实挺顺手的。

本章小结:
  • 节点是路网的“点”,边是“线”,有方向。
  • 十字路口至少需要5个节点、4条边。
  • netedit里用 Edge 模式画边,自动生成交叉节点。
  • 双击节点/边可以修改属性,如车道数、限速、节点类型。
  • 保存后生成 .net.xml 文件,可用文本编辑器查看。

可可精品资料库