示例#1
0
 def __init__( self, config, logger, playerPos3d, 
     playerDepthSensor, playerSonar, playerFrontCamera ):
     
     ControlScript.__init__( self, config, logger, 
         playerPos3d, playerCompass = None, 
         playerDepthSensor = playerDepthSensor, playerSonar = playerSonar, 
         playerFrontCamera = playerFrontCamera )
         
     self.sonarScanner = SonarScanner( 
         logger, playerSonar, 
         playerDepthSensor, config )
     
     self.setState( self.STATE_PERFORMING_SCANS )
     self.lastCameraFrameTime = 0.0
     self.lastSonarFrameTime = 0.0
     self.lastCameraImageSaveTime = 0.0
     
     self.sonarImagesDir = string.Template( config.sonarImagesDir ).safe_substitute( os.environ )
     self.cameraImagesDir = string.Template( config.cameraImagesDir ).safe_substitute( os.environ )
     
     self.sonarScanner.setSonarConfig( 
         self.config.IC_Script_sonarRange, 
         self.config.IC_Script_sonarNumBins, 
         self.config.IC_Script_sonarGain )
     self.sonarScanner.setScanAngleRange( 
         Maths.degToRad( self.config.IC_Script_sonarScanStartAngleDegrees ), 
         Maths.degToRad( self.config.IC_Script_sonarScanEndAngleDegrees ) )
         
     self.bgrImage = None
示例#2
0
    def update( self ):
        
        curTime = time.time()
        
        if self.closeEnoughFlag == 0.0:
            if self.arbitrator.atDesiredYaw() and self.arbitrator.atDesiredDepth():
                self.arbitrator.update( self.movingLinearSpeed )
                self.forwardTimer = time.time()
            
            if curTime - self.forwardTimer >= 30.0:         # temporary value - determined by test
                self.arbitrator.update( self.noLinearSpeed )
                self.closeEnoughFlag == 1.0

        else:
            angle = self.initYawAngle
            lefScanAngleRange = self.initYawAngle - math.pi/2
            rightScanAngleRange = self.initYawAngle + math.pi/2
            
            while angle >= lefScanAngleRange and self.detectOrangeFlag == 0.0:
                self.arbitrator.setDesiredYawAngle( angle )
                self.arbitrator.update( self.noLinearSpeed )
                self.ballFinder.run( )
                self.detectOrangeFlag = self.ballFinder.target_aquired
                if self.detectOrangeFlag == 0.0:
                    angle -= Maths.degToRad( 10 )
                            
            while angle <= rightScanAngleRange and self.detectOrangeFlag == 0:
                self.arbitrator.setDesiredYawAngle( angle )
                self.arbitrator.update( noLinearSpeed )
                self.ballFinder.run( )
                self.detectOrangeFlag = self.ballFinder.target_aquired
                if self.detectOrangeFlag == 0.0:
                    angle += Maths.degToRad( 10 )
            
            if self.detectOrangeFlag == 1.0:
                compassYawAngle = self.playerCompass.pose.pyaw
                self.ballFinder.run( )
                ballX = self.ballFinder.corr_x
                self.ballArea = self.ballFinder.pixel_count
                #if self.ballArea > twoMetresArea and self.ballArea < onefiveMetresArea:
                    #distance = 2.0
                #elif self.ballArea > onefiveMetresArea and self.ballArea < oneMetresArea:
                    #distance = 1.5
                #elif self.ballArea > onefiveMetresArea and self.ballArea < oneMetresArea:
                    #distance = 1.0
                while ballX > 10 or ballX < -10:
                    if ballX > 0:
                        newYaw = compassYawAngle + Maths.degToRad( 5 )
                    elif ballX < 0:
                        newYaw = compassYawAngle - Maths.degToRad( 5 )
                    self.arbitrator.setDesiredYaw( newYaw )
                    self.arbitrator.update ( movingLinearSpeed )    # don't wait for the yaw control, because it's a rough estimate anyway
                    if self.ballArea > self.oneMetresArea:               # needs to be set
                        self.arbitrator.setDesiredDepth( self.cuttingDepth )
                        self.arbitrator.update( noLinearSpeed )
                        if atDesiredDepth():
                            self.arbitrator.update( movingLinearSpeed )
                            #"activate cutter"
                            
