利用SUMO进行交叉口速度引导
系列文章目录
SUMO使用E2检测器获取信号交叉口车道信息和信号控制方案
SUMO轨迹图的绘制和traci接口的简单使用
SUMO利用转弯率构建车流rou文件
sumo仿真netgenerate使用
文章目录
目录
前言
二、仿真场景搭建
1.SUMO仿真场景搭建
2.车速引导算法实现
1.功能函数实现:
2.速度引导控制主程序实现:
三、程序结果分析
结论分析
前言
最近,本人由于项目上和一些实际上的学习需求,本文利用SUMO仿真平台对交叉口速度引导进行了一定的实践。
一、交叉口速度引导公式推算
根据车辆的速度、信号相位等信息,基本可以将车辆经过交叉口的速度引导情景概括为以下几类:
①绿灯匀速通过
②绿灯加速通过
③绿灯减速通过
④绿灯停车
⑤红灯匀速通过
⑥红灯加速通过
⑦红灯减速通过
⑧红灯停车
下面对于上述八种情况对于引导速度的计算过程
①绿灯匀速通过:
车辆能够匀速通过,如果车辆行驶速度较低,不仅不利于交叉口的通行效率提升,也提升了整体燃油消耗。
因此如果车辆速度<经济速度:
如果车辆速度大于经济速度:
②红灯匀速通过:
③加速通过:
④减速通过:
⑤停车通过:
二、仿真场景搭建
1.SUMO仿真场景搭建
由于本文所进行构建的场景为工程场景,需要使用项目地址的路网,所以本文利用OSM真实路网构建仿真场景。为了能够更加便利地构建真实道路网络,这里使用SUMO自带的OSM web wizard工具,自动生成真实路网。
点击generate即可自动生成路网,以及车流文件,但是本文中所使用的算法仅为一阶段算法,不考虑车辆排队和车辆之间的相互作用,因此实际运用过程中,还需要对车流做进一步 调整。构建完成的路网如下:
仿真车流为项目道路,双向车流,车流量为60辆/小时
2.车速引导算法实现
1.功能函数实现:
①信号周期计算:
def cycle_time(tls_id):tls_logic = traci.trafficlight.getAllProgramLogics(tls_id)#获取下一信号交叉口的控制方案current_phase = tls_logic[0].currentPhaseIndex#获取信号相位traci.simulation.getCurrentTime()/1000#获取当前仿真时间cycle_time = 0#周期时长初始化for i in range(len(tls_logic[0].phases)):cycle_time += tls_logic[0].phases[i].duration#将控制方案中各相位的控制方案累加获得周期长return cycle_time
②获取交叉口各相位进口道信息:
def incoming_lane(tls_id):logic = traci.trafficlight.getAllProgramLogics(tls_id)#获取控制方案in_lane = traci.trafficlight.getControlledLanes(tls_id)program = logic[0]phase = {}#定义空相位for i in range(len(program.phases)):#遍历信号相位if i%2 ==0:#因为相位中间存在黄灯信号,所以绿灯信号全为双数phase[i] = program.phases[i].state#信号为logic格式,.state是其中的具体信号控制方案incoming_lanes_all = {}#定义进口车道集for i in phase:#遍历相位incoming_lanes = []#定义进口空车道k = 0#控制相位数#print(phase[i])for j in phase[i]:#print(k)if j =='G':#将’G‘对应的车道记录下来#print(k)incoming_lanes.append(in_lane[k])#print(incoming_lanes)k = k+1incoming_lanes_all[i] = incoming_lanes#将每一相位的车道保存return incoming_lanes_all
③获取下一绿灯相位开始时间和结束时间
def next_green(vehicle_id):data = traci.vehicle.getNextTLS(vehicle_id)#获取下一信号交叉口信息tls_id_1 = data[0][0]#获取交叉口idin_lane = incoming_lane(tls_id_1)#获取各相位进口道cycle = cycle_time(tls_id_1)#获取周期时长current_lane = traci.vehicle.getLaneID(vehicle_id)#获取车辆所在车道signal_state_1 = data[0][3]#获取当前车道信号状态phases = traci.trafficlight.getAllProgramLogics(tls_id_1)[0].phases#获取信号相位phases_num = len(phases)#获取相位数remaining_time = traci.trafficlight.getNextSwitch(tls_id_1) - traci.simulation.getCurrentTime()/1000 #获取当前信号相位剩余时间if current_lane in in_lane[0]:#如果当前车道为相位0通行相位,则绿灯相位为0green_phase = 0#print(green_phase)elif current_lane in in_lane[2]:#如果当前车道为相位2通行相位,则绿灯相位为2green_phase = 2#print(green_phase)elif current_lane[0:8] == 'cluster':print(current_lane)green_phase = 0else :print("绿灯相位读取错误")green_phase = 0current_phase = traci.trafficlight.getPhase(tls_id_1)if signal_state_1 == 'g' or signal_state_1 == 'G':#如果当前相位为绿灯next_g_start = cycle - traci.trafficlight.getPhaseDuration(tls_id_1) + remaining_time#下一绿灯开始时间为周期长-当前相位周期时长+相位剩余时间next_g_end = cycle + remaining_time#下一绿灯结束时间为周期长加相位剩余时间elif signal_state_1 == 'r' or signal_state_1 == 'y':if green_phase == 0 :if current_phase == 1:#如果为黄灯相位next_g_start = remaining_time+phases[2].duration+phases[3].duration#下一绿灯开始为剩余时间+下一相位+下一相位next_g_end = next_g_start + phases[0].durationelif current_phase == 2:next_g_start = remaining_time + phases[3].durationnext_g_end = next_g_start + phases[0].durationelif current_phase == 3:next_g_start = remaining_timenext_g_end = next_g_start + phases[0].durationelif current_phase == 0:next_g_start = remaining_time + phases[1].durationnext_g_end = remaining_time + phases[1].duration + phases[2].durationif green_phase == 2:#如果绿灯相位为相位2if current_phase == 3:next_g_start = remaining_time+phases[0].duration+phases[1].durationnext_g_end = next_g_start + phases[2].durationelif current_phase == 0:next_g_start = remaining_time+phases[1].durationnext_g_end = next_g_start + phases[2].durationelif current_phase == 1:next_g_start = remaining_timenext_g_end = next_g_start + phases[2].durationreturn next_g_start,next_g_end
④建议速度计算:
def advise_speed(vehicle_id,next_g_start,next_g_end):min_speed = 2.0#最小速度max_speed = traci.vehicle.getAllowedSpeed(vehicle_id)#道路通行最大速度acc = traci.vehicle.getAccel(vehicle_id)#加速度dec = -traci.vehicle.getDecel(vehicle_id)#减速度distance = traci.vehicle.getNextTLS(vehicle_id)[0][2]#车辆距离交叉口距离speed_now = traci.vehicle.getSpeed(vehicle_id)#当前车辆速度phase_now = traci.vehicle.getNextTLS(vehicle_id)[0][3]#下一交叉口相位if phase_now == 'G' or phase_now == 'g':#如果相位为绿灯remaining_time = traci.trafficlight.getNextSwitch(traci.vehicle.getNextTLS(vehicle_id)[0][0]) - traci.simulation.getCurrentTime()/1000if remaining_time > distance/(speed_now+0.01):#绿灯匀速通过speed_advise = speed_nowtraci.vehicle.setColor(vehicle_id,(0,255,0))#设置颜色为绿色print('speed_now:',speed_now)print(speed_advise,'绿灯匀速通过')elif remaining_time > ((distance-(max_speed**2-speed_now**2)/(2*acc))/max_speed + (max_speed-speed_now)/acc) and remaining_time<distance/(speed_now+0.0000000001):discriminant = acc**2*remaining_time**2+2*acc*speed_now*remaining_time-2*acc*distance #计算方程判别式accTime = (acc*remaining_time-math.sqrt(discriminant))/accspeed_advise = speed_now+accTime*acc #绿灯加速通过traci.vehicle.setColor(vehicle_id,(255,0,255))#设置颜色为粉色print('speed_now:',speed_now)print(speed_advise,'绿灯加速通过')elif remaining_time <= ((distance-(max_speed**2-speed_now**2)/(2*acc))/max_speed + (max_speed-speed_now)/acc) and next_g_start < ((distance-(min_speed**2-speed_now**2)/(2*dec))/min_speed + (min_speed-speed_now)/dec) :discriminant_1 = dec**2*next_g_start**2+2*dec*speed_now*next_g_start-2*dec*distancedecTime_1 = (dec*next_g_start+math.sqrt(discriminant_1))/decspeed_advise_1 = speed_now + decTime_1*dec#绿灯减速通行 最大速度discriminant_2 = dec**2*next_g_end**2+2*dec*speed_now*next_g_end-2*dec*distancedecTime_2 = (dec*next_g_end+math.sqrt(discriminant_2))/decspeed_advise_2 = speed_now + decTime_2*dec#绿灯减速通行 最小速度speed_advise = (speed_advise_1+speed_advise_2)/2# 确保车辆能够通过traci.vehicle.setColor(vehicle_id,(0,255,255))#设置颜色为蓝色print(traci.simulation.getCurrentTime()/1000)print('speed_now:',speed_now)print(speed_advise_1,speed_advise_2,'绿灯减速通行')elif remaining_time <= ((distance-(max_speed**2-speed_now**2)/(2*acc))/max_speed + (max_speed-speed_now)/acc) and next_g_start >= ((distance-(min_speed**2-speed_now**2)/(2*dec))/min_speed + (min_speed-speed_now)/dec) :discriminant = dec**2*next_g_start**2+2*dec*speed_now*next_g_start-2*dec*distancedecTime = (dec*next_g_start+math.sqrt(discriminant))/decspeed_advise = speed_now + decTime*dec#绿灯减速停车if speed_advise<min_speed:speed_advise = min_speedtraci.vehicle.setColor(vehicle_id,(255,0,0))#设置为红色print('speed_now:',speed_now)print(speed_advise,'绿灯减速停车')if phase_now == 'r' or phase_now == 'y':if next_g_start< distance/(speed_now+0.01) and next_g_end> distance/(speed_now+0.01):if distance/(speed_now+0.01)-next_g_start < 2:speed_advise = distance/(next_g_start+3)print('略微减速')else:speed_advise = speed_now #红灯匀速通行traci.vehicle.setColor(vehicle_id,(255,255,255))#设置颜色为白色print('speed_now:',speed_now)print(speed_advise,'红灯匀速通过')elif next_g_start < distance / (speed_now+0.0000001) and next_g_start > ((distance-(max_speed**2-speed_now**2)/(2*acc))/max_speed + (max_speed-speed_now)/acc):discriminant = dec**2*next_g_start**2+2*dec*speed_now*next_g_start-2*dec*distance #计算方程判别式decTime = (dec*next_g_start+math.sqrt(discriminant))/decspeed_advise = speed_now + decTime*dec#红灯减速通行traci.vehicle.setColor(vehicle_id,(0,0,255))#设置颜色为蓝色print('speed_now:',speed_now)print(speed_advise,'红灯减速通过')elif next_g_end>((distance-(max_speed**2-speed_now**2)/(2*acc))/max_speed + (max_speed-speed_now)/acc) and next_g_end<distance/(speed_now+0.00000001):discriminant = acc**2*next_g_end**2+2*acc*speed_now*next_g_end-2*acc*distance #计算方程判别式accTime = (acc*next_g_end-math.sqrt(discriminant))/accspeed_advise = speed_now+accTime*acc #红灯加速通过traci.vehicle.setColor(vehicle_id,(255,0,255))#设置颜色为粉色print('speed_now:',speed_now)print(speed_advise,'红灯加速通过')print(traci.simulation.getCurrentTime()/1000)else :print('红灯减速停车')speed_advise = min_speedtraci.vehicle.setColor(vehicle_id,(255,0,0))#设置为红色return speed_advise
2.速度引导控制主程序实现:
while traci.simulation.getMinExpectedNumber() > 0:traci.simulationStep()for vehicle_id in traci.vehicle.getIDList():traci.vehicle.setMaxSpeed(vehicle_id,16.67)allowed_speed = traci.vehicle.getAllowedSpeed(vehicle_id)#获取路网允许速度if traci.vehicle.getNextTLS(vehicle_id) != ():#确保车辆下一交叉口信息不为空if traci.vehicle.getNextTLS(vehicle_id)[0][2] < 210: #车辆进入交叉口停止线210m范围内next_g_start , next_g_end = next_green(vehicle_id)#获取下一绿灯开始时间、结束时间distance = traci.vehicle.getNextTLS(vehicle_id)[0][2]#获取距离交叉口停止线的距离speed_adv = advise_speed(vehicle_id,next_g_start,next_g_end)#获取引导速度traci.vehicle.setSpeed(vehicle_id,speed_adv)#对车辆速度进行控制elif traci.vehicle.getNextTLS(vehicle_id)[0][2] > 220:#车辆距离交叉口大于220m时,控制车辆按照正常速度行驶traci.vehicle.setColor(vehicle_id,(255,255,0))traci.vehicle.setSpeed(vehicle_id,allowed_speed)elif traci.vehicle.getNextTLS(vehicle_id) == ():#如果车辆即将离开路网,控制车辆按允许速度行驶print(vehicle_id,'结束')traci.vehicle.setColor(vehicle_id,(255,255,0))traci.vehicle.setSpeed(vehicle_id,allowed_speed)#对车辆速度进行控制
三、程序结果分析
仿真结果:
优化前后行程时间,技术参数表 |
|||||
|
arrivalSpeed |
行程时间 |
等待时间 |
启停次数 |
timeLoss |
优化后 |
13.92 |
469.93 |
0.00 |
0.00 |
129.93 |
优化前 |
13.64 |
425.48 |
49.59 |
3.31 |
85.58 |
优化前后步均燃油消耗量及污染物 |
||||||
|
CO2 |
CO |
HC |
Nox |
PMx |
fuel |
优化后 |
13963.28786 |
21.5826697 |
0 |
124.2140218 |
2.719787913 |
5.919309 |
优化前 |
14829.80422 |
22.3261729 |
0 |
129.304049 |
2.773325695 |
6.28883 |
仿真图像:
车辆运动轨迹图:
正向车流
优化前:
优化后:
逆向车流:
优化前:
优化后:
速度-距离图:
优化前:
优化后:
结论分析
本文所提出的车辆速度引导算法可以在不考虑排队车辆和车辆间相互影响的情况下,显著减少车辆的启停次数和排队等待时间,但是由于SUMO仿真默认按照较高的速度行驶,速度引导算法为了使车辆能够顺利通过,部分场景使用了较低的引导速度,所以行程时间和timeloss并没有显著下降。
下一阶段算法的设计将考虑排队长度、车辆间的相互影响,队列的信号优化等方面,可以使得算法的使用场景更加广阔,实用性更强。如果有朋友对这一方面感兴趣,欢迎交流讨论。
利用SUMO进行交叉口速度引导相关推荐
- 笔记-车联网环境下交叉口速度引导
信号交叉口车速引导 在有信号交叉口,对于人工驾驶车来说,只受信号灯和前方车辆的影响,而人工车无法准确获得信号灯时间和自车离停止线的距离,无法对其进行速度引导,他只能跟随前方车辆行驶:但是随着车联网技术 ...
- 利用SUMO模拟事故
参考官网链接:sumo官网关于事故的描述 利用SUMO模拟事故发生基本知识 –collision.mingap-factor 0,当设置为0时,表示当车辆的间隙为0的时候发生碰撞. --collisi ...
- bcdedit添加linux引导,Linux_利用Bcdedit创建Linux系统引导,Bcdedit在Windows Vista中的一个命 - phpStudy...
利用Bcdedit创建Linux系统引导 Bcdedit在Windows Vista中的一个命令行工具,用于建立和重新配置bootloader,无须再使用boot.ini文件.下面我们来谈谈如何用bc ...
- skyeye linux qt,在ARM9上安装Linux,利用SkyEye模拟器及U-BOOT引导
提示:本人在2008年进行Linux@ARM实验,在ARM9上安装Linux.利用SkyEye模拟器及U-BOOT引导.这是实验报告.以及实验过程中留下的记录,按日期倒序排列. 本文以Creative ...
- 利用联合双边滤波或引导滤波进行升采样(Upsampling)技术提高一些耗时算法的速度。...
这十年来,在图像处理领域提出了很多新的图像分析和处理方法,包括是自动的以及一些需要有人工参与的,典型的比如stereo depth computations.image colorization.to ...
- 利用stm32控制步进电机 速度加速度控制
因为想申请 CSDN 博客认证需要一定的粉丝量,而我写了五年博客才 700 多粉丝,本文开启关注才可阅读全文,很抱歉影响您的阅读体验 利用stm32控制步进电机 尝试用42系步进电机做倒立摆,总结步进 ...
- 采用数据分析利用加速度计进行电梯速度估算之模型建立
电梯速度自适应数据模型 摘 要 该系统运用数据挖掘中可视化技术,寻找一种对于电梯运动过程中的速度进行检测的数据模型,对于外部环境带来的系统误差进行消除,以达到自适应检测速度以及数据的准确性之目的:最后 ...
- 【opencv八】利用opencv加快视频播放速度,并保存avi视频文件
在许多应用的需求中,希望将输入,或捕获图像记录到输出视频流中,并保存成一个完整的视频,OpenCV提供了一种简单的方法.正如[opencv四]利用opencv读取显示视频和[opencv七]利用ope ...
- 如何利用RamDisk加快上网速度
虽然现在宽带已经很普及了,但是很多人开网页的时候还是觉得比较慢(尤其是比较差一点的机器).这个问题并不一定是网速慢的关系,还和网页写入硬盘的速度有关.因为我们利用浏览器打开网页的时候,Web服务器上的 ...
最新文章
- leetcode算法题--回文数
- python3.7安装numpy库_python2.7/3.7安装NumPy函数库的一种方法及小心得
- HDU - 3966 Aragorn's Story(树链剖分+线段树)
- Android权限之动态权限
- css 样式通用样式
- 3dvary灯光材质为什么不亮_关机后电脑灯光闪瞎狗眼?在这里关闭它
- 《面向对象程序设计》课程作业(七)
- java gbk 内码_JAVA 中文转GBK内码方法
- 用计算机弹清明上河图谱,一篇文章让你看懂《清明上河图》中的所有细节
- 遗传算法(2):对适应度函数的改进
- 【centos7x86】安装源 设置基础软件仓库时出错 解决办法
- 神经元细胞属于什么细胞,人体有多少神经元细胞
- 情感计算机具体应用领域,人工智能-情感计算
- 惨兮兮解决mysql安装坑
- IDEA开发工具整合YAPI接口平台
- 关于在GET请求中使用body
- 【华为OD机试真题 JS】IPv4地址转换成整数
- Oracle数据库实训教师评语,教育教学评价系统数据库的设计与实现.doc
- 电商项目—会员体系、等级、折扣营销解析
- expdp报DBMS_AW_EXP等信息