SUMO全称Simulation of Urban Mobility
,是一个开源、微观、多模态交通仿真模拟软件,可用于解决大的交通管理问题。本文简介该软件的安装方法及简单示例。
一、安装方法
安装方法非常简单,只要确保网络畅通,使用如下命令即可:
sudo add-apt-repository ppa:sumo/stable
sudo apt-get update
sudo apt-get install sumo sumo-tools sumo-doc
本文写作之日(2018年8月10日)安装的版本是0.32.0
,可以使用命令sumo -V
查看。
程序安装完毕后,直接在命令行终端中输入sumo
(纯命令行)或sumo-gui
(带图形化界面),即可打开该程序。
为避免运行程序时出现如下警告:
Warning: Environment variable SUMO_HOME is not set, schema resolution will use slow website lookups.
需要使用如下命令编辑配置文件,导出环境变量SUMO_HOME
:
vi ~/.bashrc
source ~/.bashrc
在文件最后一行增加:
export SUMO_HOME=/usr/share/sumo
二、简单示例
示例教程默认位于/usr/share/doc/sumo-doc/tutorial
目录,如果通过其他方法安装,位置不一定与此相同,可以借助如下命令查找:
sudo find / -name sumo-doc
下面介绍一个简单示例:Hello
,若采用默认安装方式,则数据位于/usr/share/doc/sumo-doc/tutorial/hello
目录。
在SUMO中,街道网络由节点(交汇点)和边(连接交汇点的街道)组成。 因此,如果需要创建一个具有两条街道的网络,彼此相继,我们需要三个节点和两条边,因为若只包含一条边,则路线是唯一的,也就不成为一个网络了。
2.1 节点(Node)
所有节点包含一个ID及位置(即笛卡尔坐标系下的x和y坐标,用于描述与原点的距离,以米为单位)属性。一个简单的节点文件如下所示:
<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>
可以使用任何一种文本编辑器进行编辑(我一般使用vi
编写配置文件,使用VSCode
编写代码文件),只要将其保存成后缀为.nod.xml
的文件即可。这里我们将其保存为hello.nod.xml
。
2.2 边(Edge)
节点需要用边来连接。 对于一个有向节点,很自然地能想到,需要一个ID
、源节点ID
以及目标节点ID
,具体格式如下 所示:
<edges>
<edge from="1" id="1to2" to="2" />
<edge from="2" id="out" to="3" />
</edges>
将此数据保存到名为hello.edg.xml
的文件中。
现在我们已经创建了两个节点和一条边,于是可以调用SUMO
包中的一个工具netconvert
来创建网络。
进入节点和边文件所在的目录,使用如下命令创建名为hello.net.xml
的网络。
netconvert --node-files=hello.nod.xml --edge-files=hello.edg.xml --output-file=hello.net.xml
2.3 路线(Route)
现在我已经建好最简单的一张交通网络,接下来还需要一辆车。在SUMO
中,车辆的基本属性包括:长度、加速度、减速度以及最大速度。此外还需要一个所谓的sigma
参数,用于引入一些随机行为(类似于信号中的噪声),将该值设置为0
能得到一辆完美控制的汽车(现实中不存在这样的车辆)。
现在为我们的汽车定义一条路线,目前这条线路非常简单,它只包含我们定义的两条边1to2
以及out
。
最后还需定义车辆的驾驶情况,例如:车辆从哪个节点出发,行驶路线怎样,如文件hello.rou.xml
所示:
<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>
2.4 配置
现在我们将上述信息全部写到一个名为hello.sumocfg
的配置文件中:
<configuration>
<input>
<net-file value="hello.net.xml"/>
<route-files value="hello.rou.xml"/>
</input>
<time>
<begin value="0"/>
<end value="10000"/>
</time>
</configuration>
2.5 在模拟器中运行配置
使用如下命令在SUMO
模拟器中运行(不带图形化显示):
sumo -c hello.sumocfg
带图形化显示的命令如下:
sumo-gui -c hello.sumocfg
使用GUI进行模拟时,在配置文件hello.sumocfg
中添加一个额外的配置项gui-settings
非常有用,这样就无需在启动程序后更改设置:
<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>
配置项gui-settings
中包含的文件hello.settings.xml
内容如下所示:
<viewsettings>
<viewport y="0" x="250" zoom="100"/>
<delay value="100"/>
</viewsettings>
这里我们使用视口(viewport
)来设置摄像头位置,使用延迟(delay
)来设置每个步骤之间的模拟延迟(以ms为单位)。
在GUI中的界面如下,因为示例太简单,实在没有什么好看的效果: