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 break语句详解
Mar 11 Python
利用python批量修改word文件名的方法示例
Oct 17 Python
NetworkX之Prim算法(实例讲解)
Dec 22 Python
Python机器学习之SVM支持向量机
Dec 27 Python
解决pandas 作图无法显示中文的问题
May 24 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
Pycharm新手教程(只需要看这篇就够了)
Jun 18 Python
浅谈django url请求与数据库连接池的共享问题
Aug 29 Python
Python高级property属性用法实例分析
Nov 19 Python
Pytorch Tensor的统计属性实例讲解
Dec 30 Python
Python3与fastdfs分布式文件系统如何实现交互
Jun 23 Python
使用Pytorch训练two-head网络的操作
May 28 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
英雄试炼之肉山谷—引领RPG新潮流
2020/04/20 DOTA
ThinkPHP多语言支持与多模板支持概述
2014/08/22 PHP
PHP循环遍历数组的3种方法list()、each()和while总结
2014/11/19 PHP
php计算多维数组中所有值总和的方法
2015/06/24 PHP
使用WAMP搭建PHP本地开发环境
2017/05/10 PHP
PHP实现Huffman编码/解码的示例代码
2018/04/20 PHP
Windows服务器中PHP如何安装redis扩展
2019/09/27 PHP
验证用户是否修改过页面的数据的实现方法
2008/09/26 Javascript
防止动态加载JavaScript引起的内存泄漏问题
2009/10/08 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
jquery导航制件jquery鼠标经过变色效果示例
2013/12/05 Javascript
jQuery 回车事件enter使用示例
2014/02/18 Javascript
推荐6款基于jQuery实现图片效果插件
2014/12/07 Javascript
jquery实现鼠标拖拽滑动效果来选择数字的方法
2015/05/04 Javascript
JS实现兼容性好,带缓冲的动感网页右键菜单效果
2015/09/18 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
Nodejs全局安装和本地安装的不同之处
2016/07/04 NodeJs
BootStrap树状图显示功能
2016/11/24 Javascript
微信小程序之数据双向绑定与数据操作
2017/05/12 Javascript
基于angular实现模拟微信小程序swiper组件
2017/06/11 Javascript
jquery easyui如何实现格式化列
2017/07/30 jQuery
vue slot 在子组件中显示父组件传递的模板
2018/03/02 Javascript
vue项目接口管理,所有接口都在apis文件夹中统一管理操作
2020/08/13 Javascript
[56:14]Fnatic vs OG 2018国际邀请赛小组赛BO2 第二场 8.18
2018/08/19 DOTA
Python常用知识点汇总
2016/05/08 Python
Python 闭包的使用方法
2017/09/07 Python
django session完成状态保持的方法
2018/11/27 Python
Python matplotlib的使用并自定义colormap的方法
2018/12/13 Python
Python新手如何进行闭包时绑定变量操作
2020/05/29 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
有关HTML5页面在iPhoneX适配问题
2017/11/13 HTML / CSS
请解释流与文件有什么不同
2016/07/29 面试题
大学生水文观测实习自我鉴定
2013/09/29 职场文书
应届毕业生个人自荐信范文
2013/11/30 职场文书
高中生思想道德自我评价
2015/03/09 职场文书
党务工作者主要事迹材料
2015/11/03 职场文书