PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : MPU 9250 Yaw Winkel ist falsch



eniddelemaj
17.11.2018, 17:56
Guten Abend,

ich versuche einem Roboter einen Kompass zu geben, damit dieser eine Orientierung hat.
Mit dieser Orientierung kann ich dann beispielsweise sagen, dass sich um 180° drehen soll.
Bis jetzt konnte ich einen yaw winkel im bereich von 0 - 359° errechnen.

Das Problem ist, dass die Ausrichtung sich ändert, wenn ich das Modul auf
eine alte Ausrichtung zurück drehe. Wenn ich das MPU Modul auf 180° drehe
und dieses dann in die entgegengesetzte Richtung drehe (also weiter 180°) dann habe ich immer unterschiedliche
Abweichungen von bis zu 30°. Die Richtungen die beispielsweise 90° anzeigen, ändern sich ständig.
Nicht falsch verstehe:
Wenn das Modul still steht dann ist der Wert relativ stabil. Ich habe lediglich einen Drift von 1° alle 20 Sekunden.
Besteht mein Problem etwa in diesem Drift?

Was muss ich tun, um diese Problem zu beheben?
Ich habe den Code und die Infos von dieser Seite:

http://blascarr.com/lessons/imu-visualization/

Ansonsten ist hier auch noch mein vollständiger Code:


#include "MadgwickAHRS.h"
#include "IMU_MPU9250.h"

float roll;
float pitch;
float yaw;
long Serialtime;
long last_time;
long microsPerReading;

Madgwick filter;
MPU9250 imu;


void updateIMU(float *roll, float *pitch, float *yaw){

if (imu.readByte(MPU9250_ADDRESS, INT_STATUS) && 0x01){ imu.readAccelData(imu.accelCount);
imu.getAres();

imu.ax = (float)imu.accelCount[0]*imu.aRes;
imu.ay = (float)imu.accelCount[1]*imu.aRes;
imu.az = (float)imu.accelCount[2]*imu.aRes;
imu.readGyroData(imu.gyroCount);
imu.getGres();

imu.gx = (float)imu.gyroCount[0]*imu.gRes;
imu.gy = (float)imu.gyroCount[1]*imu.gRes;
imu.gz = (float)imu.gyroCount[2]*imu.gRes;
}

imu.updateTime();
imu.delt_t = millis() - imu.count;
if (imu.delt_t > microsPerReading){
filter.updateIMU(imu.gx, imu.gy, imu.gz, imu.ax, imu.ay, imu.az);
*roll = filter.getRoll();
*pitch = filter.getPitch();
*yaw = filter.getYaw();
imu.count = millis();
}
}
void setup() {
Wire.begin();
Serial.begin(9600);
filter.begin(25);

microsPerReading = 1000 / 25;
Serialtime = 50;
last_time = millis();

imu.gyroBias[0] = 0.0f;
imu.gyroBias[1] = 0.0f;
imu.gyroBias[2] = 0.0f;

imu.accelBias[0] = 0.0f;
imu.accelBias[1] = 0.0f;
imu.accelBias[2] = 0.0f;

imu.calibrateMPU9250(imu.gyroBias, imu.accelBias);
imu.initMPU9250();
}

void loop() {
updateIMU(&roll, &pitch, &yaw);
if (millis() - last_time > Serialtime) {
Serial.print("Orientation ");
Serial.print(yaw);
Serial.print(" ");
Serial.print(pitch);
Serial.print(" ");
Serial.println(roll);
last_time = millis();
}
}

HaWe
17.11.2018, 18:18
hallo,
ich hatte vor kurzem das selbe Problem, mit einer anderen dmp lib für den 6050
https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Es hatte ich aber heraus gestellt, dass ich anfangs recht lange warten musste, bis der dmp Prozessor stabile Werte lieferte, danach funktionierte es recht gut.
https://github.com/jrowberg/i2cdevlib/issues/409#issuecomment-431594236

eniddelemaj
17.11.2018, 18:47
hallo,
ich hatte vor kurzem das selbe Problem, mit einer anderen dmp lib für den 6050
https://github.com/jrowberg/i2cdevlib/tree/master/Arduino/MPU6050
Es hatte ich aber heraus gestellt, dass ich anfangs recht lange warten musste, bis der dmp Prozessor stabile Werte lieferte, danach funktionierte es recht gut.
https://github.com/jrowberg/i2cdevlib/issues/409#issuecomment-431594236

Danke für die Antwort!

Ich habe den sensor jetzt still liegen lassen für ca 10 min. Das Problem besteht allerdings weiterhin. Habe ich das richtig verstanden? Sry wenn nicht.

HaWe
17.11.2018, 22:04
Danke für die Antwort!

Ich habe den sensor jetzt still liegen lassen für ca 10 min. Das Problem besteht allerdings weiterhin. Habe ich das richtig verstanden? Sry wenn nicht.

bei mir haben max. 40 sec (exakt horizontal fixiert) ausgereicht.
Es kann sein, dass du den 9150 vorher zusäzlich kalibrieren musst, wegen Magnetometer, aber da muss ich passen.

eniddelemaj
17.11.2018, 23:05
Okay ich habe jetzt deine Library benutzt und eeeendlich funktioniert alles so wie ich es erwartet habe!
Ich muss ehrlich sagen, dass es ein ziemlich langer Weg war um zu diesem Ergebnis zu kommen.

Unglaublich wie schwer ich mir das gemacht habe, weil ich dachte, dass ein Magnetometer zwingend notwendig
sei um einen Yaw Wert zu erhalten. Ich habe anstatt den MPU9250 jetzt den MPU6050 angeschlossen und es funktioniert mit dieser Bibliothek.
Ich habe mir Tutorials angeschaut, etliche Seiten im Internet durchsucht wie man ein Magnetometer anständig kalibriert
und nun habe ich so einfach die Lösung für mein Problem gefunden. Ich danke dir!

- - - Aktualisiert - - -

Also an alle, die einen Yaw Wert haben wollen, ohne dabei sich an dem Erdmagnetfeld zu orientieren:
Benutzt den Accel und den Gyro. Das reicht völlig aus für einen Yaw Wert! Verwendet die oben genannten Bibliotheken
und einen MPU 6050.

HaWe
18.11.2018, 08:52
freut mich, dass es geholfen hat! (y)