4. 交通需求生成:用 flowrouter.py 搞定 OD 矩阵和车辆文件

好,咱们进入第四讲。前面几章我们把路网搭好了,检测器也布上了。但有个关键问题——车从哪来?往哪去?

说白了,交通仿真最核心的就是这个“需求”。没有车流,路网再漂亮也是空架子。今天我就带你用 SUMO 自带的 flowrouter.py 工具,把 OD 矩阵和车辆文件一气呵成地生成出来。

4.1 什么是 OD 矩阵?为什么需要它?

OD 矩阵,全称 Origin-Destination Matrix。你想想看,它就是个表格,记录着“从哪出发、到哪结束”的车辆数量。

举个例子:

起点 \ 终点 东门 西门 南门
东门 0 120 80
西门 90 0 60
南门 70 50 0

这个表的意思是:从东门出发去西门有 120 辆车,去南门 80 辆。西门到东门 90 辆……嗯,一目了然。

我在项目中遇到过,有人直接用 Excel 手填 OD 矩阵,然后手动写 .rou.xml 文件。那叫一个痛苦,改一次数据要折腾半天。所以,咱们得用工具自动化。

4.2 flowrouter.py 是什么?

flowrouter.py 是 SUMO 自带的一个 Python 脚本。它的核心能力是:根据检测器数据或已知的 OD 矩阵,自动生成车辆路径文件。

说白了,你给它一个“需求描述”,它帮你算出每辆车该走哪条路,然后生成 .rou.xml 文件。

我个人习惯把 flowrouter.py 放在 SUMO_HOME/tools/ 目录下。使用时记得加路径,或者把它加到环境变量里。

4.3 准备工作:你需要哪些输入文件?

在运行 flowrouter.py 之前,你得准备好三样东西:

  • 路网文件 (.net.xml)——我们已经有了
  • 检测器定义文件 (.add.xml)——上一章生成的
  • 检测器数据文件 (.xml 或 .csv)——可以是实测数据,也可以是模拟数据

如果你没有实测数据,也别慌。flowrouter.py 支持你直接给一个 OD 矩阵,它自己会推算路径。

小技巧: 我建议初学者先用“已知 OD 矩阵”的方式练手。等熟悉了流程,再尝试用检测器数据反推 OD。这样不容易出错。

4.4 实战:用 flowrouter.py 生成车辆文件

好,咱们直接上手。假设你有一个 OD 矩阵文件 my_od.csv,内容如下:

from,to,count
edge1,edge5,100
edge2,edge6,150
edge3,edge7,80
edge4,edge8,120

注意,这里的 from 和 to 是路网中的 边 ID(edge id)。不是节点 ID,也不是路口名称。这个坑我踩过,第一次用的时候写成了节点 ID,结果 flowrouter.py 报错说找不到边。

然后运行命令:

python flowrouter.py -n my_network.net.xml -o my_od.csv --output-file my_routes.rou.xml

参数说明:

  • -n:路网文件
  • -o:OD 矩阵文件
  • --output-file:输出的车辆路径文件

运行成功后,你会得到一个 my_routes.rou.xml 文件。打开看看,里面大概长这样:

<routes>
  <vehicle id="0" depart="0.00">
    <route edges="edge1 edge12 edge5"/>
  </vehicle>
  <vehicle id="1" depart="1.00">
    <route edges="edge1 edge12 edge5"/>
  </vehicle>
  ...
</routes>

每辆车都有唯一的 ID、出发时间,以及它要经过的边序列。这就是 SUMO 能识别的车辆文件。

4.5 进阶:用检测器数据反推 OD

如果你有检测器数据,flowrouter.py 还能做更高级的事——反推 OD 矩阵。

我曾经在一个城市主干道的项目中,只有几个路口的线圈检测器数据。当时就是用 flowrouter.py 的 --detector-data 参数,反推出了整个区域的 OD 矩阵。效果还不错,误差在 15% 以内。

命令示例:

python flowrouter.py -n my_network.net.xml -d my_detectors.add.xml -i my_detector_data.xml --output-file my_routes.rou.xml

这里 -d 是检测器定义文件,-i 是检测器数据文件。flowrouter.py 会根据检测器观测到的车流量,自动推算 OD 矩阵和路径。

注意: 检测器数据反推 OD 是个病态问题——解不唯一。所以结果需要人工校验。我一般会拿一部分数据做验证,如果偏差太大,就调整参数重新跑。

4.6 核心逻辑:一张图看懂流程

为了让你更直观地理解整个流程,我画了一张 SVG 流程图:

路网文件 .net.xml OD 矩阵 / 检测器数据 flowrouter.py 路径推算 + OD 反推 输出:.rou.xml 车辆路径文件 在 SUMO 中运行仿真 sumo -c my_config.sumocfg 迭代优化 flowrouter.py 核心工作流程

这张图把整个流程串起来了。你从左边输入路网和 OD 数据,中间 flowrouter.py 做推算,右边输出 .rou.xml 文件,最后丢进 SUMO 跑仿真。如果结果不满意,还可以反馈回去调整 OD 矩阵,形成迭代。

4.7 避坑指南:我踩过的几个坑

嗯,这里分享几个实战中容易翻车的地方:

  • 边 ID 写错:我曾经把路网中的边 ID 和节点 ID 搞混了。flowrouter.py 报错说“edge not found”。解决办法很简单——用 netedit 打开路网,确认一下边的名字。
  • OD 矩阵格式不对:flowrouter.py 对 CSV 的列名有要求,必须是 from,to,count。大小写敏感。我试过写成 From,To,Count,结果脚本直接忽略了我的数据。
  • 检测器数据时间不匹配:如果你用检测器数据反推 OD,检测器的时间间隔必须和仿真步长一致。否则推算出来的流量会偏差很大。
核心要点: flowrouter.py 是个好工具,但它不是万能的。生成的结果一定要用实际数据验证。我一般会拿 10% 的检测器数据做交叉验证,确保误差在可接受范围内。

4.8 小结

这一章我们讲了怎么用 flowrouter.py 生成 OD 矩阵和车辆文件。从 OD 矩阵的概念,到工具的使用,再到实战命令和避坑指南,应该够你上手了。

你想想看,有了路网、有了检测器、有了车辆文件,一个完整的 SUMO 仿真项目就搭起来了。下一章我们会把这些东西整合到一起,跑一次完整的仿真。

好,今天就到这里。记住,多动手试试,遇到问题别怕,踩坑也是学习的一部分。

可可精品资料库