class Vision(ccm.Model): def __init__(self, visual, location): ccm.Model.__init__(self) self._visual = visual self._location = location self.busy = False self.lastLocationPattern = Pattern('') self.tracking = None self.timeAppeared = {} self.visualOnsetSpan = 0.5 self.finst = Finst(self) def start(self): self.environmentUpdate() def isNew(self, object): if not getattr(object, 'visible', True): return time = self.timeAppeared.get(object, None) if time == None: self.timeAppeared[object] = self.now() return True return self.now() < time + self.visualOnsetSpan def environmentUpdate(self): while True: if self._location.isEmpty(): r = [] for o in self.parent.parent.get_children(): if not getattr(o, 'visible', True): if o in self.timeAppeared.keys(): del self.timeAppeared[o] continue if o not in self.timeAppeared: if hasattr(o, 'x') and hasattr(o, 'y'): #if self.lastLocationPattern.match(o)!=None: r.append(o) if len(r) > 0: obj = self.random.choice(r) self.log._ = 'Vision stuffed obj at (%g,%g)' % (obj.x, obj.y) self._location.set('%g %g' % (obj.x, obj.y)) #print 'checking tracking',self.tracking #if self.tracking!=None and (self.tracking not in self.parent.parent.get_children() or not getattr(self.tracking,'visible',True)): # print '...lost' # self.sch.add(self.lostTrack,delay=0.085) for o in self.parent.parent.get_children(): self.isNew(o) yield self.parent.parent.changes, self.lostTrack def lostTrack(self): if self.tracking is not None: self.tracking = None self.log._ = 'Object disappeared' self._visual.clear() #self._location.clear() def attendToUnattended(self, pattern=''): self.attendTo(pattern=pattern, unattended=True) def attendToNew(self, pattern=''): self.attendTo(pattern=pattern, new=True) def attendTo(self, pattern, unattended=False, new=False): if isinstance(pattern, str) and ':' not in pattern and pattern.count(' ') == 1: pattern = 'x:%s y:%s' % tuple(pattern.split(' ')) self.lastLocationPattern = Pattern(pattern, self.sch.bound) r = [] for obj in self.parent.parent.get_children(): if new == True and not self.isNew(obj): continue if unattended == True and self.finst.isIn(obj): continue if hasattr(obj, 'x') and hasattr(obj, 'y') and getattr( obj, 'visible', True): if self.lastLocationPattern.match(obj) != None: r.append(obj) if len(r) > 0: obj = self.random.choice(r) self.log._ = 'Vision found obj at (%g,%g)' % (obj.x, obj.y) self._location.set('%g %g' % (obj.x, obj.y)) def isClose(self, a, b): return abs(a - b) < 0.01 def examine(self, pat): if isinstance(pat, str) and ':' not in pat and pat.count(' ') == 1: pat = 'x:%s y:%s' % tuple(pat.split(' ')) self.lastExamine = Pattern(pat, self.sch.bound) pat = self.lastExamine for obj in self.parent.parent.get_children(): if hasattr(obj, 'x') and hasattr(obj, 'y') and getattr( obj, 'visible', True): if pat.match(obj) is not None: #if self.isClose(obj.x,float(pat[0])) and self.isClose(obj.y,float(pat[1])): self.busy = True yield 0.085 self.busy = False if obj in self.parent.parent.get_children(): self.tracking = obj self.log._ = 'Vision sees %s' % Chunk(obj) self._visual.set(obj) self.finst.add(obj) else: self.tracking = None self.log._ = 'Vision sees nothing' self._visual.clear() break
class Vision(ccm.Model): def __init__(self,visual,location): ccm.Model.__init__(self) self._visual=visual self._location=location self.busy=False self.lastLocationPattern=Pattern('') self.tracking=None self.timeAppeared={} self.visualOnsetSpan=0.5 self.finst=Finst(self) def start(self): self.environmentUpdate() def isNew(self,object): if not getattr(object,'visible',True): return time=self.timeAppeared.get(object,None) if time==None: self.timeAppeared[object]=self.now() return True return self.now()<time+self.visualOnsetSpan def environmentUpdate(self): while True: if self._location.isEmpty(): r=[] for o in self.parent.parent.get_children(): if not getattr(o,'visible',True): if o in self.timeAppeared.keys(): del self.timeAppeared[o] continue if o not in self.timeAppeared: if hasattr(o,'x') and hasattr(o,'y'): #if self.lastLocationPattern.match(o)!=None: r.append(o) if len(r)>0: obj=self.random.choice(r) self.log._='Vision stuffed obj at (%g,%g)'%(obj.x,obj.y) self._location.set('%g %g'%(obj.x,obj.y)) #print 'checking tracking',self.tracking #if self.tracking!=None and (self.tracking not in self.parent.parent.get_children() or not getattr(self.tracking,'visible',True)): # print '...lost' # self.sch.add(self.lostTrack,delay=0.085) for o in self.parent.parent.get_children(): self.isNew(o) yield self.parent.parent.changes,self.lostTrack def lostTrack(self): if self.tracking is not None: self.tracking=None self.log._='Object disappeared' self._visual.clear() #self._location.clear() def attendToUnattended(self,pattern=''): self.attendTo(pattern=pattern,unattended=True) def attendToNew(self,pattern=''): self.attendTo(pattern=pattern,new=True) def attendTo(self,pattern,unattended=False,new=False): if isinstance(pattern, str) and ':' not in pattern and pattern.count(' ')==1: pattern='x:%s y:%s'%tuple(pattern.split(' ')) self.lastLocationPattern=Pattern(pattern,self.sch.bound) r=[] for obj in self.parent.parent.get_children(): if new==True and not self.isNew(obj): continue if unattended==True and self.finst.isIn(obj): continue if hasattr(obj,'x') and hasattr(obj,'y') and getattr(obj,'visible',True): if self.lastLocationPattern.match(obj)!=None: r.append(obj) if len(r)>0: obj=self.random.choice(r) self.log._='Vision found obj at (%g,%g)'%(obj.x,obj.y) self._location.set('%g %g'%(obj.x,obj.y)) def isClose(self,a,b): return abs(a-b)<0.01 def examine(self,pat): if isinstance(pat, str) and ':' not in pat and pat.count(' ')==1: pat='x:%s y:%s'%tuple(pat.split(' ')) self.lastExamine=Pattern(pat,self.sch.bound) pat=self.lastExamine for obj in self.parent.parent.get_children(): if hasattr(obj,'x') and hasattr(obj,'y') and getattr(obj,'visible',True): if pat.match(obj) is not None: #if self.isClose(obj.x,float(pat[0])) and self.isClose(obj.y,float(pat[1])): self.busy=True yield 0.085 self.busy=False if obj in self.parent.parent.get_children(): self.tracking=obj self.log._='Vision sees %s'%Chunk(obj) self._visual.set(obj) self.finst.add(obj) else: self.tracking=None self.log._='Vision sees nothing' self._visual.clear() break
class Vision(ccm.Model): def __init__(self, visual, location): ccm.Model.__init__(self) self._visual = visual self._location = location self.busy = False self.lastLocationPattern = Pattern('') self.tracking = None self.timeAppeared = {} self.visualOnsetSpan = 0.5 self.finst = Finst(self) def start(self): self.environmentUpdate() def isNew(self, object): if not getattr(object, 'visible', True): return time = self.timeAppeared.get(object, None) if time == None: self.timeAppeared[object] = self.now() return True return self.now() < time + self.visualOnsetSpan def environmentUpdate(self): # First, create a while-loop for checking updates to the environment. while True: # If the visual location buffer is empty, if self._location.isEmpty(): # Create a list for storing new visible objects in the environment. r = [] # In the following self is the vision module, self.parent is the agent which includes the vision module, # and self.parent.parent is the environment in which the agent is. for o in self.parent.parent.get_children(): # If the object is not visible anymore, if not getattr(o, 'visible', True): # further if the object is in timeAppeared, then we delete the object from timeAppeared. # Note timeAppeared records the time when an object becomes visible in the environment. if o in self.timeAppeared.keys(): del self.timeAppeared[o] # Let us go to check the next object in the environment directly. continue # If the object is not in timeAppeared, if o not in self.timeAppeared: # further if the object has the location information, if hasattr(o, 'x') and hasattr(o, 'y'): #(obsolete) if self.lastLocationPattern.match(o)!=None: # Let add this object into the list r. r.append(o) # If there is new visible objects, i.e., the list is not empty, if len(r) > 0: # We randomly select one object. obj = self.random.choice(r) # We print the following information to the display. self.log._ = 'Vision stuffed obj at (%g,%g)' % (obj.x, obj.y) # We add the location of the new visible object to the visual location buffer. self._location.set('%g %g' % (obj.x, obj.y)) #(obsolete) print 'checking tracking',self.tracking #(obsolete) if self.tracking!=None and (self.tracking not in self.parent.parent.get_children() or not getattr(self.tracking,'visible',True)): #(obsolete) print '...lost' #(obsolete) self.sch.add(self.lostTrack,delay=0.085) # In the following self is the vision module, self.parent is the agent which includes the vision module, # and self.parent.parent is the environment in which the agent is. In the for-loop, each object in the environment # is checked to see if they are new visiable objects. for o in self.parent.parent.get_children(): self.isNew(o) # In the following self is the vision module, self.parent is the agent which includes the vision module, # and self.parent.parent is the environment in which the agent is. yield self.parent.parent.changes, self.lostTrack def lostTrack(self): """Indicate that the vision tracking is lost.""" # If the vision module is tracking an object, if self.tracking is not None: # The object slips away from our tracking. self.tracking = None # We print the information to the display. self.log._ = 'Object disappeared' # And we clear the visual buffer. self._visual.clear() #(obsolete) self._location.clear() def attendToUnattended(self, pattern=''): self.attendTo(pattern=pattern, unattended=True) def attendToNew(self, pattern=''): self.attendTo(pattern=pattern, new=True) def attendTo(self, pattern, unattended=False, new=False): # The argument "pattern" contains the information of a visual location. # If pat provides only the values of x-coordinate and y-coordinate, # we reorganize pat into 'x: x-coordinate y: y-coordinate'. if isinstance(pattern, str) and ':' not in pattern and pattern.count(' ') == 1: pattern = 'x:%s y:%s' % tuple(pattern.split(' ')) # The x-coordinate, y-coordinate often are variables, e.g. "?x ?y". We use function Pattern() to map # the variables to the values stored in sch.bound. self.lastLocationPattern = Pattern(pattern, self.sch.bound) r = [] # In the following self is the vision module, self.parent is the agent which includes the vision module, # and self.parent.parent is the environment in which the agent is. In the for-loop, each object in the environment # is checked to see if they are visiable objects. for obj in self.parent.parent.get_children(): # If the visual location is new, but the object is not new, we directly go to check the next object. if new == True and not self.isNew(obj): continue # If the location is unattended, but the object is in finst (finger instantiation) list, we directly go to check # the next object. if unattended == True and self.finst.isIn(obj): continue # Let us check if an object is a visible object. We do so by checking if the object contains the attributes # "x", "y", and if the attribute "visible=True". if hasattr(obj, 'x') and hasattr(obj, 'y') and getattr( obj, 'visible', True): # Further, if the visual location matches the location of the visible object, if self.lastLocationPattern.match(obj) != None: # We add this object to the list r. r.append(obj) # If we found more than one visible objects in the list r, if len(r) > 0: # We randomly chose one object from the list. obj = self.random.choice(r) # We print the following information to the display. self.log._ = 'Vision found obj at (%g,%g)' % (obj.x, obj.y) # We store the object's location into the visual location buffer. self._location.set('%g %g' % (obj.x, obj.y)) def isClose(self, a, b): return abs(a - b) < 0.01 def examine(self, pat): """ Check the visible object at a visual location. :param pat: specify the visual location. :return: """ # The argument "pat" (pattern) contains the information of a visual location. # If pat provides only the values of x-coordinate and y-coordinate, # we reorganize pat into 'x: x-coordinate y: y-coordinate'. if isinstance(pat, str) and ':' not in pat and pat.count(' ') == 1: pat = 'x:%s y:%s' % tuple(pat.split(' ')) # The x-coordinate, y-coordinate often are variables, e.g. "?x ?y". We use function Pattern() to map # the variables to the values stored in sch.bound. self.lastExamine = Pattern(pat, self.sch.bound) # Now we update the variable pat which has assigned valules. pat = self.lastExamine # In the following self is the vision module, self.parent is the agent which includes the vision module, # and self.parent.parent is the environment in which the agent is. In the for-loop, each object in the environment # is checked to see if they are visiable objects. for obj in self.parent.parent.get_children(): # First, let us check if an object is a visible object. We do so by checking if the object contains the attributes # "x", "y", and if the attribute "visible=True". if hasattr(obj, 'x') and hasattr(obj, 'y') and getattr( obj, 'visible', True): # Further, if the visual location pat matches the location of the visible object, if pat.match(obj) is not None: #(obsolete) if self.isClose(obj.x,float(pat[0])) and self.isClose(obj.y,float(pat[1])): # The vision module starts working; it is busy. self.busy = True # The default time required for a vision module request is set as 0.085s. yield 0.085 # The vision module finishes working; it is not busy. self.busy = False # In the following, self is the vision module, self.parent is the agent which includes the vision module, # and self.parent.parent is the environment in which the agent is. # If obj is still an object in the environment, if obj in self.parent.parent.get_children(): # The vision module is tracking this object. self.tracking = obj # We print the following information to the display. self.log._ = 'Vision sees %s' % Chunk(obj) # We put the object into the visual buffer. self._visual.set(obj) # We add the object into the list of finst (finger instantiation). self.finst.add(obj) # If obj is no longer an object in the environment, else: # There is nothing to track. self.tracking = None # We print the following information to the display. self.log._ = 'Vision sees nothing' # We clear the visual buffer. self._visual.clear() # Each time, only one object can be seen. When we find one, we break the for-loop. break