Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 class PidController(object):
00034 """
00035 Very simple PID controller class. Inspired by, and similar interface to,
00036 pid.cpp from pr2_controllers/control_toolbox
00037 """
00038 def __init__(self, KP=0, KI=0, KD=0, Ilimit=0):
00039 self.KP = KP
00040 self.KI = KI
00041 self.KD = KD
00042 assert Ilimit >= 0
00043 self.Imax = Ilimit
00044 self.Imin = -Ilimit
00045 self.zero()
00046
00047 def zero(self):
00048 self.i_term = 0.0
00049 self.p_term = 0.0
00050 self.d_term = 0.0
00051 self.p_error_last = 0.0
00052 self.p_error = 0.0
00053 self.i_error = 0.0
00054 self.d_error = 0.0
00055 self.current_output = 0.0
00056
00057 def update(self, error, dt=0.0, error_dot=None):
00058 self.p_error = error
00059 if error_dot is None:
00060
00061 if dt > 0.0:
00062 self.d_error = (self.p_error - self.p_error_last) / dt
00063 self.p_error_last = self.p_error
00064 else:
00065 self.d_error = error_dot
00066
00067 if dt == 0:
00068 output = 0.0
00069 else:
00070 p_term = self.KP*self.p_error
00071 self.i_error = self.i_error + dt*self.p_error
00072 i_term = self.KI*self.i_error
00073
00074 if i_term > self.Imax:
00075 i_term = self.Imax
00076 self.i_error = i_term/self.KI
00077 elif i_term < self.Imin:
00078 i_term = self.Imin
00079 self.i_error = i_term/self.KI
00080
00081 d_term = self.KD*self.d_error
00082 output = -p_term - i_term - d_term
00083 self.p_term, self.i_term, self.d_term = p_term, i_term, d_term
00084 self.current_output = output
00085 return output
00086
00087 def get_current_cmd(self):
00088 return self.current_output