使用 SUMO 进行仿真(1)-快速入门

王 茂南 2021年9月23日07:45:32
评论
4092字阅读13分38秒
摘要本文会介绍 SUMO。主要是从 node 和 edge 文件开始,一步一步新建 network,route,最后完整路网和车流的生成。

简介

这一篇会简单介绍一下 SUMO 使用的整个流程,来进行快速入门 SUMO。包括 node 和 edge 文件的介绍。同时介绍 NetEdit 的使用,用来生成编辑路网文件。整个内容是根据 Hello SUMO 改编来的,在他的基础上增加了一个信号灯。

在开始下面实验之前,首先在 SUMO 的官网进行下载,Simulation of Urban MObility

参考链接

 

Hello SUMO

在这个实验中,我们构建一个最简单的网络。同时,只让一辆小车在其中通行。在 SUMO 中,一个street 包含若干个 nodes(junctions)和 edges(连接 junctions 的边)。因此, 如果我们想要构建一个network 有 4 条 street,我们需要 4 个节点(node)和 4 条边(edge)。

最终构建完成的 network 如下所示:

使用 SUMO 进行仿真(1)-快速入门

Node 文件介绍

首先我们创建一个 hello.nod.xml 的文件, 注意这里 .nod.xml 的文件就是用来存放 node 的信息的。 这个文件包含 4node 的信息。注意我们将 node3 定义为信号灯类型(type=traffic_light)。

  1. <nodes>
  2.     <node id="1" x="-250.0" y="0.0" />
  3.     <node id="2" x="+0.0" y="0.0" />
  4.     <node id="3" x="+250.0" y="0.0" type="traffic_light" />
  5.     <node id="4" x="+250.0" y="-100.0" />
  6. </nodes>

 

Additional 文件介绍

为了定义红绿灯的时长等,我们可以新建一个 hello.additional.xml 文件(也就是 .additional.xml 文件),保存每个相位的时间。下面的例子表示绿灯时长为 3 秒,黄灯时长为 1 秒,红灯时长为 3 秒。

  1. <additional>
  2.     <tlLogic id="3" type="static" programID="0" offset="0">
  3.         <phase duration="3" state="G"/>
  4.         <phase duration="1"  state="y"/>
  5.         <phase duration="3" state="r"/>
  6.     </tlLogic>
  7. </additional>

.additional.xml文件除了可以设置信号灯时长之外,还可以设置探测器等。这些我们会在后面进行介绍。

 

Edge 文件介绍

接着我们创建一个 hello.edg.xml 文件,这里的 .edge.xml 是用来存放 edge 的信息。这里会包含 fromto, 这里的 fromto 中都是 node id。也就是每一辆车会从 fromnodetonode 的位置。

  1. <edges>
  2.     <edge from="1" id="1to2" to="2" />
  3.     <edge from="2" id="2to3" to="3" />
  4.     <edge from="3" id="3to4" to="4" />
  5.     <edge from="1" id="1to4" to="4" />
  6. </edges>

 

Network 的介绍

在创建了 NodeEdge 两个文件后,我们需要使用 SUMO tool 来构建一个 network。需要确保 netconvertPATH 中。下面是没有信号灯的配置文件的生成版本:

  1. netconvert --node-files=hello.nod.xml --edge-files=hello.edg.xml --output-file=hello.net.xml

如果加上信号灯的配置文件,我们需要加上参数设置 tllogic-files

  1. 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 查看即可,可以看到如下图所示的结构:

使用 SUMO 进行仿真(1)-快速入门

查看信号灯

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

使用 SUMO 进行仿真(1)-快速入门

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

使用 SUMO 进行仿真(1)-快速入门

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

使用 SUMO 进行仿真(1)-快速入门

查看车道 ID

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

使用 SUMO 进行仿真(1)-快速入门

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

使用 SUMO 进行仿真(1)-快速入门

 

Route 文件的介绍

现在我们已经有了一个 network 文件。这个 network 文件相当于是路的基础结构,现在我们需要定义一些 route 的信息。route 文件中主要包括车辆的信息,和车辆是如何行驶的(具体的路径)。

在SUMO中,一辆车有一些基本的属性,例如长度(length),加速与减速(acceleration and deceleration),最大速度(maximum speed)。同时会有一个参数 sigma 来引入一些随机的量。(关于 Route 部分的详细内容查看链接,Definition of Vehicles, Vehicle Types, and Routes)

下面我们新建一个 hello.rou.xml 的文件。里面有两辆车的信息,和两辆车行驶路径的信息。

  1. <routes>
  2.     <vType accel="1.0" decel="1.0" id="Car1" length="5.0" maxSpeed="10.0" sigma="0.0" /> <!--id表示第一种类型的车-->
  3.     <vType accel="5.0" decel="1.0" id="Car2" length="7.0" maxSpeed="10.0" sigma="0.0" /> <!--id表示第一种类型的车-->
  4.     <route id="route0" edges="1to2 2to3 3to4"/>
  5.     <route id="route1" edges="1to4"/>
  6.     <vehicle depart="1" id="veh0" route="route0" type="Car1" />
  7.     <vehicle depart="2" id="veh1" route="route1" type="Car2" />
  8. </routes>

 

Configuration

最后我们配置 configure 文件。这个文件主要用来指定 network 文件, route 文件,additional 文件,仿真开始和结束的时间等。

同时,我们可以设置一个 viewsettings 的文件,控制我们打开 SUMO GUI 的时候中心的坐标和坐标。我们新建一个 hello.setting.xml 的文件保存 viewsetting 的内容,如下所示:

  1. <viewsettings>
  2.     <viewport y="0" x="250" zoom="100"/>
  3.     <delay value="100"/>
  4. </viewsettings>

之后我们再定义我们的配置文件,保存为 hello.sumocfg(这里配置文件的后缀都是 .sumocfg

  1. <configuration>
  2.     <input>
  3.         <net-file value="hello.net.xml"/>
  4.         <route-files value="hello.rou.xml"/>
  5.         <gui-settings-file value="hello.settings.xml"/>
  6.     </input>
  7.     <time>
  8.         <begin value="0"/>
  9.         <end value="10000"/>
  10.     </time>
  11. </configuration>

之后运行的时候,执行下面命令即可。下面是带 GUI 的, 去掉 GUI 执行就是不带界面的:

  1. sumo-gui -c hello.sumocfg

在 GUI 的界面内,我们可以选择模式。这里我们选择是 real world:

使用 SUMO 进行仿真(1)-快速入门

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

使用 SUMO 进行仿真(1)-快速入门

 

NetEdit 的使用介绍

查看信号灯的信息

首先我们点击上方的红绿灯的标志:

使用 SUMO 进行仿真(1)-快速入门

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

使用 SUMO 进行仿真(1)-快速入门

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

使用 SUMO 进行仿真(1)-快速入门

 

修改车道之间的 connection

点击如下图所示的按钮:

使用 SUMO 进行仿真(1)-快速入门

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

使用 SUMO 进行仿真(1)-快速入门

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

使用 SUMO 进行仿真(1)-快速入门

一些存在的问题

在 SUMO GUI 中无法输入文字

我们想要修改 junction id,有时会发现无法输入的情况。这个时候只需要将输入法切换为英文输入法即可

  • 微信公众号
  • 关注微信公众号
  • weinxin
  • QQ群
  • 我们的QQ群号
  • weinxin
王 茂南
  • 本文由 发表于 2021年9月23日07:45:32
  • 转载请务必保留本文链接:https://mathpretty.com/12816.html
匿名

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: