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)转换。

这里我画了一张网络结构的示意图,帮你理清关系:

SUMO网络结构示意图 节点A 节点B 节点C 节点D 边1(2车道) 边2(3车道) 边3(2车道) 边4(2车道) 连接(转向) 节点(路口) 边(道路) 连接(转向关系)

小技巧:如果你用 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)。

两种定义方式

  1. 单辆车定义:适合小规模仿真,每辆车单独指定出发时间。
  2. 车流定义:适合大规模仿真,指定车流的开始时间、结束时间、车辆数或频率。
<!-- 单辆车 -->
<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的基本功就算打牢了。后面所有的进阶内容——比如交通信号控制、排放模型、行人仿真——都是在这四个概念上做扩展。

核心总结:网络是舞台,路线是剧本,车辆类型是演员,交通需求是导演。四者缺一不可,顺序也不能乱。先搭网络,再写路线,然后定义车辆类型,最后生成需求。这个流程我用了十年,从来没出过问题。


可可精品资料库