Example #1
0
class Robot(object):
    def __init__(self, robot_id):
        self.robot = DroidClient()
        connected = self.robot.connect_to_droid(robot_id)
        while not connected:
            connected = self.robot.connect_to_droid(robot_id)

    def roll(self, heading):
        mapping = {"up": 0, "right": 90, "down": 180, "left": 270}
        self.robot.roll(0, mapping.get(heading), 0)
        time.sleep(0.35)
        self.robot.roll(1, mapping.get(heading), 0.62)

    def reset(self):
        self.robot.roll(0, 0, 0)

    def disconnect(self):
        self.robot.disconnect()
Example #2
0
    def __init__(self, droid_id, location, goodness_boolean, debug=False):
        self.ID = droid_id
        self.EMPs = 2
        self.current_location = location

        # Is this droid good or evil? True refers to good droid, False refers to bad droid
        self.is_good = goodness_boolean

        # Is this droid alive? True refers to droid is alive. False refers to droid is dead.
        # ONLY GOOD DROIDS CAN DIE
        self.is_alive = True

        # Is this droid active? True refers to active droid. False refers to droid that has been stunned.
        # ONLY BAD DROIDS CAN BE STUNNED
        self.is_active = True

        # CODERPAD SECTION
        self.debug = debug
        droid_client = DroidClient()
        if not debug:
            droid_client.scan()
            droid_client.connect_to_droid(droid_id)
        self.droid_client = droid_client
Example #3
0
# droids = {} # num: droid client
#
# for num, droid_name in droid_names.items():
#     droid = DroidClient()
#     droid.connect_to_droid(droid_name)
#     droid.battery()

# droid = DroidClient()
# droid.connect_to_droid('D2-1C62')
# #droid.animate(5)
# # puzzle_maneuver.roll(droid, 0x40, 0, .40)
# # puzzle_maneuver.roll(droid, 0x40, 180, .40)
#

droid = DroidClient()
droid.connect_to_droid('Q5-B30E')

path = [(2, 2), (2, 1)]
# puzzle_maneuver.follow_path(droid, path, 0x88, .9)
# time.sleep(5)
# path = [(2, 1), (2, 2)]
# puzzle_maneuver.follow_path(droid, path, 0x88, .9)

# path1 = [(1, 0), (1, 1)]
# maneuver.follow_path(droid, path1, 0x88, .75)
#
# path1 = [(1, 1), (1, 0), (2, 0)]
# maneuver.follow_path(droid, path1, 0x88, .75)

# dist, ang = maneuver.compute_roll_parameters((1, 1), (1, 0))
# maneuver.roll(droid, 0x40, ang, dist*.4)
text_label.pack()

text_box = Entry(root, bd=1)
text_box.pack()

enter_button = Button(root, text="OK", command=add_text)
enter_button.pack()

root.mainloop()

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# connect to R2D2
from client import DroidClient
droid = DroidClient()
droid.connect_to_droid('Q5-F43E')
droid.animate(5)

# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
import string
import random
import numpy as np
import copy


# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# NLP functions
def tokenize(text):
    out = []
