I began to think of building a robot dog that would fetch a ball the first time
I saw the RIS. With the raw RIS this task is impossible unless you use a specially
illuminated ball. Even with the Vision Command System it is a non-trivial problem
using an ordinary ball. The VCS responds well to color and movement. Unfortunately,
the color must be consistent -- the color of a flat, evenly-lit object such as a
wall of LEGO bricks is easily detected; a ball, on the other hand, is not flat --
when viewed through the camera its color shades from highlight to dark/shadow
and there is not a large enough patch of any single color for the software to
detect reliably. To solve this, I used a white ball and constructed a black box
for the dog to operate in. I then turned up the contrast on the manual camera
settings until all the camera could see was a white disc on a black background.
(An unexpected benefit of the box was that the walls stopped the ball rolling
under my desk / bookcase / etc. and getting lost.)

K9 uses three motors, two touch sensors, and a light sensor. Two of the motors
rotate the left and right drive wheels which are placed near the front of the
'bot; the third motor raises and lowers the head. The jaw is operated by a
spring catch which forces the jaw to snap into one of two states: 'open' or 'closed'.
Opening the jaw presses the first touch sensor and starts an NQC program listening out
for messages from the VCS. K9 moves in a series of small arcs until it gets the
first message from the VCS, at which point it uses the VCS messages to guide the
'bot in towards the ball.

Either side of the light sensor in the nose are two LEGO lamps (powered from
a 9V battery pack on K9's back). When the nose is over the ball, the
light sensor in the nose picks up the lamp-light reflected from the ball
and performs a pre-programmed ball-trapping maneuver -- moving the head
firmly down at the same time as moving straight forwards.

As the jaw is
pressed against the ground, the spring catch is forced into 'closed' state
and snaps the lower jaw shut, trapping the ball (usually!) between the
upper and lower jaws. K9 then backs up, raising his head and lifting the
ball until the second touch sensor (located in the left-front shoulder) is
pressed. Then K9 does a "doggy dance" until you open the jaw and take the
ball out. Opening the jaw presses the jaw touch sensor again, and restarts
the program loop.