Team 48:



[introduction] [strategy] [robot] [software] [results] [pictures]

Introduction

In late October of 2005, with the original deadline for 6.270 applications passed, the three of us got together and thought: wow this would be great fun. Lucky for us, the deadline was extended to accomodate more teams. We decided to go for it, and barely slipped in as team #48, the final team to register. After finishing most of the assignments at the very last minute, placing dead last in the seeding rounds, and submitting our final robot with plenty of brand new code that had never been tested - our countless hours in lab, hard work, attention to detail, and extreme luck finally paid off as everything came together in the end. Bal (pronounced like ball) performed beyond all expectation in the final competition taking first prize and winning the Intempco design award. A simple and agressive strategy allowed Bal to take most matches in the first few seconds of the game, leaving enemy robots at best pinned in the corner, and at worst flipped over or dismembered.

Strategy

The objective of Broom Club was simple: move the majority of balls to the other side of board. With the highly unlikely option of "shooting the moon" (bringing all balls over to our own territory), we thought that speed and game predictability would be the biggest deciding factors - taking inspiration from the 1999 winner Hermes. Almost a joke, we suggested early on a strategy of running across the board to score the high-value middle balls and pin the enemy robot before he was able to move out of his starting position. But this strategy had a certain ring to it, and with encouragement by our TA's we decided to make it happen.

We divided our strategy into three sections: beginning strategy, main strategy, and backup strategy. The beginning strategy involved running across the board to score the middle balls and make an attempt at pinning the other robot. The main strategy was to take advantage of our early lead and try to intercept and prevent the enemy robot from scoring. The backup strategy - in the case that we can't find the enemy or are losing near the end of the game - was to go after any balls that haven't been moved from their initial positions. We were lucky that our beginning strategy ended up being so effective, since most of the other plans were never realized (successfully).

Robot

bottom detail showing the gearbox, differential, shaft-encoders, and I.R. sensors Bal is a tank robot. For speed he has six motors driving five wheels with a 25:1 gear ratio. Turning is accomplished by driving both sides independently while keeping the middle wheel fixed by use of a differential. The robot features foot-long wings on each side which can be opened and closed by a servo. Finally shaft encoders on each side allow precise measurement of the motion of the wheels (within 1/30th of a rotation). Total hardware used (minus LEGOs) is:
  • 6 motors
  • 5 wheels
  • 1 differential
  • 4 infrared LED/phototransistor pairs
  • 1 electronic gyro
  • 1 servo
  • 2 thin rubber bands
  • 2 red LEDs
The shaft encoders turned out to be extremely powerful. They were used for fast and precise turns using pre-calibrated values (with interpolation). They also allow the robot to move very straight for a fixed distance and detect any stalls within a fraction of a second. This allowed us to avoid using bump sensors - focusing instead on a strong frame which could handle the inevitable collisions. Although Bal was a tank, it was still necessary to be efficient in the construction to avoid making a robot which was too heavy - and thus slow given the low gear ratio. The driven 5th wheel in the middle did a lot to keep the frame from warping without sacrificing traction. Conventional and unconventional bracing was used to secure critical areas and keep everything held together tightly. The primary function of the wings was to provide the necessary coverage to sweep the middle balls during the initial run. They didn't need to be particularly strong - which allowed us to drive them with a single servo and crown gears. top view of robot

Software

In the competition, the external behavior of Bal appeared to be quite simple. However, the internal details of our code and the process of getting to this endpoint were far from simple. Throughout the class, we had many problems with the board and the OS code given to us. Things such as printfs not working inside threads, stack overflows, being unable to read the frob knob and motor currents in different threads, inaccurate RF position signals, and being unable to wait for the RF start signal inside threads, led to many hours of tinkering on silly bugs. Although most of these problems stemmed from the decision to use multi-threaded programming, we still believe this was a good decision. The ability to use multiple threads made programming easier. In the end, we had a total of about 2400 lines of code.

