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
Das Gyro misst die Winkelbeschleunigung. Das hilft leider wenig bis gar
nichts bei einer Winkelbestimmung. Integration kannste vergessen, Zuviel
Offsetdrift
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
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.
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
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.
> 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.
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".
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
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.
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
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.
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