示例#3
0
 def __init__( self, playerPos3D, playerCompass, playerDepthSensor, playerSimPos3D = None, logger = None ):
     
     self.playerPos3D = playerPos3D
     self.playerCompass = playerCompass
     self.playerDepthSensor = playerDepthSensor
     self.playerSimPos3D = playerSimPos3D
     self.logger = logger
     
     self.pitchController = PitchControl( self.playerPos3D,
         self.playerCompass, self.playerSimPos3D )
     self.yawController = YawControl( self.playerPos3D,
         self.playerCompass, self.playerSimPos3D )
     self.depthController = DepthControl( self.playerPos3D,
         self.playerDepthSensor, self.playerSimPos3D )
     self.leftMotorUncontrolled = False
     self.rightMotorUncontrolled = False
     self.frontMotorUncontrolled = False
     self.backMotorUncontrolled = False
     
     self.depthEpsilon = 10
     self.yawEpsilon = Maths.degToRad( 2.5 )
     
     self.lastTime = time.time()
     self.lastDepth = -1.0
     self.depthControlDisabled = False
     self.numIdenticalDepthReadings = 0
示例#4
0
    def __init__( self, config, logger, playerPos3D, playerCompass, 
        playerDepthSensor, playerSonar = None ):
        
        self.arbitrator = Arbitrator( playerPos3D, playerCompass, playerDepthSensor )
        self.ballFinder = bouy_finder.BouyFinder()

        self.pitchAngle = -5.0                       # temporary value - zero pitch
        self.initYawAngle = Maths.degToRad( 85.0 )   # temporary value - heading towards the wall
        self.initDepth = 7460.0                      # temporary value - 0.5 metres beneath the surface
        self.cuttingDepth = 7480.0
        self.noLinearSpeed = 0.0
        self.movingLinearSpeed = 1.0
        self.arbitrator.setDesiredState( self.pitchAngle, self.initYawAngle, self.initDepth )
        
        # AB: Disabled for now as this script will be running inside another script
        #self.arbitrator.update( self.noLinearSpeed )
        
        self.oneMetresArea = 2700                    # rough estimate        
        
        self.forwardTimer = time.time()
        self.closeEnoughFlag = 0.0
        self.detectOrangeFlag = 0.0
        self.ballArea = 0.0
        self.lastBallArea = 0.0
        self.image = None
示例#5
0
 def __init__( self, config, logger, playerPos3d, playerCompass, 
     playerDepthSensor, playerSonar, playerFrontCamera ):
     
     ControlScript.__init__( self, config, logger, 
         playerPos3d=playerPos3d, playerCompass=playerCompass, 
         playerDepthSensor=playerDepthSensor, playerSonar=playerSonar, 
         playerFrontCamera=playerFrontCamera )
     
     self.RUN_DEPTH = self.config.QR_runDepth
     self.FORWARD_SPEED = self.config.QR_forwardSpeed
     self.START_DELAY_TIME = self.config.QR_startDelayTime
     self.END_DELAY_TIME = 40.0
     self.MOVE_FORWARD_TIME = self.config.QR_moveForwardTime  # Will probably be caught by the net
     self.HEADING_TO_GATE_DEGREES = self.config.QR_headingToGateDegrees
 
     self.USE_IMAGE_CAPTURE = self.config.useImageCapture
     
     self.imageCaptureScript = ImageCaptureScript( self.config, self.logger,
         self.playerPos3d, self.playerDepthSensor, self.playerSonar, self.playerFrontCamera )
     
     self.motorKiller = KillMotors( self.playerPos3d )
     
     # Setup the arbitrator
     self.arbitrator = Arbitrator( playerPos3d, playerCompass, playerDepthSensor )
     self.arbitrator.setDesiredPitch( Maths.degToRad( -4.0 ) )
     self.arbitrator.setControlGains(
         pitchKp=self.config.pitchKp, 
         pitchKi=self.config.pitchKi, pitchiMin=self.config.pitchiMin, pitchiMax=self.config.pitchiMax, 
         pitchKd=self.config.pitchKd,
         yawKp=self.config.yawKp, 
         yawKi=self.config.yawKi, yawiMin=self.config.yawiMin, yawiMax=self.config.yawiMax, 
         yawKd=self.config.yawKd,
         depthKp=self.config.depthKp, 
         depthKi=self.config.depthKi, depthiMin=self.config.depthiMin, depthiMax=self.config.depthiMax,
         depthKd=self.config.depthKd )
     self.arbitrator.setEpsilons( 
         self.config.arbitratorDepthEpsilon, 
         Maths.degToRad( self.config.arbitratorYawEpsilonDegrees ) )
     
     # Clear timers
     self.waitTimer = 0.0
     self.delayTimer = 0.0
     
     # Move into the first state
     self.linearSpeed = 0.0
     self.delayTimer = time.time()
     self.setState( self.STATE_WAITING_TO_START )    
