4、第一个SUMO仿真:使用netedit绘制简单路网、生成车辆、运行仿真、查看结果

好,到了真正动手的时候了。

前面几章我们聊了SUMO是什么,也装好了环境。但说实话,光看不练是学不会交通仿真的。我自己带新人时,最怕的就是那种「我全看懂了,但一上手就懵」的状态。

所以这一章,我们直接干一个完整的流程:画路网 → 配流量 → 跑仿真 → 看结果。你跟着我走一遍,后面再学什么都有底。

本章核心目标:用SUMO自带的netedit工具,手绘一个十字路口,生成10辆车跑过去,最后在SUMO-GUI里看到动画。

4.1 打开netedit,认识界面

netedit是SUMO自带的图形化路网编辑器。你不需要写一行XML代码,就能画出路网来。

启动方式很简单:在命令行里敲 netedit,回车。如果提示找不到命令,检查一下SUMO的bin目录有没有加到PATH里。

界面长这样(我描述一下,你对着看):

  • 顶部是菜单栏和工具栏
  • 中间大片灰色区域是画布
  • 左侧是编辑模式切换面板
  • 底部是状态栏,会显示当前鼠标坐标

嗯,这里要注意:第一次打开可能会觉得「怎么啥都没有」。别慌,这是正常的。我们需要先切换到「网络编辑模式」才能开始画路。

4.2 绘制一条路:从边到车道

在SUMO里,路网的基本单位是 边(Edge)。一条边可以包含多条车道(Lane)。

操作步骤:

  1. 点击左侧工具栏的「Edge」模式(就是那个像一段路的图标)
  2. 在画布上左键点击,确定起点
  3. 移动鼠标,再左键点击,确定终点
  4. 一条边就画好了!

我刚开始用的时候,画出来的路总是歪歪扭扭的。后来发现,按住 Shift 键再画,可以强制水平或垂直对齐。这个小技巧帮我省了不少事。

小技巧:画完一条边后,双击它,可以在右侧属性面板里修改车道数、限速、名称等。默认是1条车道,限速13.89m/s(约50km/h)。

4.3 画一个十字路口

单条路没意思,我们来画个交叉口。

步骤:

  1. 先画一条东西方向的路(从左到右)
  2. 再画一条南北方向的路(从上到下),让它们交叉
  3. SUMO会自动在交叉点生成一个节点(Junction)

你看,就这么简单。两条路一交叉,路口就出来了。

但这里有个坑:如果你画的两条路没有完全交叉,SUMO不会自动连接它们。我遇到过好几次,画了半天发现车根本过不去,就是因为两条路中间留了个缝。

避坑指南:画交叉路时,第二条路的起点或终点一定要落在第一条路的边上。你可以放大画面确认,或者用 Ctrl+Z 撤销重画。

画完后,你可以切换到「Junction」模式,点击路口节点,在右侧属性里设置交通信号灯。把 type 改成 traffic_light,SUMO会自动生成一个默认的信号配时方案。

4.4 保存路网文件

画完路网后,记得保存。点击菜单 File → Save Network,或者按 Ctrl+S。

保存时会生成两个文件:

文件 说明
mynet.net.xml 路网文件,包含边、节点、车道、连接关系
mynet.net.xml.gui GUI设置文件,记录你上次的视图位置和缩放

我个人习惯把路网文件放在一个单独的文件夹里,比如 D:\SUMO_Projects\first_sim\。这样后面生成车辆、跑仿真时,文件路径好管理。

4.5 生成车辆:编写路由文件

路网有了,但路上没车。我们需要告诉SUMO:车从哪里来,到哪里去,什么时候出发。

这些信息写在 路由文件(.rou.xml) 里。你可以用任何文本编辑器写,比如记事本、VS Code。

一个最简单的路由文件长这样:

<routes>
    <vType id="car" accel="2.6" decel="4.5" maxSpeed="13.89" />
    <vehicle id="v0" type="car" depart="0" from="edge1" to="edge2" />
    <vehicle id="v1" type="car" depart="1" from="edge1" to="edge2" />
    <!-- 更多车辆... -->
</routes>

