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?
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.
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.
geometrisch