-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathpid.py
39 lines (38 loc) · 940 Bytes
/
pid.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import time
def clamp(num,lower,upper):
return lower if num < lower else upper if num > upper else num
class PID:
def __init__(self):
self.started = False
self.kp = 0
self.kd = 0
self.ki = 0
self.prev_error = 0
self.prev_time = 0
self.cum_error = 0
self.prev_error_time = 0
def set_gains(self,kp,ki,kd):
self.kp = kp
self.ki = ki
self.kd = kd
def step(self, error):
t = time.time()
if self.started:
dt = t-self.prev_time
d_error = (error-self.prev_error)/(t-self.prev_error_time)
self.cum_error+=error*dt
output = self.kp*error + self.ki*self.cum_error + self.kd*d_error
self.prev_time = t
if(t-self.prev_error_time > 20):
self.prev_error_time = t
self.prev_error = error
return clamp(output,0,100)
else:
self.prev_time = t
self.prev_error = error
self.prev_error_time = t
self.started=True
return 0
def reset(self):
self.cum_error = 0
self.started = False