4、第一个SUMO仿真:使用netedit绘制简单路网、生成车辆、运行仿真、查看结果
好,到了真正动手的时候了。
前面几章我们聊了SUMO是什么,也装好了环境。但说实话,光看不练是学不会交通仿真的。我自己带新人时,最怕的就是那种「我全看懂了,但一上手就懵」的状态。
所以这一章,我们直接干一个完整的流程:画路网 → 配流量 → 跑仿真 → 看结果。你跟着我走一遍,后面再学什么都有底。
本章核心目标:用SUMO自带的netedit工具,手绘一个十字路口,生成10辆车跑过去,最后在SUMO-GUI里看到动画。
4.1 打开netedit,认识界面
netedit是SUMO自带的图形化路网编辑器。你不需要写一行XML代码,就能画出路网来。
启动方式很简单:在命令行里敲 netedit,回车。如果提示找不到命令,检查一下SUMO的bin目录有没有加到PATH里。
界面长这样(我描述一下,你对着看):
- 顶部是菜单栏和工具栏
- 中间大片灰色区域是画布
- 左侧是编辑模式切换面板
- 底部是状态栏,会显示当前鼠标坐标
嗯,这里要注意:第一次打开可能会觉得「怎么啥都没有」。别慌,这是正常的。我们需要先切换到「网络编辑模式」才能开始画路。
4.2 绘制一条路:从边到车道
在SUMO里,路网的基本单位是 边(Edge)。一条边可以包含多条车道(Lane)。
操作步骤:
- 点击左侧工具栏的「Edge」模式(就是那个像一段路的图标)
- 在画布上左键点击,确定起点
- 移动鼠标,再左键点击,确定终点
- 一条边就画好了!
我刚开始用的时候,画出来的路总是歪歪扭扭的。后来发现,按住 Shift 键再画,可以强制水平或垂直对齐。这个小技巧帮我省了不少事。
小技巧:画完一条边后,双击它,可以在右侧属性面板里修改车道数、限速、名称等。默认是1条车道,限速13.89m/s(约50km/h)。
4.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 本章知识体系
下面这张图帮你理清整个流程的逻辑关系:
说白了,整个流程就是:画路 → 造车 → 配置 → 开跑 → 看数据。每一步都有对应的文件格式和工具,后面我们学更复杂的功能时,这个骨架是不变的。
4.9 常见问题与避坑
- 路网画好了,但车不动? 检查路由文件里的边ID是否和路网一致。我犯过这个错,后来养成了「画完路网先看ID」的习惯。
- 仿真跑得飞快,看不清? 在SUMO-GUI里,把底部的速度滑块往左拉,调慢播放速度。
- 车到了路口就消失? 可能是路由文件里只定义了起点,没定义终点。或者终点边不存在。
- 配置文件报错? 检查文件路径。建议用绝对路径,或者把三个文件放在同一个目录下。
重要提醒:SUMO对XML格式要求很严格。标签必须成对出现,属性值必须用引号括起来。一个不小心漏了引号,整个仿真就跑不起来。我建议你写完路由文件后,用浏览器打开看看,如果浏览器能正常显示XML树结构,那就没问题。
好了,到这里你已经完成了第一个完整的SUMO仿真。虽然只是10辆车过个路口,但你已经掌握了最核心的工作流。后面不管是画高速公路、设置公交线路,还是做信号优化,都是在这个基础上加功能而已。
去试试吧,把车加到20辆,或者换个路口形状,看看效果有什么不同。