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中pycurl库的用法实例
Sep 30 Python
Python批量发送post请求的实现代码
May 05 Python
python hbase读取数据发送kafka的方法
Dec 27 Python
Python生成指定数量的优惠码实操内容
Jun 18 Python
利用python计算windows全盘文件md5值的脚本
Jul 27 Python
python3 requests库实现多图片爬取教程
Dec 18 Python
Python sklearn库实现PCA教程(以鸢尾花分类为例)
Feb 24 Python
jupyter notebook 多行输出实例
Apr 09 Python
Django如何使用jwt获取用户信息
Apr 21 Python
python多线程semaphore实现线程数控制的示例
Aug 10 Python
python爬虫---requests库的用法详解
Sep 28 Python
Django一小时写出账号密码管理系统
Apr 29 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处理图片变得简单 基于gb库的图片处理类附实例代码下载
2011/05/17 PHP
php查找指定目录下指定大小文件的方法
2014/11/28 PHP
PHP常用工具类大全附全部代码下载
2015/12/07 PHP
PHP7匿名类用法分析
2016/09/26 PHP
浅谈PHP发送HTTP请求的几种方式
2017/07/25 PHP
在thinkphp5.0路径中实现去除index.php的方式
2019/10/16 PHP
jquery 的 $(&quot;#id&quot;).html() 无内容的解决方法
2010/06/07 Javascript
js动态在form上插入enctype=multipart/form-data的问题
2012/05/24 Javascript
JS控制文本框textarea输入字数限制的方法
2013/06/17 Javascript
jquery scroll()区分横向纵向滚动条的方法
2014/04/04 Javascript
JavaScript中的eval()函数使用介绍
2014/12/31 Javascript
JavaScript中join()方法的使用简介
2015/06/09 Javascript
js实现无限级树形导航列表效果代码
2015/09/23 Javascript
js获取图片宽高的方法
2015/11/25 Javascript
基于jQuery实现仿搜狐辩论投票动画代码(附源码下载)
2016/02/18 Javascript
vue.js 表格分页ajax 异步加载数据
2016/10/18 Javascript
vue页面使用阿里oss上传功能的实例(一)
2017/08/09 Javascript
Vue组件之全局组件与局部组件的使用详解
2017/10/09 Javascript
vue2.0 实现导航守卫(路由守卫)
2018/05/21 Javascript
最全vue的vue-amap使用高德地图插件画多边形范围的示例代码
2020/07/17 Javascript
Python3网络爬虫之使用User Agent和代理IP隐藏身份
2017/11/23 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
python读取文件名并改名字的实例
2019/01/07 Python
在SQLite-Python中实现返回、查询中文字段的方法
2019/07/17 Python
Tensorflow 多线程设置方式
2020/02/06 Python
python设置中文界面实例方法
2020/10/27 Python
Python接口自动化测试框架运行原理及流程
2020/11/30 Python
全球地下的服装和态度:Slam Jam
2018/02/04 全球购物
ddl,dml和dcl的含义
2016/05/08 面试题
部队学习十八大感言
2014/01/11 职场文书
廉洁校园实施方案
2014/05/25 职场文书
导游词之烟台威海蓬莱
2019/11/14 职场文书
python 利用PyAutoGUI快速构建自动化操作脚本
2021/05/31 Python
使用feign服务调用添加Header参数
2021/06/23 Java/Android
pycharm部署django项目到云服务器的详细流程
2021/06/29 Python
特别篇动画《总之就是非常可爱 ~制服~》PV公开,2022年夏季播出
2022/04/04 日漫