文章目录(Table of Contents)
简介
这一篇会简单介绍一下 SUMO
使用的整个流程,来进行快速入门 SUMO
。包括 node
和 edge
文件的介绍。同时介绍 NetEdit
的使用,用来生成编辑路网文件。整个内容是根据 Hello SUMO
改编来的,在他的基础上增加了一个信号灯。
在开始下面实验之前,首先在 SUMO
的官网进行下载,Simulation of Urban MObility。如果想要下载最新的版本,可以在 SUMO - Latest Development Version 中找到。traci
,sumolib
,libsumo
等可以通过下面的命令进行安装:
- pip install -U -i https://test.pypi.org/simple/ eclipse-sumo
- pip install -U -i https://test.pypi.org/simple/ traci sumolib libsumo
其中 eclipse-sumo
中包含最新的 SUMO
的二进制文件,安装完之后只需要在 sumolib.checkBinary
指定 bindir
参数即可。
Ubuntu 下安装 SUMO
Linux 下的安装可以参考链接 Downloads-SUMO。下面是简单的说明。使用以下的命令进行安装:
- sudo add-apt-repository ppa:sumo/stable
- sudo apt-get update
- sudo apt-get install sumo sumo-tools sumo-doc
如果安装过慢,可以在安装的时候加上代理,如下所是:
- sudo apt-get install -o Acquire::http::Proxy="http://xxx" sumo sumo-tools sumo-doc
安装完毕之后,我们需要在环境变量中设置 SUMO_HOME
,可以直接在命令行里输入下面的命令:
- export SUMO_HOME="/your/path/to/sumo/"
在 Ubuntu
中,路径可以设置为 /usr/share/sumo
。如果想要永久生效,则可以修改 shell profile
文件,例如在 ~/.bashrc
中添加下面的内容即可(关于环境变量的设置,可以参考链接 Linux 环境变量):
- export SUMO_HOME="/usr/share/sumo"
安装完毕之后,可以使用以下的命令进行验证,验证「环境变量」与「SUMO」是否安装成功。如果设置正确,最终的效果如下所是:

参考链接
SUMO
的下载地址, SUMO DownloadsSUMO
官方教程说明(这个教程十分建议查看一下), SUMO Tutorials- 在
Ubuntu
下的安装教程,ubuntu18安装SUMO SUMO
的使用,SUMO Command- 第一个
SUMO
的实验, Tutorials/Hello SUMO - 本实验所有的文件见
GitHub
, Github, Sumo Tutorial
Hello SUMO
在这个实验中,我们构建一个最简单的网络。同时,只让一辆小车在其中通行。在 SUMO 中,一个street 包含若干个 nodes(junctions)和 edges(连接 junctions 的边)。因此, 如果我们想要构建一个network 有 4 条 street,我们需要 4 个节点(node)和 4 条边(edge)。
最终构建完成的 network 如下所示:

Node 文件介绍
首先我们创建一个 hello.nod.xml 的文件, 注意这里 .nod.xml
的文件就是用来存放 node
的信息的。 这个文件包含 4
个 node
的信息。注意我们将 node3
定义为信号灯类型(type=traffic_light
)。
- <nodes>
- <node id="1" x="-250.0" y="0.0" />
- <node id="2" x="+0.0" y="0.0" />
- <node id="3" x="+250.0" y="0.0" type="traffic_light" />
- <node id="4" x="+250.0" y="-100.0" />
- </nodes>
Additional 文件介绍
为了定义红绿灯的时长等,我们可以新建一个 hello.additional.xml 文件(也就是 .additional.xml
文件),保存每个相位的时间。下面的例子表示绿灯时长为 3 秒,黄灯时长为 1 秒,红灯时长为 3 秒。
- <additional>
- <tlLogic id="3" type="static" programID="0" offset="0">
- <phase duration="3" state="G"/>
- <phase duration="1" state="y"/>
- <phase duration="3" state="r"/>
- </tlLogic>
- </additional>
.additional.xml
文件除了可以设置信号灯时长之外,还可以设置探测器等。这些我们会在后面进行介绍。
Edge 文件介绍
接着我们创建一个 hello.edg.xml
文件,这里的 .edge.xml
是用来存放 edge
的信息。这里会包含 from
和 to
, 这里的 from
和 to
中都是 node id
。也就是每一辆车会从 from
的 node
到 to
的 node
的位置。
- <edges>
- <edge from="1" id="1to2" to="2" />
- <edge from="2" id="2to3" to="3" />
- <edge from="3" id="3to4" to="4" />
- <edge from="1" id="1to4" to="4" />
- </edges>
Network 的介绍
在创建了 Node
和 Edge
两个文件后,我们需要使用 SUMO tool
来构建一个 network
。需要确保 netconvert
在 PATH
中。下面是没有信号灯的配置文件的生成版本:
- netconvert --node-files=hello.nod.xml --edge-files=hello.edg.xml --output-file=hello.net.xml
如果加上信号灯的配置文件,我们需要加上参数设置 tllogic-files
:
- netconvert --node-files=hello.nod.xml --edge-files=hello.edg.xml --tllogic-files=hello.additional.xml --output-file=hello.net.xml
我们这里使用第二种方式,也就是加上信号灯来生成 .net.xml
文件。此时会生成一个 hello.net.xml
的文件,我们可以使用 NetEdit
打开该文件查看构建的 network
。点击 File->Open Network
查看即可,可以看到如下图所示的结构:

