前言
本人小白,blog主要记录本人的一些学习过程和存在的疑惑,欢迎大家指出问题和交流讨论
提示:以下是本篇文章正文内容,下面案例可供参考
一、SUMO绘制轨迹图
轨迹图是交通分析过程中一个常用的工具,通过对轨迹图的分析,可以了解车流的运动状态和道路的拥堵情况。本文将以SUMO软件为例,使用自带的plot_trajectories.py绘制轨迹图。
绘制轨迹图之前我们首先需要绘制路网和车流,本文所构建的是一个简单的十字交叉口,具体构建过程就不再文中介绍,可以参考其他博主的教程,构建的结果如下所示:
在绘制轨迹图之前,我们首先浏览一下官方自带的软件包说明书(一般路径为sumo\doc\userdoc\Tools\visualization)
从上图可以看出,使用plot_trajectories.py这个工具所需要的数据为FCD数据(即浮动车数据),输出方法如下图所示:
输出命令为:
sumo -c demo.sumocfg --fcd-output fcd.xml
这样我们就得到了我们所需要FCD文件
然后从SUMO的安装路径中找到plot_trajectories.py这一文件,并拷贝至与FCD同一路径下
使用命令:
python plot_trajectories.py fcd.xml -t td -o plot.png --filter-route -gneE2
-t td表示选择绘制时间距离图
–filter-route 表示过滤车流,绘制-gneE2车道的车流
-o则表示输出的图片文件名称
最后给出的输出结果如下所示:
同样的可以绘制其他种类的图片,如距离速度图,将-t td更改为 -t ds
python plot_trajectories.py fcd.xml -t ds -o plot_1.png --filter-route -gneE2
二、Traci接口的简单使用
1.引入库
代码如下(示例):
from sumolib import checkBinary # noqa
import traci # noqa
2.启动SUMO
代码如下(示例):
if 'SUMO_HOME' in os.environ:
tools = os.path.join(os.environ['SUMO_HOME'], 'tools')
sys.path.append(tools)
else:
sys.exit("please declare environment variable 'SUMO_HOME'")
该处检查系统中是否配置SUMO的环境变量
sumocfg_file = "demo.sumocfg"
if__show__gui =True
if not if__show__gui :
sumoBinary = checkBinary('sumo')
else :
sumoBinary = checkBinary('sumo-gui')
traci.start([sumoBinary, "-c", sumocfg_file])
此处将启动SUMO cfg文件
如果此处成功启动sumocfg则表明接口正常启动,可以进行下一步操作
3.Traci接口的简单调用
本人最近使用sumo进行一些信号控制方面的研究,主要需要获取的信息包括路网中信号灯的数量,排队长度,占用率等数据
本人的一些调用方法如下所示:
junctions = traci.junction.getIDList()#获得交叉口ID
traffic_lights = traci.trafficlight.getIDList()#获得信号灯ID
traffic_lights_lanes = {}#创建控制车道
traffic_lights_links = {}#创建控制边
print(len(traffic_lights), 'traffic lights in network\n')
for tl in traffic_lights:#构建循环获得每个信号交叉口所控制的车道名称
traffic_lights_lanes[tl] = traci.trafficlight.getControlledLanes(tlsID=tl)
traffic_lights_links[tl] = traci.trafficlight.getControlledLinks(tlsID=tl)
quene_lenth={}
occ = {}
for dets in traci.lanearea.getIDList():#通过E2检测器获得车道的排队长度
lane_id = traci.lanearea.getLaneID(dets)
quene_lenth[lane_id] = traci.lanearea.getJamLengthVehicle(dets)
occ[lane_id] = traci.lanearea.getLastStepOccupancy(dets)
quene_lenth_d = pd.DataFrame.from_dict(quene_lenth,orient='index')#将获得的数据转换为dataframe格式方便读取
quene_lenth_d.rename(columns={0:"quene_lenth"},inplace = True)
occ_d = pd.DataFrame.from_dict(occ,orient='index')
occ_d.rename(columns={0:"occ"},inplace = True)
data = pd.concat([quene_lenth_d,occ_d],axis=1)#合并同类数据
获得的data如下图所示:occ数据单位错误,有待进一步修正
总结
本文主要分为两个部分,第一部分是对SUMO绘制轨迹图的介绍,第二部分是本人最近所学习的Traci接口的一些简单使用,后期可能会利用SUMO做自适应交通信号控制,有感兴趣的朋友对这部分感兴趣或者对文中内容有什么不懂可以留言或私信交流。