PID注释

PID注释

from pyb import millis      #插件重置后,返回毫秒数
from math import pi, isnan  #pi返回一个圆的周长与其直径的比值;isnan(x)对参数进行判断,若 x 非数字,则返回 True 
 
class PID:      #声明一个PID类
    _kp = _ki = _kd = _integrator = _imax = 0   #
    _last_error = _last_derivative = _last_t = 0
    _RC = 1/(2 * pi * 20)   # 不完全微分的滤波器
    def __init__(self, p=0, i=0, d=0, imax=0):
        self._kp = float(p)
        self._ki = float(i)
        self._kd = float(d)
        self._imax = abs(imax)
        self._last_derivative = float('nan')
 
    def get_pid(self, error, scaler):
        tnow = millis() # 获取当前的系统时间
        dt = tnow - self._last_t    # 系统经过的时间
        output = 0
        # 检测是否是第一次归位
        if self._last_t == 0 or dt > 1000:
            dt = 0
            self.reset_I()  # 重置
        self._last_t = tnow
        delta_time = float(dt) / float(1000)    # 换算成秒级
        output += error * self._kp
        if abs(self._kd) > 0 and dt > 0:
            if isnan(self._last_derivative):    # 检测上一次的微分值是否为空值(是否为初始复位状态)
                derivative = 0
                self._last_derivative = 0
            else:   # 不是初始复位状态时,按微分计算公式计算当前的微分值
                derivative = (error - self._last_error) / delta_time
            derivative = self._last_derivative + \
                                     ((delta_time / (self._RC + delta_time)) * \
                                        (derivative - self._last_derivative))
            self._last_error = error    # 上一次的误差值
            self._last_derivative = derivative  # 上一次的微分值
            output += self._kd * derivative # 输出加上微分项*微分项系数k_d
        output *= scaler
        if abs(self._ki) > 0 and dt > 0:
            self._integrator += (error * self._ki) * scaler * delta_time    # 积分值
            # 积分限幅
            if self._integrator < -self._imax: self._integrator = -self._imax   
            elif self._integrator > self._imax: self._integrator = self._imax
            output += self._integrator  # 输出加积分值
        return output
    # PID重置
    def reset_I(self):
        self._integrator = 0
        self._last_derivative = float('nan')
  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值