650 likes | 1.48k Views
Maze-Solving Mindstorms NXT Robot. Our Mission. Investigate the capabilities of the NXT robot Explore development options Build something interesting!. Problem Outline. Robot is placed in a “grid” of same-sized squares
E N D
Our Mission • Investigate the capabilities of the NXT robot • Explore development options • Build something interesting!
Problem Outline • Robot is placed in a “grid” of same-sized squares • (Due to obscure and annoying technical limitations, the robot always starts at the “southwest” corner of the maze, facing “north”) • Each square can be blocked on 0-4 sides (we just used note cards!) • Maze is rectangularly bounded • One square is a “goal” square (we indicate this by covering the floor of the goal square in white note cards ) • The robot has to get to the goal square
Robot Design • Uses basic “driving base” from NXT building guide, plus two light sensors (pointed downwards) and one ultrasonic distance sensor (pointed forwards) • The light sensors are used to detect the goal square, and the distance sensor is used to detect walls
Robot Design, cont’d Ultrasonic Sensor LightSensors
Search Algorithm • Simple Depth-First Search • Robot scans each cell for walls and constructs a DFS tree rooted at the START cell • As the DFS tree is constructed, it indicates which cells have been explored and provides paths for backtracking • The DFS halts when the GOAL cell is found
DFS Tree Data Structure • Two-Dimensional Array Cell maze[MAX_HEIGHT][MAX_WIDTH] typedef struct { bool isExplored; (= false) Direction parentDirection; (= NO_DIRECTION) WallStatus[4] wallStatus; (= {UNKNOWN}) } Cell; • Actually implemented as parallel arrays due to RobotC limitations
DFS Algorithm while (true) { if robot is at GOAL cell victoryDance(); if there is an unexplored, unobstructed neighbor Mark parent of neighbor as current cell; Proceed to the neighbor; else if robot is not in START cell Backtrack; else return; //No GOAL cell exists, so we exit }
Example 3x3 maze GOAL
We start out at (0,0) – the “southwest” corner of the maze • Location of goal is unknown
So we go forward; the red arrow indicates that (0,0) is (1,0)’s predecessor.
We sense a wall here too, so we’re gonna have to look north.
…so we go forward. • “When you come to a fork in the road, take it.”–Yogi Berra on depth-first search
We already know that the wall on the right is blocked, so we try turning left instead.
Wall here too! • Now there are no unexplored neighboring squares that we can get to. • So, we backtrack! (Retrace the red arrow)
…and go forward. • Now we’ve backtracked to a square that might have an unexplored neighbor. Let’s check!
What luck! Here’s the goal. • Final step: Execute victory dance.
Movement and Sensing • The search algorithm above requires five basic movement/sensing operations: • “Move forward” to the square we’re facing • “Turn left” 90 degrees • “Turn right” 90 degrees • “Sense wall” in front of us • “Sense goal” in the current square
Movement and Sensing, cont’d • Sensing turns out not to be such a big problem • If the ultrasonic sensor returns less than a certain distance, there’s a wall in front of us; otherwise there’s not • Goal sensing is similar (if the floor is “bright enough”, we’re at the goal)
Movement and Sensing, cont’d • The motion operations are a major challenge, however • Imagine trying to drive a car, straight ahead, exactly ten feet, with your eyes closed. That’s more or less what “move forward” is supposed to do – at least ideally. • In the current implementation, we just make our best estimate by turning the wheels a certain fixed number of degrees, and make no attempt to correct for error. • We’ll talk about other options later