예제 #1
0
class GestureCreator:

    def __init__(self, gestures_file, wiimotes, first_wm, num_motes, frame_freq):
        self.writer_reader = GestureWriterReader(gestures_file)
        self.wiimotes = wiimotes
        self.first_wm = first_wm
        self.num_motes = num_motes
        self.frame_freq = frame_freq
        self.known_gestures = self.writer_reader.get_learned_gestures()
        # self.full_gestures = self.writer_reader.get_full_gestures()

    # Takes iterations of a gesture, and averages them frame-by-frame.
    def average_gesture(self, frame_arr):
        min_length = float('inf')

        # Find the shortest of the gestures for indexing purposes.
        for frames in frame_arr:
            if len(frames) < min_length:
                min_length = len(frames)

        if min_length == 0:
            print "Error:  A gesture had no length.  Exiting."
            exit(1)

        avg_frames = []

        for i in range(0, min_length):
            roll_sum = 0.0
            pitch_sum = 0.0
            acc_x_sum = 0.0
            acc_y_sum = 0.0
            acc_z_sum = 0.0
            for j in range (0, len(frame_arr)):
                roll_sum += frame_arr[j][i][0]   # Roll reading for this frame
                pitch_sum += frame_arr[j][i][1]  # Pitch reading for this frame
                acc_x_sum += frame_arr[j][i][2]  # X accelerometer
                acc_y_sum += frame_arr[j][i][3]  # Y accelerometer
                acc_z_sum += frame_arr[j][i][4]  # Z accelerometer
            avg_frames.append((roll_sum/len(frame_arr), pitch_sum/len(frame_arr), acc_x_sum/len(frame_arr),
                               acc_y_sum/len(frame_arr), acc_z_sum/len(frame_arr)))

        return avg_frames

    # Prompts the user to go through the process of learning a gesture,
    # (Repeating the gesture several times, averaging these repetitions,
    # and writing this average to the gestures.txt file.)
    # rep_limit:  The number of repetitions to learn the gesture.
    def learn_gesture(self, rep_limit):

        repetitions = 0         # How many times a gesture has been repeated.
        done = False
        confirmed = False

        while not confirmed:
            gest_name = raw_input("Please name your gesture: ")

            if not (self.get_gesture_names().__contains__(gest_name) or
                    len(gest_name) > 15):
                confirmed = True
            else:
                print "\nGesture name taken or too long.  Please choose another.\n"
        gest_action = raw_input("Please specify an command for your gesture: ")

        gest_arg_arr = shlex.split(gest_action)
        frame_arr = []

        print "\nPress and hold B, perform your gesture, and then release B."

        i = 0
        while not done:
            r = wiiuse.poll(self.wiimotes, self.num_motes)
            if r != 0:

                if wiiuse.is_just_pressed(self.first_wm[0], wiiuse.button['B']):
                    print "Learning gesture, round " + str(repetitions+1) + "."

                    frames = []

                if wiiuse.is_held(self.first_wm[0], wiiuse.button['B']):
                    roll = self.first_wm[0].orient.roll
                    pitch = self.first_wm[0].orient.pitch
                    acc_x = self.first_wm[0].gforce.x
                    acc_y = self.first_wm[0].gforce.y
                    acc_z = self.first_wm[0].gforce.z

                    frame = (roll, pitch, acc_x, acc_y, acc_z)

                    # Only add every nth frame to the list.
                    if i%self.frame_freq == 0:
                        frames.append(frame)

                if repetitions >= rep_limit:
                    done = True
                    print "Good! Press A to see your gesture added to the list of known gestures."
                    continue

                if wiiuse.is_released(self.first_wm[0], wiiuse.button['B']):
                    repetitions += 1
                    frame_arr.append(frames)
                    print str(rep_limit-repetitions) + " repetition(s) remaining."

                i += 1

        # Creating the average of the repetitions to create the learned gesture.
        gesture_average = self.average_gesture(frame_arr)

        # Writing Gesture to the gesture file.
        gesture = LearnedGesture(gest_name, gesture_average, gest_arg_arr, 0, 0, frame_arr)
        self.writer_reader.write_gesture(gesture)

        # Update the current known gestures.
        self.update_gestures()

    # Collects the data of a gesture to be compared to known gestures.
    def perform_gesture(self):
        done = False

        if len(self.known_gestures) == 0:
            return
        i = 0
        frames = []
        while not done:
            r = wiiuse.poll(self.wiimotes, self.num_motes)
            if r != 0:

                if wiiuse.is_held(self.first_wm[0], wiiuse.button['B']):
                    roll = self.first_wm[0].orient.roll
                    pitch = self.first_wm[0].orient.pitch
                    acc_x = self.first_wm[0].gforce.x
                    acc_y = self.first_wm[0].gforce.y
                    acc_z = self.first_wm[0].gforce.z

                    frame = (roll, pitch, acc_x, acc_y, acc_z)

                    # Only add every nth frame to the list.
                    if i % self.frame_freq == 0:
                        frames.append(frame)

                if wiiuse.is_released(self.first_wm[0], wiiuse.button['B']):
                    done = True
                i += 1

        gesture = PerformedGesture(frames)
        return gesture

    def update_gestures(self):
        self.known_gestures = self.writer_reader.get_learned_gestures()
        # self.full_gestures = self.writer_reader.get_full_gestures()

    def get_gesture_names(self):
        names = []
        for g in self.known_gestures:
            names.append(g.get_name())

        return names
