路由文件(.rou.xml):车辆类型定义、车辆与流定义、使用randomTrips生成随机车流
路由文件,说白了就是告诉SUMO:谁要上路?走哪条路?什么时候走?
我刚开始接触SUMO时,觉得路网文件最复杂。后来才发现,真正决定仿真效果的,其实是路由文件。你路网画得再漂亮,车流不合理,仿真结果一样没法看。
3.1 车辆类型定义(vType)
车辆类型,就是给车贴标签。是轿车还是卡车?是暴躁司机还是佛系车主?
我个人习惯,在写任何车辆流之前,先把vType定义好。就像写代码先声明变量一样,后面用起来才顺手。
<vType id="car" accel="2.6" decel="4.5" sigma="0.5" length="4.5" maxSpeed="50"/>
<vType id="truck" accel="1.2" decel="3.0" sigma="0.3" length="10.0" maxSpeed="30"/>
<vType id="bus" accel="1.0" decel="2.5" sigma="0.2" length="12.0" maxSpeed="25" color="1,0,0"/>
这里每个参数都有讲究:
- accel:最大加速度。数值越大,起步越猛
- decel:最大减速度。数值越大,刹车越狠
- sigma:驾驶不完美度。0是完美司机,1是疯子司机
- length:车身长度。影响跟车模型
- maxSpeed:最高速度。单位m/s
我的经验:sigma值别设太大。我曾经设成0.8,结果仿真里车辆像喝醉了一样左右摇摆。实际道路上,sigma在0.3-0.5之间比较真实。
3.2 车辆定义(vehicle)
车辆定义,就是具体的一辆车。它从哪出发,到哪去,什么时候出发。
<vehicle id="v1" type="car" depart="0" departLane="best">
<route edges="edge1 edge2 edge3"/>
</vehicle>
<vehicle id="v2" type="truck" depart="10" departLane="random">
<route edges="edge1 edge4 edge5"/>
</vehicle>
关键属性:
- id:车辆唯一标识。不能重复
- type:引用上面定义的vType
- depart:出发时间。单位秒
- departLane:出发车道。best/random/0/1等
- route:行驶路径。按顺序经过的路段ID
注意:route里的路段必须首尾相连。我曾经犯过这个错——路段没连上,结果车辆卡在路口不动,我还以为是路网画错了,查了半天才发现是路由写错了。
3.3 车辆流定义(flow)
一辆一辆定义太麻烦?那就用流。流就是告诉SUMO:每隔多久发一辆车,发多少辆。
<flow id="flow_car" type="car" begin="0" end="3600" number="1000">
<route edges="edge1 edge2 edge3"/>
</flow>
<flow id="flow_truck" type="truck" begin="0" end="3600" probability="0.1">
<route edges="edge1 edge4 edge5"/>
</flow>
两种控制方式:
- number:指定总车辆数。系统自动均匀分布
- probability:指定每秒发车概率。适合模拟随机车流
| 属性 | 说明 | 示例 |
|---|---|---|
| begin | 开始时间 | begin="0" |
| end | 结束时间 | end="3600" |
| number | 总车辆数 | number="500" |
| probability | 每秒发车概率 | probability="0.2" |
| period | 发车间隔 | period="3" |
核心区别:number是总量控制,probability是概率控制。做交通仿真时,我一般用probability模拟真实交通流,用number做压力测试。
3.4 使用randomTrips生成随机车流
手动写路由文件?几百辆车还行,几千辆呢?手写会疯的。
SUMO自带的randomTrips工具,就是干这个的。你给它一个路网,它自动生成随机车流。
python tools/randomTrips.py -n mynet.net.xml -r myroutes.rou.xml -e 3600 -p 2
参数说明:
- -n:路网文件
- -r:输出路由文件
- -e:仿真结束时间(秒)
- -p:发车间隔(秒)
- --flows:生成流定义而非单辆车
- --vtype:指定车辆类型
举个例子,生成1小时仿真,每3秒发一辆车:
python tools/randomTrips.py -n mynet.net.xml -r myroutes.rou.xml -e 3600 -p 3 --flows
生成的文件里,你会看到类似这样的内容:
<routes>
<vType id="DEFAULT_VEHTYPE" accel="2.6" decel="4.5" sigma="0.5" length="2.5" maxSpeed="70"/>
<flow id="flow_0" type="DEFAULT_VEHTYPE" begin="0" end="3600" period="3">
<route edges="edge1 edge2 edge3"/>
</flow>
</routes>
我的习惯:先用randomTrips生成基础车流,再手动修改vType和flow参数。这样既省时间,又能精细控制。比如把10%的车改成卡车,5%的车改成公交车。
3.5 路由文件完整示例
把上面所有知识点串起来,一个完整的路由文件长这样:
<?xml version="1.0" encoding="UTF-8"?>
<routes>
<!-- 车辆类型定义 -->
<vType id="car" accel="2.6" decel="4.5" sigma="0.5" length="4.5" maxSpeed="50" color="0,0,1"/>
<vType id="truck" accel="1.2" decel="3.0" sigma="0.3" length="10.0" maxSpeed="30" color="1,0,0"/>
<vType id="bus" accel="1.0" decel="2.5" sigma="0.2" length="12.0" maxSpeed="25" color="1,1,0"/>
<!-- 单辆车定义 -->
<vehicle id="v_special" type="bus" depart="0" departLane="best">
<route edges="edge1 edge2 edge3"/>
</vehicle>
<!-- 车辆流定义 -->
<flow id="flow_car" type="car" begin="0" end="3600" probability="0.5">
<route edges="edge1 edge2 edge3"/>
</flow>
<flow id="flow_truck" type="truck" begin="0" end="3600" probability="0.1">
<route edges="edge1 edge4 edge5"/>
</flow>
</routes>
避坑指南:我曾经在项目里把vType的id写成了"car"和"Car",结果SUMO区分大小写,导致车辆类型没匹配上。仿真跑起来全是默认车型,颜色也不对。查了半小时才发现是大小写的问题。
3.6 本章知识体系
下面这张图,帮你理清路由文件的整体结构:
嗯,这张图把路由文件的三个核心模块串起来了。你写路由文件时,就按这个结构来:先定义类型,再定义车辆或流,最后用randomTrips批量生成。
最后说一句:路由文件是仿真的灵魂。路网画得再漂亮,车流不合理,仿真结果就是一堆垃圾。我建议你每次写路由文件时,先画个草图,想清楚车从哪里来、到哪里去、走什么路径。想清楚了再动手写代码。
可可精品资料库