第一次打开SUMO官网的时候,我盯着满屏的英文文档愣了好一会儿。那是我读研期间第一次接交叉口信号配时优化的仿真任务,导师只丢给我一个名字:SUMO。我按直觉下载了Windows安装包,装完双击sumo-gui,界面倒是打开了,可命令行里一敲sumo --version就提示“不是内部或外部命令”,找遍网上各种教程也没完全对上号,折腾到半夜才搞清楚是环境变量和安装目录这两个细节在作怪。
SUMO全称Simulation of Urban MObility,是德国航空航天中心(DLR)主导开发的开源微观交通仿真软件,如今托管在Eclipse基金会下,全称Eclipse SUMO。它能模拟机动车、公交、行人、自行车在路网中的运行,也能通过TraCI接口用Python实时控制仿真里的每一辆车。近年来车联网、自动驾驶决策测试、信号优化这类项目里经常能看到它的身影,很多强化学习仿真平台也拿它当底层引擎。这个系列我会从环境搭建开始,逐步讲到路网构建、交通需求生成、仿真配置、结果分析,再到TraCI二次开发。本篇先把Windows 10下的环境彻底搞定。
如果你正准备用SUMO做课程设计、毕业论文或者工程预研,那么这一篇应该能帮你少走很多弯路。我会把下载安装、环境变量配置、验证环节全部走一遍,最后给出我实际踩过的坑和排障思路。
1. 装之前先想清楚:SUMO能解决什么问题,值不值得折腾
1.1 SUMO的定位:微观交通仿真里的开源主力
交通仿真软件粗略分宏观、中观、微观三个层次。宏观仿真是把交通流当成流体,看道路容量、拥堵蔓延;微观仿真则是一辆车一辆车单独建模,每一辆车的跟驰、换道、信号响应都能被控制。SUMO属于微观仿真里的主力开源方案,而且它的开源属性带来的不仅是免费,更是一整套可扩展的生态。
拿做研究来说,很多时候你需要批量跑参数扫描。比如研究不同信号配时方案对平均延误的影响,可能要连续跑几十组场景。商业软件也能干,但要写脚本、接自动化就麻烦得多。SUMO里所有场景都是文本文件:路网是.net.xml,需求是.rou.xml,仿真配置是.sumocfg。把文件路径作为参数传给命令行工具,批量跑、自动收集结果、用Python做后处理,这套流程非常顺畅。
SUMO对路网规模的支持也相当可观。它可以导入OpenStreetMap的OSM数据,直接生成城市级路网;可以定义信号灯配时方案;可以模拟车辆变道、限速、公交站点、行人过街。它还支持多模态交通,不只是汽车。更关键的是TraCI接口,允许外部程序通过TCP连接控制仿真的每一步。我后面单独写TraCI的时候会展开讲,这里只需要记住:SUMO是少数能真正做到“灵活控制仿真过程”的开源工具。
1.2 和VISSIM、TransModeler的简单对比
很多初学者会问:既然有VISSIM,为什么还要折腾SUMO?我的看法是,两者定位不同,不是单纯的替代关系。这里放一个表格,直观对比常用微观仿真软件的核心差异。
| 对比维度 | SUMO | VISSIM | TransModeler |
|---|---|---|---|
| 授权模式 | 开源免费 | 商业授权,贵 | 商业授权,较贵 |
| 二次开发接口 | TraCI、LibTraCI、libsumo | COM接口 | 部分API |
| Python生态 | 原生traci模块,生态完善 | 需通过COM封装 | 有限 |
| 路网规模 | 城市级、支持大规模 | 适合片区/交叉口精细建模 | 区域级/城市级 |
| 学习成本 | 中等,命令行工具多 | 上手快,GUI成熟 | 上手中等 |
| 适合场景 | 算法验证、批量仿真、车联网研究 | 工程展示、精细动画 | 宏观与微观混合建模 |
如果只是做一个交叉口方案汇报,VISSIM的画质和可视化确实更有优势。但如果你是学生或者研究者,需要复现实验、修改底层逻辑、跑几百组数据,SUMO是绕不开的选择。而且它免费,实验室机器随便装,不用纠结授权周期。
1.3 本系列会覆盖的内容
这个系列我计划按下面的路径走:
- 本篇:Windows 10安装与基础环境配置,跑通第一个仿真场景。
- 路网构建:从OSM导入真实路网,用NetEdit手工修路网,理解节点的车道连接关系。
- 交通需求生成:用randomTrips.py生成随机车流,编辑.rou.xml定义固定线路车流。
- 信号控制与仿真参数配置:在.sumocfg里配置仿真时段、输出文件,用TLS(信号灯)控制信号相位。
- 结果分析与可视化:用sumo-gui查看车辆轨迹,读取输出文件统计延误、排队长度。
- TraCI二次开发:用Python脚本实时控制车辆、动态修改信号配时。
这个路径适合从零开始的人,每篇尽量控制在能“照着做”的程度。本篇先把地基打牢。
2. 下载与安装:从选版本到避开安装器的坑
2.1 安装前的环境检查
先花两分钟检查一下电脑状态,能避免后面各种莫名其妙的问题。
- 操作系统:Windows 10 64位。SUMO官方Windows安装包只提供64位版本,32位系统就不用白费劲了。
- 内存:建议8GB以上。简单示例场景4GB也能跑,但一旦导入城市级路网或跑大车队,内存占用会涨得很快。
- 磁盘空间:安装本身只要几百MB,但后续项目文件、输出文件会占空间,留出5GB余量基本够用。
- Python版本:如果只跑GUI仿真,Python可以暂时不装。但只要你想用TraCI写脚本控制仿真,我建议提前装好Python,版本选3.9到3.11之间比较稳。太新的版本偶尔会遇到某些二进制依赖还没适配的情况。
- Visual C++运行库:SUMO的Windows可执行文件依赖微软的VC++运行库。如果以前装的软件没有带这个运行库,运行sumo.exe时会直接弹“找不到MSVCP140.dll”的错。提前装好官方发布的“Visual C++ 2015-2022 Redistributable (x64)”最省事。
我遇到过几次新手拿到电脑不装运行库,结果sumo.exe双击没反应,命令行报错也看不懂。所以这一步别跳过。
2.2 从哪下载、选哪个版本
SUMO的官方下载页面在sumo.dlr.de/docs/Downloads.html,页面里会列出最新的正式发布版本。文件下载通常会跳到SourceForge或者官方自己的下载服务器。
国内访问官网有时候会比较慢,这是网络状况的原因,并不是网站故障。我是这么处理的:
- 优先直接下载,如果速度慢,挂机多等一会儿,安装包一般几十到一两百MB,不算大。
- 官方下载页面提供了SourceForge镜像链接,可以换这个入口下载,很多时候比官网直连快。
- 如果是实验室或公司有公共安装包,直接拷贝一份过来安装也行,保证版本一致即可。
关于版本选择,我给一条明确建议:新手装最新的正式release版本就好,别去碰每日构建的nightly builds。每日构建可能有新功能,但也可能引入不稳定问题,没必要给自己的学习过程增加变量。如果你是为了复现某篇论文或某门课程的作业,最好找对方注明使用的SUMO版本,不同版本的net.xml格式和部分工具参数会有差异,装错了版本就算命令一样,结果也可能不一样。
2.3 安装过程与安装目录规划
拿到安装包后,右键选择“以管理员身份运行”。这一步容易被忽略,但很重要,否则安装器可能因为权限不足没有把系统PATH写入成功。
安装器是NSIS打包的标准向导,一路Next就能装完。但有两处我建议大家不要用默认值:
第一个是安全软件拦截。SUMO的安装包是NSIS构建的,偶尔会被Windows Defender或第三方杀毒软件误报。如果你在安装时看到拦截提示,先去确认这个exe是从官网或SourceForge下载的,来源可靠的话,在安全中心里选择“允许运行”或“添加信任”即可。
第二个是关键,安装目录不要用默认的C:\Program Files (x86)\Eclipse SUMO。不是说不能装,而是这个路径包含空格和括号,后续在使用Python脚本、netconvert命令行工具时,偶尔会碰到工具脚本没有正确解析带空格路径的情况。我推荐自定义安装到纯英文、无空格的目录,比如:
D:\Software\sumo当然C盘下面也可以,只要保证路径里没有空格和中文,比如:
C:\sumo都行。这个习惯能让你在后面写自己的仿真项目时少遇到一堆路径解析问题。
安装过程中组件选择保持默认全选,尤其是“Examples”、“Tools”、“Docs”这三项一定要保留。Examples自带示例场景,是学习阶段最宝贵的参考资料;Tools目录下有很多实用Python脚本(比如randomTrips.py);Docs里有本地文档和教程,离线也能查。
安装完成后,进入安装目录,你会看到几个核心子目录:
| 目录 | 作用 |
|---|---|
| bin | sumo.exe、sumo-gui.exe、netconvert.exe、netedit.exe等可执行程序 |
| tools | 官方提供的Python工具脚本,比如randomTrips.py、routeSampler.py等 |
| docs | 本地文档和教程PDF |
| examples | 官方示例场景,包含大量可运行的.sumocfg |
| data | 默认车辆类型、公共交通定义等数据文件 |
| share | 辅助资源,比如字体、图标等 |
后续教程里我会反复提到某个文件在tools目录下,所以先记住这个目录结构。
3. 环境变量配置:为什么装完了命令行还是找不到sumo
3.1 SUMO_HOME和PATH分别管什么
很多教程会让你配环境变量,但没说清楚为什么要配。这里我说明白。
命令行工具(比如cmd、PowerShell)要执行一个命令时,会在当前目录和PATH变量里列出的目录中寻找对应的.exe文件。安装器通常会把bin目录写入PATH,所以理论上你装完就能在命令行里敲sumo。但实际中我见过不少机器装完后PATH没有成功写入,或者写入了旧版本的路径,导致命令找不到。所以必须主动检查一遍。
SUMO_HOME则是一个更上层的变量,它用来告诉工具脚本“SUMO的根目录在哪”。tools目录下的Python脚本很多都依赖SUMO_HOME来定位data目录和特定资源文件。举个典型场景:你运行randomTrips.py生成随机车流时,脚本内部需要引用SUMO安装目录下的某些定义文件,如果没有SUMO_HOME,脚本就会报错找不到文件。
打个比方,PATH就像系统知道去哪里找门牌号,SUMO_HOME是直接登记了一个地标。这两个变量各管一摊,都需要配置。
3.2 图形界面配置完整步骤
按下面的步骤操作,不要跳步。
- 按Win+R组合键,输入sysdm.cpl,回车,打开系统属性。
- 切换到“高级”选项卡,点击底部的“环境变量”。
- 在“系统变量”区域点击“新建”,变量名填SUMO_HOME,变量值填你的实际安装目录,比如D:\Software\sumo。注意这里不要带bin目录,是安装目录的根路径。
- 在“系统变量”区域找到Path,选中后点击“编辑”。
- 在弹出的编辑界面点击“新建”,输入%SUMO_HOME%\bin。这个写法是引用SUMO_HOME变量,以后如果换了安装目录,只需要改SUMO_HOME一个地方。
- 一路点“确定”,关掉所有属性窗口。
有两个细节特别提醒一下。第一个,不要手动在Path那一长串文本后面加分号再追加路径,那样很容易把原有的Path条目搞坏,一定要用编辑界面的“新建”按钮。第二个,建议在“系统变量”里设置,而不是“用户变量”。因为有些工具是以管理员权限运行的,如果变量只配在用户级,那些进程可能读不到。
如果习惯用命令行配置,也可以打开管理员PowerShell执行:
setx SUMO_HOME "D:\Software\sumo" /M但setx命令对整个PATH变量的处理有截断风险,新手我不建议用它来改Path。老老实实用图形界面最安全。
3.3 命令行验证三板斧
配置完环境变量,关键是验证。注意必须新开一个命令行窗口,因为环境变量只会在进程启动时读取一次,已经打开的窗口不会自动更新。
在cmd或PowerShell里依次执行三个命令:
echo %SUMO_HOME%正常会输出你的安装目录,比如D:\Software\sumo。
sumo --version正常会输出类似SUMO Version 1.20.0, build release之类的信息。
where sumo正常会输出sumo.exe的完整路径。这个命令能告诉你系统实际会执行哪个目录下的sumo,如果电脑里装过多个版本,这个命令就特别有用。
如果第一条命令输出为空,说明SUMO_HOME没设置成功或者窗口没重开。如果第二条命令报“不是内部或外部命令”,说明Path里没有%SUMO_HOME%\bin,或者bin目录下没有sumo.exe。如果where sumo输出的路径和你预期的安装目录不一致,说明Path中还有其他版本的bin路径排在前面。
到这里,命令行环境就算通了。接下来做两个更接近实际使用的验证。
4. 跑通第一个仿真场景:官方示例和自建极简路网双重验证
4.1 先用官方示例验证GUI
环境变量配好之后,先别急着写自己的场景,用官方自带示例跑一次,确认sumo-gui图形界面能正常工作。
打开命令行,进入安装目录下的examples目录。不同版本目录结构略有差异,你只需要找到一个包含.sumocfg文件的文件夹就行。按照官方的命名习惯,examples文件夹下有大量示例,其中比较适合起步的是那些名字里带hello或者包含简单城市路网的小场景。
假设你找到某个示例包含hello.sumocfg文件,在命令行执行:
sumo-gui hello.sumocfg或者直接在文件管理器里右键该.sumocfg文件,选择打开方式,手动指向sumo-gui.exe也可以。
sumo-gui启动后是一个深色界面的窗口。界面上方工具栏有一个播放按钮,点一下仿真就开始运行了。你可以看到一辆辆小车在路网上移动,速度滑块可以控制仿真的快慢。如果一切正常,说明GUI和环境变量都通了。
这里有一个小提示:在Windows上,如果双击.sumocfg文件没有反应,不要纠结于文件关联,直接用命令行最可靠。教程里后续所有例子我都会用命令行方式启动。
4.2 自建一个最简单路网,验证完整工具链
官方示例能跑通,说明GUI没问题,但还不能证明你的netconvert等命令行工具以及路径配置全部正常。我建议再花十分钟自建一个最简路网,把这个验证做完整。
在某个工作目录下新建文件夹,比如D:\sumo_demo,然后新建四个文件。第一个是nodes.nod.xml,定义两个路网节点:
<nodes> <node id="A" x="0.0" y="0.0" type="priority"/> <node id="B" x="500.0" y="0.0" type="priority"/> </nodes>第二个是edges.edg.xml,定义连接两个节点的道路:
<edges> <edge id="AB" from="A" to="B" numLanes="2" speed="13.9"/> </edges>然后在命令行执行netconvert,把这两个文件转换成SUMO的路网文件:
netconvert --node-files=nodes.nod.xml --edge-files=edges.edg.xml --output-file=network.net.xml如果netconvert命令找不到,说明Path没配置好;如果报XML格式错误,多半是标签写错了。这里顺带解释一下上面的参数:speed="13.9"按米每秒算,约等于50公里/小时的限速;numLanes="2"表示双向各一条车道。实际生成的网络里面,SUMO会自动补上反向车道,你不用手工定义。
接着创建routes.rou.xml,定义车辆类型和行驶路线:
<routes> <vType id="car" maxSpeed="13.9"/> <route id="route1" edges="AB"/> <vehicle id="v1" type="car" route="route1" depart="0"/> </routes>最后创建config.sumocfg,这个文件是SUMO的仿真入口,告诉仿真器读取哪个路网和哪份车流文件、仿真时间范围是多少:
<configuration> <input> <net-file value="network.net.xml"/> <route-files value="routes.rou.xml"/> </input> <time> <begin value="0"/> <end value="50"/> </time> </configuration>在命令行执行:
sumo-gui config.sumocfg点播放按钮,你会看到一辆车从A节点沿着道路开到B节点,然后离开路网。仿真结束后界面显示没有车辆了。这就是一个完整的最小闭环:用netconvert生成路网,手写车辆需求,用sumo-gui启动仿真。
做完这个实验,你的安装环境才算是真正验证完毕。因为从命令行工具到GUI再到配置文件解析,整条链路都走通了。
4.3 Python接口验证:Traci能否正常连接
接下来验证Python接口,也就是Traci。这一步不是必须的,但只要你想在SUMO里做算法控制、批量实验、动态信号配时,早晚会用到。提前验证能尽早暴露问题。
用pip安装官方Python绑定包:
pip install eclipse-sumo这个包会提供traci、sumolib等模块。注意它只提供Python绑定,不包含sumo-gui、netconvert这些可执行程序,那些还是要靠前面安装的官方Windows包。
然后在刚才的sumo_demo目录下新建一个test_traci.py:
import traci traci.start(["sumo", "-c", "config.sumocfg"]) while traci.simulation.getMinExpectedNumber() > 0: traci.simulationStep() traci.close() print("simulation finished")这段脚本的意思是用TraCI启动SUMO,然后不断往前推进仿真步,直到所有车辆都离开路网。执行:
python test_traci.py如果一切正常,会输出simulation finished。
这里有个细节值得注意:traci.start的列表第一个元素是"sumo",这时候走的是命令行版本的仿真器,没有GUI窗口,速度更快。如果你想在脚本跑的同时看到车辆移动画面,可以把"sumo"改成"sumo-gui"。但要注意,TraCI连接和GUI窗口同时打开时,GUI会显示一个连接状态,这是正常的。
如果import traci时报错,说明eclipse-sumo没装成功,或者当前Python环境不对。如果启动时报找不到sumo,说明Path还没有生效或者当前命令行窗口是旧的,重开一个。
到这一步,你的Windows 10系统上已经具备完整的SUMO仿真环境:命令行工具、GUI、netconvert网络转换工具、Python控制接口,全部验证通过。接下来就可以开始真正做交通仿真实验了。
5. 新手最容易踩的五个环境坑与排障记录
5.1 安装包被拦截或者双击没反应
这是我在新手群里被问得最多的一个问题。下载的exe安装包双击后毫无反应,或者安全中心弹出风险提示。
先说原因:SUMO的Windows安装器使用NSIS打包,这类安装器的行为和某些恶意软件的安装包有相似特征,容易触发杀毒软件的启发式检测,属于误报。解决办法是确认下载来源。只要是从sumo.dlr.de官网或SourceForge下载的,就可以放心。在Windows安全中心里,点开“保护历史记录”,找到对应的拦截项,选择“允许”或者“操作”,把那个安装包放行。装完后再恢复原来的防护策略就行。
另外有人会遇到解压式的安装版本,就是官方发布的zip压缩包。那个更简单,直接解压就能用,不过需要手动配置环境变量。我推荐用exe安装器,因为它会把组件和文件关联一起处理,省去很多手工步骤。
5.2 命令行找不到sumo命令
典型报错是:
'sumo' 不是内部或外部命令,也不是可运行的程序或批处理文件。这是PATH没有生效。按这个顺序排查:
- 命令行窗口是不是安装环境变量之前打开的?是的话关掉重新开一个。
- 打开“环境变量”设置,确认Path里有没有%SUMO_HOME%\bin,注意是bin目录,不是安装根目录。
- 确认SUMO_HOME变量的值指向的目录里真的有bin文件夹。有次我发现用户把SUMO_HOME指到了C:\Program Files (x86)\Eclipse SUMO\bin,导致后续所有脚本都报错。
- 在命令行里执行echo %SUMO_HOME%,确认变量本身没有拼写错误。
有一个技巧:用where sumo命令。这个命令会列出所有能被系统找到的sumo.exe的完整路径。如果它返回了某个路径,你就能明确知道系统执行的是哪一个。同时配置了多个版本时,where命令的输出顺序就是系统的查找顺序,排在前面的优先执行。
还有一种情况是用户自定义安装到中文路径,比如D:\仿真\sumo。虽然Windows很多命令支持中文路径,但某些Python脚本在处理中文字符串时会因为编码问题出岔子。这个事我遇到过不止一次,所以再次强调:安装路径和项目路径都用英文,别给自己挖坑。
5.3 缺少MSVCP140.dll或者VCRUNTIME140.dll
直接现象是运行sumo.exe、netconvert.exe时报错,提示找不到dll文件。原因很明确:电脑缺少Visual C++运行库。
解决办法是去微软官网搜索“Visual C++ 2015-2022 Redistributable”,下载x64版本安装。这个运行库不是SUMO特有的,很多Windows软件都依赖它,装一次能解决很多软件打不开的问题。
顺带说一句,如果你的Windows 10系统本身比较精简,有些精简系统自带的VC运行库不完整,这种情况下强烈建议装完运行库再安装SUMO。
5.4 Python版本和SUMO版本对不上
另一种常见问题是:traci模块能import,但调用某个API时报AttributeError,或者连接仿真器时报协议不匹配错误。
这多半是Python绑定包和SUMO主程序版本不一致导致的。TraCI有自己的协议版本,SUMO 1.18时代的traci和SUMO 1.20时代的traci在接口细节上有差异。如果你用pip install eclipse-sumo装的是最新绑定,而电脑上的SUMO主程序是很老的版本,两者可能无法对话。
我的建议是装完之后确认版本统一:
sumo --version pip show eclipse-sumo如果版本差距很大,就升级或降级其中一个。另外Python解释器版本也尽量别太激进,3.13刚出来时不少第三方库的wheel还不完善,我目前用3.10和3.11都很稳定。
5.5 电脑里同时存在多个SUMO版本
很多人在做课程作业时,电脑里会有两个版本:一个是通过exe安装的正式版,一个是下载zip包解压出来的旧版。这时候最容易出现诡异问题:命令行里sumo --version显示版本A,但sumo-gui打开的场景却是版本B的风格,用python脚本连TraCI时又对应不上。
排查方法还是用where sumo命令,加上where sumo-gui、where netconvert,分别确认每个工具实际指向的路径。正常情况它们应该都在同一个bin目录下。
如果确认有多个版本并存,不建议急着卸载旧版,只需要把不用的那个bin路径从PATH里移除即可。你是为了复现某个老项目才保留旧版的话,建议把旧版放到单独的目录,并且用写绝对路径的方式直接调用,而不是依赖PATH里的顺序。
我一开始用SUMO时总喜欢把所有版本都留着,后来发现带来的麻烦比收益大得多。现在凡是新机器,我只装一个当前项目需要的版本,干净利落。
装好环境其实只是第一步。我见过很多同学卡在安装上,好不容易跑通了示例,就急着导入超大城市的OSM路网,结果各种报错,最后以为是自己电脑不行。实际上,SUMO的学习路径非常适合“小场景快步走”:先从两个节点一条路开始搞懂文件结构,再逐步加入信号灯、多车道、多车型、公交线路,最后再碰真实路网。你把这个最小闭环打通了,后面的内容会顺畅很多。下一篇我会讲怎么用NetEdit工具手工搭建路网,以及如何把你所在城市的真实道路数据导入SUMO。