$search
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())