예제 #2
0
class GestureCreator:
    def __init__(self, gestures_file, wiimotes, first_wm, num_motes,
                 frame_freq):
        self.writer_reader = GestureWriterReader(gestures_file)
        self.wiimotes = wiimotes
        self.first_wm = first_wm
        self.num_motes = num_motes
        self.frame_freq = frame_freq
        self.known_gestures = self.writer_reader.get_learned_gestures()
        # self.full_gestures = self.writer_reader.get_full_gestures()

    # Takes iterations of a gesture, and averages them frame-by-frame.
    def average_gesture(self, frame_arr):
        min_length = float('inf')

        # Find the shortest of the gestures for indexing purposes.
        for frames in frame_arr:
            if len(frames) < min_length:
                min_length = len(frames)

        if min_length == 0:
            print "Error:  A gesture had no length.  Exiting."
            exit(1)

        avg_frames = []

        for i in range(0, min_length):
            roll_sum = 0.0
            pitch_sum = 0.0
            acc_x_sum = 0.0
            acc_y_sum = 0.0
            acc_z_sum = 0.0
            for j in range(0, len(frame_arr)):
                roll_sum += frame_arr[j][i][0]  # Roll reading for this frame
                pitch_sum += frame_arr[j][i][1]  # Pitch reading for this frame
                acc_x_sum += frame_arr[j][i][2]  # X accelerometer
                acc_y_sum += frame_arr[j][i][3]  # Y accelerometer
                acc_z_sum += frame_arr[j][i][4]  # Z accelerometer
            avg_frames.append(
                (roll_sum / len(frame_arr), pitch_sum / len(frame_arr),
                 acc_x_sum / len(frame_arr), acc_y_sum / len(frame_arr),
                 acc_z_sum / len(frame_arr)))

        return avg_frames

    # Prompts the user to go through the process of learning a gesture,
    # (Repeating the gesture several times, averaging these repetitions,
    # and writing this average to the gestures.txt file.)
    # rep_limit:  The number of repetitions to learn the gesture.
    def learn_gesture(self, rep_limit):

        repetitions = 0  # How many times a gesture has been repeated.
        done = False
        confirmed = False

        while not confirmed:
            gest_name = raw_input("Please name your gesture: ")

            if not (self.get_gesture_names().__contains__(gest_name)
                    or len(gest_name) > 15):
                confirmed = True
            else:
                print "\nGesture name taken or too long.  Please choose another.\n"
        gest_action = raw_input("Please specify an command for your gesture: ")

        gest_arg_arr = shlex.split(gest_action)
        frame_arr = []

        print "\nPress and hold B, perform your gesture, and then release B."

        i = 0
        while not done:
            r = wiiuse.poll(self.wiimotes, self.num_motes)
            if r != 0:

                if wiiuse.is_just_pressed(self.first_wm[0],
                                          wiiuse.button['B']):
                    print "Learning gesture, round " + str(repetitions +
                                                           1) + "."

                    frames = []

                if wiiuse.is_held(self.first_wm[0], wiiuse.button['B']):
                    roll = self.first_wm[0].orient.roll
                    pitch = self.first_wm[0].orient.pitch
                    acc_x = self.first_wm[0].gforce.x
                    acc_y = self.first_wm[0].gforce.y
                    acc_z = self.first_wm[0].gforce.z

                    frame = (roll, pitch, acc_x, acc_y, acc_z)

                    # Only add every nth frame to the list.
                    if i % self.frame_freq == 0:
                        frames.append(frame)

                if repetitions >= rep_limit:
                    done = True
                    print "Good! Press A to see your gesture added to the list of known gestures."
                    continue

                if wiiuse.is_released(self.first_wm[0], wiiuse.button['B']):
                    repetitions += 1
                    frame_arr.append(frames)
                    print str(rep_limit -
                              repetitions) + " repetition(s) remaining."

                i += 1

        # Creating the average of the repetitions to create the learned gesture.
        gesture_average = self.average_gesture(frame_arr)

        # Writing Gesture to the gesture file.
        gesture = LearnedGesture(gest_name, gesture_average, gest_arg_arr, 0,
                                 0, frame_arr)
        self.writer_reader.write_gesture(gesture)

        # Update the current known gestures.
        self.update_gestures()

    # Collects the data of a gesture to be compared to known gestures.
    def perform_gesture(self):
        done = False

        if len(self.known_gestures) == 0:
            return
        i = 0
        frames = []
        while not done:
            r = wiiuse.poll(self.wiimotes, self.num_motes)
            if r != 0:

                if wiiuse.is_held(self.first_wm[0], wiiuse.button['B']):
                    roll = self.first_wm[0].orient.roll
                    pitch = self.first_wm[0].orient.pitch
                    acc_x = self.first_wm[0].gforce.x
                    acc_y = self.first_wm[0].gforce.y
                    acc_z = self.first_wm[0].gforce.z

                    frame = (roll, pitch, acc_x, acc_y, acc_z)

                    # Only add every nth frame to the list.
                    if i % self.frame_freq == 0:
                        frames.append(frame)

                if wiiuse.is_released(self.first_wm[0], wiiuse.button['B']):
                    done = True
                i += 1

        gesture = PerformedGesture(frames)
        return gesture

    def update_gestures(self):
        self.known_gestures = self.writer_reader.get_learned_gestures()
        # self.full_gestures = self.writer_reader.get_full_gestures()

    def get_gesture_names(self):
        names = []
        for g in self.known_gestures:
            names.append(g.get_name())

        return names