Example #5
0
class Robot:
    def __init__(self, droidID, wordSimilarityCutoff, voice):
        self.createSentenceEmbeddings()
        self.droid = DroidClient()
        self.name = "R2"
        self.wordSimilarityCutoff = wordSimilarityCutoff
        self.holoProjectorIntensity = 0
        self.logicDisplayIntensity = 0
        self.frontRGB = (0, 0, 0)
        self.backRGB = (0, 0, 0)
        self.voice = voice
        self.grid = [[]]
        self.speed = 0.5
        self.pos = (-1, -1)

        self.colorToRGB = {}
        with open(path + 'data/colors.csv') as csvfile:
            readCSV = csv.reader(csvfile, delimiter=',')
            for row in readCSV:
                self.colorToRGB[row[0]] = (int(row[2]), int(row[3]),
                                           int(row[4]))

        connected = self.droid.connect_to_droid(droidID)
        while not connected:
            connected = self.droid.connect_to_droid(droidID)

    def createSentenceEmbeddings(self):
        self.categories = [
            "state", "direction", "light", "animation", "head", "grid"
        ]
        trainingSentences = loadTrainingSentences(
            path + "data/r2d2TrainingSentences.txt")

        self.indexToTrainingSentence = {}

        i = 0
        for category in self.categories:
            sentences = trainingSentences[category + "Sentences"]
            for sentence in sentences:
                self.indexToTrainingSentence[i] = (sentence, category)
                i += 1

        self.sentenceEmbeddings = np.zeros(
            (len(self.indexToTrainingSentence), vectors.dim))

        for i in range(len(self.indexToTrainingSentence)):
            sentence = self.indexToTrainingSentence[i][0]
            sentenceEmbedding = calcPhraseEmbedding(sentence)

            self.sentenceEmbeddings[i, :] = sentenceEmbedding

    def inputCommand(self, command):
        commandEmbedding = calcPhraseEmbedding(command)

        closestSentences = rankSentences(commandEmbedding,
                                         self.sentenceEmbeddings)

        # print(self.indexToTrainingSentence[closestSentences[0]][0])
        # print(self.indexToTrainingSentence[closestSentences[1]][0])
        # print(self.indexToTrainingSentence[closestSentences[2]][0])
        # print(self.indexToTrainingSentence[closestSentences[3]][0])
        # print(self.indexToTrainingSentence[closestSentences[4]][0])

        print("Closet sentence was: " +
              self.indexToTrainingSentence[closestSentences[0]][0])
        print("Its cosine similarity to the command was: " + str(
            cosineSim(commandEmbedding, self.sentenceEmbeddings[
                closestSentences[0], :])))

        if cosineSim(commandEmbedding, self.sentenceEmbeddings[
                closestSentences[0], :]) < 0.84 and not self.voice:
            subcommand = input(
                self.name +
                ": I could not understand your command. Do you want to add this command to the training set? (yes/no): "
            )
            if "yes" in subcommand.lower():
                subcommand = input(
                    "What category do you want to add it to? Choices are state, direction, light, animation, head, or grid: "
                )
                subcommand = subcommand.lower()
                if subcommand in self.categories:
                    with open(path + "data/r2d2TrainingSentences.txt",
                              'a') as the_file:
                        the_file.write(subcommand + 'Sentences :: ' + command +
                                       '\n')
                    print("Command added. Changes will be present on restart.")
                else:
                    print(subcommand + " not a valid category.")
            return

        commandType = getCommandType(self.categories, closestSentences,
                                     self.indexToTrainingSentence)
        result = getattr(self, commandType + "Parser")(command.lower())
        if result:
            print(self.name + ": Done executing " + commandType + " command.")
        else:
            print(self.name + ": I could not understand your " + commandType +
                  " command.")

    def reset(self):
        self.droid.roll(0, 0, 0)

    def disconnect(self):
        self.droid.disconnect()

    def flash_colors(self, colors, seconds=1, front=True):
        if front:
            for color in colors:
                self.droid.set_front_LED_color(*color)
                time.sleep(seconds)
        else:
            for color in colors:
                self.droid.set_back_LED_color(*color)
                time.sleep(seconds)

    def askForColor(self, lightPosition="both"):
        if lightPosition != "both":
            print("We detect that you want to change your " + lightPosition +
                  " light, but could not find a color.")
        else:
            print(
                "We parsed this as a light command, but could not find a color."
            )
        command = input("Do you want to input a color? (yes/no): ")
        color = False
        if "yes" in command.lower():
            print(
                "You may have inputted a color, but it is not in our database or is mispelled. Please input a color or rgb tuple."
            )
            command = input(
                "If you want to add the color to the database, input color_name (one string) :: rgb tuple: "
            )

            words = re.split('\W+', command)
            words = [x for x in words if x != ""]
            for word in words:
                if word in self.colorToRGB: color = self.colorToRGB[word]
            if len(words) == 4:
                try:
                    color = (int(words[1]), int(words[2]), int(words[3]))
                    colorName = words[0]
                    with open(path + 'data/colors.csv', 'a') as csvStorer:
                        csvStorer.write('\n' + colorName + ',R2D2 ' +
                                        colorName + ',' + words[1] + ',' +
                                        words[2] + ',' + words[3])
                    print(
                        colorName +
                        " added to database. It will be available on the next restart."
                    )
                except ValueError:
                    superDumbVariable = 1
            elif len(words) == 3:
                try:
                    color = (int(words[0]), int(words[1]), int(words[2]))
                except ValueError:
                    superDumbVariable = 1

        return color

    def lightParser(self, command):
        # slot filler for lights
        slots = {
            "holoEmit": False,
            "logDisp": False,
            "lights": [],
            "add": False,
            "sub": False,
            "percent": False,
            "whichRGB": [],
            "colors": [],
            "intensities": [],
            "rgb": False,
            "increment/seconds": False
        }

        if "holoemitter" in command or "holo emitter" in command:
            slots["holoEmit"] = True
        if "logic display" in command:
            slots["logDisp"] = True

        if "dim" in command:
            slots["intensities"].append("dim")
        if "blink" in command:
            slots["intensities"].append("blink")

        if "%" in command:
            slots["percent"] = True

        # WANT TO MAKE INCREASE BETTER
        if "increase" in command or "add" in command:
            slots["add"] = True
        if "decrease" in command or "reduce" in command or "subtract" in command:
            slots["sub"] = True

        # front back too similar
        if "back" in command:
            slots["lights"].append("back")
        if "front" in command:
            slots["lights"].append("front")
        if slots["lights"] == []:
            slots["lights"] = ["front", "back"]

        if "red" in command:
            slots["whichRGB"].append("red")
        if "green" in command:
            slots["whichRGB"].append("green")
        if "blue" in command:
            slots["whichRGB"].append("blue")

        words = re.split('\W+', command)
        words = [x for x in words if x != ""]

        i = 0
        for word in words:
            if i < len(words) - 2:
                try:
                    slots["rgb"] = (int(words[i]), int(words[i + 1]),
                                    int(words[i + 2]))
                except ValueError:
                    superDumbVariable = True
            if vectors.similarity(
                    "off",
                    word) > self.wordSimilarityCutoff or "minimum" in command:
                slots["intensities"].append("off")
            elif vectors.similarity(
                    "on",
                    word) > self.wordSimilarityCutoff or vectors.similarity(
                        "maximum", word) > self.wordSimilarityCutoff:
                slots["intensities"].append("on")
            if vectors.similarity("percent", word) > self.wordSimilarityCutoff:
                slots["percent"] = True
            if word in self.colorToRGB:
                slots["colors"].append(self.colorToRGB[word])
            i += 1

            try:
                increment = int(word)
                slots["increment/seconds"] = increment
            except ValueError:
                continue

        return self.lightSlotsToActions(slots)

    def lightSlotsToActions(self, slots):
        if slots["holoEmit"]:
            if "off" in slots["intensities"]:
                self.holoProjectorIntensity = 0
                self.droid.set_holo_projector_intensity(
                    self.holoProjectorIntensity)
            elif "dim" in slots["intensities"]:
                self.holoProjectorIntensity = self.holoProjectorIntensity / 2
                self.droid.set_holo_projector_intensity(
                    self.holoProjectorIntensity)
            elif "on" in slots["intensities"]:
                self.holoProjectorIntensity = 1
                self.droid.set_holo_projector_intensity(
                    self.holoProjectorIntensity)
            elif "blink" in slots["intensities"]:
                self.droid.set_holo_projector_intensity(
                    (self.holoProjectorIntensity + 1) % 2)
                time.sleep(0.3)
                self.droid.set_holo_projector_intensity(
                    self.holoProjectorIntensity)
            else:
                return False
            return True

        if slots["logDisp"]:
            if "off" in slots["intensities"]:
                self.logicDisplayIntensity = 0
                self.droid.set_logic_display_intensity(
                    self.logicDisplayIntensity)
            elif "dim" in slots["intensities"]:
                self.logicDisplayIntensity = self.logicDisplayIntensity / 2
                self.droid.set_logic_display_intensity(
                    self.logicDisplayIntensity)
            elif "on" in slots["intensities"]:
                self.logicDisplayIntensity = 1
                self.droid.set_logic_display_intensity(
                    self.logicDisplayIntensity)
            elif "blink" in slots["intensities"]:
                self.droid.set_logic_display_intensity(
                    (self.logicDisplayIntensity + 1) % 2)
                time.sleep(0.3)
                self.droid.set_logic_display_intensity(
                    self.logicDisplayIntensity)
            else:
                return False
            return True

        if (slots["add"] or slots["sub"]) and (slots["percent"]):
            lights = slots["lights"]

            if not slots["increment/seconds"]:
                command = input(
                    "Percent not found in command, please input percent to change by here: "
                )
                try:
                    command = command.replace("%", "")
                    slots["increment/seconds"] = int(command)
                except ValueError:
                    return False

            if slots["sub"]:
                slots["increment/seconds"] = -slots["increment/seconds"]

            percent = slots["increment/seconds"]

            if len(slots["whichRGB"]) == 0:
                command = input(
                    "Did not find what values (red/blue/green) to change, input what values to change: "
                )
                if "red" in command: slots["whichRGB"].append("red")
                if "green" in command: slots["whichRGB"].append("green")
                if "blue" in command: slots["whichRGB"].append("blue")

            if len(slots["whichRGB"]) == 0: return False

            if "red" in slots["whichRGB"]:
                for light in lights:
                    rgb = getattr(self, light + "RGB")
                    setattr(self, light + "RGB",
                            (max(0, min(rgb[0] + rgb[0] * percent / 100,
                                        255)), rgb[1], rgb[2]))
                    getattr(self.droid, "set_" + light +
                            "_LED_color")(*getattr(self, light + "RGB"))
            if "green" in slots["whichRGB"]:
                for light in lights:
                    rgb = getattr(self, light + "RGB")
                    setattr(self, light + "RGB",
                            (rgb[0],
                             max(0, min(rgb[1] + rgb[1] * percent / 100,
                                        255)), rgb[2]))
                    getattr(self.droid, "set_" + light +
                            "_LED_color")(*getattr(self, light + "RGB"))
            if "blue" in slots["whichRGB"]:
                for light in lights:
                    rgb = getattr(self, light + "RGB")
                    setattr(
                        self, light + "RGB",
                        (rgb[0], rgb[1],
                         max(0, min(rgb[2] + rgb[2] * percent / 100, 255))))
                    getattr(self.droid, "set_" + light +
                            "_LED_color")(*getattr(self, light + "RGB"))

            return True

        if slots["add"] or slots["sub"]:
            lights = slots["lights"]

            if not slots["increment/seconds"]:
                command = input(
                    "Increment not found in command, please input amount to change by here: "
                )
                try:
                    slots["increment/seconds"] = int(command)
                except ValueError:
                    return False

            if slots["sub"]:
                slots["increment/seconds"] = -slots["increment/seconds"]

            increaseValue = slots["increment/seconds"]

            if len(slots["whichRGB"]) == 0:
                command = input(
                    "Did not find what values (red/blue/green) to change, input what values to change: "
                )
                if "red" in command: slots["whichRGB"].append("red")
                if "green" in command: slots["whichRGB"].append("green")
                if "blue" in command: slots["whichRGB"].append("blue")

            if len(slots["whichRGB"]) == 0: return False

            if "red" in slots["whichRGB"]:
                for light in lights:
                    rgb = getattr(self, light + "RGB")
                    setattr(self, light + "RGB", (max(
                        0, min(rgb[0] + increaseValue, 255)), rgb[1], rgb[2]))
                    getattr(self.droid, "set_" + light +
                            "_LED_color")(*getattr(self, light + "RGB"))
            if "green" in slots["whichRGB"]:
                for light in lights:
                    rgb = getattr(self, light + "RGB")
                    setattr(self, light + "RGB",
                            (rgb[0], max(0, min(rgb[1] + increaseValue,
                                                255)), rgb[2]))
                    getattr(self.droid, "set_" + light +
                            "_LED_color")(*getattr(self, light + "RGB"))
            if "blue" in slots["whichRGB"]:
                for light in lights:
                    rgb = getattr(self, light + "RGB")
                    setattr(self, light + "RGB",
                            (rgb[0], rgb[1],
                             max(0, min(rgb[2] + increaseValue, 255))))
                    getattr(self.droid, "set_" + light +
                            "_LED_color")(*getattr(self, light + "RGB"))

            return True

        askedForColor = False

        if "back" in slots["lights"] and len(slots["lights"]) == 1:
            if len(slots["colors"]) > 1:
                seconds = slots["increment/seconds"]
                if not seconds: seconds = 1
                self.flash_colors(slots["colors"], seconds, False)
            elif len(slots["colors"]) == 1:
                self.backRGB = slots["colors"][0]
            else:
                if not slots["rgb"]:
                    color = self.askForColor("back")
                    askedForColor = True
                    if not color: return False
                    self.backRGB = color
                else:
                    self.backRGB = slots["rgb"]

            self.droid.set_back_LED_color(*self.backRGB)
            return True

        if ("front" in slots["lights"]
                and len(slots["lights"]) == 1) or len(slots["colors"]) > 1:
            if len(slots["colors"]) > 1:
                seconds = slots["increment/seconds"]
                if not seconds: seconds = 1
                self.flash_colors(slots["colors"], seconds)
            elif len(slots["colors"]) == 1:
                self.frontRGB = slots["colors"][0]
            else:
                if not slots["rgb"]:
                    color = self.askForColor("front")
                    askedForColor = True
                    if not color: return False
                    self.frontRGB = color
                else:
                    self.frontRGB = slots["rgb"]

            self.droid.set_front_LED_color(*self.frontRGB)
            return True

        if len(slots["colors"]) == 1:
            self.backRGB = slots["colors"][0]
            self.frontRGB = slots["colors"][0]
            self.droid.set_back_LED_color(*self.backRGB)
            self.droid.set_front_LED_color(*self.frontRGB)
            return True

        if len(slots["colors"]) == 0:
            if slots["rgb"]:
                self.backRGB = slots["rgb"]
                self.frontRGB = slots["rgb"]
                self.droid.set_back_LED_color(*self.backRGB)
                self.droid.set_front_LED_color(*self.frontRGB)
                return True

        if "off" in slots["intensities"]:
            self.holoProjectorIntensity = 0
            self.droid.set_holo_projector_intensity(
                self.holoProjectorIntensity)
            self.logicDisplayIntensity = 0
            self.droid.set_logic_display_intensity(self.logicDisplayIntensity)
            self.backRGB = (0, 0, 0)
            self.frontRGB = (0, 0, 0)
            self.droid.set_back_LED_color(*self.backRGB)
            self.droid.set_front_LED_color(*self.frontRGB)
            return True
        elif "dim" in slots["intensities"]:
            self.holoProjectorIntensity = 0
            self.droid.set_holo_projector_intensity(
                self.holoProjectorIntensity)
            self.logicDisplayIntensity = 0
            self.droid.set_logic_display_intensity(self.logicDisplayIntensity)
            self.backRGB = tuple(x / 2 for x in self.backRGB)
            self.frontRGB = tuple(x / 2 for x in self.frontRGB)
            self.droid.set_back_LED_color(*self.backRGB)
            self.droid.set_front_LED_color(*self.frontRGB)
            return True
        elif "on" in slots["intensities"]:
            self.holoProjectorIntensity = 1
            self.droid.set_holo_projector_intensity(
                self.holoProjectorIntensity)
            self.logicDisplayIntensity = 1
            self.droid.set_logic_display_intensity(self.logicDisplayIntensity)
            return True
        elif "blink" in slots["intensities"]:
            self.droid.set_holo_projector_intensity(
                (self.holoProjectorIntensity + 1) % 2)
            self.droid.set_logic_display_intensity(
                (self.holoProjectorIntensity + 1) % 2)
            time.sleep(0.3)
            self.droid.set_holo_projector_intensity(
                self.holoProjectorIntensity)
            self.droid.set_logic_display_intensity(self.logicDisplayIntensity)
            return True

        if not slots["rgb"] and not askedForColor:
            color = self.askForColor()
            if color:
                self.backRGB = color
                self.frontRGB = color
                self.droid.set_back_LED_color(*self.backRGB)
                self.droid.set_front_LED_color(*self.frontRGB)
                return True

        return False

    def directionParser(self, command):
        if re.search(r"\b(circle|donut)\b", command, re.I):
            if re.search(r"\b(counter)\b", command, re.I):
                for heading in range(360, 0, -30):
                    self.droid.roll(self.speed, heading % 360, 0.6)
            else:
                for heading in range(0, 360, 30):
                    self.droid.roll(self.speed, heading, 0.6)
            self.droid.roll(0, 0, 0)
            return True
        elif re.search(r"\b(square)\b", command, re.I):
            if re.search(r"\b(counter)\b", command, re.I):
                for heading in range(360, 0, -90):
                    self.droid.roll(0, heading % 360, 0)
                    time.sleep(0.35)
                    self.droid.roll(self.speed, heading % 360, 0.6)
            else:
                for heading in range(0, 360, 90):
                    self.droid.roll(0, heading, 0)
                    time.sleep(0.35)
                    self.droid.roll(self.speed, heading, 0.6)
            self.droid.roll(0, 0, 0)
            return True
        elif re.search(r"\b(speed|faster|slower|slow)\b", command, re.I):
            if re.search(r"\b(increase|faster)\b", command, re.I):
                self.speed += 0.25
            else:
                self.speed -= 0.25
            self.droid.animate(1)
            return True
        else:
            flag = False
            tokens = re.split("[^a-zA-Z]", command)
            for token in tokens:
                if token in {"up", "forward", "ahead", "straight", "north"}:
                    self.droid.roll(0, 0, 0)
                    time.sleep(0.35)
                    self.droid.roll(self.speed, 0, 0.6)
                    flag = True
                elif token in {"down", "back", "south"}:
                    self.droid.roll(0, 180, 0)
                    time.sleep(0.35)
                    self.droid.roll(self.speed, 180, 0.6)
                    flag = True
                elif token in {"left", "west"}:
                    self.droid.roll(0, 270, 0)
                    time.sleep(0.35)
                    self.droid.roll(self.speed, 270, 0.6)
                    flag = True
                elif token in {"right", "east"}:
                    self.droid.roll(0, 90, 0)
                    time.sleep(0.35)
                    self.droid.roll(self.speed, 90, 0.6)
                    flag = True
            self.droid.roll(0, 0, 0)
            return flag

    def animationParser(self, command):
        if re.search(r"\b(dance|move|moves)\b", command, re.I):
            self.droid.animate(3)
            return True
        elif re.search(r"\b(sing|sound|sounds|noise|noises)\b", command, re.I):
            self.droid.play_sound(3)
            return True
        elif re.search(r"\b(fall)\b", command, re.I):
            self.droid.animate(14)
            return True
        elif re.search(r"\b(scream)\b", command, re.I):
            self.droid.play_sound(7)
            return True
        return False

    def headParser(self, command):
        if re.search(r"\b(left)\b", command, re.I):
            self.droid.rotate_head(-90)
            return True
        elif re.search(r"\b(right)\b", command, re.I):
            self.droid.rotate_head(90)
            return True
        elif re.search(r"\b(behind|back)\b", command, re.I):
            self.droid.rotate_head(180)
            return True
        elif re.search(r"\b(forward|ahead)\b", command, re.I):
            self.droid.rotate_head(0)
            return True
        return False

    def gridParser(self, command):
        if re.search("\d+ (x|by) \d+", command):
            print
            arr = command.split()
            ind = -1
            for i in range(len(arr)):
                if arr[i] == "x" or arr[i] == "by":
                    ind = i
            if ind != -1 and ind < len(arr) - 1:
                x = int(arr[ind - 1])
                y = int(arr[ind + 1])
                self.grid = [["" for col in range(y)] for row in range(x)]
                self.droid.animate(1)
            print(self.grid)
            return True
        elif re.search("there is .+ at [(]?\d+,[ ]?\d+", command):
            temp = re.split("[^a-zA-Z0-9]", command)
            arr = []
            for x in temp:
                if x != "":
                    arr.append(x)
            ind1 = -1
            ind2 = -1
            for i in range(len(arr)):
                if arr[i] == "is":
                    ind1 = i
                elif arr[i].isdigit():
                    ind2 = i
                    break
            if ind1 != -1 and ind2 != -1:
                if int(arr[ind2]) < 0 or int(arr[ind2]) >= len(
                        self.grid) or int(arr[ind2 + 1]) < 0 or int(
                            arr[ind2 + 1]) >= len(self.grid[0]):
                    self.droid.play_sound(7)
                    return False
                else:
                    self.grid[int(arr[ind2])][int(arr[ind2 + 1])] = arr[ind1 +
                                                                        1]
                    print(self.grid)
            return True
        elif re.search("go to [(]?\d+,[ ]?\d+", command):
            temp = re.split("[^a-zA-Z0-9]", command)
            arr = []
            for x in temp:
                if x != "":
                    arr.append(x)
            ind = -1
            for i in range(len(arr)):
                if arr[i].isdigit():
                    ind = i
                    break
            if ind != -1:
                if int(arr[ind]) < 0 or int(arr[ind]) >= len(self.grid) or int(
                        arr[ind + 1]) < 0 or int(arr[ind + 1]) >= len(
                            self.grid[0]):
                    self.droid.play_sound(7)
                    return False
                else:
                    target = (int(arr[ind]), int(arr[ind + 1]))
                    G = Graph(self.grid)
                    moves = A_star(G, self.pos, target,
                                   manhattan_distance_heuristic)
                    print("**************")
                    print(moves)
                    print("**************")
                    for i in range(1, len(moves)):
                        if moves[i][1] > moves[i - 1][1]:
                            self.droid.roll(0, 0, 0)
                            time.sleep(0.35)
                            self.droid.roll(1, 0, 0.62)
                        elif moves[i][1] < moves[i - 1][1]:
                            self.droid.roll(0, 180, 0)
                            time.sleep(0.35)
                            self.droid.roll(1, 180, 0.62)
                        elif moves[i][0] > moves[i - 1][0]:
                            self.droid.roll(0, 90, 0)
                            time.sleep(0.35)
                            self.droid.roll(1, 90, 0.62)
                        elif moves[i][0] < moves[i - 1][0]:
                            self.droid.roll(0, 270, 0)
                            time.sleep(0.35)
                            self.droid.roll(1, 270, 0.62)
                        self.pos = moves[i]
                        if self.pos == target:
                            break
                    self.reset()
                    self.pos = target
            return True
        elif re.search("you are at [(]?\d+,[ ]?\d+", command):
            temp = re.split("[^a-zA-Z0-9]", command)
            arr = []
            for x in temp:
                if x != "":
                    arr.append(x)
            ind = -1
            for i in range(len(arr)):
                if arr[i].isdigit():
                    ind = i
                    break
            if ind != -1:
                if int(arr[ind]) < 0 or int(arr[ind]) >= len(self.grid) or int(
                        arr[ind + 1]) < 0 or int(arr[ind + 1]) >= len(
                            self.grid[0]):
                    self.droid.play_sound(7)
                    return False
                else:
                    print(int(arr[ind]), int(arr[ind + 1]))
                    self.pos = (int(arr[ind]), int(arr[ind + 1]))
                    print(self.pos)
            return True
        return False

    def stateParser(self, command):
        if re.search(r"\b(color)\b", command, re.I):
            if re.search(r"\b(front|forward)\b", command, re.I):
                print("***************")
                print(self.frontRGB)
                print("***************")
            elif re.search(r"\b(back|rear)\b", command, re.I):
                print("***************")
                print(self.backRGB)
                print("***************")
            else:
                print("***************")
                print(self.frontRGB)
                print(self.backRGB)
                print("***************")
            return True
        elif re.search(r"\b(name)\b", command, re.I):
            print("***************")
            print(self.name)
            print("***************")
            return True
        elif re.search(r"\b(power|battery)\b", command, re.I):
            print("***************")
            self.droid.battery()
            print("***************")
            return True
        return False
