Hi All,

I am facing a real problem with all IMUs with most of open source algorithms around. The problem is that the IMU gives a stable good readings when you are not moving it too fast, but when shacking and moving the IMU really fast then place it stationary, it never gets back to zero again in some algorithms /or gets back too slow in other algorithms.

By the way, i have used Arduimu, mpu6050, mpu9150, mpu9250 and they all suffer from the same problem when moving them in all axes fast for around 20 seconds then back to initial zero position, and it did not get back to zero.

I have found the source of the problem which is the Gyroscope. I have tested fast rotations using Gyroscope integration only to get eulers and found that it is causing this effect.

The Accelerometer data is supposed to correct this effect using the sensor fusion algorithm, as it gives accurate reading as long as the device is stationary. but it doesn't actually do anything except a too slow correction. and what will correct the Gyro error while the device is moving in a fast rotations like this ??  If i decided to depend more on Accelerometer using complementary filter, or raising the weights in algorithms like Magdewick and Mahony open source algorithms, it gets back to zero after a very fast rotations in one second(still slow but good comparing with previous results) but i LOOSE a very important feature for me which is the good dynamic behavior. For example, if I move the IMU right and left while keeping the roll and pitch angles zero on table, the result is that roll and pitch angles changes with this yaw movements because the device now depends more on accelerometer readings which measure the acceleration i am moving with as well.

I tried even a lot of weights for all algorithms and it is still have the same effect. why Gyro integration fails at high speed rotations ?? I have even tried to make Ki value equal ZERO at high rotations with no useful results, and also making it zero at low rotations gives nearly the same results for me.

even when using the open source fusion algorithms it still have the same effect ?? i know this effect doesn't greatly affect Copters or fixed wing planes because it never moves too fast like when i move the IMU too fast in with hand which makes the IMU do not suffer from this effect. But imagine if the user is holding an IMU in his hands for any fast rotation application, definitely he will suffer from this effect.

Is there any solution to this problem ?

I know there is a lot of experts here and i wish they can answer me. Any help is greatly appreciated.

Thank you

You need to be a member of diydrones to add comments!

Join diydrones

Email me when people reply –


    1.   If you have a shaking effect that involves rotation rates higher than the sensor can measure (in most cases 2000deg/s), then you're in trouble no matter what you do.   The gyro integration will have a high degree of error and the IMU output will quickly become unusable.  This is the case regardless of what algorithm is being used.

    2.   If you are not being effected by point 1, then the next best thing you can do to improve the accuracy of the gyro integration is to increase the rate at which you get samples and integrate.  Most algorithms that run on an Arduino run between 50 and 400Hz.  The faster you sample, the more accurately the gyro integration will match the actual movement.  There is a reason that the Pixhawk integrates the gyro at 1000Hz (Arduino does not have the power to operate this fast).  Due to the inherent limitations of 32 bit floats,  there is a point of diminishing returns as the sample rate increases.
       Avoid doing anything that takes much time away from the IMU.  Sending data out of the serial port is a horrible waste of time.  If you need to see data, only output the very minimum amount a couple of times a second. Any more often than this and the Arduino will be spending more time sending data than running the IMU, and this will guarantee poor results.  Obviously, run the serial port at max bit rate.

    3. If you are not actually using the magnetometer, then none of the algorithms will return to zero heading after a disturbance.  Pitch and roll should get very close to zero.

    4. You may need to adjust the algorithm to not use the accelerometer during high vibration periods.  Then when the vibration stops, the corrections made by the accel can be re-enabled.  This can be dangerous if set too sensitive.  I wrote my own complimentary filter and it does something like this.


    I hope this helps.  Regards,


    • That's an awesome explanation of many things involving IMU's.

This reply was deleted.


Abdulatif Tlaib liked Ryan's profile
7 hours ago
Laurie J. Troy liked Jasper Kueppers's profile
Apr 1