fuzzypid1.py 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. from fuzzypid import NB, NM, NS, ZO, PB, PM, PS
  2. from fuzzypid import RuleBase, MembershipFunction, FuzzyPIDParams, PIDDirect, FuzzyPIDController
  3. # Default fuzzy rule base of delta kp/ki/kd
  4. kp_rule_base = [
  5. [PB, PB, PM, PM, PS, ZO, ZO],
  6. [PB, PB, PM, PS, PS, ZO, NS],
  7. [PM, PM, PM, PS, ZO, NS, NS],
  8. [PM, PM, PS, ZO, NS, NM, NM],
  9. [PS, PS, ZO, NS, NS, NM, NM],
  10. [PS, ZO, NS, NM, NM, NM, NB],
  11. [ZO, ZO, NM, NM, NM, NB, NB],
  12. ]
  13. ki_rule_base = [
  14. [NB, NB, NM, NM, NS, ZO, ZO],
  15. [NB, NB, NM, NS, NS, ZO, ZO],
  16. [NB, NM, NS, NS, ZO, PS, PS],
  17. [NM, NM, NS, ZO, PS, PM, PM],
  18. [NM, NS, ZO, PS, PS, PM, PB],
  19. [ZO, ZO, PS, PS, PM, PB, PB],
  20. [ZO, ZO, PS, PM, PM, PB, PB],
  21. ]
  22. kd_rule_base = [
  23. [PS, NS, NB, NB, NB, NM, PS],
  24. [PS, NS, NB, NM, NM, NS, ZO],
  25. [ZO, NS, NM, NM, NS, NS, ZO],
  26. [ZO, NS, NS, NS, NS, NS, ZO],
  27. [ZO, ZO, ZO, ZO, ZO, ZO, ZO],
  28. [PB, PS, PS, PS, PS, PS, PB],
  29. [PB, PM, PM, PM, PS, PS, PB],
  30. ]
  31. rule_base = RuleBase(kp_rule_base, ki_rule_base, kd_rule_base)
  32. mf_params = MembershipFunction(
  33. [-3, -3, -2, 0, -3, -2, -1, 0, -2, -1, 0, 0, -1, 0, 1, 0, 0, 1, 2, 0, 1, 2, 3, 0, 2, 3, 3, 0])
  34. fuzzy_pid_params = FuzzyPIDParams([
  35. [0.65, 0, 0, 0, 0, 0, 1],
  36. [-0.34, 0, 0, 0, 0, 0, 1],
  37. [-1.1, 0, 0, 0, 0, 0, 1],
  38. ])
  39. direct = PIDDirect([True, False, False])
  40. fuzzy_pid_controller = FuzzyPIDController(
  41. rule_base, mf_params, fuzzy_pid_params, direct=direct)
  42. max_error = 100
  43. middle_pwm_output = 500
  44. control_id = 2
  45. real = 0
  46. idea = max_error * 0.9
  47. print("idea value: ", idea)
  48. for j in range(10):
  49. out = fuzzy_pid_controller.compute_output(control_id, real, idea)
  50. real += (out - middle_pwm_output) / middle_pwm_output * max_error * 0.1
  51. print("%d,%s" % (int(out), real))