comicIDIOT wrote:
Oh, perhaps I'm thinking of a different device. I'll search around for it.
It's very possible that some of the newer Roombas do, and I know for a fact that Roomba has competitors that do such things. One of the problems of mapping is performing accurate localization with no explicit environmental tagging of clues. Check out some of my papers on the topic for more information:

http://scholar.google.com/citations?user=qAK6BJsAAAAJ&hl=en
Will do. I recall that the Roomba was able to find it's dock (by other means) and charge after a session. So I figured it'd keep track of distance to each point of contact.
comicIDIOT wrote:
Will do. I recall that the Roomba was able to find it's dock (by other means) and charge after a session. So I figured it'd keep track of distance to each point of contact.
The dock has two IR LEDs on it that transmit pulses of different frequencies, called in Roomba terminology "red/green" or "left/right". The Roomba has two IR detectors with (software?) FFTs. Alternatively, it might use two different IR frequencies with filtered detectors. At any rate, when it detects the "left" LED with the "right" detector, it rotates clockwise. When it detects the "right" LED with the "left" detector, it rotates counterclockwise. When they're both visible with the correct detector, it goes forward, and adjusts its heading as it approaches the dock. I actually have a software chunk that replicates this behavior that I wrote as part of my research:

Edit: Darn, I used the built-in forceDock() command. Hell.


Code:
      if (battlevel < BATT_THRESHOLD) {
         printf("[!!] Battery depleted, docking.\n");
         if (!docked) forceDock();
         do {            //this loop checks if we're docked yet
            delayAndUpdateSensors(100);   //delay 100ms, get charge state, 1 byte
            battlevel = (unsigned int)((sensors[SenVolt1]<<8)|sensors[SenVolt0]);
            if (sensors[SenChargeState] == 0) {
               printf("[!!] Attempting to dock, battery at %dmV\n",battlevel);
               sleep(2);
            }
         } while (sensors[SenChargeState] == 0);   //while not charging
         
         //now we're docked.
         do {      //this loop waits for full batteries
            sleep(10);
            delayAndUpdateSensorsType(100,22,2);   //get battery level
            battlevel = (unsigned int)((sensors[0]<<8)|sensors[1]);
            printf("[Charging] Battery at %dmV\n",battlevel);
         } while (battlevel < CHARGED_THRESHOLD);

         //now move out of the dock, since fully charged
         resetRobot();
         drive(200,0x7fff);
         usleep(100000);
         drive(-400,0x7fff);

         sleep(1);
         drive(0,0x7fff);

         //ready to resume normal work
         byteTx(136);
         byteTx(0);
      }
Pretty clever; I realized it used an IR transmitter but not two of them.
Yup yup. All this talk is actually making me want to pull out my Roomba again. It has a board running Linux mounted on the back that I could actually connect a camera to, and still has my software to remote-control the Roomba...
  
Register to Join the Conversation
Have your own thoughts to add to this or any other topic? Want to ask a question, offer a suggestion, share your own programs and projects, upload a file to the file archives, get help with calculator and computer programming, or simply chat with like-minded coders and tech and calculator enthusiasts via the site-wide AJAX SAX widget? Registration for a free Cemetech account only takes a minute.

» Go to Registration page
Page 2 of 2
» All times are UTC - 5 Hours
 
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum

 

Advertisement