This project is a rover that just tries to autonomously navigate away from obstacles. There's really no target, it's just supposed to find a passable path a start walking... or roving in this case.
I'm using an ultrasonic range finder for obstacle detection, which seems to be very in-accurate a lot of times. An Ardunio Uno is the brains that's calculates the route. Along with an XBee shield for spiting out debug data wireless-ly and a motor-shield that actually drives the motors (this will change once I got the navigation algorithm stabilized).
The crux of the algorithm is "Vector Force filed", essentially every obstacle exerts a repulsive force on the rover and the farthest object exerts an attractive force on it. The resultant vector force gives me the direction the rover needs to travel. I won't lie to you, this idea is from a paper I found off of the internet: "Real-time Obstacle Avoidance for Fast Mobile Robots" by,J. Borenstein, Member, IEEE, and Y. Koren, Member, IEEE. (Google will show you the way if you want to check it out).
The algorithm I implemented is a bit rough on the edges, so to speak. When the rover is very close to an obstacle , say a wall, it doesn't know how much to turn to avoid it completely. In other words the rover is not fully aware of it's dimensions... I'm working on improving this aspect of the algorithm. One of the contributing factors is the range finder, it's not giving me consistent data every time the rover scans for obstacle. And the other factor being the fact that I haven't implemented everything the paper suggests and made my own "minor" modifications to the calculations to suit my rover. My biggest challenge was (and still is to a certain extent) to make the rover figure out how to translate the angle calculated into a real world turn. As you can see in the video below (where the rover is trying to get out of the room, through the door and into a corridor) it works alright. Towards the end of the video you'll see what I mean by "rough on the edges" :)