Kreiselwinkelberechnungen sind nicht genau?

Ich verwende dieses LISY300AL Gyro: DataSheet

Aber ich bekomme keine genauen Daten..

Hier meine Rechnung:    

    sensitivity = 0.716454545;
    gyroAdc = analogRead(0);
    if(abs(gyroAdc - gyroZero) <= Threshold)
      gyroAdc = gyroZero;
    gyroRate = (gyroAdc-gyroZero)/sensitivity;
    gyroRotation=gyroRotation+gyroRate*dtime1/1000;
    gyroAngle = abs((gyroRotation - 360 * ceil(gyroRotation / 360))); // Round up between 0-360
    dtime = millis() - stime; // millis() is the milliseconds since my controller started
    stime = millis();

Ich bekomme keinen genauen Winkel, ich bewege mein Objekt um 90 Grad, aber der Kreisel driftet zu sehr, sodass er etwas anderes zeigt ...

Vielleicht mache ich etwas falsch? oder sollte ich einfach einen Beschleunigungsmesser hinzufügen, um es genauer zu machen?

Antworten (2)

Ich habe mir Ihr Datenblatt nicht angesehen, aber billige Kreisel (nicht 10 von 1000 von $) erhalten von Natur aus ein Signal proportional zur Drehgeschwindigkeit . Um einen Winkel zu erhalten, muss dieser integriert werden. Jeder Fehler im Ratensignal akkumuliert sich daher mit der Zeit. Billige MEMS-Kreisel haben Drift und Genauigkeit, sodass der Winkel nach ein paar Sekunden ziemlich bedeutungslos ist.

Echte mechanische Gyroskope arbeiten nach einem völlig anderen Prinzip, bei dem die Achse in die gleiche Richtung zeigt. Diese liefern daher echte Winkelausgaben, keine Winkeländerungsrate, und sind daher nützlicher für die Trägheitsnavigation.

Beschleunigungsmesser können Ihnen die absolute Winkelgröße in Bezug auf die Schwerkraft geben, wenn Sie wissen, dass das Objekt nicht anderweitig beschleunigt. Dies ist jedoch nur ein Winkel in Bezug auf unten. Sie helfen Ihnen beispielsweise nicht, den seitlichen Drehwinkel zu bestimmen.

Tolle Erklärung. Ich wollte nur anmerken, dass der LSM303-Chip sowohl einen Beschleunigungsmesser als auch einen Magnetometer enthält und nützlich sein könnte, um sowohl die Neigung als auch den Kurs zu ermitteln. Pololu hat ein gutes Modul für Arduino.

Um diese Drift in meinem Kreisel zu vermeiden, habe ich if-Anweisungen hinzugefügt, um die Drift herauszufiltern. Etwas wie das:

if(abs(degrees(gyroRate[XAXIS]))>0.5) 
    rollAngle += degrees(gyroRate[XAXIS])*timeDiff/1000.00; 
if(abs(degrees(gyroRate[YAXIS]))>0.5) 
    pitchAngle += degrees(gyroRate[YAXIS])*timeDiff/1000.00; 
if(abs(degrees(gyroRate[ZAXIS]))>0.5) 
    yawAngle += degrees(gyroRate[ZAXIS])*timeDiff/1000.00;

Wenn also die Kreiselrate weniger als +/- 0,5 beträgt (übliche Drift von Kreiseln), wird der Winkel nicht aktualisiert.