路由文件(.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 本章知识体系

下面这张图,帮你理清路由文件的整体结构:

路由文件(.rou.xml)知识体系 <routes> vType 车辆类型 vehicle 单辆车 flow 车辆流 accel / decel sigma / length maxSpeed / color id / type / depart departLane route(固定路径) begin / end number / probability period(间隔) randomTrips 自动生成工具

嗯,这张图把路由文件的三个核心模块串起来了。你写路由文件时,就按这个结构来:先定义类型,再定义车辆或流,最后用randomTrips批量生成。

最后说一句:路由文件是仿真的灵魂。路网画得再漂亮,车流不合理,仿真结果就是一堆垃圾。我建议你每次写路由文件时,先画个草图,想清楚车从哪里来、到哪里去、走什么路径。想清楚了再动手写代码。

可可精品资料库