1. Hello SUMO
构建最简单的网络,让一辆汽车在上面行驶。
Nodes 文件
<nodes>
<node id="1" x="-250.0" y="0.0" />
<node id="2" x="+250.0" y="0.0" />
<node id="3" x="+251.0" y="0.0" />
</nodes>
保存为 hello.nod.xml
Edges 文件
<edges>
<edge from="1" id="1to2" to="2" />
<edge from="2" id="out" to="3" />
</edges>
保存为 hello.edg.xml
Net 文件
生成道路网络,名称为hello.net.xml
netconvert --node-files=hello.nod.xml --edge-files=hello.edg.xml --output-file=hello.net.xml
Routes 文件
<routes>
<vType accel="1.0" decel="5.0" id="Car" length="2.0" maxSpeed="100.0" sigma="0.0" />
<route id="route0" edges="1to2 out"/>
<vehicle depart="1" id="veh0" route="route0" type="Car" />
</routes>
保存为 hello.rou.xml
其中参数 sigma 由于汽车跟随模型的使用而引入的一些随机行为
配置文件
<configuration>
<input>
<net-file value="hello.net.xml"/>
<route-files value="hello.rou.xml"/>
</input>
<time>
<begin value="0"/>
<end value="10000"/>
</time>
</configuration>
保存为 hello.sumocfg
开始仿真
使用命令行开始仿真
sumo -c hello.sumocfg
也可以使用 GUI
sumo-gui -c hello.sumocfg
使用 GUI 进行仿真前,你可以添加一个 gui-settings 文件,这样你在开始程序之后,就可以不必再更改设置。为了实现这些,可以像如下这样更改 hello.sumocfg
<configuration>
<input>
<net-file value="hello.net.xml"/>
<route-files value="hello.rou.xml"/>
<gui-settings-file value="hello.settings.xml"/>
</input>
<time>
<begin value="0"/>
<end value="10000"/>
</time>
</configuration>
然后使用 viewsettings 创建一个新文件
<viewsettings>
<viewport y="0" x="250" zoom="100"/>
<delay value="100"/>
</viewsettings>
保存为 hello.settings.xml
这里我们使用 viewport 来设置摄像机位置,使用 delay 来设置模拟的每一步之间的延迟(ms)。
2. 高速公路教程
加载 gui 配置文件
可以将视图设置导出到一个额外的 xml 文件中,并在模拟启动时加载它。在导出时,可以选中在导出中包含延迟的复选框。要保存当前的可视化方案,请单击视图设置对话框中的保存图标,并将其保存为 autobahn.view.xml。
<configuration>
<input>
<gui-settings-file value="autobahn.view.xml"/>
</input>
</configuration>
3. 场景指导
创建道路网络
每次仿真都需要一个道路网络。netconvert 用来创建可以用于 sumo 仿真的路网,netedit 提供一个图像化的用户交互界面,也可以建立或修改一个仿真路网。
- 如果你已经有路网数据
检查是否可以直接导入,否则你需要将数据转换成 netconvert 可读的 XML 格式。(具体操作方法详见说明文档) - 如果你没有路网数据
使用来自 OpenStreetMap 的公开可用路网数据。(具体操作方法详见说明文档)
生成交通
首先你应该了解车辆车辆模型的基础信息。在地图中倒车入车辆有多种方法。基于你拥有的车辆信息类型来选择导入方法。
改善你的场景
大多是导入路网的方法都存在网路质量不好的问题。
- 修改路网
你将为路网数据做补丁以添加多余的道路,禁止一些转弯,修正车道的数量并且添加或移除一些交通信号灯。推荐的执行方法包括:- 在编码中更改,大多数xml属性是可选的,所以你只需要设置想要更改的值。
- 通过加载 net.xml 和纯 xml 文件,使用 netconvert 对网络进行补丁。您甚至可以在初始导入过程中使用它(即加载一个 osm 文件以及您的纯 xml 文件)
- 直接用 GUI 调整你的网络:打开 netedit 程序后,你加载需要修改的网络文件(*.net.xml)。然后在netedit中选择相应的功能来修改,例如车道的数量、道路形状、交通信号图、十字路口的几何形状,以及组合十字路口或边缘。
- 示例:修改节点类型
准备这样的文件
patch.nod.xml :
<nodes>
<node id="id_of_the_node_you_want_to_modify" type="right_before_left"/>
<nodes>
像这样对路网进行补丁
netconvert --sumo-net-file your.net.xml --node-files patch.nod.xml -o yourpatched.net.xml
或者在初始导入时执行补丁:
netconvert --osm-file yourOSMfile.xml --node-files patch.nod.xml ...<other options>
- 通过 plain.xml 修改导入的网络
除了修补单个的元素,你还可以将你的网络转换成 plain.xml,然后修改 plain 文件,然后像这样重新组装网络:
netconvert --sumo-net-file your.net.xml --plain-output-prefix yourplain
或在导入时:
netconvert --osm-files yourOSMinput.xml --plain-output-prefix yourplain ... <your other options>
你会得到这些文件:
yourplain.edg.xml
yourplain.nod.xml
yourplain.con.xml
yourplain.tll.xml
你可以编辑这些文件,然后重新装配网络通过加载其中的部分或全部:
netconvert --edge-files yourplain.edg.xml --node-files yourplain.nod.xml -o new.net.xml
或
netconvert --edge-files yourplain.edg.xml --node-files yourplain.nod.xml --connection-files yourplain.con.xml -o new.net.xml
注意:
当使用基于OSM输入的网络时,.edg.xml 文件将包含边界的 OSM 类型的信息(例如highway.residential)。当使用 netconvert 加载这样的 .edg.xml 文件时,需要提供选项 --ignore-errors.edge-type。边类型或加载类型文件,以防止 Type … not defined。
- 在sumolib的帮助下修改节点位置
Sumolib是一个用于处理SUMO文件的python库。可以随机改变所有节点的位置
信号灯程序
在几乎所有的情况下,交通灯程序将被 netconvert 估计,并得出不同于真正的交通灯。改善红绿灯程序的一个简单方法是让它们在不同的时间启动程序周期。尝试使用选项 --tls.half-offset 和其他所有 netconvert 选项的 --tls.*
改进交通灯的一种更实用、更有效的方法是使用 tls.xml 文件显式地提供程序。
此时,netconvert 只支持创建静态红绿灯程序。
管理场景
如果你有 A.net.xml 和 B.net.xml 两个路网文件,,你希望找到它们的不同之处。这可以使用 <SUMO_HOME>/tools/net/netdiff.py 工具完成。运行这个工具将为您提供一组纯 xml 差异文件。它们只包含通过删除、创建和更改元素的差异。甚至可以将这些文件与 A.net.xml 一起加载,以重新创建 B.net.xml。