python实现PID算法及测试的例子


Posted in Python onAugust 08, 2019

PID算法实现

import time

class PID:
  def __init__(self, P=0.2, I=0.0, D=0.0):
    self.Kp = P
    self.Ki = I
    self.Kd = D
    self.sample_time = 0.00
    self.current_time = time.time()
    self.last_time = self.current_time
    self.clear()
  def clear(self):
    self.SetPoint = 0.0
    self.PTerm = 0.0
    self.ITerm = 0.0
    self.DTerm = 0.0
    self.last_error = 0.0
    self.int_error = 0.0
    self.windup_guard = 20.0
    self.output = 0.0
  def update(self, feedback_value):
    error = self.SetPoint - feedback_value
    self.current_time = time.time()
    delta_time = self.current_time - self.last_time
    delta_error = error - self.last_error
    if (delta_time >= self.sample_time):
      self.PTerm = self.Kp * error#比例
      self.ITerm += error * delta_time#积分
      if (self.ITerm < -self.windup_guard):
        self.ITerm = -self.windup_guard
      elif (self.ITerm > self.windup_guard):
        self.ITerm = self.windup_guard
      self.DTerm = 0.0
      if delta_time > 0:
        self.DTerm = delta_error / delta_time
      self.last_time = self.current_time
      self.last_error = error
      self.output = self.PTerm + (self.Ki * self.ITerm) + (self.Kd * self.DTerm)
  def setKp(self, proportional_gain):
    self.Kp = proportional_gain
  def setKi(self, integral_gain):
    self.Ki = integral_gain
  def setKd(self, derivative_gain):
    self.Kd = derivative_gain
  def setWindup(self, windup):
    self.windup_guard = windup
  def setSampleTime(self, sample_time):
    self.sample_time = sample_time

测试PID算法

import PID
import time
import matplotlib
matplotlib.use("TkAgg")
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import spline
#这个程序的实质就是在前九秒保持零输出,在后面的操作中在传递函数为某某的系统中输出1

def test_pid(P = 0.2, I = 0.0, D= 0.0, L=100):
  """Self-test PID class

  .. note::
    ...
    for i in range(1, END):
      pid.update(feedback)
      output = pid.output
      if pid.SetPoint > 0:
        feedback += (output - (1/i))
      if i>9:
        pid.SetPoint = 1
      time.sleep(0.02)
    ---
  """
  pid = PID.PID(P, I, D)

  pid.SetPoint=0.0
  pid.setSampleTime(0.01)

  END = L
  feedback = 0

  feedback_list = []
  time_list = []
  setpoint_list = []

  for i in range(1, END):
    pid.update(feedback)
    output = pid.output
    if pid.SetPoint > 0:
      feedback +=output# (output - (1/i))控制系统的函数
    if i>9:
      pid.SetPoint = 1
    time.sleep(0.01)

    feedback_list.append(feedback)
    setpoint_list.append(pid.SetPoint)
    time_list.append(i)

  time_sm = np.array(time_list)
  time_smooth = np.linspace(time_sm.min(), time_sm.max(), 300)
  feedback_smooth = spline(time_list, feedback_list, time_smooth)
  plt.figure(0)
  plt.plot(time_smooth, feedback_smooth)
  plt.plot(time_list, setpoint_list)
  plt.xlim((0, L))
  plt.ylim((min(feedback_list)-0.5, max(feedback_list)+0.5))
  plt.xlabel('time (s)')
  plt.ylabel('PID (PV)')
  plt.title('TEST PID')

  plt.ylim((1-0.5, 1+0.5))

  plt.grid(True)
  plt.show()

if __name__ == "__main__":
  test_pid(1.2, 1, 0.001, L=80)
#  test_pid(0.8, L=50)

结果

python实现PID算法及测试的例子

以上这篇python实现PID算法及测试的例子就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python socket 超时设置 errno 10054
Jul 01 Python
Python制作CSDN免积分下载器
Mar 10 Python
python 列表,数组,矩阵两两转换tolist()的实例
Apr 04 Python
Linux CentOS Python开发环境搭建教程
Nov 28 Python
python实时检测键盘输入函数的示例
Jul 17 Python
Python 3.8正式发布,来尝鲜这些新特性吧
Oct 15 Python
Django跨域资源共享问题(推荐)
Mar 09 Python
Pycharm中安装wordcloud等库失败问题及终端通过pip安装的Python库如何添加到Pycharm解释器中(推荐)
May 10 Python
python如何进行矩阵运算
Jun 05 Python
python爬取”顶点小说网“《纯阳剑尊》的示例代码
Oct 16 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
Oct 27 Python
Python PIL按比例裁剪图片
May 11 Python
python开头的coding设置方法
Aug 08 #Python
pycharm 安装JPype的教程
Aug 08 #Python
Python学习笔记之lambda表达式用法详解
Aug 08 #Python
python读取大文件越来越慢的原因与解决
Aug 08 #Python
Python实现Singleton模式的方式详解
Aug 08 #Python
Python判断字符串是否xx开始或结尾的示例
Aug 08 #Python
详解解决Python memory error的问题(四种解决方案)
Aug 08 #Python
You might like
重置版游戏视频
2020/04/09 魔兽争霸
解析php中两种缩放图片的函数,为图片添加水印
2013/06/14 PHP
php.ini中date.timezone设置详解
2016/11/20 PHP
浅谈javascript 面向对象编程
2009/10/28 Javascript
解决jquery的.animate()函数在IE6下的问题
2010/12/03 Javascript
Jquery中使用setInterval和setTimeout的方法
2013/04/08 Javascript
JS的数组迭代方法
2015/02/05 Javascript
javascript实现在网页中运行本地程序的方法
2016/02/03 Javascript
JS中使用变量保存arguments对象的方法
2016/06/03 Javascript
js仿淘宝评价评分功能
2017/02/28 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
vue 关闭浏览器窗口的时候,清空localStorage的数据示例
2019/11/06 Javascript
原生js+ajax分页组件
2020/01/30 Javascript
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
2011/03/13 Python
深入解析Python中的线程同步方法
2016/06/14 Python
python运行其他程序的实现方法
2017/07/14 Python
Python namedtuple命名元组实现过程解析
2020/01/08 Python
Windows系统下pycharm中的pip换源
2020/02/23 Python
Python模块相关知识点小结
2020/03/09 Python
Python列表切片常用操作实例解析
2020/03/10 Python
Python实现获取当前目录下文件名代码详解
2020/03/10 Python
利用python控制Autocad:pyautocad方式
2020/06/01 Python
ffmpeg+Python实现B站MP4格式音频与视频的合并示例代码
2020/10/21 Python
matplotlib实现数据实时刷新的示例代码
2021/01/05 Python
css3 border旋转时的动画应用
2016/01/22 HTML / CSS
CSS3模拟动画下拉菜单效果
2017/04/12 HTML / CSS
德国最大的网上足球商店:11teamsports
2019/09/11 全球购物
美国传奇滑手Paul Rodriguez创办的街头滑板品牌:Primitive Skateboarding
2019/10/29 全球购物
BIFFI美国站:意大利BIFFI BOUTIQUES豪华多品牌时装零售公司
2020/02/11 全球购物
部队学习十八大感言
2014/01/11 职场文书
开展党的群众路线教育实践活动方案
2014/02/05 职场文书
个人社会实践自我鉴定
2014/03/24 职场文书
四查四看整改措施
2014/09/19 职场文书
介绍信如何写
2015/01/31 职场文书
与死神共舞观后感
2015/06/15 职场文书
开学第一天的感想
2015/08/10 职场文书