Example #6
0
G = [[False, False, False, False, False],
     [False, False, True, False, True],
     [False, True, False, False, False],
     [False, False, False, True, False],
     [True, False, False, False, False],
     [False, False, True, False, False],
     [True, False, False, False, False],
     [False, False, False, False, False]]




# connect to Sphero
droid = DroidClient()
droid.scan()
droid.connect_to_droid('D2-6F8D')
# droid.connect_to_R2D2()

enemy = DroidClient()
enemy.scan()
enemy.connect_to_droid('Q5-8CC0')




# get course, find path
#G = courses.grid_1
agent_pos = (0, 0)
enemy_pos = (7, 2)
goal = (7, 4)
Example #7
0
# assign droids to a number and start all droids
droid_names = {
    1: 'D2-579A',
    2: 'Q5-8C54',
    3: 'Q5-EFBE',
    4: 'Q5-240E',
    5: 'D2-0969',
    6: 'Q5-B30E',
    7: 'D2-1C62',
    8: 'Q5-D8D3'
}
droids = {}  # num: droid client

for num, droid_name in droid_names.items():
    droid = DroidClient()
    droid.connect_to_droid(droid_name)
    droids[num] = droid

# create puzzle and find solution to puzzle
start_board = [[3, 7, 1], [6, 4, 2], [0, 8, 5]]
# Other boards to use/test:
# start_board = [[3, 1, 0], [4, 6, 5], [7, 8, 2]]
# start_board = [[7, 6, 4], [3, 0, 8], [2, 1, 5]]
puzzle = Puzzle(start_board)
blank = puzzle.blank
moves = puzzle.find_solution()

# set up droids in grid
droid_board = []
for row in start_board:
    new_row = []