pid.py
Go to the documentation of this file.
00001 # Software License Agreement (BSD License)
00002 #
00003 #  Copyright (c) 2011, UC Regents
00004 #  All rights reserved.
00005 #
00006 #  Redistribution and use in source and binary forms, with or without
00007 #  modification, are permitted provided that the following conditions
00008 #  are met:
00009 #
00010 #   * Redistributions of source code must retain the above copyright
00011 #     notice, this list of conditions and the following disclaimer.
00012 #   * Redistributions in binary form must reproduce the above
00013 #     copyright notice, this list of conditions and the following
00014 #     disclaimer in the documentation and/or other materials provided
00015 #     with the distribution.
00016 #   * Neither the name of the University of California nor the names of its
00017 #     contributors may be used to endorse or promote products derived
00018 #     from this software without specific prior written permission.
00019 #
00020 #  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
00021 #  "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
00022 #  LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
00023 #  FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
00024 #  COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
00025 #  INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
00026 #  BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
00027 #  LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
00028 #  CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
00029 #  LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
00030 #  ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
00031 #  POSSIBILITY OF SUCH DAMAGE.
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             # TODO: finite differencing
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 # maybe useful for debugging
00084             self.current_output = output
00085         return output
00086     
00087     def get_current_cmd(self):
00088         return self.current_output


starmac_roslib
Author(s): Patrick Bouffard
autogenerated on Sun Jan 5 2014 11:38:14