一个有用的信号控制小程序
这个信号控制小程序是我的一个课程作业,要求根据交叉口单点配时理论设计一个小程序,之后用python的wx库实现了可视化。
wx的官方文档在这里
信号控制策略
周期时长
未饱和交叉口周期时长由韦伯斯特延误优化模型确定的周期时长、最大周期时长、满足行人过街的最小周期时长共同决定 。
最大周期时长
当交叉口的信号周期达到一定阈值后,等待的人易产生急躁情绪,等待的车队也会过长,因此通常设定一个阈值作为周期时长的界限。 如果周期太长,则某一方向的绿灯时间可能大于实际需要时长,而另外方向的红灯时间不合理的延长必然导致该方向车流等待时间的延长。本软件中设定的最大周期时长取为 180s。
满足行人过街的周期时长
在设置每一相位的最小绿灯时长时,最小绿灯时长应取行人过街的最小绿灯时长和按照车流量得到的配时方案决定的最小绿灯时长两者中的较大值。 在得到所有相位的最小绿灯时长后, 对所有相位的最小绿灯时长、红灯、黄灯时间进行加和,得到满足行人过街的最小周期时长 。
绿信比分配原则
软件中采用的是各个相位有效绿灯时间按照等饱和度原则(等流量比原则)确定的方法,即各相位绿信比按各相位关键车道流量比的比例进行分配,因此最终各相位的饱和度也相同。
损失时间
饱和流率
(2)当无法实测路口各类车道的饱和流率时,则饱和流率可以根据 HCM2010(Page18-35)中的方法进行估算。 车道饱和流率与道路条件、交通条件、渠化条件、信号条件、环境条件等有关系。饱和流率应当尽量采用实测数据,在无法取得实测数据时,如新建交叉口设计时,才考虑采用估算方法。估算时, 校正后的每车道饱和流率如公式(9)所示。
行人相位和非机动车相位
在参考文献[5]中,有这部分的详细说明
软件设计
这里写了几个比较重要的语句
1.对软件界面上一些要素的定义,例如
def __init__(self):
##定义名称
wx.Frame.__init__(self, None, -1, '信号交叉口配时参数计算',size=(1190, 800))
##静态文本显示
self.panel = wx.Panel(self, -1)
self.rev = wx.StaticText(self.panel, -1, "信号交叉口配时参数计算", (460,10))
self.rev.SetForegroundColour('black')
self.rev.SetBackgroundColour('white')
###定义静态文本字体
font = wx.Font(18, wx.DECORATIVE,wx.ITALIC, wx.NORMAL)
self.rev.SetFont(font)
##建立相位个数选项框
#self.dict = {'1':2,'2':3,'3':4,'4':4,'5':4}
authors = ['2','3','4']
text1 = wx.StaticText(self.panel,-1,"请输入相位数:",(20,60))
self.choose = wx.ComboBox(self.panel,-1,'', pos=(100, 60), size=(130, -1), choices=authors , style=wx.CB_SORT)
self.button=wx.Button(parent=self.panel,id=-1,label=u'确定',pos=(280,60))
##插入相位图
img3=wx.Image('相位方案图.jpg',wx.BITMAP_TYPE_ANY)
show3=wx.StaticBitmap(self.panel,-1,wx.BitmapFromImage(img3),pos=(20,130))
self.Bind(wx.EVT_BUTTON,self.Settings,self.button)
sb=wx.StaticBox(self.panel, label='预定义参数',pos = (10,38),size = (520,180))
2.对[确定]、[计算]按钮的定义
##绘制“计算”button
self.button1=wx.Button(parent=self.panel,id=-1,label=u'计算',pos=(670,600))
self.Bind(wx.EVT_BUTTON,self.CloseMe,self.button1)
##绘制第二部分的确定按钮
self.button5=wx.Button(parent=self.panel,id=-1,label=u'确定',pos=(210,665))
self.Bind(wx.EVT_BUTTON,self.Settings3,self.button5)
3.对用户输入信息的提取
使用GetValue(),如:
non_auto1 = self.isisnumber(self.non_auto1.GetValue())
4.将计算结果写入对话框
使用SetValue(),如:
self.output[i].SetValue(str(y2[i]))
信号策略的表达其实十分简单,在进行可视化时,只需要实际上将这些组件进行结合,并对组件进行定义,最终可以得到很好的效果,还可以自己添加一些功能,例如输出信号配时图和信号配时方案的文字等。