plot_speed.py
Go to the documentation of this file.
00001 #!/usr/bin/env python
00002 #
00003 # Description: ART speed data analysis
00004 #
00005 #   Copyright (C) 2009 Austin Robot Technology
00006 #
00007 #   License: Modified BSD Software License Agreement
00008 #
00009 # $Id: plot_speed.py 123 2010-04-10 01:38:29Z jack.oquin $
00010 
00011 import sys
00012 import getopt
00013 import os
00014 
00015 import numpy
00016 import matplotlib.pyplot as pyplot
00017 import pylab
00018 
00019 class speedData:
00020     "ART speed data analysis."
00021 
00022     def __init__(self, name=None):
00023         "Constructor method."
00024 
00025         # set default name prefix for plots
00026         if name:
00027             self.name = name
00028         else:
00029             self.name = 'speed'
00030 
00031         # initialize some class variables
00032         self.clear()
00033 
00034         # default pressure polynomial
00035         self.pr_poly = numpy.array([0.44371437, -3.84781813,  9.19754362])
00036         # this value from octave (when pressure > 1.001v)
00037         self.oct_poly = numpy.array([0.40480, -3.56259, 8.69659])
00038 
00039     def cd(self, path):
00040         "Change directory to path."
00041         os.chdir(os.path.expanduser(path))
00042 
00043     def clear(self):
00044         "Clear data arrays."
00045         self.bc_t = numpy.array([])
00046         self.bc_pos = numpy.array([])
00047         self.bs_t = numpy.array([])
00048         self.bs_pos = numpy.array([])
00049         self.od_t = numpy.array([])
00050         self.od_v = numpy.array([])
00051         self.pc_t = numpy.array([])
00052         self.pc_v = numpy.array([])
00053         self.tc_t = numpy.array([])
00054         self.tc_pos = numpy.array([])
00055         self.ts_t = numpy.array([])
00056         self.ts_pos = numpy.array([])
00057 
00058     #def fit_pressure(self, order):
00059     #    "Fit a polynomial function of potentiometer to pressure voltages. "
00060     #    (self.pr_poly, resid, rank, singularvalues,
00061     #     rcond) = numpy.polyfit(self.bs_pot, self.bs_pr, order, full=True)
00062     #    print "polynomial coefficients: ", self.pr_poly
00063     #    print "residual: ", resid
00064 
00065     def plot(self, save=False):
00066         """ Plot some interesting data from the speed test run.
00067 
00068         When save=True write the figures to PNG files, otherwise show
00069         them interactively.
00070         """
00071         self.plot_summary(save)
00072         self.plot_speed(save)
00073         self.plot_servo(save)
00074         #self.plot_brake(save)
00075         #self.plot_throttle(save)
00076 
00077     def plot_brake(self, save=False):
00078         """ Plot brake requests and results from the speed test run.
00079 
00080         When save=True write the figure to a PNG file, otherwise show
00081         it interactively.
00082         """
00083         pyplot.hold(False)
00084         pyplot.plot(self.bs_t, self.bs_pos, 'r-', label="brake position")
00085         pyplot.hold(True)
00086         pyplot.plot(self.bc_t, self.bc_pos, 'bd', label="brake request")
00087         pyplot.xlabel("time (s)")
00088         pyplot.title(self.name + " brake")
00089         pyplot.legend(loc="best")
00090         pyplot.axis()
00091         pyplot.grid(True)
00092         self.render_plot(save, "-brake")
00093 
00094     def plot_servo(self, save=False):
00095         """ Plot servo controller requests and results from the speed test.
00096 
00097         When save=True write the figure to a PNG file, otherwise show
00098         it interactively.
00099         """
00100         pyplot.hold(False)
00101         pyplot.title(self.name + " servo")
00102         pyplot.plot(self.bs_t, -self.bs_pos, 'r-', label="-brake")
00103         pyplot.hold(True)
00104         pyplot.plot(self.bc_t, -self.bc_pos, 'rd', label="-request")
00105         pyplot.plot(self.ts_t, self.ts_pos, 'g-', label="throttle")
00106         pyplot.plot(self.tc_t, self.tc_pos, 'gd', label="request")
00107         pyplot.xlabel("time (s)")
00108         pyplot.ylabel("servo position")
00109         pyplot.legend(loc="best")
00110         pyplot.axis()
00111         pyplot.grid(True)
00112         self.render_plot(save, "-servo")
00113 
00114     def plot_speed(self, save=False):
00115         """ Plot speed requests and results from the speed test run.
00116 
00117         When save=True write the figure to a PNG file, otherwise show
00118         it interactively.
00119         """
00120         pyplot.hold(False)
00121         pyplot.title(self.name + " speed")
00122         pyplot.plot(self.od_t, self.od_v, 'b-', label="velocity")
00123         pyplot.hold(True)
00124         pyplot.plot(self.pc_t, self.pc_v, 'rd', label="request")
00125         pyplot.xlabel("time (s)")
00126         pyplot.ylabel("velocity (m/s)")
00127         pyplot.legend(loc="best")
00128         pyplot.axis()
00129         pyplot.grid(True)
00130         self.render_plot(save, "-speed")
00131 
00132     def plot_summary(self, save=False):
00133         """ Plot summary of speed test requests and results.
00134 
00135         When save=True write the figure to a PNG file, otherwise show
00136         it interactively.
00137         """
00138         pyplot.hold(False)
00139         pyplot.axis("off")              # no axis for overall figure
00140         pyplot.title(self.name + " speed summary")
00141 
00142         # 2 rows, 1 column: first (upper) subplot
00143         pyplot.subplot(211)
00144         pyplot.plot(self.od_t, self.od_v, 'b-', label="velocity")
00145         pyplot.hold(True)
00146         pyplot.plot(self.pc_t, self.pc_v, 'rd', label="request")
00147         pyplot.xlabel("time (s)")
00148         pyplot.ylabel("velocity (m/s)")
00149         pyplot.legend(loc="best")
00150         #pyplot.axis()
00151         pyplot.grid(True)
00152 
00153         # 2 rows, 1 column: second (lower) subplot
00154         pyplot.subplot(212)
00155         pyplot.hold(False)
00156         pyplot.plot(self.bs_t, -self.bs_pos, 'r-', label="-brake")
00157         pyplot.hold(True)
00158         pyplot.plot(self.bc_t, -self.bc_pos, 'rd', label="-request")
00159         pyplot.plot(self.ts_t, self.ts_pos, 'g-', label="throttle")
00160         pyplot.plot(self.tc_t, self.tc_pos, 'gd', label="request")
00161         pyplot.xlabel("time (s)")
00162         pyplot.ylabel("servo position")
00163         pyplot.legend(loc="best")
00164         #pyplot.axis()
00165         pyplot.grid(True)
00166         self.render_plot(save, "-summary")
00167 
00168     def plot_throttle(self, save=False):
00169         """ Plot throttle requests and results from the speed test run.
00170 
00171         When save=True write the figure to a PNG file, otherwise show
00172         it interactively.
00173         """
00174         pyplot.hold(False)
00175         pyplot.plot(self.ts_t, self.ts_pos, 'g-', label="throttle position")
00176         pyplot.hold(True)
00177         pyplot.plot(self.tc_t, self.tc_pos, 'gd', label="throttle request")
00178         pyplot.xlabel("time (s)")
00179         pyplot.title(self.name + " throttle")
00180         pyplot.legend(loc="best")
00181         pyplot.axis()
00182         pyplot.grid(True)
00183         self.render_plot(save, "-throttle")
00184 
00185     def pwd(self):
00186         "Print current working directory."
00187         return os.getcwd()
00188 
00189     def render_plot(self, save=False, suffix=''):
00190         """Common plot rendering commands.
00191 
00192         When save=True write the figure to a PNG file appending suffix
00193         to the file name.  Otherwise show the plot interactively.
00194 
00195         """
00196         if save:
00197             pylab.savefig(self.name + suffix + ".png")
00198         else:
00199             pyplot.show()
00200 
00201     def set_brake_cmd(self, t, pos):
00202         "set brake command data fields."
00203         self.bc_t =   numpy.append(self.bc_t, t)
00204         self.bc_pos = numpy.append(self.bc_pos, pos)
00205 
00206     def set_brake_state(self, t, pos):
00207         "set brake state data fields."
00208         self.bs_t =   numpy.append(self.bs_t, t)
00209         self.bs_pos = numpy.append(self.bs_pos, pos)
00210 
00211     def set_odometry(self, t, v):
00212         "set odometry data fields."
00213         self.od_t = numpy.append(self.od_t, t)
00214         self.od_v = numpy.append(self.od_v, v)
00215 
00216     def set_pilot_cmd(self, t, v):
00217         "set pilot command data fields."
00218         self.pc_t = numpy.append(self.pc_t, t)
00219         self.pc_v = numpy.append(self.pc_v, v)
00220 
00221     def set_throttle_cmd(self, t, pos):
00222         "set throttle command data fields."
00223         self.tc_t =   numpy.append(self.tc_t, t)
00224         self.tc_pos = numpy.append(self.tc_pos, pos)
00225 
00226     def set_throttle_state(self, t, pos):
00227         "set throttle state data fields."
00228         self.ts_t =   numpy.append(self.ts_t, t)
00229         self.ts_pos = numpy.append(self.ts_pos, pos)
00230         
00231 
00232 def usage(progname):
00233     "Print usage message."
00234     print "\n", progname, """[-h] [ <file.bag> ]
00235 
00236  -h, --help        print this message
00237  -i, --interactive display plots to terminal (default: save as files)
00238 
00239 Run some unit tests of the ART speed data analysis package.
00240  """
00241 
00242 # main program -- for either script or interactive use
00243 def main(argv=None):
00244     "Main program, called as a script or interactively."
00245 
00246     if argv is None:
00247         argv = sys.argv                 # use command args
00248 
00249     # extract base name of command, will be '' when imported
00250     progname = os.path.basename(argv[0])
00251     if progname is "":
00252         progname = "plot_speed.py"
00253 
00254     # process parameters
00255     try:
00256         opts, files = getopt.gnu_getopt(argv[1:], 'hi',
00257                                         ('help', 'interactive'))
00258     except getopt.error, msg:
00259         print msg
00260         print "for help use --help"
00261         return 9
00262 
00263     save = True
00264 
00265     for k,v in opts:
00266         if k in ("-h", "--help"):
00267             usage(progname)
00268             return 2
00269         if k in ("-i", "--interactive"):
00270             save = False
00271 
00272     # @todo run some unit tests
00273 
00274     return 0
00275 
00276 # when called as a script or via python-send-buffer
00277 if __name__ == "__main__":
00278     # run main function and exit
00279     sys.exit(main())


art_pilot
Author(s): Austin Robot Technology, Jack O'Quin
autogenerated on Fri Jan 3 2014 11:09:32