查看信号灯
我们还可以切换到信号灯的模式下,查看信号灯的相位情况。首先切换到信号灯的状态:

接着有红绿灯的路口(junction
)会出现红绿灯的标志:

我们点击红绿灯,就可以查看不同 state
对应的信号灯的变化。可以看到用红色框框出的部分就是 state
的情况。点击不同的 state
,右侧会在图像中有相应的表示(哪些车道是通行的)。我们可以在这个界面修改信号灯的时长,:

查看车道 ID
我们还可以查看每一个车道的 ID
。如下所示,点击「感叹号」的按钮,再把鼠标放在路网上就可以看到 edge id
。下面是查看的 lane id
(每一个 edge
会有一个或是多个 lane
组成)

同时如果我们希望复制 edge id
或是 lane id
,我们可以「右键」进行复制(有的时候这个 edge id
还是会比较复杂,完全自己打字会比较麻烦,而且容易出错)

Route 文件的介绍
现在我们已经有了一个 network
文件。这个 network
文件相当于是路的基础结构,现在我们需要定义一些 route
的信息。route 文件中主要包括车辆的信息,和车辆是如何行驶的(具体的路径)。
在SUMO中,一辆车有一些基本的属性,例如长度(length),加速与减速(acceleration and deceleration),最大速度(maximum speed)。同时会有一个参数 sigma 来引入一些随机的量。(关于 Route 部分的详细内容查看链接,Definition of Vehicles, Vehicle Types, and Routes)
下面我们新建一个 hello.rou.xml
的文件。里面有两辆车的信息,和两辆车行驶路径的信息。
- <routes>
- <vType accel="1.0" decel="1.0" id="Car1" length="5.0" maxSpeed="10.0" sigma="0.0" /> <!--id表示第一种类型的车-->
- <vType accel="5.0" decel="1.0" id="Car2" length="7.0" maxSpeed="10.0" sigma="0.0" /> <!--id表示第一种类型的车-->
- <route id="route0" edges="1to2 2to3 3to4"/>
- <route id="route1" edges="1to4"/>
- <vehicle depart="1" id="veh0" route="route0" type="Car1" />
- <vehicle depart="2" id="veh1" route="route1" type="Car2" />
- </routes>
Configuration
最后我们配置 configure
文件。这个文件主要用来指定 network
文件, route
文件,additional
文件,仿真开始和结束的时间等。
同时,我们可以设置一个 viewsettings
的文件,控制我们打开 SUMO GUI
的时候中心的坐标和坐标。我们新建一个 hello.setting.xml
的文件保存 viewsetting
的内容,如下所示:
- <viewsettings>
- <viewport y="0" x="250" zoom="100"/>
- <delay value="100"/>
- </viewsettings>
之后我们再定义我们的配置文件,保存为 hello.sumocfg(这里配置文件的后缀都是 .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>
之后运行的时候,执行下面命令即可。下面是带 GUI
的, 去掉 GUI
执行就是不带界面的:
- sumo-gui -c hello.sumocfg
我们可以在仿真的时候不显示 warning
,不显示仿真的步数等。关于详细的 SUMO
的命令,可以查看链接,SUMO Command,下面是几个常用的介绍:
time-to-teleport
,车辆转移(消失)的时间。如果车辆停止超过一定时间,就会自动消失;no-warnings
,不显示 warning;no-step-log
,不在终端显示仿真过程的信息,仿真步数等;
- sumo -c hello.sumocfg -r 10000.rou.xml --time-to-teleport 1000 --no-warnings --no-step-log
在 GUI
的界面内,我们可以选择模式。这里我们选择是 real world
:

最终的运行结果如下所示,黄色的表示汽车:

NetEdit 的使用介绍
查看信号灯的信息
首先我们点击上方的红绿灯的标志:

接着点击我们想要查看的路口处的红绿灯,如下图所示:

之后就会出现该路口的每一个 phase 的 state,对应那几条lane是可以通行的。同时也会有每一个phase 的持续时间。

修改车道之间的 connection
点击如下图所示的按钮:

此时车道会变成下面的样子,

接着我们点击要修改的车道。首先点击的是起点的位置,接着点击后一个位置会取消当前的connection,再点击我们想要进行连接的地方即可。(这里说的有点不是很清楚, 尝试一下即可)

一些存在的问题
设置 SUMO_HOME
想要临时设置 SUMO_HOME
,可以直接在命令行里输入下面的命令:
- export SUMO_HOME="/your/path/to/sumo/"
在 Ubuntu 中,路径可以设置为 /usr/share/sumo
。如果想要永久生效,则可以修改 shell profile
文件,例如在 ~/.bashrc
中添加下面的内容即可(关于环境变量的设置,可以参考链接 Linux 环境变量):
- export SUMO_HOME="/usr/share/sumo"
关于不同系统 SUMO_HOME
的设置,可以参考官方的文档,Configuring Path Settings。
在 SUMO GUI 中无法输入文字
我们想要修改 junction id,有时会发现无法输入的情况。这个时候只需要将输入法切换为英文输入法即可。
- 微信公众号
- 关注微信公众号
-
- QQ群
- 我们的QQ群号
-
评论