zoukankan      html  css  js  c++  java
  • Python PID

    import time
    
    class PID:
        """PID Controller
        """
    
        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):
            """Clears PID computations and coefficients"""
            self.SetPoint = 0.0
    
            self.PTerm = 0.0
            self.ITerm = 0.0
            self.DTerm = 0.0
            self.last_error = 0.0
    
            # Windup Guard
            self.int_error = 0.0
            self.windup_guard = 20.0
    
            self.output = 0.0
    
        def update(self, feedback_value):
            """Calculates PID value for given reference feedback
            .. math::
                u(t) = K_p e(t) + K_i int_{0}^{t} e(t)dt + K_d {de}/{dt}
            .. figure:: images/pid_1.png
               :align:   center
               Test PID with Kp=1.2, Ki=1, Kd=0.001 (test_pid.py)
            """
            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
    
                # Remember last time and last error for next calculation
                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):
            """Determines how aggressively the PID reacts to the current error with setting Proportional Gain"""
            self.Kp = proportional_gain
    
        def setKi(self, integral_gain):
            """Determines how aggressively the PID reacts to the current error with setting Integral Gain"""
            self.Ki = integral_gain
    
        def setKd(self, derivative_gain):
            """Determines how aggressively the PID reacts to the current error with setting Derivative Gain"""
            self.Kd = derivative_gain
    
        def setWindup(self, windup):
            """Integral windup, also known as integrator windup or reset windup,
            refers to the situation in a PID feedback controller where
            a large change in setpoint occurs (say a positive change)
            and the integral terms accumulates a significant error
            during the rise (windup), thus overshooting and continuing
            to increase as this accumulated error is unwound
            (offset by errors in the other direction).
            The specific problem is the excess overshooting.
            """
            self.windup_guard = windup
    
        def setSampleTime(self, sample_time):
            """PID that should be updated at a regular interval.
            Based on a pre-determined sampe time, the PID decides if it should compute or return immediately.
            """
    self.sample_time = sample_time
  • 相关阅读:
    CSS Grid 网格布局全解析
    VSCode插件和首选项配置
    mybatis分页实现原理
    org.apache.ibatis.exceptions.PersistenceException解决办法
    使用ssm框架在使用id查询时应注意的问题
    出现Caused by: org.apache.ibatis.executor.ExecutorException: No constructor found in com.duowenjia.bean.StudentInfo matching [java.lang.Integer, java.lang.String, java.lang.String, java.lang.String]的问题
    如何实现每个页面都判断session
    count(*),count(常量),count(列名)的区别
    json的jsonarray是有区别的
    毕业设计(高校网上作业提交系统)开发记录(20)
  • 原文地址:https://www.cnblogs.com/qj696/p/10878023.html
Copyright © 2011-2022 走看看