示例#6
0
    def update( self ):
        
        curTime = time.time()
        
        if self.USE_IMAGE_CAPTURE \
            and self.state != self.STATE_WAITING_TO_START:
            self.imageCaptureScript.update()
        
        if self.state == self.STATE_WAITING_TO_START:
            
            timeDiff = curTime - self.delayTimer
            print "timeDiff is", timeDiff, "delay is", self.START_DELAY_TIME
            
            if curTime - self.delayTimer >= self.START_DELAY_TIME:
                self.logger.logMsg( "Going to " + str( self.RUN_DEPTH ) )
                self.arbitrator.setDesiredDepth( self.RUN_DEPTH )
                self.linearSpeed = 0.0
                self.setState( self.STATE_DIVING )
            
        elif self.state == self.STATE_DIVING:

            if self.arbitrator.atDesiredDepth():
                self.arbitrator.setDesiredYaw( 
                    Maths.degToRad( self.HEADING_TO_GATE_DEGREES ) )
                self.setState( self.STATE_TURNING_TO_GATE_1 )
            
        elif self.state == self.STATE_TURNING_TO_GATE_1:
            
            if self.arbitrator.atDesiredYaw():
                self.linearSpeed = self.FORWARD_SPEED
                self.driveTimer = time.time()
                self.setState( self.STATE_DRIVING_THROUGH_GATE_1 )
                        
        elif self.state == self.STATE_DRIVING_THROUGH_GATE_1:
            
            if curTime - self.driveTimer >= self.MOVE_FORWARD_TIME:
                self.linearSpeed = 0.0
                self.delayTimer = time.time()
                self.setState( self.STATE_SURFACING )
            
        elif self.state == self.STATE_SURFACING:

            # Wait for a bit and then exit the program
            timeDiff = curTime - self.delayTimer    
            if timeDiff >= self.END_DELAY_TIME:
                sys.exit( 0 )   # Quit
        else:
            self.logger.logError( "Unrecognised state - ({0}) - surfacing".format( self.state ) )
            self.linearSpeed = 0.0
            self.delayTimer = time.time()
            self.setState( self.STATE_SURFACING )
        
        if self.state == self.STATE_SURFACING:
            # Kill motors to come up and end mission
            self.motorKiller.update()
        else:
            self.arbitrator.update( self.linearSpeed )
