PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Gyro Auswertung



churchi
03.10.2009, 22:49
Hallo!

Ich arbeite grad an den ersten Teilen für unseren Tricopter und bin grad ein wenig verwirrt bezüglich dem Gyro.

Ich habe mir einen Gyro besorgt und an einen ATMega88 angeschlossen.
Mir ist das Thema Drift bekannt, aber ich glaube ich habe das extrem unterschätzt.

Leider ist die Qualität des Diagramms nicht so gut, aber ich kann leider eine größere Version hier nicht hochladen.

https://www.roboternetz.de/phpBB2/album_pic.php?pic_id=2383

Grüne Linie: Referenz (erstmal unwichtig)
Rote Linie: der berechnete Winkel
Blaue Linie: die Gyro Rohdaten

Ich habe die Platine immer ein wenig gedreht und dir Gyrowerte werden dabei immer aufintegriert.
Hier der Code dazu:

if((gyro_x > 1) && (gyro_x > gyro_x_old)) {
gyro_x_increment += gyro_x - gyro_x_old;
}
if((gyro_x < -1) && (gyro_x < gyro_x_old)) {
gyro_x_increment -= gyro_x_old - gyro_x;
}
gyro_x_old = gyro_x;


Die roten Pfeile markieren die Stellen wo die Platine wieder waagrecht stand.
Nun sieht man rechts, dass der Wert des Winkels doch extrem abweicht.
Ist dies normal, oder muss ich den Code noch verfeinern?

Den ACC hab ich schon daheim, aber ich dachte nicht, dass ich den unbedingt brauche - sieht derzeit aber so aus? (Der Unterschied vom realen zum berechneten liegt bei ca. 40°)

Willa
03.10.2009, 23:03
Hi!
Du baust auch einen Tricopter? Das ist aber interessant :-D .
Du scheinst ziemliche Probleme mit dem Integral zu haben... "Drift" in dem Sinne in dem ich es verstehe ist eigentlich nur eine ganz leichte Verschiebung des Nullpunktes vom Gyropegel über die Zeit. Bei dir scheint aber was bei der Berechnung des Integrals nicht ganz zu klappen. Hast du es schon mal ganz einfach versucht?

gyro_x_increment=gyro_x + gyro_x_increment

Ausserdem ist dein Gyropegel irgendwie sehr stark verrauscht... Hast du zitterige Hände, oder nutzt du keinen Tiefpass? Die Grenzfrequenz darf gerne bei 40 Hz liegen (klingt wenig, isses aber nicht). Mit welcher Frequenz misst du denn den Gyropegel? Und was für Gyros hast du überhaupt?
Wie stark ist der Ausschlag deines Pegels am ADC? Kommst du von 0 bis auf 1024 (d.h. nutzt du den ADC auch komplett aus?)

Willa
03.10.2009, 23:08
Hier siehst du übrigens meine ersten Versuche mit den Gyro's:

http://www.villalachouette.de/william/krims/tricopter/tricopdebug.wmv

Dort erkennt man auch das Driftproblem: Der Nullpegel der Gyro's ist nicht mehr auf Null sondern zwischen 2 und 5. So ließ es sich aber schon fliegen. Man erkennt auch, dass ich deutlich weniger Rauschen auf dem Signal hatte. Obwohl ich damals noch schlechtere Gyro's verwendet hatte (Murata ENC-03R).

churchi
03.10.2009, 23:20
Ja ich bin vor einigen Wochen mit 2 Arbeitskollegen von mir auf die Idee gekommen und hab dann auch recht schnell deinen gefunden und mal angeschaut =)

Ok, also mit dem Drift ist da nicht gemeint, dass das so dermaßen krass nicht mehr stimmt - gut zu wissen - danke! :)

Ich hab mir einen Motion Sensor für die Wii gekauft.
Da hab ich den Prozessor und unnötiges Zeugs weg gegeben und den µC draufgefädelt.
Einen wirklichen Tiefpass hat das Board derzeit nicht.

Ob ich den ADC wirklich komplett ausnutze hab ich noch nicht getestet, aber es sollte schon so sein.

