A while back I wanted to use an arduino, a servo, and 2 ultrasonic sensors to generate a map of the environment. Alternatively the sensor data could be used for cheap localization with particle filters on a known map of the area.
The setup is pretty straightforward: 2 ultrasonic sensors facing in opposite directions are placed on a breadboard. The breadboard is placed on a servo, which since it's a cheap one can only turn about 130 degrees, that'll give us 260 degrees of scan with 2 blind spots. The program is pretty much:
left = sensor_left.getReading();
right = sensor_right.getReading();
print out position and sensor data
A few scans show that there's pretty consistent readings even with varying scan speeds and motor step sizes. I settled on a roughly ~50ms scan step time and increment servo position by one each time, back and forth.
|Polar plotted scanned points of the kitchen |
|Scanning the kitchen|
Interesting, the kitchen shows up very roughly. A guess as to why the walls are not getting straight sides is that the sonar will pick up the first echo as the distance, so for walls angled to the sensor, even if it's center is facing the angled wall at distance X, the closest point of the wall within a small cone radiating out from the sensor is the first to echo back, resulting in that as the reading.
A step beyond using just the raw data is using it to fill out an occupancy grid
taking account of the ultrasonic sensor's noise profile. In this case the probability would fill out a curved arc. As the grid gets filled over time, the points of highest probability would demarcate the kitchen edges, providing a more accurate map. Conversely the probability distribution can be used to predict location.