Rose-Hulman Robotics Team

Changeset 487

Show
Ignore:
Timestamp:
05/12/09 20:37:14 (3 years ago)
Author:
mosttw
Message:

Added graphing of motor controller pid values

Location:
trunk/software/rb
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/software/rb/controller.py

    r485 r487  
    4343                self.data_queue = Queue() 
    4444                self.init_drive() 
    45                 self.init_camera() 
     45                #self.init_camera() 
    4646                #self.init_gps() 
    4747                #self.init_microstrain() 
  • trunk/software/rb/drive.py

    r482 r487  
    6363 
    6464 
    65 # TODO: 
    66 #  - Make motors public so they can be accessed directly 
    67 #  - Rename:  TestPlatformDrive -> Drive 
    68 #             legacy2008.py     -> Drive.py 
    69 #  - Remove helper methods from DiffDrive 
    70  
    7165class Drive(object): 
    7266        ''' 
     
    7872                self.controller = controller 
    7973                self.running = True 
     74                self._stats = ((0, 0, 0), (0, 0, 0)) 
    8075                self.left  = Motor(self, ldev) 
    8176                self.right = Motor(self, rdev) 
     
    8479        def _main(self): 
    8580                while self.running: 
     81                        # Get the current speed 
    8682                        lcur, rcur = self._split('getspeed', (), ()) 
    8783                        if lcur is not None: 
     
    9591                        if lcur is not None and rcur is not None: 
    9692                                self.controller.send('drive_speeds', self.getspeed()) 
     93                         
     94                        # Get the PID numbers 
     95                        try: 
     96                                (lp, li, ld), (rp, ri, rd) = self._split('getstat', (), ()) 
     97                        except ValueError: # Failed to get so unpacking failed 
     98                                print "Drive._main: timeout getting stats" 
     99                        else: 
     100                                self._stats = ((lp, li, ld), (rp, ri, rd)) 
     101                                self.controller.sent('drive_stats', (lp, li, ld), (rp, ri, rd)) 
     102                         
    97103                        time.sleep(.05) 
    98104 
     
    128134        def getspeed(self): 
    129135                return (self.left.current, self.right.current) 
    130  
     136         
     137        def getstat(self): 
     138                return self._stats 
     139         
    131140        def disable(self):     return self._split("disable", (), ()) 
    132141        def enable (self):     return self._split("enable" , (), ()) 
     
    218227                self.left = FakeMotor() 
    219228                self.right = FakeMotor() 
     229                self._stat_counter = 0 
    220230                start_new_thread(self._main, ()) 
    221231         
     
    234244        def gettarget(self): 
    235245                return (self.left.target, self.right.target) 
     246         
     247        def getstat(self): 
     248                s = (self._stat_counter % 0xffff) 
     249                self._stat_counter += 300 
     250                return (((s + 1000) % 0xffff - 32767, 
     251                                  (s + 3000) % 0xffff - 32767, 
     252                                  (s + 6000) % 0xffff - 32767), 
     253                                 ((s + 8000) % 0xffff - 32767, 
     254                                  (s + 10000) % 0xffff - 32767, 
     255                                  (s + 14000) % 0xffff - 32767)) 
    236256         
    237257        def getspeed(self): 
  • trunk/software/rb/gui/speedgraph.py

    r461 r487  
    2929                super(SpeedGraph, self).__init__() 
    3030                self.drive = drive 
    31                 self.ldata = [] 
    32                 self.ltargets = [] 
    33                 self.rdata = [] 
    34                 self.rtargets = [] 
     31                self.colors = [ 
     32                        ( 0, .5,  0), # Left speeds 
     33                        ( 0,  1,  0), # Left targets 
     34                        (.5,  0,  0), # Right speeds 
     35                        ( 1,  0,  0), # Right targets 
     36                        ( 0,  0,  0), # Left p 
     37                        ( 0,  0,  0), # Left i 
     38                        ( 0,  0,  0), # Left d 
     39                        ( 0,  0,  0), # Right p 
     40                        ( 0,  0,  0), # Right i 
     41                        ( 0,  0,  0), # Right d 
     42                ] 
     43                self.data = [[] for color in self.colors] 
    3544                self.connect("expose_event", self.expose) 
    3645                gobject.timeout_add(150, self.graph_tick) 
     
    5463                context.fill() 
    5564                 
    56                 if len(self.ldata) < DATA_WINDOW: 
    57                         start_x = a.width * (1 - len(self.ldata) / float(DATA_WINDOW)) 
     65                if len(self.data[0]) < DATA_WINDOW: 
     66                        start_x = a.width * (1 - len(self.data[0]) / float(DATA_WINDOW)) 
    5867                else: 
    5968                        start_x = 0 
    6069                step_x = a.width / float(DATA_WINDOW) 
    61                 self.draw_line(context, center_y, start_x, step_x, ( 0, .5,  0), self.ldata[-DATA_WINDOW:]) 
    62                 self.draw_line(context, center_y, start_x, step_x, ( 0,  1,  0), self.ltargets[-DATA_WINDOW:]) 
    63                 self.draw_line(context, center_y, start_x, step_x, (.5,  0,  0), self.rdata[-DATA_WINDOW:]) 
    64                 self.draw_line(context, center_y, start_x, step_x, ( 1,  0,  0), self.rtargets[-DATA_WINDOW:]) 
     70                for color, data in zip(self.colors, self.data): 
     71                        self.draw_line(context, center_y, start_x, step_x, color, data[-DATA_WINDOW:]) 
    6572                 
    6673                return False 
     
    7885         
    7986        def graph_tick(self): 
    80                 ltarget, rtarget = self.drive.gettarget() 
    81                 lspeed, rspeed = self.drive.getspeed() 
    82                 self.ldata.append(lspeed) 
    83                 self.ltargets.append(ltarget) 
    84                 self.rdata.append(rspeed) 
    85                 self.rtargets.append(rtarget) 
     87                lt, rt = self.drive.gettarget() 
     88                ls, rs = self.drive.getspeed() 
     89                lst, rst = self.drive.getstat() 
     90                new_data = [lt, rt, ls, rs] 
     91                new_data += [s / 32767.0 for s in (lst + rst)] 
     92                 
     93                for datum, list in zip(new_data, self.data): 
     94                        list.append(datum) 
    8695                self.queue_draw() 
    8796                return True