Combine Gyroscope and Accelerometer Data

CAlgorithmAccelerometerLegoNxt

C Problem Overview


I am building a balancing robot using the Lego Mindstorm's NXT system. I am using two sensors from HiTechnic, the first being an Accelerometer and the second being a Gyroscope. I've successfully filtered out noise from both sensors and derived angles for both in a range between -90 and 90 degrees, with 0 degrees being perfectly balanced.

My next challenge is to combine both of the sensor values to correct for the Gyroscope's drift over time. Below is an example graph I created from actual data to demonstrate the drift from the gyroscope:

enter image description here

The most commonly used approach I've seen to make combining these sensors rock solid is by using a Kalman filter. However, I'm not an expert in calculus and I really don't understand mathematical symbols, I do understand math in source code though.

I'm using RobotC (which is like any other C derivative) and would really appreciate if someone can give me examples of how to accomplish this in C.

Thank you for your help!

SOLUTION RESULTS:

Alright, kersny solved my problem by introducing me to complementary filters. This is a graph illustrating my results:

Result #1

enter image description here

Result #2

enter image description here

As you can see, the filter corrects for gyroscopic drift and combines both signals into a single smooth signal.

Edit: Since I was fixing the broken images anyways, I thought it would be fun to show the rig I used to generate this data:

enter image description here

C Solutions


Solution 1 - C

Kalman Filters are great and all, but I find the Complementary Filter much easier to implement with similar results. The best articles that I have found for coding a Complementary Filter are this wiki (along with this article about converting sensors to Engineering units) and a PDF in the zip file on this page (Under Technical Documentation, I believe the file name in the zip is filter.pdf);

PS. If your stuck on a Kalman Filter, here is some C-syntax code for the Arduino that implements it.

Solution 2 - C

http://www.gamasutra.com/">Gamasutra.com</a> ran http://www.gamasutra.com/view/feature/1494/wheres_the_wiimote_using_kalman_.php">an article on using Kalman filters for WiiMote filtering.

There are some links to C++ source code at the end of the article.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDylan VesterView Question on Stackoverflow
Solution 1 - CkersnyView Answer on Stackoverflow
Solution 2 - CVatineView Answer on Stackoverflow