Ich werde morgen mal einen 40Hz Tiefpass draufgeben und schauen ob das Signal besser wird, aber ich denke nicht das das bei mir noch viel bringt.

Der ADC misst so schnells geht 3 Kanäle und mittelt dann die letzten 32 Werte.
Alle 50ms werden die Werte an den Computer gesendet.


Einen Systemfehler hab ich jedoch vielleicht schon entdeckt der durch den Gyro verursacht wird:
Drehe ich die Platine schnell in die eine Richtung und dann langsamer wieder zurück, so erreicht er nicht mehr den korrekten Wert.
Kann das sein oder ist hier noch etwas faul?

churchi
03.10.2009, 23:24
ah danke für den Link!

Ich bin da wohl einfach viel zu schnell - das kann ich alles noch viel gemächlicher angehn - dann wird das Rauschen auch weniger werden und die Kurven so rund wie bei dir...


edit:
Hab grad die ADC Geschwindigkeit ausgemessen.
Alle 0,9ms bekomme ich einen neuen gyro x ADC Wert.
Das in Verbindung mit dem mitteln über 32 Werte wär eigentlich garnicht mehr so schnell.

Willa
03.10.2009, 23:52
Also bei der Gyroauswertung würde ich mal ca. 500 Hz anpeilen. Weniger und mehr geht bestimmt auch, aber 500 Hz ist vielleicht ein guter Richtwert.

Ob ich den ADC wirklich komplett ausnutze hab ich noch nicht getestet, aber es sollte schon so sein.
Das ist aber ziemlich essentiell für eine gute Regelung. Also teste das mal. Und einen Tiefpass würde ich IMMER mit als Elektronik auslegen und nicht als Software. Mittelwertbildung is m.M. nach lange nicht so optimal wie ein richtiger Tiefpass.

Ich werde morgen mal einen 40Hz Tiefpass draufgeben und schauen ob das Signal besser wird, aber ich denke nicht das das bei mir noch viel bringt. Ich glaube schon.

Drehe ich die Platine schnell in die eine Richtung und dann langsamer wieder zurück, so erreicht er nicht mehr den korrekten Wert. Klingt so als ob dein Gyro evtl. in die Sättigung kommt. Was haben die Teile für eine max. Drehrate die sie messen können? Für einen Copter wären 150 bis 300 °/s geeignet.

recycle
04.10.2009, 05:12
@Churchi
Dein Code kommt mir irgendwie seltsam vor.
Integration bedeuten normalerweise, das man alle Messwerte aufaddiert.

Wenn ich deinen Code richtig verstehe, lässt du aller Messwert zwischen -1 und 1 weg. Wenn die Werte gösser 1 sind, addierst du nur wenn der Wert noch grösser wird und wenn er kleiner -1 ist, nur wenn er noch kleiner wird.
D.h. wenn du deinen Gyro so hin und her bewegst, dass der Messwert z.B. immer zwischen 1 und 10 schwankt, wird dein Integral immer grösser, weil alle Werte bei denen der Winkel kleiner wird gar nicht addiert werden.
D.h. wenn du deinen Gyro bei der Messung nicht immer ganz gleichmässig weit hin - und her drehst, verschiebt sich der berechnete Nullpunk zwangsläufig.
Oder habe ich da den Code falsch verstanden?

In deinem Diagramm fällt natürlich der Sprung in der 17. Sekunde auf.

Vorher verschiebt sich der Nullpunkt kontinuierlich nach oben, bei Sekunde 17 macht er plötzlich einen Sprung nach unten. Kann es sein, dass da einfach nur die Variable für das Integral übergelaufen ist?

Was ist gyro_x für ein Wert? Direkt der Messwert des Gyros?
Kann ja eigentlich nicht sein, denn der ist ja immer > 0.

Daher wird Gyro_x vermutlich immer der aktuelle Messwert minus dem Wert den der Gyro in Ruhelage hat sein. Ausserdem mittelst du noch über 32 Messwerte.
Je nachdem wie du Gyro_x bestimmst und was für einen Datentyp du dafür verwendest, kann es sein, dass das Integral alleine durch "Rundungsfehler" ständig wächst ohne dass der Gyro überhaupt bewegt wird. Da du allle Messwerte zwischen -1 und 1 ausblendest würdest du das allerdings nicht sehen und dieser Fehler geht erst ein, wenn du den Gyro bewegst.