解释一下:

  • vType:定义车辆类型,包括加速度、减速度、最高速度
  • vehicle:定义具体车辆,depart是出发时间(秒),from和to是起止边的ID

你可能会问:边的ID从哪里看? 在netedit里,选中一条边,右侧属性面板最上面就是 ID 字段。默认是 edge1、edge2 这样的名字。

我建议你生成10辆车,出发时间从0秒到9秒,每1秒发一辆。这样跑起来能看到车流效果。

注意:路由文件里的边ID必须和路网文件里的完全一致,大小写也要一样。我曾经因为把 edge1 写成了 Edge1,查了半天bug。

4.6 运行仿真:把路网和车辆结合起来

现在我们有路网文件(.net.xml)和路由文件(.rou.xml),还差一个 配置文件(.sumocfg) 把它们串起来。

配置文件也是XML格式:

<configuration>
    <input>
        <net-file value="mynet.net.xml"/>
        <route-files value="myroute.rou.xml"/>
    </input>
    <time>
        <begin value="0"/>
        <end value="100"/>
    </time>
</configuration>

保存为 first.sumo.cfg。

然后,在命令行里运行:

sumo-gui first.sumo.cfg

SUMO-GUI窗口会打开,点击底部的「开始」按钮(三角形图标),仿真就跑起来了!

我第一次看到自己画的路网上有车在跑时,说实话,还挺有成就感的。虽然只是10辆车过个路口,但那种「从零到一」的感觉,后面做再复杂的项目都找不回来了。

4.7 查看结果:数据输出与分析

光看动画不过瘾,我们还要看数据。SUMO可以输出各种统计信息。

在配置文件里加上输出设置:

<output>
    <tripinfo-output value="tripinfo.xml"/>
    <summary-output value="summary.xml"/>
</output>

重新跑一遍仿真,会生成两个文件:

  • tripinfo.xml:每辆车的行程信息,包括出发时间、到达时间、行驶距离、平均速度等
  • summary.xml:每秒钟的全局统计,包括当前车辆数、平均速度、排队长度等

你可以用Excel打开这些XML文件,或者写个Python脚本分析。我个人常用的是 pandas 读取 tripinfo.xml,然后算平均旅行时间、平均延误等指标。

小提示:如果数据量不大,你也可以直接在SUMO-GUI里右键点击车辆或路段,查看实时数据。这在调试时特别方便。

4.8 本章知识体系

下面这张图帮你理清整个流程的逻辑关系:

第一个SUMO仿真:核心流程 步骤1:绘制路网 netedit → 边 → 节点 步骤2:生成车辆 路由文件 .rou.xml 步骤3:配置 .sumocfg 步骤4:运行仿真 sumo-gui 或 sumo 步骤5:查看结果 tripinfo.xml / GUI实时数据 输出文件:.net.xml + .rou.xml → .sumocfg → 仿真结果

说白了,整个流程就是:画路 → 造车 → 配置 → 开跑 → 看数据。每一步都有对应的文件格式和工具,后面我们学更复杂的功能时,这个骨架是不变的。

4.9 常见问题与避坑

  • 路网画好了,但车不动? 检查路由文件里的边ID是否和路网一致。我犯过这个错,后来养成了「画完路网先看ID」的习惯。
  • 仿真跑得飞快,看不清? 在SUMO-GUI里,把底部的速度滑块往左拉,调慢播放速度。
  • 车到了路口就消失? 可能是路由文件里只定义了起点,没定义终点。或者终点边不存在。
  • 配置文件报错? 检查文件路径。建议用绝对路径,或者把三个文件放在同一个目录下。

重要提醒:SUMO对XML格式要求很严格。标签必须成对出现,属性值必须用引号括起来。一个不小心漏了引号,整个仿真就跑不起来。我建议你写完路由文件后,用浏览器打开看看,如果浏览器能正常显示XML树结构,那就没问题。

好了,到这里你已经完成了第一个完整的SUMO仿真。虽然只是10辆车过个路口,但你已经掌握了最核心的工作流。后面不管是画高速公路、设置公交线路,还是做信号优化,都是在这个基础上加功能而已。

去试试吧,把车加到20辆,或者换个路口形状,看看效果有什么不同。

可可精品资料库