1
2
3
4
5
6 import rospy
7
8
10 """
11 PID control class
12
13 This class implements a simplistic PID control algorithm. When first
14 instantiated all the gain variables are set to zero, so calling
15 the method compute_output will just return zero.
16 """
17
18 - def __init__(self, kp=0.0, ki=0.0, kd=0.0):
19
20 self._kp = kp
21 self._ki = ki
22 self._kd = kd
23
24
25 self._prev_err = 0.0
26 self._cp = 0.0
27 self._ci = 0.0
28 self._cd = 0.0
29 self._cur_time = 0.0
30 self._prev_time = 0.0
31
32 self.initialize()
33
35 """
36 Initialize pid controller.
37 """
38
39 self._cur_time = rospy.get_time()
40 self._prev_time = self._cur_time
41
42 self._prev_err = 0.0
43
44
45 self._cp = 0.0
46 self._ci = 0.0
47 self._cd = 0.0
48
50 """
51 Set proportional gain.
52 """
53 self._kp = invar
54
56 """
57 Set integral gain.
58 """
59 self._ki = invar
60
62 """
63 Set derivative gain.
64 """
65 self._kd = invar
66
68 """
69 Performs a PID computation and returns a control value based on
70 the elapsed time (dt) and the error signal from a summing junction
71 (the error parameter).
72 """
73 self._cur_time = rospy.get_time()
74 dt = self._cur_time - self._prev_time
75 de = error - self._prev_err
76
77 self._cp = error
78 self._ci += error * dt
79
80 self._cd = 0
81 if dt > 0:
82 self._cd = de / dt
83
84 self._prev_time = self._cur_time
85 self._prev_err = error
86
87
88 return ((self._kp * self._cp) + (self._ki * self._ci) +
89 (self._kd * self._cd))
90