2022年 11月 4日

PID的Python实现

本文参考微信公众号文章“简易PID算法的快速扫盲”

这篇文章写得很好,我仅仅是将C++改成了Python,毕竟Python看起来还是更短小、更容易理解的。

代码如下:

  1. import matplotlib.pyplot as plt
  2. class PID():
  3. def __init__(self, dt, max, min, Kp, Kd, Ki):
  4. self.dt = dt # 循环时长
  5. self.max = max # 操作变量最大值
  6. self.min = min # 操作变量最小值
  7. self.Kp = Kp # 比例增益
  8. self.Kd = Kd # 积分增益
  9. self.Ki = Ki # 微分增益
  10. self.integral = 0 # 直到上一次的误差值
  11. self.pre_error = 0 # 上一次的误差值
  12. def calculate(self, setPoint, pv):
  13. # 其中 pv:process value 即过程值,
  14. error = setPoint - pv # 误差
  15. Pout = self.Kp * error # 比例项
  16. self.integral += error * self.dt
  17. Iout = self.Ki * self.integral # 积分项
  18. derivative = (error - self.pre_error)/self.dt
  19. Dout = self.Kd * derivative # 微分项
  20. output = Pout + Iout + Dout # 新的目标值
  21. if(output > self.max):
  22. output = self.max
  23. elif(output < self.min):
  24. output = self.min
  25. self.pre_error = error # 保存本次误差,以供下次计算
  26. return output
  27. t = range(150)
  28. pid = PID(0.1, 100, -100, 0.1, 0.01, 0.5)
  29. val = 20
  30. z = []
  31. for i in t:
  32. inc = pid.calculate(0, val)
  33. print("val:%f inc:%f"%(val,inc))
  34. z.append(20-val)
  35. val += inc
  36. plt.figure(figsize=(8,6), dpi = 80)
  37. plt.plot(t,z,color="blue",linewidth=1.0,linestyle="-")
  38. plt.show()

增加的内容不过是个简单的绘图,结果如下: