3. SUMO核心概念:网络、路线、车辆类型、交通需求
好,咱们正式开始接触SUMO的核心概念。说实话,这四个东西——网络、路线、车辆类型、交通需求——就是搭建任何交通场景的四大支柱。你想想看,一个仿真场景无非就是:车在哪跑(网络)、怎么跑(路线)、什么车在跑(车辆类型)、跑多少(需求)。
我个人习惯把这四个概念比作拍电影:网络是舞台,路线是剧本,车辆类型是演员,需求就是导演喊的“Action!”和“Cut!”。下面我一个一个拆开讲。
3.1 网络(Network)——舞台搭好了吗?
网络,说白了就是路网。它定义了车辆能走的所有物理空间:车道、交叉口、红绿灯、限速等等。SUMO里网络文件的后缀是 .net.xml。
我记得刚入行时,有个同事直接用OpenStreetMap导了个超大路网,结果仿真跑起来卡成PPT。后来我才明白,网络不是越精细越好,关键看你的仿真目标。
网络的核心组成
- 节点(Node/Junction):路口、道路端点。每个节点有坐标(x, y)。
- 边(Edge):连接节点的道路。一条边可以有多个车道(lane)。
- 车道(Lane):车辆实际行驶的轨迹。每个车道有长度、最大速度、形状等属性。
- 连接(Connection):定义车道之间的转向关系。比如左转、直行、右转。
重要提醒:网络文件是SUMO仿真的基础。没有网络,后面的一切都是空谈。你可以用 netedit 手动画,也可以用 netconvert 从其他格式(如OpenStreetMap、MATSim)转换。
这里我画了一张网络结构的示意图,帮你理清关系:
小技巧:如果你用 netedit 手动画路网,记得先画节点,再连边。我刚开始总想一步到位,结果连接关系乱成一团。先搭骨架,再填细节,这是铁律。
3.2 路线(Route)——剧本怎么写?
路线定义了车辆从起点到终点的行驶路径。在SUMO里,路线就是一系列边(edge)的有序列表。文件后缀通常是 .rou.xml。
举个例子,一辆车从“边1”出发,经过“边2”,最后到达“边3”,它的路线就是 ["edge1", "edge2", "edge3"]。
路线的定义方式
<routes>
<route id="route1" edges="edge1 edge2 edge3"/>
<vehicle id="car1" route="route1" depart="0"/>
</routes>
你看,代码很简单。但这里有个坑——我曾经犯过一个错误:路线里的边必须首尾相连,中间不能断开。否则SUMO会直接报错,仿真都跑不起来。
避坑指南:我曾经在项目里写了一条路线,中间漏了一条边,结果车辆卡在半路不动了。排查了半天才发现是路线不连续。所以,写路线时一定要检查边的连接关系。
3.3 车辆类型(Vehicle Type)——演员长什么样?
车辆类型定义了车辆的物理特性和行为参数。比如车长、最大速度、加速度、跟车模型等等。在SUMO里用 vType 标签定义。
我个人觉得,车辆类型是四个概念里最灵活的一个。你可以定义小轿车、公交车、卡车,甚至自行车。每种类型的参数都可以单独设置。
常见的车辆类型参数
| 参数名 | 含义 | 默认值 | 我的建议 |
|---|---|---|---|
| length | 车长(米) | 5.0 | 小车设4.5,公交车设12.0 |
| maxSpeed | 最大速度(m/s) | 55.55(约200km/h) | 城市道路设13.89(50km/h) |
| accel | 最大加速度(m/s²) | 2.6 | 普通轿车设2.0-3.0 |
| decel | 最大减速度(m/s²) | 4.5 | 紧急制动设7.5 |
| sigma | 驾驶随机性(0-1) | 0.5 | 0.5表示中等随机 |
<vType id="car" length="4.5" maxSpeed="13.89" accel="2.5" decel="4.5" sigma="0.5"/>
<vType id="bus" length="12.0" maxSpeed="11.11" accel="1.5" decel="3.0"/>
注意:车辆类型的参数直接影响仿真行为的真实性。比如你把加速度设得太大,车辆起步就跟火箭一样,完全不真实。我一般会参考真实车辆的参数来设置。
3.4 交通需求(Demand)——导演喊Action!
交通需求定义了什么时候、有多少辆车进入路网。这是仿真的“驱动力”。没有需求,路网再漂亮也是空的。
SUMO里定义需求的方式有很多种,最常用的是直接定义车辆(vehicle)或车流(flow)。
两种定义方式
- 单辆车定义:适合小规模仿真,每辆车单独指定出发时间。
- 车流定义:适合大规模仿真,指定车流的开始时间、结束时间、车辆数或频率。
<!-- 单辆车 -->
<vehicle id="car1" type="car" route="route1" depart="0"/>
<vehicle id="car2" type="car" route="route1" depart="5"/>
<!-- 车流 -->
<flow id="flow1" type="car" route="route1" begin="0" end="3600" number="1000"/>
你想想看,如果仿真1小时,你要手动定义3600辆车,那不得累死?所以实际项目中,我几乎只用 flow 来定义需求。除非是测试场景,才用单辆车。
经验之谈:我曾经在一个城市级仿真项目里,用 flow 定义了上万个车流。结果仿真跑得飞快,因为SUMO对车流做了优化。所以,能用flow就别用单辆车,这是性能的关键。
3.5 四个概念的关系
这四个概念不是孤立的,它们层层递进:
- 网络是基础,提供物理空间。
- 路线建立在网络之上,告诉车辆怎么走。
- 车辆类型定义车辆的行为特性。
- 交通需求把前三者串联起来,驱动仿真运行。
说白了,你只要掌握了这四个概念,SUMO的基本功就算打牢了。后面所有的进阶内容——比如交通信号控制、排放模型、行人仿真——都是在这四个概念上做扩展。
核心总结:网络是舞台,路线是剧本,车辆类型是演员,交通需求是导演。四者缺一不可,顺序也不能乱。先搭网络,再写路线,然后定义车辆类型,最后生成需求。这个流程我用了十年,从来没出过问题。