ThinkBot 203 robotics platform


The ThinkBot 203 is a mobile robotics base featuring a IBM ThinkPad A20m core. The ThinkBot features a 500 MHz Celeron processor and 64 MB of main memory. The base is a classic AT style case that originally contained a 386 class computer. It is a prototype robot intended to test and refine robotics technologies.


I haven't written anything in a while but the ThinkBot is still getting plenty of attention. The biggest change has been the replacement of the main I/O board.

Previously the robot was using the Pontech SV203 to read analog voltages and to control the motors and servos. The board began displaying erratic behavior, occasionally it would pause for around .5 seconds when I was doing an analog read - this really caused a problem with the robot timing. I have replaced the functions of the SV203 with an Arduino Diecimila which is an open-source board based on the ATMega168 microprocessor. There has been a lot of code to port to the new board in addition to writing code to run on the board itself. It is working fairly smoothly at the current time although there are still a few bugs to track down.

I have also added a new power supply for the laptop that can run on 12 volts so I no longer need to make 24 volts and can use the batteries differently. Localization is working fairly well and the robot can plan paths around the house and deck. It has made a couple of sanding runs on the deck and results are positive.

There has been a lot of work completed since the last entry. I have added some new hardware and have been refining a lot of details on the robot. The most pressing problem has been with localization, odometry just doesn't work over time as errors will add up. There is a nice localization driver in player named amcl (adaptive monte-carlo localization) that uses a SICK-type laser and features on a preexisting map to localize the robot. I have been working on my fakelaser player driver to present distance data from my IR sensor arrays as laser data so I can use player drivers that require a laser without spending several thousand dollars on one. Testing is progressing and has been fairly positive. In simulation the robot can localize itself fairly well and can use the player tools for complex path planning. There are some performance issues on the live robot that I am attempting to overcome by offloading the processing to an external server but I am running into problems with the player servers communicating with each other. Hopefully I will able to work through that issue soon.

Quite a few new hardware features have been completed:

Software improvements:

I haven't been doing much sanding lately as the weather turned bad. I am working on some new electronic components for the robot.

Sanding trials are going well. The robot is using it's IR sensors to avoid obstacles and it simply drives around randomly sanding away. So far the tests have been going pretty good although I have run into a few issues. One of them is the bot can become erratic when it is under load. Since I am encoding live video on the fly this is certainly a problem. I have been reworking the low-level code recently to deal with some timing issues so hopefully my work there will help with the load issues. There are also problems with the amount of float the mount has, if the height difference in 2 areas is more than about a centimeter the sanding pad can get hung up. It is a little more forgiving since I attached a neoprene pad to the sanding surface but it would be nice to have at least 2-3 cm of float.

After hours of fruitless searching on converting my bump switch state to an analog voltage for the SV203 to read I have decided to read the bump sensors with the parallel port for the time being. The connector I currently have on the parallel port only has 9 of the lines from the port (it is a 25 pin serial connector, designed to go from a motherboard header to the back of a computer). This was fine for my previous use (controlling relays to switch power) as I had access to 7 of the 8 data lines. But to read a bit you need to use input lines like ACK, BUSY, SELECT, etc. When I installed this connector I had to remove part of it's casing to allow it to fit behind the back shelf column. I noticed that the non-connected pins existed on the back of the connector rather than just being blanks. So needing access to the other pins I simply added a new 6-wire (PS2 mouse) cable coming out of the connector with pins 10, 11, 12, 13, 9 and 25. With some tricky soldering and lots of epoxy I had my new franken-connector. This gives me 4 input lines, the 1 output line I didn't have on the ribbon cable and a ground. I constructed some diode-transistor gates for the bump switches to drive and fed the outputs into the parallel port.

There were a lot of software changes to read the bumpers. The low-level LPTPort object was enhanced to allow reading different addresses than just the base address so could read the byte with the input pins (port base address +1). The Player driver was modified to read the status from the robot object and to make the data available as a Player bumper interface. So far tests have been going well and I haven't seen any performance issues with the new code.

The sanding project is going well and I am also working on a bumper system to tell if I have actually run into any obstacles that the IR sensors missed. I have manufactured and wired the front bumper but still need a way to read the switches.

I am working on a few new projects for the bot. I have been working on attaching a sander to the front of the robot in order to sand my deck. The deck is in need of a paint job and sanding it by hand would be very tedious so it is a perfect job for a robot.

I have re-worked the original case so it will fit over the new wheel position. The arm and the middle crossbar now attach to the motor box through the top of the case. Arm and sensor wires go through a new penetration in the top of the case.


The brains of the operation