Ich habe auch mal mit einem Gyro herumexperimentiert und um Resourcen zu sparen Integerwerte für das Mittel über mehrere Werte verwendet.
Dabei ist dann bei jeder Messung ein sehr kleiner "Rundungsfehler" aufgetreten, der sich durch die vielen Messungen pro Sekunde ruckzuck auffadiert hat und dadurch jeweils nach kurzer Zeit die Variable für das Integral zum Überlaufen gebracht hat

D.h. mein berecheter Nullwinkel machte eigentlich genau das, was deiner macht, nämlich langasm anwachsen um dann beim Überlauf plötzlich nach unten zu springen.

Bei mir konnte man das allerdings schon feststellen, wenn der Gyro ruhig auf dem Tisch lag. Bei dir würde das in Ruheposition wie nicht auffallen, weil du die Werte zwischen -1 und 1 ausblendest.

churchi
04.10.2009, 09:57
Meine Gyros haben eine Drehrate von 500°/s.
Ich möchte diese aber noch durch einen OPV ein wenig nach unten schrauben und natürlich auch noch besser an den ADC anpassen.

@recycle
Ja das stimmt so wie du es beschreibst.
Mein Gedanke dahinter war, dass wenn ich einfach alles aufaddiere der Winkel immer wieder auf 0 zurück gehen würde?
Also wenn ich in eine Richtung schwenke, dann wird der Wert mehr - wenn ich jedoch dann aufhöre zu schwenken, dann geht der Winkelwert ja auch schon wieder zurück weil der Gyro auch wieder zurück geht?
Oder addiert man alles was in einer Richtung passiert zusammen?

Die Variablen sind groß genug gewählt - ein Überlauf war es nicht (das hätte ich auch beim Aufzeichnen des Diagramms gesehn)

gyro_x ist der Messwert des Gyros minus dem Offset.

Das mit dem Rundungsfehler ist glaub ich ein guter Hinweis - das werd ich gleich mal ausprobieren - danke!

Willa
04.10.2009, 10:00
Das Integral zu bilden bedeutet einfach die Gyrowerte (- Offset) zu addieren. Wenn du in eine Richtung drehst wird das Integral größer. Hörst du auf zu drehen bleibt es da wo es war. Das soll ja nun auch so sein...

Ein beliebter Denkfehler ist, dass oft Drehbeschleunigung und Drehgeschwindigkeit verwechselt wird. Ein Gyro misst immer die Drehgeschwindigkeit. Die Physik sagt uns, dass wir beim Integrieren einer Winkelgeschwindigkeit über die Zeit den Winkel erhalten.

churchi
04.10.2009, 10:54
ach kakke ich hab da ja viel zu kompliziert gedacht #-o
klar - einfach addieren genügt ja komplett...

Jetzt sieht es schon viel besser aus das Signal :)

Aufaddieren heißt halt wirklich aufaddieren und nicht viel Blödsinn drum herum machen :D
Danke!

Crazy Harry
05.10.2009, 15:16
Wie macht ihr den Tiefpass ? Hardware oder Software ? Wenn Hardware wie genau ?

danke :)

Willa
05.10.2009, 15:31
Mit "ihr" meinst du die Leute die an diesem Thread beteiligt sind...? Der Tiefpass ist so aufgebaut wie hier beschrieben (RC-Glied):
http://www.elektronik-kompendium.de/sites/slt/0206172.htm
Als Kondensatoren nehme ich Wima Folienkondensatoren oder Kerkos mit ca. 100nF und 36k Widerstand... Scheint gut zu funktionieren.

Crazy Harry
06.10.2009, 08:26
Ich meinte die Kundigen und Wissenden hier :oops:

Vielen Dank

[EDIT]Noch eine Frage: habt ihr den Tiefpass direkt am Sensor oder nach einem nachfolgenden OP ?