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深入学习之闭包
Aug 31 Python
Python中的面向对象编程详解(上)
Apr 13 Python
简单介绍Python中的floor()方法
May 15 Python
Python实现的选择排序算法示例
Nov 29 Python
自定义Django Form中choicefield下拉菜单选取数据库内容实例
Mar 13 Python
Django实现whoosh搜索引擎使用jieba分词
Apr 08 Python
Python实现查找数据库最接近的数据
Jun 08 Python
python 基于卡方值分箱算法的实现示例
Jul 17 Python
Python unittest装饰器实现原理及代码
Sep 08 Python
Python判断变量是否是None写法代码实例
Oct 09 Python
Python如何使用ElementTree解析xml
Oct 12 Python
深入理解python多线程编程
Apr 18 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
php通过递归方式复制目录和子目录的方法
2015/03/13 PHP
PHP获取指定月份第一天和最后一天的方法
2015/07/18 PHP
用showModalDialog弹出页面后,提交表单总是弹出一个新窗口
2009/07/18 Javascript
js 页面刷新location.reload和location.replace的区别小结
2009/12/24 Javascript
javascript 解析url的search方法
2010/02/09 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
深入理解Javascript中this的作用域
2014/08/12 Javascript
Javascript核心读书有感之表达式和运算符
2015/02/11 Javascript
一看就懂:jsonp详解
2015/06/01 Javascript
jQuery实现输入框下拉列表树插件特效代码分享
2015/08/27 Javascript
jquery实现楼层滚动效果
2018/01/01 jQuery
JQuery+Bootstrap 自定义全屏Loading插件的示例demo
2019/07/03 jQuery
JS组件库AlloyTouch实现图片轮播过程解析
2020/05/29 Javascript
解决echarts echarts数据动态更新和dataZoom被重置问题
2020/07/20 Javascript
[13:55]Newbee vs Team Spirit
2018/06/07 DOTA
以Flask为例讲解Python的框架的使用方法
2015/04/29 Python
python中解析json格式文件的方法示例
2017/05/03 Python
Python中类的初始化特殊方法
2017/12/01 Python
django admin添加数据自动记录user到表中的实现方法
2018/01/05 Python
使用Python实现牛顿法求极值
2020/02/10 Python
keras读取h5文件load_weights、load代码操作
2020/06/12 Python
详解CSS3中常用的样式【基本文本和字体样式】
2020/10/20 HTML / CSS
Html5移动端获奖无缝滚动动画实现示例
2018/06/25 HTML / CSS
HTML5单页面手势滑屏切换原理分析
2017/07/10 HTML / CSS
在线课程:Skillshare
2019/04/02 全球购物
德国便宜的宠物店:Brekz.de
2020/10/23 全球购物
打架检讨书300字
2014/02/02 职场文书
大学生毕业自我鉴定范文
2014/02/03 职场文书
竞聘书格式及范文
2014/03/31 职场文书
迟到检讨书2000字(精选篇)
2014/10/07 职场文书
2014年幼儿园老师工作总结
2014/12/05 职场文书
出纳工作检讨书范文
2014/12/27 职场文书
2015年暑假生活总结
2015/07/13 职场文书
2016年小学“感恩教师”主题队日活动总结
2016/04/01 职场文书
2019年教师节活动策划方案
2019/09/09 职场文书
【海涛教你打DOTA】剑圣第一人称视角解说
2022/04/01 DOTA