コード例 #1
0
    def run(self, Dest, acceptDist=None):
        self.acceptDist = acceptDist
        self.initialize()
        gVars.logger.info("Started point to pointAWA toward " + repr(Dest))
        self.Dest = Dest
        self.updateData()

        while (not self.arrivedAtPoint()) and gVars.kill_flagPTP == 0:
            self.updateData()

            if (standardcalc.isWPNoGoAWA(self.AWA, self.hog, self.Dest,
                                         self.sog, self.GPSCoord)):
                if (self.tackEngine.onStarboardTack(self.AWA)):
                    self.enterBeatLoop(False)
                elif (self.tackEngine.onPortTack(self.AWA)):
                    self.enterBeatLoop(True)

            else:
                self.p2pLogger.printStraight("Sailing straight to point")
                if (self.isThereChangeToAWAorWeatherOrModeOrAngle()):
                    self.sailor.adjustSheetsAndSteerByCompass(
                        self.AWA, self.angleBetweenCoords)
            time.sleep(.1)

        self.exitP2P()
コード例 #2
0
 def canLayMarkWithoutTack(self):
     if standardcalc.isWPNoGoAWA(self.AWA, self.hog, self.Dest,self.sog,self.GPSCoord):
         return False
     else:
         windDirection = standardcalc.boundTo180(self.AWA + self.hog)
         bearing = standardcalc.angleBetweenTwoCoords(self.GPSCoord,self.Dest)
         return not standardcalc.isAngleBetween(bearing,windDirection,self.hog)      
コード例 #3
0
 def canLayMarkWithoutTack(self):
     if standardcalc.isWPNoGoAWA(self.AWA, self.hog, self.Dest, self.sog,
                                 self.GPSCoord):
         return False
     else:
         windDirection = standardcalc.boundTo180(self.AWA + self.hog)
         bearing = standardcalc.angleBetweenTwoCoords(
             self.GPSCoord, self.Dest)
         return not standardcalc.isAngleBetween(bearing, windDirection,
                                                self.hog)
コード例 #4
0
 def calculateHeadingForExit(self):
     if standardcalc.isWPNoGoAWA(gVars.currentData.awa, gVars.currentData.hog, self.wayPtCoords[self.currentWaypoint],gVars.currentData.sog,self.wayPtCoords[(self.currentWaypoint+2)%4]):
         self.STEER_METHOD = self.AWA_METHOD
         if gVars.currentData.awa<0:
             tackAngleMultiplier = -1
         else:
             tackAngleMultiplier = 1
         return tackAngleMultiplier*34
     else:
         self.STEER_METHOD = self.COMPASS_METHOD                       
         return standardcalc.angleBetweenTwoCoords(self.wayPtCoords[(self.currentWaypoint+2)%4], self.wayPtCoords[self.currentWaypoint])
コード例 #5
0
    def run(self, Dest, acceptDist=None):
        self.acceptDist = acceptDist
        self.initialize()
        gVars.logger.info("Started point to pointAWA toward "+repr(Dest))
        self.Dest = Dest
        self.updateData()

        while(not self.arrivedAtPoint()) and gVars.kill_flagPTP == 0:
            self.updateData()
   
            if(standardcalc.isWPNoGoAWA(self.AWA, self.hog, self.Dest,self.sog,self.GPSCoord)):
                if(self.tackEngine.onStarboardTack(self.AWA)):
                    self.enterBeatLoop(False)                 
                elif(self.tackEngine.onPortTack(self.AWA)):
                    self.enterBeatLoop(True) 
                    
            else:                    
                self.p2pLogger.printStraight("Sailing straight to point")
                if(self.isThereChangeToAWAorWeatherOrModeOrAngle()):
                    self.sailor.adjustSheetsAndSteerByCompass(self.AWA,self.angleBetweenCoords)                    
            time.sleep(.1)

        self.exitP2P()
コード例 #6
0
 def testExpectNotNoGoStrange(self):
     self.appWind = 130
     self.heading = -140
     self.GPSCoord = datatypes.GPSCoordinate(49,-123)
     self.Dest = datatypes.GPSCoordinate(48,-123)
     self.assertFalse(standardcalc.isWPNoGoAWA(self.appWind, self.heading, self.Dest, self.sog, self.GPSCoord))
コード例 #7
0
 def testExpectNoGo(self):
     self.appWind=-131
     self.assertTrue(standardcalc.isWPNoGoAWA(self.appWind, self.heading, self.Dest, self.sog, self.GPSCoord))
