Forum: Mikrocontroller und Digitale Elektronik Winkelbestimmung mit einem Gyroskop


von Alex (Gast)


Lesenswert?

Hallo,

ich bin gerade am Aufbau eines Systems, mit dem ich den Winkel eines 
autonomen Roboters bestimmen will.
Als Sensor dient mir der Gyroskope LISY300AL 
(http://www.st.com/stonline/products/literature/ds/14753.pdf), zur 
Verarbeitung der Daten benutze ich ein Atmega88.
Das lesen der Werte, des Gyros und die Kommunikation mit dem Rechner 
funktionieren soweit schon.  Als VREF dient mir die Versorgungsspannung 
von 3.3V. Der Analoge Output des Gyros ist in Ruhelage 1.62V.
Jetzt zu meinem Eigentlichen Problem. Ich bin seid ein paar Tagen auf 
der Suche im Netz und in diesem Forum wie man nun den Winkel bestimmen 
kann, während der Roboter lustig vor sich hin fährt. Ich finde im Paper 
leider keine Hinweise über Zeit/Stärke Verhältnis zueinander.
Eventuell hat ja einer von euch eine Idee, Beispiel Code oder ein Link 
der mir weiterhelfen könnte.

Gruß Alex

von ah (Gast)


Lesenswert?

Das Gyro misst die Winkelbeschleunigung. Das hilft leider wenig bis gar 
nichts bei einer Winkelbestimmung. Integration kannste vergessen, Zuviel 
Offsetdrift

von Michael (Gast)


Lesenswert?

Nein, tut er nicht. Ein Gyroskop misst die Winkelgeschwindigkeit!

Michael

von ah (Gast)


Lesenswert?

Stimmt, aendert aber nichts. Das hilft leider wenig bis gar nichts bei 
einer Winkelbestimmung. Integration kannste vergessen, Zuviel
Offsetdrift

von Spike (Gast)


Lesenswert?

Hallo Alex,

wie der Name des Sensors sagt (yaw rate) misst er die 
Winkelgeschwindigkeit. Das Datenblatt sagt Dir auch, wie das Signal 
aussieht. Auf Seite 5 in Tabelle 3 steht zum Einen die Ausgangsspannung 
Voff in Ruhelage (1,65V), die nahe bei den von Dir gemessenen 1,62V 
liegt.
Die Drehgeschwindigkeit wird unter der Sensitivity So mit 3.3mV/grad/s 
angegeben.
Heisst bei einer Drehgeschwindigkeit von 10 grad/Sekunde kannst Du 
abhängig von der Drehrichtung 1,653V oder 1,587V AM Ausgang messen (+- 
33mV)
Um den absoluten Winkel zu erhalten, musst Du die Geschwindigkeit 
integrieren, vereinfacht gesagt mit 10 Hz messen und 1/10 des gemessenen 
Wertes aufaddieren. Je nach Frequenz der Messung wird dies, wie "ah" 
anmerkt, hinlänglich ungenau.

Spike

von Klaus2 (Gast)


Lesenswert?

deshlab ja auch einen kompass, sonst nix. und ggf einen beschl.sensor um 
den neigungswinkel zu bestimmen.

Klaus.

von Karl H. (kbuchegg)


Lesenswert?

Klaus2 schrieb:
> deshlab ja auch einen kompass, sonst nix.

Ist egal. Entscheidend ist, dass bei deiner Aufaddiererei nicht 0 
herauskommen wird, wenn du den Sensor um 90° nach links und wieder 
zurückdrehst. Dafür wird dir der Sensor auch dann eine Drehung ausgeben, 
wenn der Sensor defintiv einfach so in Ruhe auf dem Tisch liegt.

Ob deine Ruhelage willkürlich ist, oder ob die so ausgerichtet ist, dass 
0° nach Norden zeigt, spielt dabei keine Rolle.

von Spike (Gast)


Lesenswert?

Grundsätzlich kann man einen Gyro schon verwenden. Moderne IMU arbeiten 
zum Teil auch auf Basis von MEMS Sensoren.
Ich würde mir auch keine so große Sorge bezüglich der Offsetdrift 
machen.
Man kann ja im Betrieb nachkalibrieren, denn wenn der Roboter steht ist 
die Drehrate Null.
Man sollte allerdings keine Wunder erwarten...nach 3 Stunden 
Geländefahrt eine Genauigkeit von 0.1 Grad ist wohl unrealistisch :-)

@Klaus2:

Mit einem Kompass kann man je nach Umgebung durchaus gute Ergebnisse 
erzielen, jedoch ist gerade in Gebäuden das Magnetfeld z.T. arg 
verbogen. Da fährt man dann einer gekrümmten Feldlinie nach.
In diesem Zusammenhang, Beschleunigungssensoren zur Neigungsmessung 
funktionieren i.d.R. nur im Stillstand zuverlässig.

Spike

von Klaus2 (Gast)


Lesenswert?

Gut, das mit dem Stillstand gilt wohl auch für den Gyro, denke ich mal - 
auser man filtert gerne aufwendig digital :)

Kompass inhouse stimmt natürlich, hatte ich vergessen. Wobei ich mich da 
ehrlich gesagt auch am Quadrokopter orientiere, bei denen klappt das 
einiger Maßen. Evtl mal "inspirieren lassen"? :)

Klaus.

von Karl H. (kbuchegg)


Lesenswert?

> Ich finde im Paper
> leider keine Hinweise über Zeit/Stärke Verhältnis zueinander.

