第1章:微观交通仿真工具SUMO入门

各位同学,今天咱们来聊聊SUMO。说实话,我第一次接触SUMO是在一个城市路网改造项目里,甲方要求评估新路口设计对通行效率的影响。那时候我手头只有CAD图纸,硬着头皮啃了三天SUMO文档,才把第一个仿真跑起来。嗯,踩过的坑不少,但用顺手之后,你会发现这工具是真的香。

1.1 SUMO是什么?为什么选它?

SUMO全称是"Simulation of Urban MObility",一个开源的微观交通仿真平台。说白了,就是能模拟每辆车怎么走、每个路口怎么排队的工具。我个人的习惯是,但凡涉及路网改造、信号灯优化、或者自动驾驶测试,首选SUMO。

为什么?三个理由:

  • 开源免费——没有授权限制,想怎么改都行
  • 生态完善——支持Python、TraCI接口,能跟其他系统联动
  • 精度够用——微观模型能精确到每辆车的跟驰、换道行为
小提示:如果你做的是宏观层面的交通规划,SUMO可能太重了。但微观场景——比如某个路口拥堵分析、公交优先策略验证——SUMO绝对是首选。

1.2 SUMO安装:别被命令行吓到

安装SUMO其实很简单。我建议直接从官网下载安装包,Windows用户选那个exe文件,一路下一步就行。Linux用户用apt或源码编译,看个人习惯。

安装完成后,记得检查环境变量。打开命令行,输入:

sumo --version

如果能看到版本号,说明安装成功。我曾经遇到一个学员,装完SUMO后死活跑不起来,最后发现是PATH没配好。嗯,这个坑我踩过,所以提醒你一下。

注意:SUMO依赖Python 3.6以上版本。如果你电脑里同时有Python 2和3,记得把Python 3的路径加到环境变量里。

1.3 路网构建:从零开始画路

路网是仿真的基础。SUMO支持两种方式构建路网:

  • 手动绘制——用NETEDIT工具,像画图一样画路
  • 导入OSM数据——从OpenStreetMap下载真实路网

我个人更推荐新手先用NETEDIT手动画一个小路网,熟悉一下概念。打开NETEDIT,你会看到三个主要区域:

  • 画布——绘制路网的地方
  • 属性面板——设置道路参数(车道数、限速等)
  • 工具栏——选择、绘制、连接等操作

举个例子,画一条双向两车道的路:

  1. 点击"Edge"工具,在画布上点两个点,生成一条边
  2. 在属性面板里设置"numLanes"为2,"speed"为13.89(对应50km/h)
  3. 点击"Connection"工具,设置车道连接关系

保存后,你会得到一个.net.xml文件。这就是路网文件。

核心概念:SUMO里的路网由"Edge"(路段)和"Junction"(交叉口)组成。Edge有方向,Junction负责连接不同Edge。理解这个,后面就好办了。

1.4 基础仿真文件结构:三个文件搞定一切

一个完整的SUMO仿真,至少需要三个文件。我习惯把它们放在同一个文件夹里,方便管理。

文件类型 扩展名 作用
路网文件 .net.xml 定义道路、交叉口、信号灯等物理结构
交通流文件 .rou.xml 定义车辆类型、路线、发车时间
配置文件 .sumocfg 告诉SUMO加载哪些文件、仿真时长等参数

咱们一个一个来看。

1.4.1 路网文件 (.net.xml)

这个文件由NETEDIT或netconvert生成,不建议手写。但你要能看懂它的结构:

<?xml version="1.0" encoding="UTF-8"?>
<net version="1.19" junctionCornerDetail="5">
    <edge id="edge1" from="node1" to="node2" priority="1" numLanes="2" speed="13.89"/>
    <edge id="edge2" from="node2" to="node3" numLanes="1" speed="11.11"/>
    <junction id="node1" x="0.0" y="0.0" type="dead_end"/>
    <junction id="node2" x="100.0" y="0.0" type="priority"/>
    <junction id="node3" x="200.0" y="0.0" type="dead_end"/>
</net>

看到没?每个edge有起点终点,junction有坐标。这就是路网的骨架。

1.4.2 交通流文件 (.rou.xml)

这个文件定义车怎么来、怎么走。我一般用Python脚本生成,但手写也不难:

<routes>
    <vType id="car" accel="2.6" decel="4.5" sigma="0.5" length="4.5" maxSpeed="50.0"/>
    <vehicle id="veh1" type="car" depart="0.0">
        <route edges="edge1 edge2"/>
    </vehicle>
    <vehicle id="veh2" type="car" depart="5.0">
        <route edges="edge1 edge2"/>
    </vehicle>
</routes>

这里定义了两种车:veh1在0秒出发,veh2在5秒出发,都走edge1到edge2的路线。注意vType里的参数——accel是加速度,decel是减速度,sigma是驾驶行为随机性。这些参数直接影响仿真效果。

经验之谈:sigma值我一般设0.5,太大会导致车辆行为异常,太小又太理想化。你可以根据实际数据调整。

1.4.3 配置文件 (.sumocfg)

这个文件是总指挥,告诉SUMO加载哪些文件:

<configuration>
    <input>
        <net-file value="mynet.net.xml"/>
        <route-files value="myroutes.rou.xml"/>
    </input>
    <time>
        <begin value="0"/>
        <end value="100"/>
    </time>
</configuration>

保存后,在命令行运行:

sumo-gui myconfig.sumocfg

就能看到仿真动画了。我第一次跑通的时候,看着小车在屏幕上移动,还挺有成就感的。

1.5 知识体系总览

下面这张图,帮你理清本章的核心逻辑:

SUMO仿真文件体系 SUMO仿真 路网文件 .net.xml 交通流文件 .rou.xml 配置文件 .sumocfg NETEDIT绘制 OSM导入 车辆定义 路线规划 三个文件缺一不可,共同构成完整仿真

1.6 避坑指南

最后,分享几个我踩过的坑:

  • 路径不连通——检查路网里edge之间的连接关系,别让车走到死胡同
  • 文件路径错误——.sumocfg里引用的文件路径要写对,建议用相对路径
  • 参数单位搞混——SUMO里速度单位是m/s,不是km/h。我刚开始老搞混,仿真出来的车像蜗牛一样慢
重要提醒:如果你用NETEDIT修改路网后,记得重新保存。我经常改完忘记保存,然后跑仿真发现还是老路网,白忙活半天。

好了,这一章就到这里。SUMO入门其实不难,关键是动手。你打开软件,画一条路,放一辆车,跑起来看看效果。相信我,看到小车动起来的那一刻,你会觉得一切努力都值得。

可可精品资料库