Roomba detects "cliffs" like stairs by using four optical sensors, each equipped with a light emitting diode and a receiving diode housed in a clear plastic chamber with a lens that looks down in front of the machine. As long as the receiver can see light from the emitter at high enough intensity, things are fine. If, however, it comes to a cliff, such as a flight of stairs, the light in the chamber is suddenly far less intense, so the receiving diode gets less signal, and detects a cliff. The machine then turns away and continues on. Here are two of the sensors sitting in one of the four lens chambers.
The system works well most of the time, but my new Navajo carpet has some black design areas on it. The machine reads this black as a cliff, but when it tries to turn away, it hits more black, which causes it to stall and beg for help ("Move Roomba to a new location!").
Lots of folks have encountered this problem, and there are various ways to "blind" the machine to cliff edges by fooling these sensors using aluminum foil, paper, etc. I tried them and none of them worked, so I decided to open it up. There were a few decent videos of similar machines, so I was able to figure it out. Here is the sensor array, which includes the cliff sensors and six additional proximity sensors.
The fix is to disassemble the light chambers, pull out the transmit and receiver diodes, and then attach them to each other so that the receiver sees the transmitter full on all the time. I used shrink wrap tubing to encase the diodes. Forgot to get a pic, but it's pretty simple--place them next to each other, stick a piece of shrink wrap over both diodes, and entomb them in it.
Worked like a charm. Roomba glides right over the carpet. To prevent him from falling down the stairs, I put the Roomba-supplied electronic fence gadget across the top.