Da würde ich gar nicht lange fackeln und es auf einen Versuch ankommen 
lassen.
Integrieren wie beschrieben und dann den Sonsor um 360° drehen. Der Wert 
der dann rauskommt ist dein Integrationsergebnis für einen Vollkreis. 
Der Rest ist dann einfach nur 3-Satz. Wenn ein Wert von 2875 einer 
Drehung um 360° entspricht, wie gross ist dann der Winkel bei einem 
Integrationswert von 457? (3 Äpfel kosten 5 Euro, wieviel kosten 7 
Äpfel)

Probier aber unbedingt aus, wie sich das Ergebnis verändert, wenn du 
schnell drehst/langsam drehst etc. 5 Minuten warten und nachsehen, ob 
das Ergebnis sich auch dann nicht verändert, etc.
Dein Gyro scheint temperaturkompensiert zu sein. Ist schon einmal etwas.

von Simon K. (simon) Benutzerseite


Lesenswert?

Genau, probier es aus, und sehe, dass es nach allerspätestens 10 
Sekunden nicht mehr funktioniert.

Bei IMUs und auch bei Quadrokoptern wird ein zusätzlicher 
Beschleunigungssensor benutzt, der den Winkel zur Erdgravitation misst. 
Somit kann man das Integral immer ganz leicht hinter dem (stark 
getiefpassten Beschleunigungssensor) "hinterherziehen".

von Alex (Gast)


Lesenswert?

Hallo an alle,

erst einmal danke für die Antworten, habe mich mal Inserieren lassen :)

@ Klaus
Kompass kommt leider nicht in Frage da der Robot nur in Gebäuden fährt 
und ich schlechte Erfahrungen damit habe.  Aber an sich hast du recht.

@ Spike
Super Sache habe ich ganz überlesen. Werde mal versuchen ob ich etwas 
Brauchbares hinbekomme. Der Offsetdrift sollte hoffentlich nicht allzu 
schlimm, sein da der Robot nur 90 Sekunden fährt und dann wieder in 
Ausgangslage gebracht wird.

Ich hätte noch eine Frage. Wäre der Watchdog Timer genau genug um z.B. 
alle 10 Hz zu messen? Oder gibt es eine andere Möglichkeit um dies zu 
realisieren, denke da an Threadaufteilung, fals dies bei einem Atmega88 
möglich ist.

Sollte ich weiterkommen werde ich euch auf dem Laufenden halten.


Gruß Alex

von Karl H. (kbuchegg)


Lesenswert?

Alex schrieb:

> Ich hätte noch eine Frage. Wäre der Watchdog Timer genau genug

Den Wtschdog willst du da mit Sicherheit in seiner Hundehütte lassen. 
Der hätte andere Aufgaben.

> um z.B.
> alle 10 Hz zu messen?

Kannst du mit jedem x-beliebigen Timer machen.
Normalerweise hat man sowieso in einem Programm einen Timer durchlaufen, 
der dem ganze Programm eine stabile Zeitbasis von zb 1ms in einer ISR 
verpasst.

> Oder gibt es eine andere Möglichkeit um dies zu
> realisieren, denke da an Threadaufteilung, fals dies bei einem Atmega88
> möglich ist.

Kommt drauf, was der Mega sonst noch so alles zu tun hat.
Ist aber oft Overkill.
Timer aufsetzen, der zb. alle 1ms eine ISR aufruft. In der ISR die 
Aktion anstossen. Wenns schnell geht, kann die ISR auch selber die 
Aktion ausführen, aber ansonsten kann sie ein Flag setzen, welches in 
der Hauptschleife ausgeführt wird.

In deinem Fall bietet es sich an, dass die Timer-ISR den ADC startet 
(aber nicht auf das Ergebnis wartet!). Ist der ADC fertig, wird ein 
ADC-Interrupt ausgelöst, in dem wiederrum der ADC Wert ausgelesen und 
integriert wird.

von Spike (Gast)


Lesenswert?

Hallo Alex,

"probieren geht über studieren"!

Bedenke folgendes, um nicht frustiert zu werden:

1. Die 10 Bit des ADC geben Dir eine Messauflösung von etwa 1 
Grad/Sekunde (Quantisierung)-> also nicht Mircogradgenauigkeit erwarten.

2. Die Messfrequenz kannst Du fast mit jedem Timer des 88er erzeugen. -> 
Am Besten direkt so proggen, dass eine Veränderung der Messfrequenz 
einfach möglich ist. Die 10Hz waren nur als Beispiel gedacht, gerade 
wenn Du den nächsten Punkt siehst, ist eine höhere Messfrequenz 
sinnvoll.

3. Denk dann mal über einen Filteralgorithmus nach. Ein Moving Average 
Filter ist recht einfach geproggt, auch hier die Parametrisierung 
variabel halten und ausprobieren.

4. Die Ergebnisse hier bekanntgeben, ich bin schon gespannt.


Viel Erfolg

Spike

von Simon K. (simon) Benutzerseite


Lesenswert?

Um was für einen Winkel geht es eigentlich? Gierwinkel (Also 
Fahrrichtung) oder Neigungswinkel? Bei ersterem ist meine Idee mit dem 
Beschleunigungssensor natürlich nonsense.

von Alex (Gast)


Lesenswert?

Hi,

@ Simon K.
Es geht um ein Gierwinkel des Robotors in Bezug auf eine ca. 3 x 2.3 
Meter große Spielplatte. Das Gute ist, dass ich nur ein Winkel brauche. 
Entschuldige hätte ich vorher sagen sollen.

Alex

von Alex (Gast)


Lesenswert?

Ich nochmal,

@ Karl heinz Buchegger
Danke für die Antwort. Werde das so machen.

Gruß

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.