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:
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(); } }







Zitieren

Lesezeichen