2. SUMO基础入门

SUMO(Simulation of Urban MObility)是目前学术界与工业界应用最广泛的开源微观交通仿真平台之一。它由德国航空航天中心(DLR)开发,支持多模态交通网络建模、动态路由、交通信号控制、排放计算以及V2X(车联网)协同仿真。对于自动驾驶算法验证而言,SUMO提供了可重复、可扩展、可观测的仿真环境,是连接高精地图、车辆动力学模型与交通流理论的关键桥梁。本章将围绕SUMO的安装配置、GUI与命令行工具的使用方法,以及如何构建并运行第一个简单路网仿真展开,帮助读者建立从工具链到仿真流程的完整认知。

SUMO 工具链与仿真流程总览 路网文件 *.net.xml 路由文件 *.rou.xml 附加文件 *.add.xml(信号/检测器) netedit 可视化路网编辑器 netconvert OSM/Shapefile → net.xml duarouter 生成车辆路径 sumo 命令行仿真引擎 sumo-gui 图形化仿真界面 输出文件 *.xml / *.csv 轨迹数据 fcd / amitran 可视化 GUI截图/动画 第一个仿真项目的标准流程 ① 创建路网 netedit 或 netconvert ② 定义车辆与路径 duarouter / 手写 rou.xml ③ 运行仿真 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/stable
sudo apt update
sudo 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')"
经验提醒:在Linux系统中,安装完成后建议执行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虚拟显示。操作步骤:

  1. 安装虚拟显示:sudo apt install xvfb
  2. 使用xvfb-run -a sumo-gui启动GUI(或直接使用命令行sumo)
  3. 对于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 → 选择颜色映射(速度/排放/等待时间)宏观交通流状态评估
实战技巧:在GUI中按Ctrl+Shift+V可打开车辆可视化设置,将车辆颜色映射为“速度”模式(绿色=高速,红色=低速),可快速识别拥堵区域。若需导出高清图片用于报告,使用File → Export → SVG/PNG,建议将分辨率设置为1920×1080以上。

案例拆解:利用GUI定位路网连接错误

某次仿真中,车辆在交叉口处出现“teleport”(瞬移)现象,即车辆从一条边突然消失并出现在另一条边。初始现象:仿真日志出现大量Warning: Teleporting vehicle 'veh0' from edge 'E0' to edge 'E1'。分析过程:

  1. 在GUI中加载路网,开启Vehicle Teleport图层(红色闪烁标记)
  2. 放大交叉口,发现E0到E1的连接(connection)缺失,车辆无法通过合法路径转向
  3. 使用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创建十字路口路网

  1. 启动netedit:终端输入netedit,选择New Network
  2. 创建四条边:使用Edge工具,依次绘制北-南、南-北、东-西、西-东四条双向道路
  3. 设置车道属性:选中每条边,在右侧属性栏设置numLanes=2,speed=13.89(约50km/h)
  4. 自动生成交叉口:点击Junction工具,选择中心点,netedit自动创建交叉口并生成连接
  5. 保存路网: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之内。