def __init__ (self): # Initialize the analog to digital converter. self.wind_sensor = WindSensor() # Initialize the servo motor. self.robot = PololuMicroMaestro() # Startup and initialize the analog to digital converter phidget. self.wind_sensor.startup() # Initialize the angle of the servo motor that's plugged into port 2. The servo motor only really moves from about 50 degrees to # about 115 degrees, so doing more than that doesn't do a lot of good. self.robot.setAngle(2, 49) # averaged data from several samples of running the sweep self.calculated_data = [[0, 22.90789474, 40.16140351, 42.57368421, 45.35789474, 46.70263158, 47.6622807, 47.86403509, 48.04912281, 47.63421053, 46.61052632, 46.81315789, 46.04824561, 45.15526316, 45.63596491, 46.2754386, 45.63596491, 45.59824561, 44.76491228, 44.37192982, 43.57807018, 42.48508772, 41.71578947, 40.36754386, 39.70263158, 39.32017544, 38.60614035, 39.07192982, 39.24824561, 38.85964912, 37.60087719, 38.39649123, 38.70701754, 39.46052632, 38.29736842, 39.20789474, 38.72807018, 39.65350877, 39.81754386, 39.63859649, 39.61929825, 38.87631579, 37.88333333, 36.66403509, 35.44122807, 34.31754386, 31.98684211, 30.41754386, 27.67894737, 24.01491228, 21.71491228, 19.16140351, 16.76666667, 14.17719298, 11.73333333, 11.61754386, 10.46315789, 7.29122807, 5.907894737, 3.421929825, 2.372807018, 2.374561404, 1.93245614, 0.993859649, 0.28245614, 0.165789474], [0, 11.09298246, -11.51403509, -17.73947368, -22.19210526, -25.36929825, -26.41052632, -27.39736842, -30.60263158, -31.47017544, -33.07807018, -35.18947368, -35.97105263, -37.37719298, -36.88508772, -36.2754386, -35.98157895, -35.43245614, -35.75350877, -33.96929825, -32.98070175, -30.41929825, -26.19035088, -22.48070175, -22.30175439, -19.17894737, -14.79210526, -14.8622807, -15.71315789, -14.49473684, -5.653508772, -2.83245614, 0.549122807, 1.071929825, 1.234210526, 0.705263158, 3.96754386, 9.664912281, 8.55877193, 8.049122807, 11.0754386, 8.412280702, 9.313157895, 8.59122807, 9.466666667, 8.638596491, 10.09385965, 9.753508772, 9.250877193, 8.294736842, 8.764035088, 8.397368421, 6.600877193, 4.648245614, 1.785087719, 0.575438596, 2.754385965, 1.831578947, 0.235087719, -0.137719298, 0.522807018, -0.501754386, 0.444736842, 0.484210526, -0.311403509, -0.405263158], [0, -15.525, -5.1, 0.9, 5.45, 7.2, 6.95, 4.675, 4.3, 3.35, 2.1, 0.7, -1.95, -3.45, -5.9, -7.875, -8.675, -10.025, -10.65, -12.125, -13.4, -11.85, -11.85, -11.45, -13.475, -13.975, -12.875, -12.5, -14.15, -15, -15.575, -15.475, -16.175, -15.85, -15.575, -15.15, -15.95, -15.475, -16.6, -18.475, -19.225, -19.125, -19.05, -21.475, -23.05, -27.725, -27.75, -30.95, -29.375, -28.975, -27.825, -28.1, -29.2, -29.525, -26.9, -24.525, -21.725, -15.175, -11.525, -8.75, -7.1, -4.85, -3.45, -3.75, -2.925, -1.75], [0, -14.14561404, -18.41052632, -17.97719298, -16.79649123, -16.49385965, -16.04473684, -16.29035088, -16.36140351, -16.55701754, -16.06578947, -15.96403509, -15.42719298, -15.01929825, -15.81578947, -17.17017544, -17.20964912, -17.57807018, -18.07280702, -18.62807018, -19.45877193, -20.41403509, -21.29473684, -22.55263158, -23.87368421, -23.4754386, -24.60701754, -26.17105263, -27.29385965, -27.91578947, -28.62280702, -29.56842105, -30.39649123, -30.53157895, -31.19561404, -30.87719298, -31.01491228, -30.7122807, -31.18157895, -29.78508772, -29.1877193, -28.37894737, -27.34035088, -25.7877193, -24.44122807, -22.82894737, -21.6245614, -20.01666667, -18.19824561, -17.52105263, -15.82631579, -14.45789474, -12.2, -11.54561404, -10.2377193, -8.904385965, -7.483333333, -6.407894737, -5.5, -3.584210526, -3.026315789, -2.421929825, -1.378947368, -1.492105263, -1.398245614, -0.335087719]]
class myWindSensor(object): def __init__ (self): # Initialize the analog to digital converter. self.wind_sensor = WindSensor() # Initialize the servo motor. self.robot = PololuMicroMaestro() # Startup and initialize the analog to digital converter phidget. self.wind_sensor.startup() # Initialize the angle of the servo motor that's plugged into port 2. The servo motor only really moves from about 50 degrees to # about 115 degrees, so doing more than that doesn't do a lot of good. self.robot.setAngle(2, 49) # averaged data from several samples of running the sweep self.calculated_data = [[0, 22.90789474, 40.16140351, 42.57368421, 45.35789474, 46.70263158, 47.6622807, 47.86403509, 48.04912281, 47.63421053, 46.61052632, 46.81315789, 46.04824561, 45.15526316, 45.63596491, 46.2754386, 45.63596491, 45.59824561, 44.76491228, 44.37192982, 43.57807018, 42.48508772, 41.71578947, 40.36754386, 39.70263158, 39.32017544, 38.60614035, 39.07192982, 39.24824561, 38.85964912, 37.60087719, 38.39649123, 38.70701754, 39.46052632, 38.29736842, 39.20789474, 38.72807018, 39.65350877, 39.81754386, 39.63859649, 39.61929825, 38.87631579, 37.88333333, 36.66403509, 35.44122807, 34.31754386, 31.98684211, 30.41754386, 27.67894737, 24.01491228, 21.71491228, 19.16140351, 16.76666667, 14.17719298, 11.73333333, 11.61754386, 10.46315789, 7.29122807, 5.907894737, 3.421929825, 2.372807018, 2.374561404, 1.93245614, 0.993859649, 0.28245614, 0.165789474], [0, 11.09298246, -11.51403509, -17.73947368, -22.19210526, -25.36929825, -26.41052632, -27.39736842, -30.60263158, -31.47017544, -33.07807018, -35.18947368, -35.97105263, -37.37719298, -36.88508772, -36.2754386, -35.98157895, -35.43245614, -35.75350877, -33.96929825, -32.98070175, -30.41929825, -26.19035088, -22.48070175, -22.30175439, -19.17894737, -14.79210526, -14.8622807, -15.71315789, -14.49473684, -5.653508772, -2.83245614, 0.549122807, 1.071929825, 1.234210526, 0.705263158, 3.96754386, 9.664912281, 8.55877193, 8.049122807, 11.0754386, 8.412280702, 9.313157895, 8.59122807, 9.466666667, 8.638596491, 10.09385965, 9.753508772, 9.250877193, 8.294736842, 8.764035088, 8.397368421, 6.600877193, 4.648245614, 1.785087719, 0.575438596, 2.754385965, 1.831578947, 0.235087719, -0.137719298, 0.522807018, -0.501754386, 0.444736842, 0.484210526, -0.311403509, -0.405263158], [0, -15.525, -5.1, 0.9, 5.45, 7.2, 6.95, 4.675, 4.3, 3.35, 2.1, 0.7, -1.95, -3.45, -5.9, -7.875, -8.675, -10.025, -10.65, -12.125, -13.4, -11.85, -11.85, -11.45, -13.475, -13.975, -12.875, -12.5, -14.15, -15, -15.575, -15.475, -16.175, -15.85, -15.575, -15.15, -15.95, -15.475, -16.6, -18.475, -19.225, -19.125, -19.05, -21.475, -23.05, -27.725, -27.75, -30.95, -29.375, -28.975, -27.825, -28.1, -29.2, -29.525, -26.9, -24.525, -21.725, -15.175, -11.525, -8.75, -7.1, -4.85, -3.45, -3.75, -2.925, -1.75], [0, -14.14561404, -18.41052632, -17.97719298, -16.79649123, -16.49385965, -16.04473684, -16.29035088, -16.36140351, -16.55701754, -16.06578947, -15.96403509, -15.42719298, -15.01929825, -15.81578947, -17.17017544, -17.20964912, -17.57807018, -18.07280702, -18.62807018, -19.45877193, -20.41403509, -21.29473684, -22.55263158, -23.87368421, -23.4754386, -24.60701754, -26.17105263, -27.29385965, -27.91578947, -28.62280702, -29.56842105, -30.39649123, -30.53157895, -31.19561404, -30.87719298, -31.01491228, -30.7122807, -31.18157895, -29.78508772, -29.1877193, -28.37894737, -27.34035088, -25.7877193, -24.44122807, -22.82894737, -21.6245614, -20.01666667, -18.19824561, -17.52105263, -15.82631579, -14.45789474, -12.2, -11.54561404, -10.2377193, -8.904385965, -7.483333333, -6.407894737, -5.5, -3.584210526, -3.026315789, -2.421929825, -1.378947368, -1.492105263, -1.398245614, -0.335087719]] # Calculate which direction the wind is coming from, store it in a queue and publish the majority of the queue to a file. # This is done so that the wind direction doesn't change too quickly by a random weird bit of data and throw the sailboat off. def calculateWindDirection(self): # Initial angle angle = 49 # Initialize the temperatures array. temps = [1.0] # Initialize the directions directionQueue = [-1, -1, -1] # Total of all the data values total_all = 0 # Do the servo sweep and gather all the data. while angle != 115: angle += 1 self.robot.setAngle(2, angle) time.sleep(.1) total = 0 # Gather three data values at each angle and average them to get rid of random data values. for index in range(0,3): total += self.wind_sensor.getValue() # Sleep to give the data time to change. time.sleep(.01) # Average out the data. avg = total/4 # Add the current average to the temperatures array. temps.append(avg) # Add the current average to the total. total_all += (avg - temps[1]) # Get rid of the initial dummy value used to initialize the temperatures array. temps.pop(0) first = temps[0] # Record both the absolute value and signed differences between the data gathered and the four best fit lines. signed_avg_diffs = [0, 0, 0, 0] avg_diffs = [0, 0, 0, 0] for indexa in range(0,len(avg_diffs)): total_diff = 0 signed_total_diff = 0 for indexb in range(0,114-50): signed_total_diff += (temps[indexb] - first) - self.calculated_data[indexa][indexb] total_diff += abs((temps[indexb] - first) - self.calculated_data[indexa][indexb]) signed_avg_diffs[indexa] = signed_total_diff / 115 avg_diffs[indexa] = total_diff / 115 print "Signed avg diffs: " print signed_avg_diffs print "Abs avg diffs: " print avg_diffs # Possible directions are front, back, right, and left. directions = ["F", "B", "R", "L"] min_val = min(avg_diffs) # Initialize the direction to none. direction = "N" # Index in the directions array that is the current hypothesized direction. directionNum = -1 # Find the minimum difference to give best guess as to the direction. for index in range(0,len(directions)): if avg_diffs[index] == min_val: directionNum = index # Do some other kind of random tests that seemed to help... :) if directionNum == 0: if (avg_diffs[0] > 30): min_bal = min(avg_diffs[1], avg_diffs[2], avg_diffs[3]) for index in range(1, len(directions)): if avg_diffs[index] == min_val: directionNum = index if directionNum != 0 and avg_diffs[2] < avg_diffs[3]: directionNum = 3 elif signed_avg_diffs[1] < 0 and signed_avg_diffs[2] < 0: directionNum = 1 elif directionNum == 1: if avg_diffs[2] < avg_diffs[3]: directionNum = 3 else: directionNum = 2 elif directionNum == 0 and total_all < 0: if avg_diffs[2] < avg_diffs[3]: directionNum = 3 else: directionNum = 2 elif directionNum == 2 or directionNum == 3: if signed_avg_diffs[1] <= avg_diffs[2] and signed_avg_diffs[1] <= avg_diffs[3]: directionNum = 2 else: directionNum = 3 # Get the direction and display it to the current terminal. direction = directions[directionNum] print "Direction: " + direction # Add the direction to the queue and take off the oldest direction. directionQueue.append(directionNum) directionQueue.pop(0) counts = [0, 0, 0, 0] # Count the totals for each direction. for index in range(0, len(directionQueue)): if directionQueue[index] >= 0: counts[directionQueue[index]] += 1 max = 0 # Find the max count, and set the direction equal to that. for index in range(0, len(counts)): if (counts[index] > max): directionNum = index # Open the file to write to, write the direction, and close it right after so that the other program can access it. fo = open("wind.txt", "w+") fo.write(directions[directionNum]) fo.close()