SUMOlympics

1、场景描述

  • 对单个道路划分为普通车道、有轨电车车道、公交车车道、自行车车道和人y行道,定义相应的车辆和行人,并将该道路切分为2段,重命名为"beg"、“end”,其中“end”道路长度100m,在分段节点处设置一个简易的红绿灯,其相位分别是“rrrrr”–100s,“GGGGG”–1000s(自定义),所有车辆和行人在红绿灯处准备出发,进行100m竞速比赛。

2、实现流程

①利用NetEdit编辑器创建基本道路、特殊道路

  • 特殊车道的设置如下图所示,依次重复下图步骤,单机其他车道,将允许的车辆设置为“bus”、“bicycle”、“pedestrian”

在这里插入图片描述
②车辆、行人的定义

  • 车辆的定义,保存为***.rou.xml文件:
<routes>
	<!--passenger为普通汽车,并非行人-->
    <vType id="pkw"  vClass="passenger" length="5" maxSpeed="50" accel="2.6" decel="4.5" sigma="0.2" speedDev="0.2" />
	<vType id="bus"  vClass="bus" length="15" maxSpeed="30" accel="1.2" decel="2.5" sigma="0.1" speedDev="0.1" />
	<vType id="tram" vClass="tram" length="40" maxSpeed="13" accel="0.8" decel="0.5" sigma="0.1" speedDev="0.1" />
	<vType id="bike" vClass="bicycle" length="1.8" width="0.8" maxSpeed="7.5" accel="0.8" decel="1.5" sigma="0.5" speedDev="0.5" />
	
	<flow id="pkw"  type="pkw" from="beg" to="end" begin="0" end="0"  number="66" color="1,1,0"/>
	<flow id="bus"  type="bus" from="beg" to="end" begin="0" end="0" number="5" departPos="last" color="0.5,0.1,0"/>
	<flow id="tram" type="tram" from="beg" to="end" begin="0" end="0" number="5" departPos="last" color="0,1,0"/>
	<flow id="bike" type="bike" from="beg" to="end" begin="0" end="0" number="100" departPos="last" color="0,1,1"/>
	<!--行人的定义-->
	<personFlow id="p" begin="0" end="0" number="40" color="0,1,1">
       <walk from="beg" to="end"/>
    </personFlow>
</routes>

其中vType为车辆类型的定义,比如

<vType id="tram" vClass="tram" length="40" maxSpeed="13" accel="0.8" decel="0.5" sigma="0.1" speedDev="0.1" />
  • 对有轨电车进行了定义,id可以任意设置,但vClass=“tram” 参数说明该车辆只能在“tram”车道上行驶
	<flow id="tram" type="tram" from="beg" to="end" begin="0" end="0" number="5" departPos="last" color="0,1,0"/>
  • 使用“车流”定义若干车辆,上述定义了5辆有轨电车,from=“beg” to="end"表示从“beg”道路驶向“end道路”,颜色color="0,1,0"为黄色,begin=“0” end=“0” number=“5” 表示从begin秒开始到end秒结束,每辆车(共5辆)以相同的时间间隔出现在仿真中,begin=“0” end=“0” 表示5辆车同时出现在仿真中,若begin=“0” end=“10”,每2秒就有一辆车出现在仿真中。
  • 其实我的理解vType 相当于python的类,“车流”定义的车辆是对该类进行实例化
  • 对于行人的定义,参照行人定义

③创建红绿灯,作为竞赛的起点
在道路边缘点击右键,选择edge operations→split edge here添加一个节点,并将节点坐标设置随意。然后在节点处按“t”添加红绿灯选项,在左侧面板中点击Create TLS,接着修改下面的Phases,将第一阶段设置为“rrrrr”,100(秒)、第二阶段设置为“GGGGG”,1000(秒)在这里插入图片描述
在这里插入图片描述
④定义配置文件**.sumocfg**

<configuration>
   <input>
       <net-file value="sumolympics.net.xml"/>
       <route-files value="sumolympics.rou.xml,sumolympicWalks.rou.xml"/>
   </input>
   <processing>
    <lateral-resolution value="0.8" />
   </processing>
</configuration>

其中 大概意思是多人可以并排在单个人行道中,以便在竞赛过程中可以实现超越,更符合实际模型

其中,行人的定义可以通过下面脚本实现:

#!/usr/bin/python
#parameters
outfile = "sumolympicWalks.rou.xml"
startEdge = "beg"
endEdge = "end"
departTime = 0. #time of departure
departPos = -30. #position of departure
arrivalPos = 100. #position of arrival
numberTrips = 100 #number of persons walking
#generate XML
xml_string = "<routes>\n"  
for i in range(numberTrips):
    xml_string += '    <person depart="%f" id="p%d" departPos="%f" >\n' % (departTime, i, departPos)
    xml_string += '        <walk edges="%s %s" arrivalPos="%f"/>\n' % (startEdge, endEdge, arrivalPos)
    xml_string += '    </person>\n'
xml_string += "</routes>\n"
with open(outfile, "w") as f:
    f.write(xml_string)

本质是单独建立一个"sumolympicWalks.rou.xml"路由文件,改代码利用for循环,重复创建了100个 行人。
== <walk edges=startEdge, endEdge

注:本文是初学sumo,该文章也是对学习过程的记录,理解上可能不太准确,表达似乎也不太通顺,望体谅!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值