One of the first things written was a menu system. As we learned while doing the initial assignments, it was relatively time consuming to have to continually reload different code on to the board to test different parts. The hierarchical menu system allowed an arbitrary number of items per menu and allowed menu selection through the buttons and the use of the frob knob to scroll through the menus. The menu system probably saved much time later in not having to reload code and allowed us to have all our debugging code (about a sixth of our code) loaded as backup for the final competition. This also allowed us to optionally re-calibrate our light sensors if we found it to be necessary on the day of the competition.

The most critical part of Bal's strategy was to be fast at the beginning. The start location was determined as quickly as possible by reading from the 4 light sensors positioned under Bal. Even though we were given suggestions for making multiple readings and sleeping between readings for more accurate readings, we simply read each sensor once in rapid succession. Once we knew our starting location, we turned at most approximately 45 degrees so that Bal would be facing the center. An important part of our speed was that the robot and our code was designed such that there was no "front" or "back." Therefore, it made the initial turn to the center fast no matter which random orientation we started from. Instead of using feedback from the gyro for this turn (a technique that was just too slow), we used the shaft encoders and pre-calibrated the amount needed to turn accurately to the center.

Once facing the center, Bal zoomed straight forward, again using the shaft encoders to maintain the heading. The wings would open shortly after start which would usually allow Bal to get all 5 balls in the center of the board. After another fixed distance, the wings would close. With the proper orientation, Bal would sometimes amusingly catch the other robot in its corner with the wings, as if it were hugging it.

Luckily, this code was sufficient to win our matches most of the time, within the first couple seconds. The code for our main strategy of intercepting the other robot and basically being a nuisance by getting in its way had never been tested by the time of the start of the competition. Not surprisingly, it didn't always perform as we expected. In a couple games, Bal would move unexpectedly, and in some cases, score points for the other team. Therefore, it would probably have been better if we hadn't loaded this untested code and simply shut Bal off after the beginning move.

Results

Going into the final competition we were tied in last place with some number of other robots who had managed to score zero points in the seeding rounds. Our first round was against the high ranking Team 2 which we promptly won - raising our hopes for the rest of the competition. We played a total of 12 rounds and lost only 1 against the impressive Team 40 robot, "Quimble," AKA "Inspector Gadget". Unfortunately Quimble had a weakness against robots which could intercept their projectile arm before it was completely deployed and they didn't make it to the final rounds for a rematch. After the loss to Quimble, we had one more near loss when we again scored 6 points on ourselves at the very end of the match.

Rounds we played, the known scores, and number of teams remaining at each round:

  1. Team 2 (Rogdor) (11-0) (46 teams)
  2. Team 6 (Phat Phaffer) (11-0)
  3. Team 31 (Two Guys, A Girl, and a Robot Pizza Place) (7-0) (28 teams)
  4. Team 32 (Within One Standard Deviation) (5-2) (18 teams)
  5. Team 40 (Quimble) (7-8) (14 teams)
  6. Team 19 (BLT) (9-8)
  7. Team 19 (BLT) (9-2) (8 teams)
  8. Team 1 (Bi-Bim-Bot) (4 teams)
  9. Team 13 (Cookie Monster) (3 teams, round robin)
  10. Team 43 (Unicron) (9-4) (3 teams, round robin)
  11. Team 13 (Cookie Monster) (9-2) (2 teams, match 1)
  12. Team 13 (Cookie Monster) (2 teams, match 2)

Not only did Bal cause damage to opponents, one of our Bal's eyes was also broken in its impacts with other robots. We also dropped our robot sometime during the middle of the competition, creating a big scare when it turned out that one of our I.R. sensors was no longer working reliably. After some messing around, we were able to resuscitate it and were very very careful handling the robot afterwards.

We made it to the finals against "Cookie Monster," also a very fast robot - but too light to be rushing the center like it did! The final was a best out of 3, and we won in 2 matches. Click on the picture to the left to see a short video clip of us demolishing our final opponent within the first couple seconds.

Starting this year, the organizers presented to the winners a perpetual large LEGO block. This LEGO award was named after Ross Glashan, one of the organizers who designed the board behind the simple brains of our bot and who had helped us tremendously during the month.

Pictures