コード例 #8
0
def pointToPointAWA(Dest, initialTack, ACCEPTANCE_DISTANCE):
    sheetList = parsing.parse(path.join(path.dirname(__file__), 'apparentSheetSetting'))
    gVars.kill_flagPTP = 0
    end_flag = 0
    arduino = gVars.arduino
    appWindAng = 0
    oldColumn = 0
    tackDirection = 0
    gVars.logger.info("Started point to pointAWA")
    
    while(end_flag == 0 and gVars.kill_flagPTP == 0):
        gVars.logger.info("End flag and kill flag OK")
        
        while(gVars.currentData[aut_index] == False):
            time.sleep(0.1)
            
        currentData = gVars.currentData
        GPSCoord = currentData[gps_index]
        newappWindAng = currentData[awa_index]
        cog = currentData[cog_index]
        hog = currentData[hog_index]
        sog = currentData[sog_index] * 100        
        
        if(standardcalc.distBetweenTwoCoords(GPSCoord, Dest) > ACCEPTANCE_DISTANCE):
            #This if statement determines the sailing method we are going to use based on apparent wind angle
            arbitraryTWA = standardcalc.getTrueWindAngle(newappWindAng,sog)
                #print ("Hit else statement")
                #print ("TWA is: " + str(gVars.TrueWindAngle))
                                
            if(standardcalc.isWPNoGoAWA(newappWindAng,hog,Dest,sog,GPSCoord)):
                gVars.logger.info("Point cannot be reached directly")
                #Trying to determine whether 45 degrees clockwise or counter clockwise of TWA wrt North is closer to current heading
                #This means we are trying to determine whether hog-TWA-45 or hog-TWA+45 (both using TWA wrt North) is closer to our current heading.
                #Since those values give us TWA wrt to north, we need to subtract hog from them to get TWA wrt to our heading and figure out which one has a smaller value.
                #To get it wrt to current heading, we use hog-TWA-45-hog and hog-TWA+45-hog.  Both terms have hogs cancelling out.
                #We are left with -TWA-45 and -TWA+45, which makes sense since the original TWA was always with respect to the boat.
                #Since we are trying to figure out which one is closest to turn to, we use absolute values.
                if((abs(-newappWindAng-43)<abs(-newappWindAng+43) and initialTack is None) or initialTack == 1):
                    initialTack = None
                    while(abs(hog-standardcalc.angleBetweenTwoCoords(GPSCoord, Dest))<80 and gVars.kill_flagPTP ==0):
                        gVars.logger.info("On starboard tack")
                        
                        while(gVars.currentData[aut_index] == False):
                            time.sleep(0.1)
                        
                        gVars.tacked_flag = 0
                        GPSCoord = currentData[gps_index]
                        newappWindAng = currentData[awa_index]
                        cog = currentData[cog_index]
                        hog = currentData[hog_index]
                        sog = currentData[sog_index] * 100  #Using speed in cm/s
                                               
                        arbitraryTWA = standardcalc.getTrueWindAngle(newappWindAng, sog)                            
                        
                        if( appWindAng != newappWindAng or oldColumn != gVars.currentColumn):
                            gVars.logger.info("Changing sheets and rudder")
                            arduino.adjust_sheets(sheetList[abs(int(arbitraryTWA))][gVars.currentColumn])
                            arduino.steer(AWA_METHOD,hog-newappWindAng-43)
                            appWindAng = newappWindAng
                            oldColumn = gVars.currentColumn
                            
                        if(newappWindAng > 0):
                            tackDirection = 1
                        else:
                            tackDirection = 0
                        
                        if( len(gVars.boundaries) > 0 ):
                            for boundary in gVars.boundaries:
                                if(standardcalc.distBetweenTwoCoords(boundary, GPSCoord) <= boundary.radius):
                                    gVars.logger.info("Tacked from boundary")
                                    arduino.tack(gVars.currentColumn,tackDirection)
                                    gVars.tacked_flag = 1
                                    break
                        if(gVars.tacked_flag):
                            break
                                                            
                    arduino.tack(gVars.currentColumn,tackDirection)
                    gVars.logger.info("Tacked from 80 degrees")
                    
                elif((abs(-newappWindAng-43)>=abs(-newappWindAng+43) and initialTack is None) or initialTack == 0):
                    initialTack = None
                    while(abs(hog-standardcalc.angleBetweenTwoCoords(GPSCoord, Dest))<80 and gVars.kill_flagPTP == 0):
                        gVars.logger.info("On port tack")
                        while(gVars.currentData[aut_index] == False):
                            time.sleep(0.1)
                        gVars.tacked_flag = 0
                        GPSCoord = currentData[gps_index]
                        newappWindAng = currentData[awa_index]
                        cog = currentData[cog_index]
                        hog = currentData[hog_index]
                        sog = currentData[sog_index]*100
                        
                        arbitraryTWA = standardcalc.getTrueWindAngle(newappWindAng, sog)
                        #TWA = abs(int(TWA))
                        #print ("TWA is: " + str(newTWA))
                        
                        if(appWindAng != newappWindAng or oldColumn != gVars.currentColumn):
                            gVars.logger.info("Changing sheets and rudder")
                            arduino.adjust_sheets(sheetList[abs(int(arbitraryTWA))][gVars.currentColumn])
                            arduino.steer(AWA_METHOD,hog-newappWindAng+43)
                            appWindAng = newappWindAng
                            oldColumn = gVars.currentColumn
                            
                        if(newappWindAng > 0):
                            tackDirection = 1
                        else:
                            tackDirection = 0
                            
                        if( len(gVars.boundaries) > 0 ):
                            for boundary in gVars.boundaries:
                                if(standardcalc.distBetweenTwoCoords(boundary, GPSCoord) <= boundary.radius):
                                    gVars.logger.info("Tacked from boundary")
                                    arduino.tack(gVars.currentColumn,tackDirection)
                                    gVars.tacked_flag = 1
                                    break
                        
                        if(gVars.tacked_flag):
                            break
                        
                    arduino.tack(gVars.currentColumn,tackDirection)
                    gVars.logger.info("Tacked from 80 degrees")
                    
            elif(abs(hog-arbitraryTWA-standardcalc.angleBetweenTwoCoords(GPSCoord, Dest))>90):
                gVars.logger.info("Sailing straight to point")
                if(appWindAng != newappWindAng or oldColumn != gVars.currentColumn):
                    gVars.logger.info("Changing sheets and rudder")
                    arduino.adjust_sheets(sheetList[abs(int(arbitraryTWA))][gVars.currentColumn])
                    arduino.steer(COMPASS_METHOD,standardcalc.angleBetweenTwoCoords(GPSCoord,Dest))
                    appWindAng = newappWindAng
                    gVars.currentColumn
            
        else:
            end_flag = 1
            print ("Finished Point to Point")
            gVars.logger.info("Finished Point to Point")
    
    return 0