UserPreferences

NNFindBlobProgram


You are not allowed to edit this page. Are you logged in? Click on UserPreferences in upper-righthand corner.

Clear message

  1 
  2 
  3 
  4 
  5 
  6 
  7 
  8 
  9 
 10 
 11 
 12 
 13 
 14 
 15 
 16 
 17 
 18 
 19 
 20 
 21 
 22 
 23 
 24 
 25 
 26 
 27 
 28 
 29 
 30 
 31 
 32 
 33 
 34 
 35 
 36 
 37 
 38 
 39 
 40 
 41 
 42 
 43 
 44 
 45 
 46 
 47 
 48 
 49 
 50 
 51 
 52 
 53 
 54 
 55 
 56 
 57 
 58 
 59 
 60 
 61 
 62 
 63 
 64 
 65 
 66 
 67 
 68 
 69 
 70 
 71 
 72 
 73 
 74 
 75 
 76 
 77 
 78 
 79 
 80 
 81 
 82 
 83 
 84 
 85 
 86 
 87 
 88 
 89 
 90 
 91 
 92 

# Brain used in conjunction with GAFindBlobNN.py to create a robot
# that chases after red objects.

# Network inputs: 8
# 4 virtual sonar sensors and 4 pieces of color blob info.
# Sonar values are the minimums of four groups:
# back, front-left, front-right, and front.

# The color blob info consists of the range to closest blob,
# and 3 nodes which code for direction of the closest blob:
# 100=left, 010=center, 001=right, and 000=none.
# All inputs are scaled between 0 and 1.

# Network outputs: 2
# Translate and rotate.

from pyrobot.brain import Brain
from pyrobot.brain.conx import *
from time import *

# The robot will get translate and rotate values in the range [-0.5,0.5],
# but the neural network will generate outputs in the range [0,1].
def toNetworkUnits(val):
   return (val + 0.5)

def toRobotUnits(val):
   return (val - 0.5)

class NNBrain(Brain):
   def setup(self, **args):
      self.net = Network()
      self.net.addLayers(8,6,2)
      self.net.setLearning(0)
      if not self.robot.hasA("camera"):
         # Assume Stage, which uses the BlobCamera:
         self.robot.startDevice("BlobCamera")
         self.robot.camera[0].addFilter("match", 255, 0, 0)
         self.robot.camera[0].addFilter("blobify",0,255,255,0,1,1,1,)
      self.robot.range.units = "meters"
      self.robot.range.setMaxvalue(4.5) # about as far as sonar can see in room
      self.robot.range.units = "scaled"
      self.counter = 0
      self.currentInputs = [0] * 8

   def getBlobInfo(self, (x1, y1, x2, y2, pixels)):
      blobLeft, blobCenter, blobRight = (0.0, 0.0, 0.0)
      if (x1, y1, x2, y2) == (0.0, 0.0, 0.0, 0.0):
         return 0.0, blobLeft, blobCenter, blobRight
      # how close is the blob? how much of the view does it occupy?
      blobRange = (y2 - y1) / float(self.robot.camera[0].height)
      # where is the blob in the image?
      center = (x2 + x1) / 2.0
      # is it in the left third of view?
      if center < self.robot.camera[0].width/3.0: # left third
         blobLeft = 1.0
      # right third?
      elif center > 2.0 * self.robot.camera[0].width/3.0: # right third
         blobRight = 1.0
      # must be in center
      else:
         blobCenter = 1.0
      return blobRange, blobLeft, blobCenter, blobRight

   def getInputs(self):
      # get minimum values for each area:
      back =  min([s.distance() for s in self.robot.range["back"]])
      left  = min([s.distance() for s in self.robot.range["front-left"]])
      front = min([s.distance() for s in self.robot.range["front"]])
      right = min([s.distance() for s in self.robot.range["front-right"]])
      blobList = self.robot.camera[0].filterResults[1]
      if blobList  != []:
         blobRange, blobLeft, blobCenter, blobRight  = self.getBlobInfo(blobList[0]) # biggest blob
      self.currentInputs = [back, left, front, right, blobRange, blobLeft, blobCenter, blobRight]
      self.net['input'].copyActivations(self.currentInputs)

   def getOutputs(self):
      translate = toRobotUnits(self.net['output'].activation[0])
      rotate = toRobotUnits(self.net['output'].activation[1])
      return translate, rotate

   def step(self):
      print "adapter is stepping"
      self.robot.update()
      self.getInputs()
      self.net.propagate()
      translate, rotate = self.getOutputs()
      self.move(translate, rotate)
      self.counter += 1

def INIT(engine):
   return NNBrain('NNBrain', engine)