1. 先搞清楚:SUMO是什么,为什么值得花时间装它
第一次听到SUMO的人,多半会以为是个相扑游戏。其实SUMO是Simulation of Urban MObility的缩写,直译过来就是“城市交通模拟”,一个开源的微观交通仿真软件。它最早由德国航空航天中心(DLR)开发,到现在已经维护了二十多年,在交通仿真领域算是老牌选手了,而且完全免费、开源、可商用。
我理解很多人第一次接触SUMO是出于这几个原因:要么是做车联网、V2X相关的研究,需要一个能跑车辆轨迹的仿真环境;要么是做自动驾驶算法测试,需要把感知、决策放到一个可控的交通流里跑;要么是搞交通规划、信号配时优化,需要一个能模拟路网和车辆交互的工具。SUMO在这几个场景里都是非常高频的选择,尤其是学术界和工业界做车路协同、智能网联汽车方向的,几乎绕不开它。
那有人会问,交通仿真的工具不少,VISSIM、PTV、TransModeler这些商业软件也有不少人用,为什么非要选SUMO?我的体会是:SUMO最大的优势在于“开放”。它提供了完整的命令行工具链、Python接口(TraCI)、网络编辑器和大量API接口,你可以把交通信号灯的控制逻辑替换成自己的算法,可以把车辆的轨迹导出成数据分析,甚至可以和CARLA、OMNeT++这类软件做联合仿真。这种开放性,商业软件很难比。
这篇教程是系列的第一篇,重点就一个:把SUMO装好、跑通第一个仿真。不需要你有多深的编程基础,也不需要你懂交通工程理论,只要按着文中的步骤一步步来,一小时之内你就能看到一个有路口、有车流、有信号灯在动的小场景跑起来。
2. 安装前先盘一盘:SUMO这套工具链到底包含哪些东西
在动手下载之前,我建议你先花三分钟了解一下SUMO的组成,不然装完以后面对一堆可执行文件,你会很困惑。
2.1 核心功能模块速览
SUMO安装完成后,在安装目录的bin文件夹下会看到几十个exe文件。但日常使用频率最高的其实就这五个:
| 工具名称 | 作用 | 说明 |
|---|---|---|
| sumo | 命令行仿真引擎 | 无界面运行,适合批量仿真和服务器环境 |
| sumo-gui | 图形化仿真界面 | 可视化查看路网、车辆运行、信号灯变化 |
| netedit | 网络编辑器 | 可视化绘制/编辑道路网络,新手友好 |
| netconvert | 网络转换工具 | 把OSM、OpenDrive等格式转为SUMO路网格式 |
| duarouter | 路径分配工具 | 根据车流需求生成车辆行驶路径 |
此外还有一个非常重要的库叫TraCI,它不在这五个工具里,而是以Python库的形式存在。你安装完SUMO之后,在Python环境里配置好环境变量,就能通过TraCI实时控制仿真中的车辆、信号灯,这是我们后面做二次开发的基础。
2.2 安装方式怎么选
SUMO的安装方式和很多开源软件一样,分为三种:官方二进制包、系统包管理器、源码编译。从我的实践经验来看,不同场景选择不一样:
第一,如果你只是在Windows电脑上学习或者做小规模仿真,直接下载官方提供的Windows安装包,双击安装,五分钟搞定,这是最省心的路径。
第二,如果你用的是Linux服务器,尤其是Ubuntu或者Debian系统,用apt install sumo一行命令就能装好。但要注意,软件源里的版本可能不是最新版,如果你需要用到最新功能,还是建议去官网下载或者源码编译。
第三,如果你要针对源码做二次开发,或者需要修改SUMO内核代码,那就必须源码编译。但这是一条相对辛苦的路,依赖项非常多,我不建议初学者一上来就走这条路。
本篇教程以Windows安装为主来展开,因为这是绝大多数人起步的环境。Linux安装我会在后文补充命令行方式,只要照着执行基本不会有坑。
3. 手把手完成SUMO下载安装全流程(Windows为主)
这一章是全篇的核心操作部分,我来逐步拆解。你不需要记任何多余的参数,也不用管那些暂时用不上的功能,把所有注意力放在“把软件跑起来”这件事上。
3.1 第一步:去官网找文件,别下错版本
SUMO的官方下载地址是sumo.dlr.de,这个网站是德国航空航天中心的官方站点,下载页面也在这个域名下。打开之后,找到“Downloads”页面,你会看到不同系统对应的安装包。
需要注意一个细节:下载文件名里通常会带版本号和系统标识,比如sumo-win64-1.20.0.exe这样的格式。64位系统选win64,如果你的电脑还是老掉牙的32位系统,那就要找win32版本。现在绝大多数电脑都是64位,win64基本不会选错。
还有一个值得提醒的点:有些人会从第三方网站下载所谓“绿色版”“破解版”SUMO,完全没必要。SUMO本身是开源免费的,官方提供的安装包就是最干净、最稳定的,没必要去冒安全风险。第三方打包的版本可能缺失组件,环境变量也可能被动过手脚,出了问题排查起来非常头疼。
下载的时候我建议选带-setup.exe的安装包,这种是向导式安装,有图形界面引导,比直接解压zip压缩包要友好很多,对新手来说能少踩一个坑。
3.2 第二步:安装过程要点
安装包下载好之后,双击运行。安装过程基本就是“一路Next”的节奏,但有几个选项值得留意一下:
第一,安装路径。我强烈建议不要用默认的C:\Program Files\sumo,因为路径中含空格,虽然一般不影响使用,但在某些脚本配置环境变量时可能会遇到奇怪问题。我自己习惯装在D:\Software\sumo或者C:\sumo这种简短路径下。路径越短、越简单,后面对接Python和脚本的时候越省事。
第二,安装类型选择。安装过程中如果有“Complete”和“Custom”两种模式,直接选“Complete”完整安装。因为SUMO的各个工具有不少关联依赖,比如netedit要用的库文件、sumo-gui要用的3D渲染组件等,完整安装能避免后续缺这少那。
第三,环境变量的问题。新版SUMO安装向导通常会提供一个选项,让你自动添加系统环境变量,比如“Add to PATH”这种勾选框。如果有,勾上。如果没有,我们后面手动配置,也不难。这里先记住一个判断标准:安装完成后,打开一个CMD窗口,输入sumo如果能出来一堆参数说明,说明环境变量没问题;如果提示“不是内部或外部命令”,那就需要手动配。
3.3 第三步:手动配置环境变量(很多人的第一道坎)
环境变量是什么?我用最通俗的话解释一下:你希望系统在任何目录下都能直接调用SUMO的命令,而不是每次都输入一长串完整路径,那就把SUMO的bin目录加到系统的“PATH”里。这就好比你把某家店的地址存到了手机通讯录,以后找它只需要喊名字,不用每次都翻地图输入详细地址。
手动配置分三步:
- 确认你的SUMO安装目录下有
bin文件夹,里面能看到sumo.exe、sumo-gui.exe这些文件。这是后续一切操作的基准目录。 - 在Windows搜索框里输入“环境变量”,打开“编辑系统环境变量”,然后点击“环境变量”,在“系统变量”里找到
Path,双击编辑,新建一条,把SUMO的bin路径填进去。 - 依次点确定,关掉所有设置窗口,然后新开一个CMD窗口,输入
sumo --version,如果能看到版本号输出,说明环境变量配置成功。
我自己见的比较多的一个问题是:很多人配置完环境变量之后,忘记重新打开CMD,直接在旧的CMD窗口里运行,系统还是读不到刚加的路径,于是以为是配置失败了。这是很初级但非常常见的坑,记住:修改完环境变量,必须新开一个终端窗口才生效。
3.4 第四步:验证安装是否成功
配置完环境变量后,我们做一次完整的验证。打开CMD窗口,依次输入下面几个命令,每一条都应该有正常输出:
sumo --version sumo-gui --version netedit --version netconvert --version duarouter --version如果每一条都能返回类似“SUMO Version 1.20.0”这样的信息,说明核心工具都已经安装成功。在这个阶段,哪怕你还不懂每个工具具体怎么用的,至少环境是稳的,后面不会因为装得不对而白折腾半天。
如果你还需要用TraCI做Python开发,那还要验证Python能否正常导入SUMO的库。在CMD里输入python进入交互模式,然后尝试导入:
python import os import sys sumo_home = r"D:\Software\sumo" os.environ["SUMO_HOME"] = sumo_home sys.path.append(os.path.join(sumo_home, "tools")) import traci print(traci.__version__)这里我写的路径是示例,你要改成自己的实际安装目录。如果最后能正常打印出版本号,说明TraCI也通了,就可以进入下一个阶段了。
3.5 Linux系统安装快速指南
如果你用的是Linux服务器或者Ubuntu桌面系统,我可以顺手把安装方式也写了,因为很多人可能在Windows上装了但后续会把仿真任务丢到服务器上跑。
Ubuntu/Debian系一行命令就能装:
sudo apt update sudo apt install sumo sumo-tools sumo-doc装完之后验证一下:
sumo --version which sumo注意,apt安装的SUMO版本往往比官方最新版旧一些,比如官方已经到1.20了,软件源里可能还是1.18。如果你做研究需要最新版本,不要用这种方式,去官网下载Linux压缩包,配置好环境变量即可。另外,Ubuntu里安装的可能性缺失是OpenGL相关的库,如果sumo-gui启动报错,通常安装一个freeglut3-dev就能解决。
4. 立刻跑通你的第一个SUMO仿真:从画路网到看见车辆动起来
装好不代表会用。我见过太多人安装完就对着一个空白的sumo-gui界面发呆,不知道怎么把一辆车放进去。这一章我们就从零开始,搭建一个最简单的单路口场景,让两辆小车在屏幕里跑起来。
4.1 用netedit画一个最简单的十字路口
老一批SUMO用户以前都是手工编XML文件来定义路网的,那种方式极其折磨人。好在现在有了netedit这个图形化工具,鼠标点一点就能画路网。
启动netedit有两种方式:命令行输入netedit,或者在sumo-gui安装目录里找到netedit.exe双击运行。打开之后,新建一个网络文件,界面里你会看到一个网格画布,按住鼠标左键拖动画布,右键拖动视角。
画路网的操作逻辑可以概括为三个动作:画道路节点、连道路边、设置连接关系。
第一步,画节点。SUMO里的道路交叉口、路段端点都叫节点(Node)。在netedit左侧工具栏选择“Create Edge”工具,然后在画布上点按你的意图画出路的形状。比如我们画一个十字路口,需要四个方向的入口节点和一个中心的交叉口节点。最简单的做法是:先用工具栏里的“Create Edge”从一个节点连到另一个节点,SUMO会自动把中间点设为交叉口。
我建议你从最基础的单条直路开始练手,比如画一条从(0,0)到(100,0)的路,再画一条从(0,0)到(100,100)的路,让它俩十字交叉。画完之后按快捷键Ctrl+S保存,文件类型选择.net.xml路网文件。
注意,SUMO的画路逻辑和CAD不太一样,它天然是“节点-路段”模型,你画的是edge和node的拓扑关系,而不是简单的线条。刚开始画不顺手很正常,画几个小场景之后就明白了。
4.2 生成车流:让车辆有路可走
有了路网,接下来要造“车流”。SUMO里的车辆生成需要三个基本参数:车辆的类型定义、行驶的路径、发车的时刻。
在最早的教程里,大家都在手工写一个rou.xml文件,格式大概是这样的:
<routes> <vType id="car" accel="1.0" decel="4.5" sigma="0.5" length="5" maxSpeed="16.67"/> <vehicle id="veh1" type="car" depart="0.00"> <route edges="edge1 edge2 edge3"/> </vehicle> </routes>如果你是通过netedit建的网,我要提醒你一个很重要的细节:netedit里默认给每条道路分配的ID可能是类似edge0、edge1这样的编号,但也取决于你画的时候的命名。你要知道车辆路径中填的edge id必须和路网文件里实际存在的edge id完全一致,否则仿真器会报错“Route has no edges”。
为了让流程简单点,你可以这样操作:在netedit中选中一条路,右侧属性面板里能看到它的edge id,记下来。然后自己新建一个文本文件命名为demo.rou.xml,把上面那段XML里的edge换成你实际路网的edge id,保存好备用。
4.3 用sumo-gui可视化运行
路网文件有了,车流文件也有了,现在就差把它们联合起来跑一遍。在CMD窗口里切换到这两个文件所在目录,执行:
sumo-gui -n demo.net.xml -r demo.rou.xml如果一切正常,sumo-gui会弹出一个窗口,但默认的仿真速度是静止的,你需要按下工具栏中的“Play”按钮(或者按快捷键Ctrl+Shift+P)开始仿真。这时你会看到一辆小车出现在路网入口,沿着道路移动,经过交叉口,然后从出口消失。
在这一步,我建议你好好观察几件事:车辆在进入交叉口时会不会减速?两辆车同时到达交叉口会不会互相避让?信号灯默认是什么状态?这些细节反映了SUMO微观仿真的底层逻辑。
如果没有信号灯,SUMO默认会采用“让右侧车辆先行”的规则,这在欧洲路权规则下是合理的。如果你希望模拟有信号灯的交叉口,需要在路网里手动添加交通信号灯分布,这个我们放到后续教程里详细讲。
4.4 用命令行工具批量跑仿真
图形界面适合调试和观察,但一旦你需要跑大量场景,比如设计多组交通流量或者对比不同的信号配时方案时,就得用命令行模式了。在同样的目录下执行:
sumo -n demo.net.xml -r demo.rou.xml --duration-log.statistics true没有图形界面时,SUMO会在终端输出一些统计信息,比如仿真总时长、车辆平均等待时间等。这些指标在我们后续做交通评价时非常有用。而且命令行模式下仿真速度比GUI快很多,因为不需要渲染画面。
如果你有多个车流文件要叠加,可以在命令行里用--additional-files参数加载,但这是后面教程的内容。第一节课,你能把一条路、一条车流跑通,就算成功了一大半。
5. 安装和首次运行中常见的坑,我踩过的都帮你排了
接下来这部分价值极高,因为很多内容不是官方文档会写的,而以我的经验,新手大概率会在这里卡住。我按出现频率从高到低排一下。
5.1 环境变量配置后command找不到
这个问题前面已经提到了,我再补充一个容易忽略的点:如果你用的是新版Windows 10或者Windows 11,环境变量有“用户变量”和“系统变量”两种。如果你只在用户变量里加了Path,然后你的CMD是在管理员权限下打开的,系统有可能优先读取的是系统变量而不是用户变量,导致配置看起来没生效。
解决办法很直接:直接把SUMO的bin路径加到“系统变量”的Path里,一劳永逸。另外,配置完环境变量后,确认自己是在一个全新的CMD窗口里测试。我在全国各地带过不少学员,踩这个坑的比例超过一半。
5.2 启动sumo-gui报缺少动态库
在Windows上,有一种很常见的情况是安装完SUMO后双击sumo-gui,弹出“找不到libgdal-28.dll”或者类似的动态库缺失错误。这个问题多半是你安装的是精简版、或者杀毒软件把某些DLL文件拦截了。
处理思路按优先级排序:
- 先检查你的安装路径是不是完整版,安装文件是否完整。
- 到SUMO安装目录的bin文件夹下,看看那些DLL文件是否真的存在。
- 如果文件存在仍然报错,用管理员身份重新运行一次安装包,选择“Repair”修复安装。
如果这些都不行,检查一下系统是否缺少微软的Visual C++ Redistributable。SUMO依赖VC++运行库,很多精简版系统没有预装,去微软官网下载最新版的VC_redist.x64.exe装一遍,大概率能解决。
5.3 netedit画的路网无法保存
我用netedit的过程中碰到过一次比较诡异的问题:保存路网文件时提示“Saving failed”,后来发现是因为保存路径中包含中文字符。SUMO底层对Unicode处理不完善,路径里带有中文在某些环境下会出问题。
这个问题非常隐蔽,因为你在Windows图形界面里操作,感觉中文路径很正常。我建议从第一天起,你的SUMO项目目录就用纯英文命名,比如D:\sumo-projects\demo,不要出现“交通仿真”“新建文件夹”这样的名字。这个习惯能让你少掉很多莫名其妙的坑。
5.4 仿真开始后车辆不动
有时候你点了Play,但车辆就一直停在起点不往前走。这个问题的核心原因通常是:车辆到达边的位置和仿真器的逻辑不一致,或者车道设置不允许该类型车辆通行。
排查思路:先看sumo-gui左下角的日志输出,有没有报错信息。如果车辆一直没进入路网,检查路网文件中是否定义了allowed属性限制车型。如果车辆停在路段中间不动,多半是前方红灯或者路权冲突。你要记住一个原则:SUMO里的车辆是严格受交通规则约束的,不能简单地“飞过去”,遇到这种情况首先考虑路权和车道连接的关系。
5.5 仿真速度特别慢
如果你的电脑配置不算低,但仿真速度始终上不去,查看一下sumo-gui底部状态栏中的速度倍数是否设置过低。另外,把界面上的“draw”设置降低,关闭车辆的3D渲染,仿真速度会有明显提升。如果车辆数量很大,如上万辆,直接用命令行模式跑,不要开GUI,效率差距是数量级的。
6. 装好了、跑通了,然后呢?给新手的后续进阶路径
很多人做到上面那一步后,会产生一个模糊的感觉:好像会用了,又好像什么都不会。这其实非常正常,因为SUMO是一座冰山,你现在看到的只是水面上的那一小层。结合我自己用了这么多年的经验,给你几条下一步的路线参考。
第一条路,深耕“路网构建”。试着从OpenStreetMap导出你所在城市的真实道路数据,然后用netconvert转换成SUMO路网格式。这步一旦打通,你就不再是只在玩具路网上玩了,而是在真实路网上做仿真。过程中你会学到如何清洗路网数据、如何处理高速公路匝道、如何在路口补画信号灯。这条路线对做城市交通规划研究的人最有价值。
第二条路,吃透TraCI。TraCI是SUMO的Python实时控制接口,用好了你几乎可以控制仿真里的一切对象。举个例子,你在TraCI里写一个循环,实时读取每个路口的排队长度,然后用你的算法动态调整信号灯时长方案。这时SUMO就不再是一个看动画的工具了,而是一个可以承载你算法的微型交通实验平台。这个方向是目前车路协同、智能交通研究最常用的路径。
第三条路,做联合仿真。把SUMO和CARLA、Gazebo这些仿真器连起来,让自动驾驶车辆在SUMO生成的高密度交通流里行驶,同时感知模块在渲染环境里测试。这条路比较难,但做出来效果相当震撼,能直接支撑自动驾驶项目的决策规划算法验证。
不管走哪条路,我的建议是一样的:不要追求一次看懂所有文档,而是带着具体问题去查、去试。SUMO的官方文档其实写得很全面,但内容过于庞杂,一次性读下去很容易劝退。最好的方式是先跑通一个最小例子,再按照自己的项目需求逐步深入。这篇教程帮你完成了“最小例子”这一步,后面的事,就是持续和这个工具死磕的过程了。
7. 最后分享几个我的使用习惯
既然这是系列教程的第一篇,我就再讲几点个人经验,算是一个小福利。
第一,建议你为每一个仿真场景建立一个独立文件夹,里面固定放net(路网)、route(车流)、output(输出结果)、script(脚本)四个子目录。SUMO项目一旦复杂起来,文件特别多,如果没有这个习惯,用不了几周你就会陷入“找文件”的泥潭。
第二,每次跑仿真之前,先设置一个固定随机种子。SUMO里用--seed参数控制随机性,不管道路怎么设置,车辆发车时间、路径选择都会受随机数影响。科研做实验的时候,固定种子才能保证你的结果可复现,论文里写数据也有据可依。
第三,多用命令行,少依赖GUI。GUI适合展示和调试,但真正要批量跑实验的时候,命令行加Python脚本才是效率最高的方式。我从第二年开始,基本90%的时间都在命令行和Python环境中工作,GUI只在需要截图或者调试路网时才打开。
第四,如果你卡在某一步卡了一个小时,先停下来,去检查一下你的SUMO版本和网上教程的版本是否一致。SUMO迭代挺快的,不同版本的XML格式命令参数有变化,老教程里的参数可能在你要用的版本里已经废弃了。版本不一致是很多问题的根源,这同样也适用于其他开源工具。
SUMO是个值得投入时间的工具,它的学习曲线有些陡,但只要把这个最简单的闭环跑通,后面每走一步,你能控制的东西就多一层。下一篇教程里,我打算聊一聊如何用TraCI实时控制仿真中的车辆和信号灯,这也是做车联网研究最关心的部分。装好环境、跑通第一个仿真的你,正好可以准备好代码,和我一起在那个场景里动手试试。