python 一个有用的信号控制小程序

一个有用的信号控制小程序

这个信号控制小程序是我的一个课程作业,要求根据交叉口单点配时理论设计一个小程序,之后用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]))

信号策略的表达其实十分简单,在进行可视化时,只需要实际上将这些组件进行结合,并对组件进行定义,最终可以得到很好的效果,还可以自己添加一些功能,例如输出信号配时图和信号配时方案的文字等。

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 我可以为你提供一些建议,但我不会直接写出代码。如果你想使用Python编写PID控制程序,可以参考Python的标准库中的函数,例如time.sleep(),还有一些第三方库,例如PIDController和PIDpy。你还可以参考一些示例代码,例如使用模拟控制器进行PID控制的示例代码。 ### 回答2: 使用Python编写一个PID控制程序可以实现很多不同的控制任务,例如机器人运动控制、温度控制、速度控制等。下面为您提供一个简单的示例代码: ```python import time class PIDController: def __init__(self, Kp, Ki, Kd): self.Kp = Kp # 比例常数 self.Ki = Ki # 积分常数 self.Kd = Kd # 微分常数 self.last_error = 0 self.integral = 0 def calculate(self, setpoint, current_value): error = setpoint - current_value proportional = self.Kp * error self.integral += self.Ki * error derivative = self.Kd * (error - self.last_error) output = proportional + self.integral + derivative self.last_error = error return output # 主程序 if __name__ == "__main__": kp = 0.5 ki = 0.2 kd = 0.1 target = 50 # 目标值 current = 0 # 当前值 controller = PIDController(kp, ki, kd) for i in range(10): # 调用PID控制器计算输出 output = controller.calculate(target, current) print("Output:", output) # 模拟实际控制过程,更新当前值 current += output time.sleep(1) ``` 以上代码实现了一个简单的PID控制器。通过调用`calculate`方法,传入目标值和当前值,程序会自动计算出一个输出值,并将其加到当前值上,模拟实际控制过程。在每次循环中,程序会打印输出值。在实际使用中,您可能需要根据具体需求进行修改和适配。 ### 回答3: PID控制器是一种常见的控制方法,它通过根据系统误差的大小来调节控制量,使得误差趋向于零并保持稳定。下面是一个使用Python编写的简单PID控制程序的示例: ```python class PIDController: def __init__(self, kp, ki, kd): self.Kp = kp self.Ki = ki self.Kd = kd self.error = 0 self.error_sum = 0 self.error_diff = 0 def update(self, setpoint, current_value): self.error = setpoint - current_value self.error_sum += self.error self.error_diff = self.error - self.error_diff output = (self.Kp * self.error) + (self.Ki * self.error_sum) + (self.Kd * self.error_diff) return output # 使用示例 pid = PIDController(1, 0.1, 0.2) # 创建PID控制器对象,并设置控制参数 setpoint = 50 # 设置目标值 current_value = 0 # 当前值 for i in range(100): # 控制循环 control_signal = pid.update(setpoint, current_value) # 更新控制信号 current_value += control_signal # 更新当前值 print("控制信号:", control_signal, "当前值:", current_value) ``` 在这个示例中,我们创建了一个名为PIDController的类,它具有包含控制参数和误差的实例变量。类中的update方法计算输出控制信号,并返回控制器的输出。在使用时,我们实例化一个PIDController对象,设置目标值和当前值,并在控制循环中不断更新控制信号和当前值。 这只是一个简单的PID控制程序示例,实际应用中可能需要更复杂的逻辑和处理。不过,相信这个示例可以帮助你了解如何使用Python编写一个PID控制程序。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值