3、SUMO基础操作:SUMO界面与工具链、路网生成与编辑、交通需求定义、车辆与行人模型
各位同学,欢迎来到SUMO实操环节。说实话,很多做自动驾驶仿真的朋友,一听到SUMO就觉得头大——命令行、XML配置、一堆脚本……但我想说,SUMO其实没那么可怕。我刚开始接触它的时候,也是被各种参数搞得晕头转向。但用久了你会发现,它就像一把瑞士军刀,功能强大且灵活。
这一章,咱们就踏踏实实地把SUMO的基础操作捋一遍。我会结合我自己的项目经验,把那些容易踩坑的地方都指出来。你跟着我走一遍,保证能上手。
本章核心知识点:
- SUMO的界面布局与核心工具链
- 两种路网生成方式:手动绘制与OSM导入
- 交通需求定义:从OD矩阵到随机车流
- 车辆与行人模型的参数配置
3.1 SUMO界面与工具链
先说说SUMO的界面。很多人第一次打开SUMO-GUI,会觉得界面有点简陋。嗯,确实,它不像商业软件那么花哨。但它的设计逻辑其实很清晰:上面是菜单栏和工具栏,中间是仿真视图,下面是状态栏和信息面板。
我个人习惯把界面分成三个区域:
- 左侧面板:用于选择元素(车辆、道路、检测器等),双击可以查看属性
- 中间视图区:仿真主窗口,支持缩放、平移、旋转
- 右侧面板:显示选中元素的详细信息,比如车速、位置、加速度
SUMO的工具链,说白了就是一堆命令行工具。我刚开始也觉得命令行麻烦,但用久了发现,脚本化操作才是效率最高的。核心工具包括:
| 工具名称 | 功能说明 | 我的使用频率 |
|---|---|---|
| netedit | 图形化路网编辑器 | ⭐⭐⭐⭐⭐ |
| netconvert | 路网格式转换(如OSM转SUMO) | ⭐⭐⭐⭐ |
| duarouter | 基于OD矩阵生成车辆路径 | ⭐⭐⭐⭐ |
| sumo-gui | 图形化仿真运行界面 | ⭐⭐⭐⭐⭐ |
| traci | Python接口,用于实时控制仿真 | ⭐⭐⭐(需要编程时用) |
我的小技巧: 在终端里输入 sumo --help 可以查看所有可用参数。我曾经花了一下午翻文档,后来发现这个命令就能解决大部分问题。
3.2 路网生成与编辑
路网是仿真的基础。没有路网,车往哪儿跑?SUMO支持两种主流方式生成路网:
方式一:手动绘制(用netedit)
netedit是SUMO自带的图形化编辑器。我个人觉得,对于小场景(比如一个十字路口、一段高速公路),手动绘制反而更快。操作步骤很简单:
- 打开netedit:终端输入
netedit - 选择“Edge”模式,点击画布添加节点,连接形成道路
- 右键道路,设置车道数、限速、方向等属性
- 添加交通信号灯:选中节点,在右侧面板设置相位
方式二:从OpenStreetMap导入
做真实场景仿真时,我强烈推荐用OSM数据。比如你要仿真北京长安街,直接在OSM上导出那片区域,然后用netconvert转换就行。
# 将OSM文件转换为SUMO路网
netconvert --osm-files beijing_changan.osm \
--output-file beijing_changan.net.xml \
--geometry.remove \
--roundabouts.guess \
--ramps.guess
注意: OSM数据有时候会有拓扑错误,比如断头路、重叠路段。我曾经导入一个大型路网,结果仿真时车辆直接飞出去了……后来发现是路网连接有问题。建议导入后用netedit检查一遍,尤其是交叉口区域。
3.3 交通需求定义
路网有了,接下来就是让车跑起来。交通需求定义,说白了就是告诉SUMO:什么时间、什么地点、有多少车、往哪儿开。
SUMO里定义交通需求有三种主流方式:
- 随机车流:最简单,指定一个流量值,车辆随机出现。适合做压力测试。
- OD矩阵:定义起点(Origin)和终点(Destination)之间的车流量。更接近真实交通。
- 基于路径:直接指定每辆车的完整行驶路径。最精确,但配置工作量大。
我个人最常用的是OD矩阵方式。举个例子:
<routes>
<vType id="car" accel="2.6" decel="4.5" sigma="0.5" length="4.5" maxSpeed="50"/>
<flow id="flow_1" type="car" begin="0" end="3600" number="500" from="edge_1" to="edge_5"/>
<flow id="flow_2" type="car" begin="0" end="3600" number="300" from="edge_2" to="edge_8"/>
</routes>
这段代码定义了两股车流:一股从edge_1到edge_5,一小时500辆车;另一股从edge_2到edge_8,一小时300辆车。车辆类型是car,加速度2.6m/s²,减速度4.5m/s²。
避坑指南: 我曾经在定义车流时,把 number 和 probability 搞混了。number是绝对数量,probability是概率。如果你想要随机生成,用probability更灵活。
3.4 车辆与行人模型
SUMO里的车辆模型,核心是跟驰模型和换道模型。默认用的是Krauss模型,说白了就是:每辆车根据前车速度和安全距离,调整自己的速度。
车辆类型(vType)可以配置的参数很多,我挑几个最常用的:
| 参数 | 说明 | 典型值 |
|---|---|---|
| accel | 最大加速度 (m/s²) | 2.6 |
| decel | 最大减速度 (m/s²) | 4.5 |
| sigma | 驾驶随机性(0=完美,1=随机) | 0.5 |
| length | 车辆长度 (m) | 4.5(轿车) |
| minGap | 最小停车间距 (m) | 2.5 |
| maxSpeed | 最大速度 (m/s) | 50(约180km/h) |
行人模型相对简单一些。SUMO把行人当作一种特殊的“车辆”,只不过走的是人行道。定义行人的方式和车辆类似:
<vType id="pedestrian" vClass="pedestrian" maxSpeed="1.5" width="0.5" length="0.5"/>
<person id="person_1" depart="0">
<walk from="edge_walk_1" to="edge_walk_5" departPos="0" arrivalPos="10"/>
</person>
这里定义了一个行人,最大速度1.5m/s(正常步行速度),从edge_walk_1走到edge_walk_5。
注意: 行人的路网和车辆路网是分开的。如果你想让行人在人行横道上过马路,需要在netedit里专门绘制人行横道(crossing)。我刚开始做混合仿真时,就忘了画人行横道,结果行人直接横穿马路……那画面,你想想看。
好了,这一章的内容就到这里。SUMO的基础操作其实不难,关键是多动手。你打开SUMO,跟着上面的步骤走一遍,很快就能上手。下一章我们会深入SUMO与Prescan的联合仿真配置,那才是真正有意思的部分。