Detecting Acceleration in a car (iPhone Accelerometer)

To solve this, if possible, you would need to reference something external to the car. Probably using the GPS to measure elevation gain is the most direct approach. That is, calculate the slope of the hill using the measured elevation gain, and use this to compensate the acceleration measurement.

As others have mentioned, at a very deep level, there's no way to distinguish between gravity and acceleration; this is known as the Equivalence Principle (and was one of Einstein's most important insights). So one would need to know more than the accelerometer's output to solve this problem, and this makes the problem difficult. For various approaches to the problem, see here.

Your best hope is to reference something external to the car, like a GPS signal, or pictures to measure the change in the location of something outside the car, or the earth's magnetic field, etc. Since this will take place near a lot of metal (the car) the earth's field will likely be difficult to measure, and continuous photos of some reference object (like the sun) is obviously difficult, so it seems that the GPS is your best bet.

More on why you need an external reference:

It's worth considering whether you could use the unique features of gravity that 1) it's always “on”, 2) it always has the same magnitude (for this situation). But when all you know is the total acceleration, you can't reliably separate the two contributions. As the picture below shows, just knowing the magnitude of gravity isn't enough... the picture below is drawn in the phone's frame of reference where it measures the resultant acceleration (black vector), and the larger colored arrows are possible gravity vectors, while the matching color smaller arrows are the corresponding acceleration vectors. So you can see, without knowing and angle, you don't have enough information to solve the problem.

alt text

The other thing you might be able to do is integrate the output from a gyro to find the angle of the gravity vector. That is, assuming that you start on the flat, and then you always keep track of the where you think gravity would be based on the accumulated small changes. But this is highly error prone, and your error in the calculation will accumulate quickly with time; and it also assumes that you have access to a gyro.

Therefore, the only good solution is to use external information.


You need a gyro. Otherwise there are multiple configurations of an accelerating car on a hill that can give rise to exactly the same readings on an accelerometer. They will be completely impossible to distinguish. That's why inertial navigation systems combine a gyro and accelerometer.

The reason you can't do this was given by Einstein! Using a local measurement, you can't distinguish between gravity and acceleration. You do have some useful non-local information - the assumption that gravity here, and gravity a few yards over there, have the same value. But you can't compare gravity in two different locations without a means to carry out what's called "parallel transport". This is what a gyro does.

Forget the $250, but I think you should give me a beer for the amount of R&D time I'm saving you. :-)