2. SUMO基础入门
SUMO(Simulation of Urban MObility)是目前学术界与工业界应用最广泛的开源微观交通仿真平台之一。它由德国航空航天中心(DLR)开发,支持多模态交通网络建模、动态路由、交通信号控制、排放计算以及V2X(车联网)协同仿真。对于自动驾驶算法验证而言,SUMO提供了可重复、可扩展、可观测的仿真环境,是连接高精地图、车辆动力学模型与交通流理论的关键桥梁。本章将围绕SUMO的安装配置、GUI与命令行工具的使用方法,以及如何构建并运行第一个简单路网仿真展开,帮助读者建立从工具链到仿真流程的完整认知。
2.1 SUMO的安装与配置:跨平台部署与版本管理
核心原理:SUMO的软件架构与依赖关系
SUMO采用模块化设计,核心仿真引擎(libsumo)与工具集分离。安装SUMO不仅仅是获取一个可执行文件,而是获得一套完整的工具链,包括:sumo(命令行仿真)、sumo-gui(图形界面)、netedit(路网编辑器)、netconvert(路网转换器)、duarouter(动态路由分配)、polyconvert(多边形转换)以及Python API(traci和libsumo)。在Ubuntu 22.04 LTS系统中,官方PPA(Personal Package Archive)提供了最新稳定版,推荐使用apt方式安装以确保依赖完整性。
操作流程:三种主流安装方式对比
| 安装方式 | 适用场景 | 命令/步骤 | 注意事项 |
|---|---|---|---|
| Ubuntu PPA(推荐) | 开发与学习 | sudo add-apt-repository ppa:sumo/stablesudo apt updatesudo apt install sumo sumo-tools sumo-doc | 自动安装依赖,版本较新 |
| 源码编译 | 二次开发/定制 | 下载源码 → cmake → make → make install | 需安装g++、libxerces-c-dev、proj等依赖 |
| Windows安装包 | Windows环境 | 下载安装包 → 添加环境变量SUMO_HOME | 注意PATH路径包含bin目录 |
安装完成后,验证环境变量是否配置正确:
# 检查SUMO_HOME环境变量(Linux/macOS)
echo $SUMO_HOME
# 预期输出:/usr/share/sumo 或自定义路径
# 验证sumo可执行文件
sumo --version
# 预期输出:SUMO Version 1.18.0(或更高)
# 验证Python API可用性
python3 -c "import sumo; print('SUMO Python API OK')"
sumo --version确认版本。若提示找不到共享库,可运行sudo ldconfig刷新动态链接库缓存。对于Windows用户,务必确保SUMO_HOME指向安装根目录(例如C:\Program Files\Eclipse\Sumo),并将%SUMO_HOME%\bin加入系统PATH。
案例拆解:Ubuntu 22.04下的完整安装与排障
某自动驾驶团队在配置CI(持续集成)环境时,需要自动化安装SUMO。初始现象是apt install sumo后运行sumo-gui报错cannot open display。分析发现,CI服务器为无头(headless)环境,需要安装xvfb虚拟显示。操作步骤:
- 安装虚拟显示:
sudo apt install xvfb - 使用
xvfb-run -a sumo-gui启动GUI(或直接使用命令行sumo) - 对于Python API调用,设置
DISPLAY=:99并启动Xvfb :99 &
结果对比:修复后CI流水线可稳定运行仿真测试,单次仿真耗时从手动环境的45秒降至30秒(因无GUI渲染开销)。风险提示:无头环境下应避免调用sumo-gui的截图功能,改用--save-configuration保存配置后离线分析。
2.2 SUMO-GUI图形界面:从可视化到交互调试
核心原理:GUI的图层管理与视觉反馈机制
SUMO-GUI不仅是一个可视化工具,更是调试路网和验证仿真逻辑的利器。其核心机制在于图层(Layer)系统:路网层(道路、交叉口)、车辆层(动态实体)、检测器层(感应线圈、车道区域)、POI层(兴趣点)。每个图层可独立设置显示属性(颜色、大小、透明度)。GUI通过OpenGL渲染,支持缩放、平移、旋转(3D模式)以及车辆轨迹追踪。对于自动驾驶算法验证,GUI的车辆跟踪模式(Track Vehicle)和信号相位显示是两大核心功能。
操作流程:GUI关键功能速查
| 功能模块 | 操作方式 | 典型应用场景 |
|---|---|---|
| 加载仿真 | File → Open Simulation → 选择.sumocfg文件 | 启动已有仿真项目 |
| 播放控制 | 空格键暂停/继续;Ctrl+→单步执行 | 逐步观察车辆交互 |
| 车辆选择 | 点击车辆 → 右侧属性栏显示速度、加速度、位置 | 分析单车行为 |
| 路网编辑 | 进入Edit模式 → 添加/删除边、连接、信号灯 | 快速修改路网拓扑 |
| 数据可视化 | Settings → Edit Visualisation → 选择颜色映射(速度/排放/等待时间) | 宏观交通流状态评估 |
Ctrl+Shift+V可打开车辆可视化设置,将车辆颜色映射为“速度”模式(绿色=高速,红色=低速),可快速识别拥堵区域。若需导出高清图片用于报告,使用File → Export → SVG/PNG,建议将分辨率设置为1920×1080以上。
案例拆解:利用GUI定位路网连接错误
某次仿真中,车辆在交叉口处出现“teleport”(瞬移)现象,即车辆从一条边突然消失并出现在另一条边。初始现象:仿真日志出现大量Warning: Teleporting vehicle 'veh0' from edge 'E0' to edge 'E1'。分析过程:
- 在GUI中加载路网,开启
Vehicle Teleport图层(红色闪烁标记) - 放大交叉口,发现E0到E1的连接(connection)缺失,车辆无法通过合法路径转向
- 使用
netedit打开路网,检查连接编辑器,发现E0的右转连接未创建
修复操作:在netedit中选择E0边,右键添加连接至E1,设置转向角度为90°,保存后重新加载仿真。结果对比:修复后车辆正常通过交叉口,无瞬移警告,平均行程时间从120秒降至95秒。复盘经验:瞬移是路网拓扑错误的最直接信号,应优先检查交叉口连接而非车辆逻辑。
2.3 命令行工具:sumo与sumo-gui的参数化控制
核心原理:命令行参数解析与配置文件优先级
SUMO的命令行工具遵循“参数覆盖配置文件”的原则。一个典型的.sumocfg文件包含<input>(路网、路由)、<time>(仿真起止时间)、<processing>(线程数、随机种子)等配置段。命令行参数优先级最高,适合批量实验和自动化脚本。例如,sumo -c demo.sumocfg --start --quit-on-end表示加载配置后立即开始仿真并在结束时退出。
操作流程:常用命令行参数速查表
| 参数 | 功能说明 | 示例 |
|---|---|---|
-c, --configuration-file | 指定配置文件 | sumo -c demo.sumocfg |
--start | 加载后立即开始仿真 | sumo-gui -c demo.sumocfg --start |
--quit-on-end | 仿真结束后自动退出 | 适合批处理 |
--step-length | 设置仿真步长(秒) | --step-length 0.1(默认1秒) |
--end | 覆盖配置中的结束时间 | --end 3600(仿真1小时) |
--net-file | 直接指定路网文件(覆盖配置) | --net-file osm.net.xml |
--route-files | 指定路由文件 | --route-files trips.rou.xml |
--fcd-output | 输出车辆完整轨迹(FCD格式) | --fcd-output trace.xml |
--step-length 0.1时,仿真精度提高但计算量增加10倍。对于包含数千辆车的场景,建议先使用默认步长(1秒)验证逻辑,再根据需求调整。另外,--end参数若小于路由文件中车辆的最晚出发时间,会导致部分车辆未仿真即被丢弃,需注意日志中的Teleport警告。
案例拆解:批量仿真实验的脚本化控制
某研究团队需要评估不同交通流量(500/1000/1500 veh/h)下的平均延误。初始目标:自动化运行3组实验并收集延误数据。关键输入:基础路网grid.net.xml、路由模板flow.rou.xml。操作步骤:
#!/bin/bash
# batch_sim.sh
for flow in 500 1000 1500; do
# 使用sed动态修改路由文件中的流量参数
sed "s/FLOW_RATE/$flow/g" flow_template.rou.xml > flow_$flow.rou.xml
# 运行仿真并输出延误统计
sumo -c sim.sumocfg \
--route-files flow_$flow.rou.xml \
--tripinfo-output tripinfo_$flow.xml \
--statistic-output stats_$flow.xml \
--end 3600
# 提取平均延误(使用grep和awk)
avg_delay=$(grep -o 'meanTravelTime="[0-9.]*"' stats_$flow.xml | head -1 | cut -d'"' -f2)
echo "Flow $flow veh/h: Average Delay = $avg_delay seconds"
done
结果对比:500 veh/h时平均延误12.3秒,1000 veh/h时18.7秒,1500 veh/h时35.2秒,呈现非线性增长趋势。复盘经验:命令行参数化是批量实验的核心,通过模板文件+sed替换可避免手动修改XML的繁琐与错误。
2.4 第一个简单路网仿真:从零构建十字路口
核心原理:SUMO路网文件(.net.xml)的结构解析
一个最小的SUMO路网包含<edges>(边)和<junctions>(交叉口)两大核心元素。每条边由<lane>定义车道属性(宽度、最大速度、允许车辆类型)。交叉口通过<connection>定义转向关系。对于初学者,推荐使用netedit图形化创建路网,而非手写XML,因为手写容易遗漏连接关系导致车辆无法转向。
操作流程:使用netedit创建十字路口路网
- 启动netedit:终端输入
netedit,选择New Network - 创建四条边:使用
Edge工具,依次绘制北-南、南-北、东-西、西-东四条双向道路 - 设置车道属性:选中每条边,在右侧属性栏设置
numLanes=2,speed=13.89(约50km/h) - 自动生成交叉口:点击
Junction工具,选择中心点,netedit自动创建交叉口并生成连接 - 保存路网:
File → Save Network,命名为cross.net.xml
案例拆解:完整仿真项目文件配置
创建完路网后,需要编写路由文件和配置文件。以下是一个完整的仿真项目示例:
<!-- cross.rou.xml -->
<routes>
<vType id="car" maxSpeed="13.89" color="1,0,0"/>
<flow id="flow_ns" type="car" begin="0" end="3600" number="500">
<route edges="N2I I2S"/> <!-- 从北到南 -->
</flow>
<flow id="flow_ew" type="car" begin="0" end="3600" number="300">
<route edges="E2I I2W"/> <!-- 从东到西 -->
</flow>
</routes>
<!-- cross.sumocfg -->
<configuration>
<input>
<net-file value="cross.net.xml"/>
<route-files value="cross.rou.xml"/>
</input>
<time>
<begin value="0"/>
<end value="3600"/>
</time>
<processing>
<threads value="4"/>
</processing>
<output>
<tripinfo-output value="tripinfo.xml"/>
</output>
</configuration>
运行仿真:
# 命令行模式
sumo -c cross.sumocfg
# 图形界面模式
sumo-gui -c cross.sumocfg --start
number="500"表示在begin到end时间段内均匀分布500辆车。edges="N2I I2S"定义了车辆从边N2I出发,经过交叉口I,到达边I2S。注意边ID的命名规则:起点2终点,例如N2I表示从北侧节点到交叉口节点。
常见误区与总结复盘
- 误区1:忽略交叉口连接。netedit自动生成的连接可能不包含左转(需要额外设置),导致车辆在交叉口处无法转向。解决:在netedit中检查
Connections标签页,手动添加缺失的转向连接。 - 误区2:路由文件中的边ID拼写错误。SUMO对大小写敏感,
N2I与n2i是不同边。建议在netedit中复制边ID。 - 误区3:仿真时间与车辆出发时间不匹配。若
end="3600"但车辆出发时间设置为begin="0" end="7200",则后半段车辆不会被仿真。应确保路由文件的时间范围在配置文件的begin/end之内。