This week, I began wrapping up my project. Only one week remains until this thing must be worthy of demonstration in front of a class full of peers, so adding new features has to be de-emphasized in favor of reinforcing stability & adding documentation to the project.
Major New Features:
- Added the ability to give a conditional statement. For now, this is limited to wall sensing. So now, “go forward until you hit a wall” is a legit command.
- Added the ability to repeat a command a specified number of times. i.e. “Turn left ninety degrees twice” or “Beep six times.”
Quality of Life Improvements:
- I reorganized quite a bit of the python code and added docstrings to all the functions.
- I added the ability to toggle voice/text input/output modes as well as debug mode. Previously, these were command-line options or hardcoded.
- Added punctuation filtering to user text input in order to avoid ugly crashes. Should be a lot more user-proof now.
- I added some more documentation to my prolog code.
- Stabilized the photo-taking code. It still crashes in IDLE, but works great via console python.
- MANY small grammar reinforcements & bug fixes.
The last major feature I hope to add is a “help” menu, which will give the user an overview of commands and some examples of usage.
In the meantime, I am beginning to brainstorm about my in-class presentation and am also working on outlining my final project paper.
Next week I will post all of the sources for the final program along with a project summary. In the meantime, here is a writeup of the full command grammar that the robot accepts:
ScribPro Command Grammar
Commands entered into the parser in accordance with the following grammar will be properly parsed and executed:
Compound_Sentence = [Address] Simple_Sentence Conn_And Compound_Sentence | [Address] Simple_Sentence Simple_Sentence = Command_Phrase (Number “times” | Number_Eng) | Command_Phrase Command_Phrase = Move_Command | Move_Command Cond_Until “you” Cond_Encounter Obj_Wall | Turn [“to”] [“the” | “your”] Direction Amount | Turn [“to”] [“the” | “your”] Direction | Turn Around | Spin Around [“to”] [“the” | “your”] Direction | Spin Around | Take Adposition_A Photomode Obj_Picture | Take Adposition_A Obj_Picture | Beep | Wait ["for"] Amount | Wait | Moonwalk [“for”] Amount | Moonwalk Move_Command = Go Direction [“for”] Amount | Go Amount Direction | Go Amount | Go Direction Adposition_A = “a” | “one” Cond_Until = “until” Cond_Encounter = “encounter” | “reach” | “sense” | “hit” Photomode = Photomode_0 | Photomode_1 Photomode_0 = “grayscale” | “greyscale” | “gray” | “grey” | “black” ”and” ”white” | “black” ”&” ”white”. Photomode_1 = “color” Obj_Picture = “photo” | “picture” | “pic” | “snapshot” Obj_Wall = “a” ”wall” | “the” ”wall” | “an” ”obstacle” | “something” Pronoun_Robot = “robot” | “scribbler” Conn_And = “and” | “then” | “,” | “and” “then” | “,” “then” | “,” “and” “then” Address = [“robot” | “scribbler”] [“,”] [“please”] Action = Go | Turn | Spin | Take | Wait | Beep | Moonwalk Go = “go” | “move” | “drive” | “roll” | “scoot” Turn = “turn” | “rotate” | “swivel” Spin = “spin” Take = “take” | “obtain” | “get” | “snap” Wait = “wait” | “pause” | “stop” Beep = “beep” Moonwalk = “moonwalk” Direction = Forward | Backward | Left | Right | Around Forward = “forward” | “forwards” | “ahead” | “up” Backward = “backward” | “backwards” | “back” Left = “left” | “counter-clockwise” | “counter” ”clockwise” Right = “right” | “clockwise” Around = “around” | “in” Adposition_A ”circle” Number = Num “point” Digit | Num Number_Eng = “once” | “twice” | “thrice” Num = “zero” | Xxxx | Xxx | Xx | Digit | Integer Xxxx = Digit “thousand” Xxx Xxx = Digit “hundred” Rest_Xxx Rest_Xxx = “and” Xx | Xx | λ Xx = Digit | Teen | Tens Rest_Xx Rest_Xx = Digit | λ Digit = “one” | “two” | “three” | “four” | “five” | “six” | “seven” | “eight” | “nine” Integer = (*Integer is just a meta integer, i.e “242”*) Teen = “ten” | “eleven” | “twelve” | “thirteen” | “fourteen” | “fifteen” | “sixteen” | “seventeen” | “eighteen” | “nineteen” Tens = “twenty | “thirty” | “forty” | “fifty” | “sixty” | “seventy” | “eighty” | “ninety” Amount = Number “seconds” (*Number != 1*) | Number “second” (*Number == 1*) | Number “milliseconds” (*Number != 1*) | Number “millisecond” (*Number == 1*) | Number “feet” (*Number != 1*) | Number “foot” (*Number == 1*) | Number “inches” (*Number != 1*) | Number “inch” (*Number == 1*) | Number “degrees” (*Number != 1*) | Number “degree” (*Number == 1*)
Legend for the EBNF-unsavvy:
- Nonterminal symbols are Capitalized.
- Terminals are in “quotes”.
- []’s denote optional symbols.
- | denotes alternation.