I am looking for a way to detect what sort of terrain a bot is travelling on. To keep it simple lets start with grass vs sand vs tarmac.

It is to be used with arduino, and for a hobby project so cant cost an arm and a leg. I figured it could be done with a camera but hoping to find a better way. maybe with sonar or something.

tx

Edit: Im taking this info to do some more research on the problem. Will be back with some more info and hopefully and answer. i think bouncing light/sound off the ground and somehow measuring the amount reflected/absorbed, maybe with the color filters to aid the readings as the start.

1) I think this is a start. http://embedded-lab.com/blog/?p=1671 sending out light and reading how much has been returned. that would just be picking up the highs and lows.

link|improve this question
I edited the question title a bit, since the first thing I thought when reading it was that you were trying to do some sort of ground-testing in an electrical system. – Fake Name Feb 6 '11 at 8:53
A robot with a petrol engine? Sounds like a fun project. – davidcary Feb 7 '11 at 17:12
feedback

5 Answers

Those three different types of ground (grass, sand and tarmac) will be predominantly three different colours - green, yellow and black. Simple light sensors and appropriate colour filters might work.

I just remembered an aid for the blind that was developed many years ago, based on sonar. The person swept the sound source backwards and forwards in front of him or her, and was able to detect obstacles from the returned signal. It was possible for different textures to be detected, such as grass and leaves. I looked up sonar and texture on Google and found this. It looks as though the technique is suitable for detecting terrain.

Both techniques could be used, with some form of sensor fusion, to maximise the probability of a correct identification.

link|improve this answer
kellenjb has that answer. – Kortuk Feb 5 '11 at 14:21
It's different, he didn't mention colour. – Leon Heller Feb 5 '11 at 14:43
1  
that is good till there is a dead patch of grass that is the color of light sand, or dirty tarmac that is brownish. – dogmatic69 Feb 6 '11 at 0:44
You seem to have accepted this technique, though, in your edited question! – Leon Heller Feb 6 '11 at 1:42
Remember that we see with three colors, but objects reflect an infinite number of colors. You might be able to look at the spectra and choose LEDs at wavelengths that only occur with certain materials, and then figure out the material by comparing the relative reflectance of the light from each LED. Turn the LEDs on and off in a pattern to reject fluctuations in light level from other sources? – endolith Feb 9 '11 at 20:01
feedback

Have you thought about an accelerometer? Could measure the frequency of bumps.

You might also be best served by a combination of several different methods...

link|improve this answer
2  
I'm not sure that will help... grass, sand and tarmac can all have bumps. – BG100 Feb 4 '11 at 22:32
That's the thing - you'll never know until you try. And even if you can't identify every type of terrain, this can be included as part of a bigger system later on. – AngryEE Feb 4 '11 at 22:44
i dont see this working – dogmatic69 Feb 5 '11 at 9:44
1  
This type of approach is used a lot in neural networks where you take data from many different sensors and train a system to predict what type of ground it is. In general the more sensors and types of sensors you have the better results you can get, but will also require more training data. – Kellenjb Feb 5 '11 at 19:03
2  
having 32k for programming and 1k for storing does not lend its self well to that tough... i see the idea, but that approach might just be out of the arduino's league – dogmatic69 Feb 6 '11 at 0:42
feedback

You might want to look into reflecting a light off of the surface you are driving on. Based off of how much light is reflected you can get a good idea of the type of surface that you are on.

link|improve this answer
i was thinking something like a sonar that measures distance. if you had it set at a fixed hight from the ground you should be able to measure the different signals coming back – dogmatic69 Feb 5 '11 at 9:58
Most sonar setups are designed to measure distances that are longer then this. I would be worried about not getting a great accuracy with them at close range. – Kellenjb Feb 5 '11 at 19:07
feedback

I wonder if you could do it by sound? A rolling vehicle would make different sounds going over those different terrains, and if the motor is quiet enough...

link|improve this answer
it will have a petrol engine so that will not work – dogmatic69 Feb 5 '11 at 9:59
@dogmatic69, But the sound of the petrol engine is predictable (at least if you know the current load and RPM) so you might be able to filter that out. – finnw Feb 6 '11 at 14:28
no it wont be, when there is more load it slows down, and more gas speeds up. that would make it really complicated. also talking about a petrol engine like 200cc from a generator type size, not from a rc car something like tinyurl.com/6ds4e9u – dogmatic69 Feb 6 '11 at 16:18
I agree with your initial assessment, but I wonder if you could feed a tachometer input to remove noises at the harmonics of the engine RPM... interesting... – W5VO Feb 7 '11 at 3:02
feedback

Let the robot measure the torque/force at one or more joints of each leg. Perhaps measure torque directly using a discrete strain gage or other force/torque sensor. Or perhaps you can get an adequate approximation by using "sensorless" measurements of the back-EMF of that leg's motor, or the amount of power going into that leg's motor.

Say the robot is using some gait that is efficient for tarmac: the robot puts the foot down in front until it touches the tarmac, then it stays at that vertical position and pushes the foot straight straight back, then lifts the leg up a little and pulls it forward, then puts the foot back down and repeats.

If you really are moving over tarmac, you expect the robot to measure a high torque/force when it is pushing the leg back, and close to zero when it is pulling the leg through the air forwards.

If the torque in one leg feels low when the robot pushes it back, then perhaps that leg (not necessarily any other leg) is slipping across the surface of some sand. So the robot should push that leg down a little deeper into the sand, and perhaps move the leg back a little faster, until that leg gives the robot the forward thrust you want.

If the torque in one leg feels high when the robot pulls it forward, perhaps it is rubbing against grass. Or perhaps the other legs have dug in deeply into sand, and that leg is brushing the top layer of sand. So the robot should lift that leg up a little higher to avoid that obstacle. (And perhaps lift all the legs up a little higher on the return stroke for the next few steps, so other legs can avoid that obstacle or similar nearby obstacles).

I'm assuming your goal is to get the robot to adaptively change its gait, because different gaits are more efficient on different substrates. If your real goal is to get the robot to stay on a tarmac track, rather than wandering off over grass and sand, you'll need some other approach.

link|improve this answer
that is exactly the idea, keeping it either on / off a particular surface. also using wheels, not legs – dogmatic69 Feb 7 '11 at 20:26
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.