def __init__(self, config=None, guiloader=None): ''' Constructor ''' self._gui = GuiLoader() # check for config if type(config) == mrConfigParser: self.__visionConfig = config self.__visionHostName = self.__visionConfig.getConfigValue("PROTOCOl", "visionHostname") self.__visionCalibImg = self.__visionConfig.getConfigValue("GENERAL", "calibrationImg") self.__moduleName = self.__visionConfig.getConfigValue("GENERAL", "moduleName") self.__connectionTimeout = self.__visionConfig.getConfigValueFloat("NETWORK", "timeout") else: mrLogger.log( "No configuration specified", mrLogger.LOG_LEVEL['info'] ) # load network interface self.__initNetworkInterface() # start image processing start_new_thread( self.__processImage, () ) # start gui if guiloader != None: self._gui = guiloader self._imageGrabber = ImageGrabber(self._gui, self.__visionConfig) self.__distortion = Distortion(self._gui, self._imageGrabber, self.__visionConfig) self.__transformation = Transformation(self._gui, self._imageGrabber, self.__visionConfig) self.__recognition = Recognition(self._gui, self._imageGrabber, self.__visionConfig) self.__initGui()
class mrVisionModule(object): ''' classdocs ''' __visionConfig = mrConfigParser() __visionHostName = "vision" __visionCalibImg = "img/calibration.jpg" _gui = GuiLoader() __serverName = None __serverNameAck = False _imageGrabber = ImageGrabber() __distortion = Distortion() __transformation = Transformation() __recognition = Recognition() __socketManager = None __mode = mrVisionData.VISION_MODE_NONE __connectionTimeout = 30.0 __moduleName = None def __init__(self, config=None, guiloader=None): ''' Constructor ''' self._gui = GuiLoader() # check for config if type(config) == mrConfigParser: self.__visionConfig = config self.__visionHostName = self.__visionConfig.getConfigValue("PROTOCOl", "visionHostname") self.__visionCalibImg = self.__visionConfig.getConfigValue("GENERAL", "calibrationImg") self.__moduleName = self.__visionConfig.getConfigValue("GENERAL", "moduleName") self.__connectionTimeout = self.__visionConfig.getConfigValueFloat("NETWORK", "timeout") else: mrLogger.log( "No configuration specified", mrLogger.LOG_LEVEL['info'] ) # load network interface self.__initNetworkInterface() # start image processing start_new_thread( self.__processImage, () ) # start gui if guiloader != None: self._gui = guiloader self._imageGrabber = ImageGrabber(self._gui, self.__visionConfig) self.__distortion = Distortion(self._gui, self._imageGrabber, self.__visionConfig) self.__transformation = Transformation(self._gui, self._imageGrabber, self.__visionConfig) self.__recognition = Recognition(self._gui, self._imageGrabber, self.__visionConfig) self.__initGui() def __initGui(self): ''' Initiates gui ''' self._gui.connect( "cmdCoriander", "clicked()", self.__startCoriander ) def __initNetworkInterface(self): ''' Initiates network interface ''' host = self.__visionConfig.getConfigValue("NETWORK", "serverIP") port = self.__visionConfig.getConfigValueInt("NETWORK", "serverPort") self.__socketManager = mrSocketManager(host=host, port=port, server=True, udpOn=True, useHandshake=True, name=str(self.__moduleName)) self.__socketManager.addOnDataRecievedListener( self.__dataRecieved ) self.__socketManager.addOnClientAddedListener( self.__clientAdded ) mrLogger.log( "Vision module trying to connect to gameserver", mrLogger.LOG_LEVEL['info'] ) # wait for connection t1 = time() while (time()-t1) < self.__connectionTimeout and not self.__socketManager.isConnected(): pass if self.__socketManager.isConnected(): mrLogger.log( "Vision module started", mrLogger.LOG_LEVEL['info'] ) else: msg = "Vision module could not establish connection to server at " + str(host) msg += " on port " + str(port) mrLogger.log( msg, mrLogger.LOG_LEVEL['error'] ) return False return True def __startCoriander(self): ''' Starts external program coriander ''' self._imageGrabber.stopVideo() start_new_thread(call, ("coriander",)) def __clientAdded(self, servername, clientdata): ''' Client added listener ''' msg = "Client " + servername + " " + str(clientdata) msg += " added" mrLogger.log( msg, mrLogger.LOG_LEVEL['info'] ) def __dataRecieved(self, socket, addr, data): ''' Data recieved listener ''' try: print "recieved:", data dom = CreateFromDocument(data) print "type:", type(dom) if type(dom) == changeVisionMode: assert isinstance(dom, changeVisionMode) self.__mode = str(dom.visionmode) mode = changeVisionMode() mode.visionmode = self.__mode self.__socketManager.sendData( mode.toxml("utf-8", element_name="changevisionmode") ) self._gui.status( "Vision mode set to " + str(self.__mode) ) mrLogger.logDebug( "Vision mode set to: " + str(self.__mode) ) except: pass def __sendVisionData(self, visionObjects={'bots': [], 'rectangles': []}): ''' Sends list of recognized objects @param visionObjects: Twoi dimensional list with visionObjects['bots'] as list of bots visionObjects['rectangles'] as list of objects ''' if self.__socketManager.isConnected() and len(visionObjects) == 2: # create data package data = positionDataPackage() data.visionmode = self.__mode # add bots to datapackage if self.__mode == VISION_MODE_STREAM_BOTS or self.__mode in VISION_MODE_STREAM_ALL: for bot in visionObjects['bots']: b = positionObjectBot() b.id = bot['id'] print "-----------------" print "bot:", bot bot['center'] = ( 1-bot['center'][0], bot['center'][1] ) b.location.append( bot['center'][0] ) b.location.append( bot['center'][1] ) b.angle = bot['angle'] data.append(b) print "botsend:", bot # add rectangles to datapackage if self.__mode == VISION_MODE_STREAM_OBJ or self.__mode in VISION_MODE_STREAM_ALL: for obj in visionObjects['rectangles']: print obj # send datapackage self.__socketManager.sendData( data.toxml("utf-8", element_name="positiondatapackage") ) def __setMode(self, mode=mrVisionData.VISION_MODE_NONE): ''' Sets vision mode @param mode: mrVisionData mode ''' self.__mode = mode def __processImage(self): ''' processes image recognision ''' mrLogger.logInfo( "Main loop started in mode " + str(self.__mode) ) while self.__mode != mrVisionData.VISION_MODE_TERMINATE: #print "mode:", self.__mode # get image img = self._imageGrabber.getImage() # sets image to distortion module self.__distortion.setImg(img) # undistort and crop image if self.__distortion.isCalibrated(): img = self.__distortion.undistortImage(img) img = self.__distortion.cropImage(img) # sets image to transformation and recognition module self.__transformation.setImg(img) self.__recognition.setImg(img) # STREAM IMAGES if self.__mode in mrVisionData.VISION_STREAMING_MODES: if self._imageGrabber.isActive(): # recognize objects self.__recognition.recognize() # get bots and rectangles try: obj = {'bots': self.__recognition.getBots(), 'rectangles': self.__recognition.getRectangles()} except: pass # transformate objects self.__transformation.transformObjects( obj['bots'] ) # send vision objects self.__sendVisionData(obj) # CALIBRATE CHESSBOARD elif self.__mode == mrVisionData.VISION_MODE_CALIBRATE_DIST: if not self.__distortion.isCalibrating(): self.__distortion.calibrateCamera() while self.__distortion.isCalibrating(): pass self.__setMode(mrVisionData.VISION_MODE_NONE) # CALIBRATE TRANSFORMATIONEN elif self.__mode == mrVisionData.VISION_MODE_CALIBRATE_TRANSF: # To-DO: calibration of transformation if not self.__transformation.isCalibrating(): self.__transformation.startCalibration() while self.__transformation.isCalibrating(): pass self.__setMode(mrVisionData.VISION_MODE_NONE) # sleep(0.01) # exit program mrLogger.logInfo( "Main loop stopped" ) self.__socketManager.stopSocket()