Some Information About Our Robot

Our robot was designed to move to the opponents side, pick up the balls there and then carry them back over to our side. Since the balls were fairly large, the robot and its storage bin, had to be pretty big. In fact, our robot was just under the size restrictions at 12" by 12". Basically, we had all the drive motors, two drive wheels and electronics in the back of the robot. In front of that was the space the balls were carried in. We also had two independently steering wheels at the front of the robot with an entryway that pulled the balls into the robot.

The two back wheels of our robot were driven independently by two motors each. The front two wheels were steered by two independent servo motors. This enabled us to steer in two different ways. We could set the drive motors at the same speed at turn the front wheels together to turn as we moved forward. We could also drive the back wheels in different directions and pivot about the point directly b/w the back wheels. When doing this, we also turned the front wheels such that each faced at a right angle to an imaginary line between the pivot point and the center of the wheel. In competition, we only ended up using this latter sort of drive, or differential steering. We had anticipated that we might want to turn at a lesser angle while moving forward when designing our drive, but when the robot was completed it turned out not to be useful in any circumstance we accounted for in our code.

The ball collection mechanism at the front of our robot consisted of a set of smaller wheels arranged across the front at a height slightly higher than the radius of the balls. The structure that held them in place was able to swing backwards, into the robot, a little more than 90 degrees. In competition, the wheels were set spinning by two more drive motors such that any ball that touched them would be inclined to roll into the robot's holding area. As the ball rolled into the robot, the structure swung backwards to accommodate the ball's height and roll it all the way into the robot and onto the holding platform. This proved very effective in practice. In practice, if the ball came into contact w/ any of the wheels, the ball would be pulled into the robot about 95 percent of the time.

The rest of the robot was essentially dedicated to detecting position, orientation and the relative position of the other robot. Of course, we had our IR beacon mounted on top of our robot, with our IR receiver to determine where the other robot was relative to us. Also, we had LED and photoresistor pairs located at various locations under the robot to help us determine our starting orientation and when we crossed lines. Originally, we had planned on using those for line-following as well. However, in competition we did not actually use them as such. We found it unnecessary, slow and unreliable. Our robot also included a shaft decoder on each drive wheel shaft. They allowed us to determine, given direction of motion, the number of times each drive wheel had rotated. We used them to perform precise differential turns, to go forward precise distances and to determine when we were stuck and not moving (our wheels didn't slip). Finally, we had tactile sensors located at key locations around our robot to determine when we ran into things like walls, balls and other robots. In general, it was difficult to determine which of these three we had run into, but our robot made decisions among the three based on what we felt was likely in any given circumstance.

The code, although somewhat bulky, was fairly straightforward. After starting and turning everything on, our robot oriented itself by looking at the color of the ground beneath it. If this failed, we tried to orient by looking for the other robot. If that failed there were other things we might have done, but didn't have time to implement. Once oriented, we turned in the direction of the first ball on the opponent's side and moved forward to capture it. When we reached the line, we turned towards the second ball, backed into the wall, then raced across to grab it. After that we returned to our side, attempting to avoid the other robot. In most of our procedures we incorporated time-outs that could be based on whether we had accomplished the desired task in a given amount of time, our back wheels were still turning, we had hit something, or some combination of the three. Which one we used, depended on the part of our ball collection routine we were in. Basically, we had an ideal progression of events we were looking for. If something bad happened, we tried to guess what might have caused it and accommodate for it. If something bad happened again, we tried to guess again. After that, we generally just tried to get back to our side with whatever balls we had collected. We had specific routines for doing that, depending on where we thought we were. If everything timed out and we could tell from the ground color we weren't on our side, we just entered an almost random movement routine that looped until time ran out in the contest or we made it back to our side.

Our strategy was to collect the two balls on our opponents side and return to ours. We thought this would be effective against most other robots. Robots that went for the balls in the middle could get all three, but if we collected the two on their side at the start and added those to the ones on our side, we figured we would win most of the time. If the other robot did the same thing as we did we'd just have to do it better. Other opposing strategies were considered but we didn't worry about them too much, because we figured it would be difficult to account for every possible strategy.

In competition we fared poorly, being eliminated in the 2nd round. However, this does not reflect as poorly on our robot as it might. In the first round we lost because our robot failed to orient properly. We had not added a calibration routine for the LED and photodiode pairs and the default calibration was for the practice table- not the competition table. This was an unfortunate oversight- because our opponent had false-started, had we oriented properly, we probably would have collected at least one ball and won. Fixing the problem meant adding a simple procedure to our pre-start code. We never really had further problems with that and qualified easily on the first try. In the 2nd round we simply faced a better robot. They had essentially the same strategy, but a faster robot. They did their thing on our side, and then trapped us on their side so we lost. They advanced to the top eight in the contest. If we had better luck we might have advanced to round four or five. We wouldn't have done any better because our robot was flawed for two reasons. First, we had the wrong basic strategy. Both final robots used a faster strategy that was very difficult to beat with any robot with our strategy. Also, we were too slow. Our robot would have been substantially better if it had been faster. In the end, our robot functioned just about as we predicted. It was reasonably consistent in doing its job. But it couldn't handle a faster robot that interrupted it by running into it. That sort of thing would be extremely difficult, read impossible, to deal with.