I found this video a few months ago and asked the author for a copy of his paper as soon as it was available. Just received it today. Here are links to both.
PDF report with source code:
http://www.scribd.com/doc/29754518/A-Efficient-Orientation-Filter-f...Video:
https://www.youtube.com/watch?v=fOSTOnQzZCIIntro to report:
This report presents a novel orientation filter applicable to IMUs
consisting of tri-axis gyroscopes and accelerometers, and MARG sensor
arrays that also include tri-axis magnetometers. The MARG implementation
incorporates magnetic distortion and gyroscope bias drift compensation.
The filter uses a quaternion representation, allowing accelerometer and
magnetometer data to be used in an analytically derived and optimised
gradient-descent algorithm to compute the direction of the gyroscope
measurement error as a quaternion derivative. The benefits of the filter
include:
(1) computationally inexpensive; requiring 109 (IMU) or
277 (MARG) scalar arithmetic operations each filter update,
(2)
effective at low sampling rates;e.g.10Hz,and
(3) contains 1
(IMU) or 2 (MARG) adjustable parameters defined by observable system
characteristics.
Description from YouTube video:
A real-time demonstration of an efficient orientation filter
capable of providing an estimate of the sensor arrays orientation
relative to the earth through the fusion of tri-axis gyroscope, tri-axis
accelerometer and tri-axis magnetometer data. Unlike an IMU, the
inclusion of the magnetometer mean that the filter is not subject to any
accumulating errors. The filter also incorporates magnetic distortion
compensation to overcome soft-iron disturbances and gyroscope bias drift
compensation. The algorithm is an alternative to more computationally
expensive Kalman based solutions that are commonly used in this
application. The total computation requirement of this filter is 278
scalar arithmetic operations per sample.
Hardware used in video: Sparkfun
6DOF IMU Razor (ADXL335, LPR530 and LPY530) with gyroscope RC HP filters
removed, Sparkfun HMC5843 breakout board (low ESR cap replacement),
x-io Board with .NET interface library