示例#7
0
 def __init__( self, config, logger, playerPos3d, playerCompass, 
     playerDepthSensor, playerSonar, playerFrontCamera ):
     
     ControlScript.__init__( self, config, logger, 
         playerPos3d=playerPos3d, playerCompass=playerCompass, 
         playerDepthSensor=playerDepthSensor, playerSonar=playerSonar, 
         playerFrontCamera=playerFrontCamera )
     
     self.UP_DEPTH = self.config.B_upDepth
     self.DOWN_DEPTH = self.config.B_downDepth
     self.START_DELAY_TIME = self.config.B_startDelayTime
     
     self.USE_IMAGE_CAPTURE = self.config.useImageCapture
     
     self.imageCaptureScript = ImageCaptureScript( self.config, self.logger,
         self.playerPos3d, self.playerDepthSensor, self.playerSonar, self.playerFrontCamera )
     
     # Setup the arbitrator
     self.arbitrator = Arbitrator( playerPos3d, playerCompass, playerDepthSensor )
     self.arbitrator.setDesiredPitch( Maths.degToRad( -4.0 ) )
     self.arbitrator.setControlGains(
         pitchKp=self.config.pitchKp, 
         pitchKi=self.config.pitchKi, pitchiMin=self.config.pitchiMin, pitchiMax=self.config.pitchiMax, 
         pitchKd=self.config.pitchKd,
         yawKp=self.config.yawKp, 
         yawKi=self.config.yawKi, yawiMin=self.config.yawiMin, yawiMax=self.config.yawiMax, 
         yawKd=self.config.yawKd,
         depthKp=self.config.depthKp, 
         depthKi=self.config.depthKi, depthiMin=self.config.depthiMin, depthiMax=self.config.depthiMax,
         depthKd=self.config.depthKd )
     self.arbitrator.setEpsilons( 
         self.config.arbitratorDepthEpsilon, 
         Maths.degToRad( self.config.arbitratorYawEpsilonDegrees ) )
     
     # Clear timers
     self.waitTimer = 0.0
     self.delayTimer = 0.0
     
     # Move into the first state
     self.linearSpeed = 0.0
     self.delayTimer = time.time()
     self.setState( self.STATE_WAITING_TO_START )    
示例#8
0
    def update( self ):
        
        curTime = time.time()
        
        if self.state == self.STATE_DIVING:

            if self.arbitrator.atDesiredDepth():
                self.arbitrator.setDesiredYaw( Maths.degToRad( 0.0 ) )
                self.setState( self.STATE_TURNING_TO_GATE_1 )
                
        elif self.state == self.STATE_SURFACING:
            
            if self.arbitrator.atDesiredDepth():
                self.arbitrator.setDesiredDepth( self.scanDepth )
                self.setState( self.STATE_FINISHED )
            
        elif self.state == self.STATE_FINISHED:
            # Nothig to do
            pass
        else:
            self.logger.logError( "Unrecognised state - surfacing" )
            self.setState( self.STATE_SURFACING )
        
        self.arbitrator.update( self.linearSpeed )
示例#9
0
    def update( self ):
        
        curTime = time.time()
        
        if self.state == self.STATE_DIVING:

            if self.arbitrator.atDesiredDepth():
                self.arbitrator.setDesiredYaw( Maths.degToRad( 0.0 ) )
                self.setState( self.STATE_TURNING_TO_GATE_1 )
            
        elif self.state == self.STATE_TURNING_TO_GATE_1:
            
            if self.arbitrator.atDesiredYaw():
                self.linearSpeed = 1.0
                self.driveTimer = time.time()
                self.setState( self.STATE_DRIVING_THROUGH_GATE_1 )
                        
        elif self.state == self.STATE_DRIVING_THROUGH_GATE_1:
            
            if curTime - self.driveTimer >= 20.0:
                self.linearSpeed = 0.0
                self.arbitrator.setDesiredYaw( Maths.degToRad( 180.0 ) )
                self.setState( self.STATE_TURNING_TO_GATE_2 )
            
        elif self.state == self.STATE_TURNING_TO_GATE_2:
            
            if self.arbitrator.atDesiredYaw():
                self.linearSpeed = 1.0
                self.driveTimer = time.time()
                self.setState( self.STATE_DRIVING_THROUGH_GATE_2 )
            
        elif self.state == self.STATE_DRIVING_THROUGH_GATE_2:
            
            if curTime - self.driveTimer >= 40.0:
                self.linearSpeed = 0.0
                self.arbitrator.setDesiredYaw( Maths.degToRad( 0.0 ) )
                self.setState( self.STATE_TURNING_TO_START )
            
        elif self.state == self.STATE_TURNING_TO_START:
            
            if self.arbitrator.atDesiredYaw():
                self.linearSpeed = 1.0
                self.driveTimer = time.time()
                self.setState( self.STATE_DRIVING_BACK_TO_START )
            
        elif self.state == self.STATE_DRIVING_BACK_TO_START:
            
            if curTime - self.driveTimer >= 20.0:
                self.linearSpeed = 0.0
                self.arbitrator.setDesiredDepth( 0.0 )
                self.setState( self.STATE_SURFACING )
            
        elif self.state == self.STATE_SURFACING:
            
            if self.arbitrator.atDesiredDepth():
                self.setState( self.STATE_FINISHED )
            
        elif self.state == self.STATE_FINISHED:
            # Nothing to do
            pass
        else:
            self.logger.logError( "Unrecognised state - surfacing" )
            self.setState( self.STATE_SURFACING )
        
        self.arbitrator.update( self.linearSpeed )
