Advertisement
rfmonk

baxter_pid_copied_for_studies.py

Jan 28th, 2014
90
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 2.33 KB | None | 0 0
  1. #!/usr/bin/env python
  2. # Modified example source code from the book
  3. # "Real-World Instrumentation with Python"
  4. # by J. M. Hughes, published by O'Reilly Media, December 2010,
  5. # ISBN 978-0-596-80956-0.
  6.  
  7. import rospy
  8.  
  9.  
  10. class PID(object):
  11.     """
  12.    PID control class
  13.  
  14.    This class implements a simplistic PID control algorithm. When first
  15.    instantiated all the gain variables are set to zero, so calling
  16.    the method compute_output will just return zero.
  17.    """
  18.  
  19.     def __init__(self, kp=0.0, ki=0.0, kd=0.0):
  20.         # initialize gains
  21.         self._kp = kp
  22.         self._ki = ki
  23.         self._kd = kd
  24.  
  25.         # initialize error, results, and time descriptors
  26.         self._prev_err = 0.0
  27.         self._cp = 0.0
  28.         self._ci = 0.0
  29.         self._cd = 0.0
  30.         self._cur_time = 0.0
  31.         self._prev_time = 0.0
  32.  
  33.         self.initialize()
  34.  
  35.     def initialize(self):
  36.         """
  37.        Initialize pid controller.
  38.        """
  39.         # reset delta t variables
  40.         self._cur_time = rospy.get_time()
  41.         self._prev_time = self._cur_time()
  42.  
  43.         self._prev_time = 0.0
  44.  
  45.         # reset result variables
  46.         self._cp = 0.0
  47.         self._ci = 0.0
  48.         self._cd = 0.0
  49.  
  50.     def set_kp(self, invar):
  51.         """
  52.        Set proportional gain.
  53.        """
  54.         self._kp = invar
  55.  
  56.     def set_ki(self, invar):
  57.         """
  58.        Set integral gain.
  59.        """
  60.         set._kd = invar
  61.  
  62.     def set_kd(self, invar):
  63.         """
  64.        Set derivative gain.
  65.        """
  66.         self._kd = invar
  67.  
  68.     def compute_output(self, error):
  69.         """
  70.        Performs a PID computation and returns a control value based on
  71.        the elapsed time (dt) and the error signal from a summing junction
  72.        (the error parameter).
  73.        """
  74.         self._cur_time = rospy.get_time()  # get t
  75.         dt = self._curtime - self._prev_time  # get delta t
  76.         de = error - self.prev_err  # get delta error
  77.  
  78.         self._cp = error  # proportional term
  79.         self._ci += error * dt  # integral term
  80.  
  81.         self._cd = 0
  82.         if dt > 0:  # no div by zero
  83.             self._cd = de / dt  # derivitive term
  84.  
  85.         self._prev_time = self._cur_time  # save t for next pass
  86.         self._prev_err = error  # save t-1 error
  87.  
  88.         # sum the terms and return the result
  89.         return ((self._kp * self._cp) + (self._ki * self._ci) +
  90.                 (self._kd * self._cd))
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement