-
Notifications
You must be signed in to change notification settings - Fork 471
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Quaternion Filter Drift #125
Comments
Seems like you have everything set up properly, I think the problem is your
MCU speed. It is likely that 4 - 5 times for iteration isn't sufficient. So
I would recommned you step up to a Teensy 3.2 or a Butterfly.(
https://www.tindie.com/products/TleraCorp/butterfly-stm32l433-development-board/?pt=full_prod_search).
With the latter you can easily run the fusion at > 1 kHz, which will reduce
or eliminate the drift you are seeing.
…On Sun, Mar 12, 2017 at 1:09 AM, Jaqos ***@***.***> wrote:
Hello Kris,
Thanks for posting your code, examples and wikis online, they are awesome!
I am getting a small drift when the MPU9250 is put at rest after
movements, it looks like a small 5-10° converge to magnetometer.
The filter converges from initial conditions just like the black cube on Open
source IMU and AHRS algorithms
<http://x-io.co.uk/open-source-imu-and-ahrs-algorithms/>
In the video when the sensor is placed flat on the desk, there is no
drift, where i do see drift when i place my sensor flat on the desk.
My setup:
Original code: MPU9250BasicAHRS
<https://github.com/sparkfun/MPU-9250_Breakout/tree/master/Libraries/Arduino>
Sketch uploaded to Arduino: MPU9250_Jaqos_GitHub.zip
<https://github.com/kriswiner/MPU-9250/files/836352/MPU9250_Jaqos_GitHub.zip>
Board: Arduino Pro Mini 8mhz <https://www.sparkfun.com/products/11114>
Sensor: Sparkfun MPU9250 breakout
<https://www.sparkfun.com/products/13762>
I have learned a lot from reading the issues and questions on this GitHub,
but haven't found anyone with the same results as me.
The filter is updated 5-6 times every new sensor data, Arduino sends the
Quaternion to my computer which is applied visually to a cube in Unity.
The drifting effect is different with different NED orders (north, east,
down).
By trial and error, the best order i found was: (ay, az, ax, gy, gz, gx,
mx, -mz, my)
[image: north east down]
<https://cloud.githubusercontent.com/assets/25260920/23830201/452d4180-0759-11e7-8eab-42a1f9bdd9e8.png>
Drift graph: (you can see the blue line slowly moves up when sensor is at
rest):
[image: graph]
<https://cloud.githubusercontent.com/assets/25260920/23830053/2219a714-0755-11e7-9f0e-b8fc35114026.png>
The mag calibration looks good:
[image: calibrated]
<https://cloud.githubusercontent.com/assets/25260920/23830202/478d28a0-0759-11e7-8941-69a84fbecbc7.png>
A video showing the drift:
cube drift
<https://drive.google.com/file/d/0B4G1yoIaeMUFaEUtRTR4Qk5lMm8/view?usp=sharing>
The Questions:
1. Did you get good results like the x-io video, what board, what
sensor?
2. How do you think i can eliminate the drift?
3. What is the correct NED order for the Sparkfun MPU9250 breakout?
Thanks for your time ;)
[image: board]
<https://cloud.githubusercontent.com/assets/25260920/23830435/e81581a0-075e-11e7-9a7f-86d3b4f05690.jpg>
—
You are receiving this because you are subscribed to this thread.
Reply to this email directly, view it on GitHub
<#125>, or mute the thread
<https://github.com/notifications/unsubscribe-auth/AGY1qs8hDd5pi2FcnNeKmWjw5FiIyoNyks5rk7YsgaJpZM4MafCS>
.
|
One other thing, Sparkfun routed traces and vias undeneathe the MPU9250
package, a no-no. I have told them about this but I guess they have to sell
off their inventory before they can redesign it. Anyway, here are properly
designed MPU9250 breakouts:
https://www.tindie.com/products/onehorse/mpu9250-teensy-3x-add-on-shields/?pt=full_prod_search
Kris
…On Sun, Mar 12, 2017 at 5:17 AM, Kris Winer ***@***.***> wrote:
Seems like you have everything set up properly, I think the problem is
your MCU speed. It is likely that 4 - 5 times for iteration isn't
sufficient. So I would recommned you step up to a Teensy 3.2 or a
Butterfly.(https://www.tindie.com/products/TleraCorp/butterfly-stm32l433-
development-board/?pt=full_prod_search). With the latter you can easily
run the fusion at > 1 kHz, which will reduce or eliminate the drift you are
seeing.
On Sun, Mar 12, 2017 at 1:09 AM, Jaqos ***@***.***> wrote:
> Hello Kris,
> Thanks for posting your code, examples and wikis online, they are awesome!
>
> I am getting a small drift when the MPU9250 is put at rest after
> movements, it looks like a small 5-10° converge to magnetometer.
>
> The filter converges from initial conditions just like the black cube on Open
> source IMU and AHRS algorithms
> <http://x-io.co.uk/open-source-imu-and-ahrs-algorithms/>
> In the video when the sensor is placed flat on the desk, there is no
> drift, where i do see drift when i place my sensor flat on the desk.
>
> My setup:
> Original code: MPU9250BasicAHRS
> <https://github.com/sparkfun/MPU-9250_Breakout/tree/master/Libraries/Arduino>
> Sketch uploaded to Arduino: MPU9250_Jaqos_GitHub.zip
> <https://github.com/kriswiner/MPU-9250/files/836352/MPU9250_Jaqos_GitHub.zip>
> Board: Arduino Pro Mini 8mhz <https://www.sparkfun.com/products/11114>
> Sensor: Sparkfun MPU9250 breakout
> <https://www.sparkfun.com/products/13762>
>
> I have learned a lot from reading the issues and questions on this
> GitHub, but haven't found anyone with the same results as me.
>
> The filter is updated 5-6 times every new sensor data, Arduino sends the
> Quaternion to my computer which is applied visually to a cube in Unity.
>
> The drifting effect is different with different NED orders (north, east,
> down).
> By trial and error, the best order i found was: (ay, az, ax, gy, gz, gx,
> mx, -mz, my)
> [image: north east down]
> <https://cloud.githubusercontent.com/assets/25260920/23830201/452d4180-0759-11e7-8eab-42a1f9bdd9e8.png>
>
> Drift graph: (you can see the blue line slowly moves up when sensor is at
> rest):
> [image: graph]
> <https://cloud.githubusercontent.com/assets/25260920/23830053/2219a714-0755-11e7-9f0e-b8fc35114026.png>
>
> The mag calibration looks good:
> [image: calibrated]
> <https://cloud.githubusercontent.com/assets/25260920/23830202/478d28a0-0759-11e7-8941-69a84fbecbc7.png>
>
> A video showing the drift:
> cube drift
> <https://drive.google.com/file/d/0B4G1yoIaeMUFaEUtRTR4Qk5lMm8/view?usp=sharing>
>
> The Questions:
>
> 1. Did you get good results like the x-io video, what board, what
> sensor?
> 2. How do you think i can eliminate the drift?
> 3. What is the correct NED order for the Sparkfun MPU9250 breakout?
>
> Thanks for your time ;)
>
> [image: board]
> <https://cloud.githubusercontent.com/assets/25260920/23830435/e81581a0-075e-11e7-9a7f-86d3b4f05690.jpg>
>
> —
> You are receiving this because you are subscribed to this thread.
> Reply to this email directly, view it on GitHub
> <#125>, or mute the thread
> <https://github.com/notifications/unsubscribe-auth/AGY1qs8hDd5pi2FcnNeKmWjw5FiIyoNyks5rk7YsgaJpZM4MafCS>
> .
>
|
Thanks, i have changed the Arduino sketch to send raw accelerometer, gyro, magnetometer data to computer. With the Madgwick filter iteration running much faster on my computer, and the drifting looks to be a little smaller. At some orientations it seems to be noisy, maybe it's the MPU9250 breakout. Should i use a filter to smooth gyro or mag noise? |
I usually run the accel and gyro at 200 - 400 Hz and use a 40 Hz low pass
filter for smooting.
…On Sun, Mar 12, 2017 at 4:00 PM, Jaqos ***@***.***> wrote:
Thanks, i have changed the Arduino sketch to send raw accelerometer, gyro,
magnetometer data to computer. With the Madgwick filter iteration running
much faster on my computer, and the drifting looks to be a little smaller.
At some orientations it seems to be noisy, maybe it's the MPU9250
breakout. Should i use a filter to smooth gyro or mag noise?
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#125 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AGY1quiVQ3umalpDysrPmGCGw6nbFCDyks5rlHkYgaJpZM4MafCS>
.
|
Thanks, I will try adding a low pass filter. Maybe the drift is because of the NED order, which order is the best for the MPU-9250? How good are results with the Teensy 3.2 & MPU9250 Teensy 3.X add-on shield? |
The order you are using is correct. I have done some testing just using the Madgwick filter and with the MPU9250 properly calibrated you should be able to hold +/-4 degree accuracy in heading and +/-1 accuracy in pitch and roll. I usually do not see this kind of drift. I have always had good results with the MPU9250 using either a Teensy or a Butterfly/Ladybug. |
It seems to be some problem related to the magnetometer. And the drift i saw was due to the orientation estimation being incorrect. I have changed the breadboard setup: replaced the Arduino with an esp8266 for faster speeds running the same Arduino code and a different mpu-9250 breakout board (gy-9250). I am sending raw data (which looks good) from the sensor to my computer via serial (accelerometer, gyro, mag), doing the motion fusion on the computer and directly applying the quaternion to a cube. Any IMU code works very well. The motion fusion works when the sensor is rotated on an axis that does not rotate around yaw. And doesn't rotate at all around the yaw axis (relative to earth). This leads me to think that the part of the correction related to gravity works but not compass. Here is a video, i show how it should rotate, then i turn off the gyro and show how it solves orientation with gravity and compass. Results seem to be the same with or without mag calibration, how important is calibration? what i pass into the function: (-ax, ay, az, gx, -gy, -gz, my, -mx, mz); What do you think and do you have any suggestions? Thanks |
Calibration (especially of the mag) is pretty important to get reasonable
results. Plot Mx vs My, Mx vs. Mz and My vs. Mz while moving the sensor all
around. Are the clouds of points centered on the origin? Are the clouds
spherical slices or ellipsoidal? Until these data are spheres centered on
the origin, your mag is not calibrated and without a calibrated mag you
will get nonsense from AHRS.
…On Mon, May 15, 2017 at 10:40 PM, Jaqos ***@***.***> wrote:
It seems to be some problem related to the magnetometer. And the drift i
saw was due to the orientation estimation being incorrect.
I have changed the breadboard setup: replaced the Arduino with an esp8266
for faster speeds running the same Arduino code and a different mpu-9250
breakout board (gy-9250).
I am sending raw data (which looks good) from the sensor to my computer
via serial (accelerometer, gyro, mag), doing the motion fusion on the
computer and directly applying the quaternion to a cube.
Any IMU code works very well.
All AHRS/MARG code gives strange results.
The motion fusion works when the sensor is rotated on an axis that does
not rotate around yaw. And doesn't rotate at all around the yaw axis
(relative to earth). This leads me to think that the part of the correction
related to gravity works but not compass.
Here is a video, i show how it should rotate, then i turn off the gyro and
show how it solves orientation with gravity and compass.
https://youtu.be/GtdHHOppNCs
Results seem to be the same with or without mag calibration, how important
is calibration?
what i pass into the function: (-ax, ay, az, gx, -gy, -gz, my, -mx, mz);
What do you think and do you have any suggestions?
Thanks
mpu9250 quaternionFilters.zip
<https://github.com/kriswiner/MPU-9250/files/1003293/mpu9250.quaternionFilters.zip>
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#125 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AGY1qqjbcK4uug26B2BnSG5NWiUEGw3mks5r6Ta3gaJpZM4MafCS>
.
|
This doesn't look well calibrated, you will have crosstalk between My and
Mz, causeing headign drift when you make a change in roll (or pitch,
depending on your axes choices).
If you are using the ESP8266, you should be able to use this sketch to get
good AHRS, I do and don't have the kinds of problems you describe:
https://github.com/kriswiner/ESP8285/tree/master/MPU9250
Lastly, the Sparkfun MPU9250 design is flawed, and you could easily be
picking up false mag field reading since they poorly chose to rout power
traces under the MPU9250 IC.
…On Tue, May 16, 2017 at 12:06 AM, Jaqos ***@***.***> wrote:
this is what the plots look like
[image: uncalibrated]
<https://cloud.githubusercontent.com/assets/25260920/26093528/a6fc1714-3a59-11e7-8f50-dea588cc988f.png>
[image: caibrated]
<https://cloud.githubusercontent.com/assets/25260920/26093527/a6ede46e-3a59-11e7-826c-d5d6fe375318.png>
[image: screen shot 2017-05-16 at 5 03 41 pm]
<https://cloud.githubusercontent.com/assets/25260920/26093532/aa538032-3a59-11e7-9ecd-4cc48f5d0fd9.png>
the My vs Mz plot looks ellipsoidal
the AHRS seems to be the same with and without calibration.
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#125 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AGY1qtdIg0PHK3J83bqEBnk7ZRQGR-NTks5r6UsRgaJpZM4MafCS>
.
|
How should the accelerometer be calibrated? I understand the concepts of mag and gyro calibration, but not accelerometer. Gyro calibration: (rest on flat surface, read bias) |
Same principle for accel. Flat and motionless. Ideal values are 0, 0, 1.
Calculate bias as deviations from these. There are examples of how to do
this in th MPU9250 repository. For more sophiticated aceel calibration see
here:
https://github.com/kriswiner/EM7180_SENtral_sensor_hub/wiki/F.--Magnetometer-and-Accelerometer-Calibration
…On Tue, Jun 6, 2017 at 2:03 AM, Jaqos ***@***.***> wrote:
I understand the concepts of mag and gyro calibration, how should the
accelerometer be calibrated?
Gyro calibration: (rest on flat surface, read bias)
Mag calibration: (make a prefect sphere)
Accelerometer calibration ??
—
You are receiving this because you commented.
Reply to this email directly, view it on GitHub
<#125 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AGY1qjYon8stADjFmFD3LNEAbhlwDifhks5sBRXYgaJpZM4MafCS>
.
|
I'm encountering the same issue with my Sparkfun MPU, to bad I missed this post before ordering. Basically the sample "cube" I'm rotating on the PC screen slowly moves to kind of the opposite direction after putting the sensor to rest on the table. I assume this is related to the Sparkfun bug. Before I order the other sensor @kriswiner suggested, I wanted to know if @Jaqos did find a workaround/solution to this. Just for completion, I'm running this on a Teensy 3.6. |
Are you sure you are properly calibrating the sensor?
…On Wed, Jun 14, 2017 at 8:47 AM, Matthias Y ***@***.***> wrote:
I'm encountering the same issue with my Sparkfun MPU, to bad I missed this
post before ordering. Basically the sample "cube" I'm rotating on the PC
screen slowly moves to kind of the opposite direction after putting the
sensor to rest on the table. I assume this is related to the Sparkfun bug.
Before I order the other sensor @kriswiner <https://github.com/kriswiner>
suggested, I wanted to know if @Jaqos <https://github.com/jaqos> did find
a workaround/solution to this.
Just for completion, I'm running this on a Teensy 3.6.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#125 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AGY1qq95I8xFWiaFOnjqdnDW2FouJ_OZks5sEACggaJpZM4MafCS>
.
|
I started with 'MPU9250_MS5637_AHRS_t3.ino' from your github and #ifdef'd the barometer code. Then I changed the "Serial.send" commands to just send yaw,pitch,roll in order to be able to display the data in the serial plotter. I Also tried with the Sparkfun version. (To rotated the cube on my PC app I added the necessary USB functions to send the quaternion.) I followed the "figure 8 instructions" during startup so I guess the sensor is 'properly' calibrated? I'll start with a sphere plot of the mag field to get out of doubts. I'll get back to you. Thanks for your time. |
The 'backwards spin' of my cube after putting the sensor to rest, was related to a copy paste error in my code. It is working pretty accurate now. The only rotation which I'm still not 100% satisfied is of course the yaw component. I guess getting good results, specially indoors will be quite challenging. I was planing to use the IMU to do some AR Headtracking. These are my calibrated ellipsoids. I think they look quite decent within -400/+400 and centred in the origin. What do you think, any suggestions? Something else, I saw this comment of yours #152 (comment). I'm just kinda failing to understand why to update at 5-10x the sensor sample rate if the sensor values won't change. |
The fusion method is iterative, it will get closer and closr to a stable answer each time the filter is iterated on a set of sample data. |
@myzb - check out MagMaster, it can calibrate soft-iron and its easy to use, if the mag plot looks distorted on the Sparkfun MPU-9250, give it a try. Hi Kris, these articles look good: do you know of any open source ellipsoid fitting algorithms in c# ? thanks. |
Yes, freescale has one, ask about it at the Teensy forum.
…On Tue, Jun 20, 2017 at 7:51 PM, Jaqos ***@***.***> wrote:
@myzb <https://github.com/myzb> - check out MagMaster, it can calibrate
soft-iron and its easy to use, if the mag plot looks distorted on the
Sparkfun MPU-9250, give it a try.
http://diydrones.com/profiles/blogs/advanced-hard-and-soft-
iron-magnetometer-calibration-for-dummies
https://github.com/YuriMat/MagMaster
Hi Kris,
i have been researching auto mag calibration, using ellipsoid fitting.
these articles look good:
https://skotagiri.wordpress.com/2010/06/19/c-
implementation-for-fitting-an-ellipse-for-a-set-of-points/
http://diydrones.com/forum/topics/magnetometer-soft-and-
hard-iron-calibration
https://sites.google.com/site/sailboatinstruments1/c-
language-implementation
do you know of any open source ellipsoid fitting algorithms in c# ?
thanks.
—
You are receiving this because you were mentioned.
Reply to this email directly, view it on GitHub
<#125 (comment)>,
or mute the thread
<https://github.com/notifications/unsubscribe-auth/AGY1qv1J-l05EKHvrS6cq4ANFJMYgofOks5sGIVOgaJpZM4MafCS>
.
|
@Jaqos I managed to get a quite decent calibration with the current mag calibration method after a few tries. As I will be using this for head orientation tracking inside of vehicles an more advanced calibration may come in handy down the road. Thanks for the links. |
I would recommend moving to Teensy 3.5 or 3.6. These babies run at 120Mhz and have a math coprocessor... |
kriswiner/MPU9250#125 Following the discussion here the arduino processor may be a cause of the issue. NodeMcuEsp8266 code
Hello Kris,
Thanks for posting your code, examples and wikis online, they are awesome!
I am getting a small drift when the MPU9250 is put at rest after movements, it looks like a small 5-10° converge to magnetometer.
The filter converges from initial conditions just like the black cube on Open source IMU and AHRS algorithms
In the video when the sensor is placed flat on the desk, there is no drift, where i do see drift when i place my sensor flat on the desk.
My setup:
Original code: MPU9250BasicAHRS
Sketch uploaded to Arduino: MPU9250_Jaqos_GitHub.zip
Board: Arduino Pro Mini 8mhz
Sensor: Sparkfun MPU9250 breakout
I have learned a lot from reading the issues and questions on this GitHub, but haven't found anyone with the same results as me.
The filter is updated 5-6 times every new sensor data, Arduino sends the Quaternion to my computer which is applied visually to a cube in Unity.
The drifting effect is different with different NED orders (north, east, down).
![north east down](https://cloud.githubusercontent.com/assets/25260920/23830201/452d4180-0759-11e7-8eab-42a1f9bdd9e8.png)
By trial and error, the best order i found was: (ay, az, ax, gy, gz, gx, mx, -mz, my)
Drift graph: (you can see the blue line slowly moves up when sensor is at rest):
![graph](https://cloud.githubusercontent.com/assets/25260920/23830053/2219a714-0755-11e7-9f0e-b8fc35114026.png)
The mag calibration looks good:
![calibrated](https://cloud.githubusercontent.com/assets/25260920/23830202/478d28a0-0759-11e7-8941-69a84fbecbc7.png)
A video showing the drift:
cube drift
The Questions:
Thanks for your time ;)
The text was updated successfully, but these errors were encountered: