# Dead reckoning with an accelerometer

Is it possible to use an Arduino, connected to a 3 axis accelerometer, to estimate a platform's continuous change in position and orientation? I have a small mobile robot, and given an initial position and velocity vector and sequence of acceleration changes, I'd like to calculate the current position and velocity vector.

From this question, it sounds possible, but I can't find any reference to projects or code to accomplish it with an Arduino. I understand the main problem will be the build-up of errors over time, but that's ok, as a rough estimate is acceptable. I'm also using wheel encoders to calculate the same values, and I want to use the accelerometer to account for errors in the encoders, like slippage. e.g. If the encoders say we're accelerating at 1cm/sec but the accelerometer says we're at a constant speed, then I know to ignore the encoders because the wheels are probably slipping.

I understand the math behind this, so the problem is how to write it in C to run on an Arduino. Is anyone aware of existing open source code for something like this? I'd like to avoid reinventing the wheel in-case anyone's implemented a similar system.

``````for each accelerometer:
sample the accelerometer;
low-pass filter its values (current and recent history) to remove noise;
multiply by the sample interval to get the velocity increment;
add the increment to a running sum to get velocity;

sample the velocity (the running sum you just updated);
maybe low-pass filter, as above;
multiply by the sample interval, as above, to get the position increment;
add the increment to a running sum to get position;
end;
``````

Noise, the artifacts created by filtering, and the double summation all work against your accuracy. That said, if your problem is to sense traction or loss of it, how about sensing real velocity more directly such as by dragging an encoded but otherwise free fifth wheel? Or if circumstances allow, optically sense the velocity of the surface underneath you as an optical mouse does?

• using the midpoint rule when multiplying by the sample interval will help a little bit – BrettAM Nov 16 '14 at 19:21
• I considered the optical approach. It's still tricky. A hacked optical mouse sensor has a simple interface, but will only work when very close to very flat surfaces. A cheap USB webcam could be used instead, but then you need a beefy processor to calculate optical flow, which an Arduino isn't really suited for. And extra wheel would be cheap and simple, but would be mechanically cumbersome and awkward. An accelerometer is small, relatively cheap, and can be easily accessed by an Arduino. – Cerin Nov 17 '14 at 4:35