第四节:配置文件(.sumocfg)——仿真的总指挥
好,咱们继续。前面几节我们把路网、车流、检测器都准备好了,就像把食材、调料、锅碗瓢盆都摆上了台面。但谁来指挥这一切?谁来告诉SUMO“先放油,再下菜,火候多大”?
答案就是——.sumocfg配置文件。
我个人习惯,每次新建仿真项目,第一件事就是写好这个cfg文件。它就像一份总清单,告诉SUMO:你要加载哪些文件、输出什么结果、仿真跑多久、步长多少。没有它,SUMO连门都找不到。
4.1 配置文件长什么样?
说白了,.sumocfg就是一个XML格式的文本文件。你拿记事本就能写。它的根节点是<configuration>,里面包含几个核心模块。
我直接给你看一个我常用的模板:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!-- 输入文件绑定 -->
<input>
<net-file value="mynet.net.xml"/>
<route-files value="myroutes.rou.xml"/>
<additional-files value="myadd.xml"/>
</input>
<!-- 仿真时间设置 -->
<time>
<begin value="0"/>
<end value="3600"/>
</time>
<!-- 输出文件 -->
<output>
<tripinfo-output value="tripinfo.xml"/>
<summary-output value="summary.xml"/>
</output>
<!-- 仿真参数 -->
<processing>
<time-to-teleport value="300"/>
<default.speeddev value="0.1"/>
</processing>
</configuration>
嗯,这里要注意:additional-files是可选的,但如果你有检测器、交通灯方案、公交线路等,就得放这里。我曾经漏掉这个,结果跑完发现检测器数据全是空的——白跑了一整天。
4.2 输入文件绑定——把食材端上桌
配置文件最核心的任务,就是告诉SUMO去哪里找输入文件。这部分放在<input>标签里。
| 标签 | 作用 | 必填? |
|---|---|---|
<net-file> |
路网文件,定义道路拓扑 | 是 |
<route-files> |
车流文件,定义车辆和路径 | 是 |
<additional-files> |
附加文件,检测器、交通灯、公交等 | 否 |
你想想看,如果路网文件路径写错了,SUMO会直接报错退出。我建议你养成好习惯:所有文件都放在cfg文件同目录下,或者用相对路径。绝对路径一换电脑就废了,我吃过这个亏。
value="detectors.xml; trafficlights.xml; busstops.xml"。但别写太多,否则加载会变慢。
4.3 输出文件绑定——把结果记下来
仿真跑完了,数据得存下来吧?这部分在<output>标签里。常用的输出类型有:
- tripinfo-output:每辆车的完整行程信息(出发时间、到达时间、行驶距离、等待时间等)
- summary-output:每个仿真步长的全局统计(车辆总数、平均速度、排队长度等)
- vehroute-output:车辆的实际行驶路径
- emission-output:排放数据(CO2、NOx等)
我个人习惯,调试阶段只开tripinfo和summary,够用了。正式跑大规模仿真时,我会选择性关闭一些输出——不然硬盘分分钟被撑爆。我记得有一次跑24小时仿真,忘了关vehroute-output,结果生成了30GB的XML文件……嗯,从那以后我长记性了。
tripinfo_20250101.xml。
4.4 仿真参数设置——调火候
这部分在<processing>和<time>标签里。说白了,就是告诉SUMO仿真怎么跑。
时间参数
<begin>:仿真开始时间(秒)。通常从0开始。<end>:仿真结束时间(秒)。比如3600就是1小时。<step-length>:仿真步长(秒)。默认1秒,你可以改成0.5秒提高精度,但会慢一些。
处理参数
<time-to-teleport>:车辆卡住多久后“瞬移”走(秒)。默认300秒。我建议设小一点,比如120秒,否则堵车时仿真会卡死。<default.speeddev>:速度偏差系数。默认0.1,表示车速在限速的±10%范围内波动。设成0就是所有车都开一样快——不真实。<threads>:并行计算线程数。多核CPU可以设成4或8,跑得快。
4.5 知识体系总览
为了让你一眼看清配置文件的结构,我画了张图:
这张图你看懂了吗?configuration下面挂四个孩子:input管输入,time管时间,output管输出,processing管仿真行为。每个孩子下面又有自己的参数。结构清晰,层次分明。
4.6 一个完整的实战例子
最后,我给你一个我实际用过的配置文件。这是一个城市主干道的仿真,跑30分钟,输出车辆行程和全局统计:
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<input>
<net-file value="city_main_road.net.xml"/>
<route-files value="morning_rush.rou.xml"/>
<additional-files value="loop_detectors.xml; traffic_lights.xml"/>
</input>
<time>
<begin value="0"/>
<end value="1800"/>
<step-length value="1.0"/>
</time>
<output>
<tripinfo-output value="tripinfo_1800s.xml"/>
<summary-output value="summary_1800s.xml"/>
</output>
<processing>
<time-to-teleport value="120"/>
<default.speeddev value="0.15"/>
<threads value="4"/>
</processing>
</configuration>
你直接复制这个,改改文件名和参数就能用。我刚开始学SUMO时,就是靠这种模板一点点改出来的。别怕出错——SUMO报错信息其实挺友好的,它会告诉你哪一行写错了。
<net-file>写成了<netfile>,结果SUMO报“无法找到输入文件”。检查了半小时才发现少了个横杠。XML标签名是大小写敏感的,而且横杠不能少。切记!
好了,配置文件这块就讲到这里。你只要记住:cfg文件就是仿真的总指挥,它告诉SUMO“用什么、跑多久、存哪里、怎么跑”。把这四个问题回答清楚,你的仿真就能顺利跑起来。