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()
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)
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)
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])
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()
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))
def testExpectNoGo(self): self.appWind=-131 self.assertTrue(standardcalc.isWPNoGoAWA(self.appWind, self.heading, self.Dest, self.sog, self.GPSCoord))
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