class BotNavigator: def __init__(self): self.bot = None self.lastBotCommand = None self.angularVelocity = 50 self.linearVelocity = 200 self.isBraked = False self.keyMap = { 'w':('self.bot.driveStraight', '( self.linearVelocity, )'), 's':('self.bot.driveStraight', '( -self.linearVelocity, )'), 'a':('self.bot.rotate', '( self.angularVelocity, )'), 'd':('self.bot.rotate', '( -self.angularVelocity, )'), 'q':('self.terminate', None), ' ':('self.toggleState', None) } def useRemoteController(self, uri): self.bot = xmlrpclib.ServerProxy(uri, allow_none=True) def useLocalController(self, devPath): self.bot = BotController() self.bot.connect(devPath) self.bot.start() self.bot.enterFullMode() def isBotCommand(self, cmdStr): return ( cmdStr.find('self.bot.')==0 ) def execCommand(self, funcName, argExp): cmd = eval(funcName) if argExp==None: cmd() else: args = eval(argExp) cmd(*args) if self.isBotCommand(funcName): self.isBraked = False self.lastBotCommand = (funcName, argExp) def terminate(self): self.isRunning = False def toggleState(self): if(self.lastBotCommand == None): return self.isBraked = not self.isBraked if (self.isBraked): self.bot.brake() else: self.execCommand(*(self.lastBotCommand)) def navigate(self): self.isRunning = True while(self.isRunning): ch = getch() try: cmdTuple = self.keyMap[ch] self.execCommand(*cmdTuple) except KeyError: pass self.bot.brake()