示例#10
0
 def __init__( self, config, logger, playerPos3d, playerCompass, 
     playerDepthSensor, playerSonar, playerFrontCamera ):
     
     ControlScript.__init__( self, config, logger, 
         playerPos3d=playerPos3d, playerCompass=playerCompass, 
         playerDepthSensor=playerDepthSensor, playerSonar=playerSonar, 
         playerFrontCamera=playerFrontCamera )
     
     self.NORMAL_DEPTH = self.config.HM_normalDepth
     self.PIPE_SURVEY_DEPTH = self.config.HM_pipeSurveyDepth
     self.FORWARD_SPEED = self.config.HM_forwardSpeed
     self.START_DELAY_TIME = self.config.HM_startDelayTime
     self.END_DELAY_TIME = self.config.HM_endDelayTime
     self.DRIVING_THROUGH_GATE_1_TIME = self.config.HM_drivingThroughGate_1_Time
     self.SURVEYING_PIPE_TIME = self.config.HM_surveyingPipeTime
     self.APPROACHING_WALL_TIME = self.config.HM_approachingWallTime
     self.SURVEYING_WALL_TIME = self.config.HM_surveyingWallTime
     self.MAX_HUNTING_BUOY_TIME = self.config.HM_maxHuntingBuoyTime
     self.RETURNING_TO_CENTRE_TIME = self.config.HM_returningToCentreTime
     self.NORTH_HEADING_DEGREES = self.config.HM_northHeadingDegrees
     self.EAST_HEADING_DEGREES = self.config.HM_eastHeadingDegrees
     self.SOUTH_HEADING_DEGREES = self.config.HM_southHeadingDegrees
     self.WEST_HEADING_DEGREES = self.config.HM_westHeadingDegrees
     
     # Configure the image capture script as we please
     imageCaptureConfig = copy.deepcopy( self.config )
     imageCaptureConfig.IC_Script_sonarGain = 0.3
     imageCaptureConfig.IC_Script_sonarRange = 25
     imageCaptureConfig.IC_Script_sonarNumBins = 300
     imageCaptureConfig.IC_Script_sonarScanStartAngleDegrees = 0.0
     imageCaptureConfig.IC_Script_sonarScanEndAngleDegrees = 350.0
     imageCaptureConfig.IC_Script_numImagesSavedPerSecond = 1.0
     imageCaptureConfig.IC_Script_enableCamera = True
     imageCaptureConfig.IC_Script_enableSonar = False
     
     self.imageCaptureScript = ImageCaptureScript( imageCaptureConfig, self.logger,
         self.playerPos3d, self.playerDepthSensor, self.playerSonar, self.playerFrontCamera )
     
     self.motorKiller = KillMotors( self.playerPos3d )
     self.ballChopper = OrangeBallScript( config, logger, 
         playerPos3d, playerCompass, playerDepthSensor )
     
     # Setup the arbitrator
     self.arbitrator = Arbitrator( playerPos3d, playerCompass, playerDepthSensor, logger=logger )
     self.arbitrator.setDesiredPitch( Maths.degToRad( -4.0 ) )
     self.arbitrator.setControlGains(
         pitchKp=self.config.pitchKp, 
         pitchKi=self.config.pitchKi, pitchiMin=self.config.pitchiMin, pitchiMax=self.config.pitchiMax, 
         pitchKd=self.config.pitchKd,
         yawKp=self.config.yawKp, 
         yawKi=self.config.yawKi, yawiMin=self.config.yawiMin, yawiMax=self.config.yawiMax, 
         yawKd=self.config.yawKd,
         depthKp=self.config.depthKp, 
         depthKi=self.config.depthKi, depthiMin=self.config.depthiMin, depthiMax=self.config.depthiMax,
         depthKd=self.config.depthKd )
     self.arbitrator.setEpsilons( 
         self.config.arbitratorDepthEpsilon, 
         Maths.degToRad( self.config.arbitratorYawEpsilonDegrees ) )
     
     # Clear timer
     self.stateTimer = 0.0
     
     # Move into the first state
     self.setState( self.STATE_WAITING_TO_START )    
