I have built a fairly simple locomotive robot with a conning tower that houses an ultrasonic range finder. The current short-term goal is that the range-finder will determine a safe path to progress. However, I'm finding that the robot is advancing towards and colliding with my couch at an angle. Although a direct scan reveals the distance of the couch, a pulse that hits the couch at a diagonal angle returns an abnormally large distance. Any ideas on how I can mitigate this?
Couches tend to be soft, and thus tend to make poor reflectors for ultrasound; even a "hard" object, at an angle, is still likely to not reflect the sound back properly (that's just the way reflection works, unfortunately). So what can you do?
Well, first you could try adding additional sensors - maybe a Sharp IR sensor or two would help (and/or scan using a servo). You might also want to implement some bump sensors for those obstacles that slip thru (if it's good enough for a commercial product like the Roomba, it should be good enough for DIY).
If the idea of contact sensors doesn't suit you, you could try some form of a 2D LIDAR system; such sensors are still fairly expensive, but a few options that are cheaper spring to mind:
1. For this you would need a PC on-board or similar (beagleboard?) - but a Microsoft Kinect is a possibility here
2. Another cheap method would be to purchase a Neato XV-11 robot vacuum and rip the LIDAR unit off it
3. You could mount a small webcam and laser to an "arm" mounted on a servo (to scan it), and use a PC/beagleboard for processing
4. In theory you might be able to "hack" a Sharp IR sensor to disable the onboard IR LED and use an IR laser instead (then scan it with a servo)
Another possibility is to build a vision system (again, you would need a PC or something for processing the data), using OpenCV or Roborealm, or other similar vision processing libraries (if you were ambitious - though likely this would fail, but it might be worth trying - you could try using the Nootropic Electronics Video Experimenter shield along with an Arduino to try to do simple vision/video processing - probably wouldn't have the resolution or be fast enough, but maybe you can make it work?).