示例#11
0
    def setState( self, newState ):
        
        self.exitState()
        
        if newState == self.STATE_WAITING_TO_START:
            
            self.linearSpeed = 0.0
            self.stateTimer = time.time()
            
        elif newState == self.STATE_DIVING:

            self.linearSpeed = 0.0
            self.logAction( "Descending to " + str( self.NORMAL_DEPTH ) )
            self.arbitrator.setDesiredDepth( self.NORMAL_DEPTH )

        elif newState == self.STATE_TURNING_TO_GATE_1:

            self.linearSpeed = 0.0
            self.arbitrator.setDesiredYaw( 
                Maths.degToRad( self.NORTH_HEADING_DEGREES ) )
            self.setSonarLocatorActive( True )
                        
        elif newState == self.STATE_DRIVING_THROUGH_GATE_1:
            
            self.linearSpeed = self.FORWARD_SPEED
            self.staterTimer = time.time()
    
        elif newState == self.STATE_DESCENDING_TO_PIPE:
            
            self.linearSpeed = 0.0
            self.logAction( "Descending to " + str( self.PIPE_SURVEY_DEPTH ) )
            self.arbitrator.setDesiredDepth( self.PIPE_SURVEY_DEPTH )
            
        elif newState == self.STATE_TURNING_TO_GATE_2:
            
            self.linearSpeed = 0.0
            self.arbitrator.setDesiredYaw( 
                Maths.degToRad( self.SOUTH_HEADING_DEGREES ) )
                
        elif newState == self.STATE_SURVEYING_PIPE:
            
            self.linearSpeed = self.FORWARD_SPEED
            self.staterTimer = time.time()
            
        elif newState == self.STATE_RETURNING_TO_NORMAL_DEPTH:
            
            self.linearSpeed = 0.0
            self.logAction( "Climbing to " + str( self.NORMAL_DEPTH ) )
            self.arbitrator.setDesiredDepth( self.NORMAL_DEPTH )
            
        elif newState == self.STATE_TURNING_TO_WALL:
            
            self.linearSpeed = 0.0
            self.arbitrator.setDesiredYaw( 
                Maths.degToRad( self.EAST_HEADING_DEGREES ) )
            
        elif newState == self.STATE_APPROACHING_WALL:
            
            self.linearSpeed = self.FORWARD_SPEED
            self.staterTimer = time.time()
            
        elif newState == self.STATE_SURVEYING_WALL:
            
            self.linearSpeed = 0.0
            self.stateTimer = time.time()
            self.setSonarLocatorActive( False )
            self.imageCaptureScript.config.IC_Script_enableSonar = True
            
        elif newState == self.STATE_TURNING_TO_HUNT_BUOY:
            
            self.linearSpeed = 0.0
            self.arbitrator.setDesiredYaw( 
                Maths.degToRad( self.WEST_HEADING_DEGREES ) )
            
        elif newState == self.STATE_HUNTING_BUOY:
    
            # Go, go, go!
            self.ballChopper.initYawAngle = self.playerCompass.pose.pyaw
            self.stateTimer = time.time()
            
        elif newState == self.STATE_RETURNING_TO_CENTRE:
    
            # Blast forward in hopeful direction
            self.linearSpeed = self.FORWARD_SPEED
            heading = ( self.WEST_HEADING_DEGREES + 45.0 )
            self.arbitrator.setDesiredYaw( 
                Maths.degToRad( heading ) )
            self.stateTimer = time.time()
    
        elif newState == self.STATE_SURFACING:
            
            self.linearSpeed = 0.0
            self.stateTimer = time.time()
            
        else:
            self.logger.logError( "Enter State - Unrecognised state - ({0})".format( self.state ) )
            return
        
        ControlScript.setState( self, newState )