PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : PID + Kompass



robvoi
11.02.2013, 08:50
Hallo,

ich würde gerne eure Meinung zur Herangehensweise für die Integration eines Kompass in meinen PID Regelkreis hören.
Es geht um ein Kettenfahrzeug, mit zwei DC Motoren. (Die Plattform nähert sich, nach einem Umbau, der Fertigstellung, ist aber noch nicht soweit. Daher kann ich noch nicht testen.)

1. Macht es eurer Erfahrung nach überhaupt Sinn, einen Kompass (AHRS mit Kompass, Beschleunigungssensor und Gyro) als Referenz zum geradeaus fahren zu nutzen? Der Kompass wird auf einem Mast montiert, um Abstand zu den DC Motoren zu bekommen.

2. Bisher hatte ich zwei PID Regler, welche beide Motoren auf einer bestimmten Drehzahl halten (via PWM). Damit fährt das Fahrzeug recht gut geradeaus.
Die Frage ist jetzt ob es Sinn macht, diese recht gut funktionierende Methode mit dem Kompass zu erweitern, oder ob ich nur den Kompass nutzen sollte.
Es wäre schade, die guten Ergebnisse der Steuerung über die Encoder zu verwerfen, allerdings befürchte ich, dass ich mit beiden Systeme zusammen keine Stabilität hinbekommen.
Wie würde ich eine Zusätzliche Komponente in die Reglung integrieren, ohne das System instabil zu machen?

3. Gibt es eine gängige Methode um den Sprung in den Sprung in den Kompass Werten (360->1) zu verarbeiten?


Generelle Tipps aus der Praxis zum Thema Kompass im Roboter sind sehr willkommen. Da ich leider wenig Zeit für das Hobby habe, freue ich mich über alle vermiedenen Fehlversuche (auch wenn Sie teilweise zum Spaß gehören ;)).

Danke und Gruß
Robert

Che Guevara
11.02.2013, 19:34
Hi,

also wenn ich das richtig verstehe, hast du einen Roboter mit je einem Encoder pro Motor. Dazu willst du jetzt (oder eben auch nicht) einen Kompass integrieren!?
Ich würde da einen Komplementärfilter verwenden (Hoch + Tiefpass), der die Signale miteinander verechnet und somit einen auf kurze & lange Zeit stabilen Wert ausgibt.
Den Sprung könnte man z.b. so lösen:


Heading = Kompass_Value()

If Heading >= 0 and Heading_old <= 360 then
Umdrehung = Umdrehung + 1
Elseif Heading <= 360 and Heading_old >= 0 then
Umdrehung = Umdrehung - 1
Endif
Heading_old = Heading
Heading_laufend = 360*Umdrehung + Heading


Gruß
Chris

robvoi
12.02.2013, 08:10
Hallo Chris,

danke für die Antwort.

Ist es denn Erfahrungsgemäß sinnvoll, zwei PID Regler zu kombinieren? Oder beeinflussen diese sich zu sehr gegenseitig und erzeugen ein instabiles System?

Danke für den Anstoß bezüglich des Sprungs in den Winkel Werten. Ich werde die Winkel in einer Skala -180 bis +180 verwenden. Dann muss ich nicht zwingend die 0 beim Auslesen erwischen.

Gruß
Robert

Che Guevara
12.02.2013, 08:15
Hi,

wieso möchtest du den zwei PID-Regler verwenden? Kombinier doch einfach die Sensoren via Komplementärfilter.
Naja, dann korigier doch den Code einfach auf +-180°. Sollte ja auch kein Problem sein ;)

Gruß
Chris

robvoi
12.02.2013, 08:59
Hmm, richtig. Das macht mehr Sinn.
Kann ich dann einfach die beiden PIDs für RPM nutzen und den Error des Kompass, je nach Richtung der Abweichung, auf den Error der RPM aufrechnen bzw. abziehen? (ggf. mit einem sinnvollen Faktor)


Ich hatte jetzt nicht erwartet, dass du den Code noch auf +-180° anpasst. :) Zur Veranschaulichung hat der erste Code gereicht.

Che Guevara
12.02.2013, 09:06
Hi,

also du filterst die Signale und erhältst daraus dann einen Winkel. Diesen schickst du in den PID-Regler.
Ich würde die reinen Encoder-Daten für den D-Anteil des Reglers verwenden und den korrekten Winkel für den P und I Anteil. Oder du verwendest die Encoder-Daten für P & D und den Winkel für I. Da müsste man wohl experimentieren was am besten ist ;)

Gruß
Chris

mare_crisium
12.02.2013, 09:58
robvoi,

für diese Art von Regelungen nimmt man normalerweise eine Kaskaden-Regelung. Aber um Dir raten zu können, müsste ich erst wissen:
1. benutzt Du Deine bisherigen beiden Regler als getrennte Drehzahlregler (je einer pro Kette)?
2. welche Messwerte liefert der Kompass (den Winkel oder auch den cos und den sin des Winkels)?
3. kannst Du Vektorrechnung (Skalarprodukt, Vektorprodukt)?

Ciao,
mare_crisium

robvoi
12.02.2013, 10:12
Die Idee, die Sensorwerte auf PI und D zu verteilen finde ich gut. Muss man dann mal testen.

@mare_crisium

1. benutzt Du Deine bisherigen beiden Regler als getrennte Drehzahlregler (je einer pro Kette)?
Ja, je einer pro Kette. Ich hatte mal versucht, nur mit dem Error aus der Differenz der Drehzahlen zu arbeiten. Das hat aber nicht gut funktioniert.


2. welche Messwerte liefert der Kompass (den Winkel oder auch den cos und den sin des Winkels)?
Der Sensor ist eine 9DOF IMU.
Ich nutze folgende Firmware zur Auswertung: https://dev.qu.tu-berlin.de/projects/sf-razor-9dof-ahrs/wiki/Tutorial

Da bekomme ich dann Yaw, Roll und Pitch raus. Bzw auch die Rohdaten, da ich ja direkt Zugriff auf die Sensoren habe.


3. kannst Du Vektorrechnung (Skalarprodukt, Vektorprodukt)?
Habe ich mich noch nicht mit beschäftigt. Wenn es keine sinnvolle simple Alternative gibt, kann man sich natürlich einarbeiten.

Gruß
Robert

mare_crisium
12.02.2013, 11:13
robvoi,

ok, es geht auch ohne Vektoren, aber die Erklärungen werden schwieriger. Es lohnt sich auf alle Fälle, wenn Du Dich mal damit beshäftigst :-).

Gut, dass Du die Regelung mit der Differenz der Drehzahlen schon probiert hast, das ist für's regeln der Geradeausfahrt in einer bestimmten Richtung besser geeignet. Bevor wir an die Sache mit der IMU gehen, wär's gut, wenn Du das nochmal probierst.

Ich schlage vor, die Regelung folgendermassen aufzubauen:
Es gibt wieder zwei Regler: Einer regelt den Mittelwert der Drehzahlen, der andere die Differenz. D.h. der erste regelt die Fahrgeschwindigkeit, der andere die Drehgeschwindigkeit (nennen wir das lieber Wendegeschwindigkeit, sonst verwechselt man's zu leicht mit der Drehgeschwindigkeit der Antriebsräder).
Die Stellgrössen der beiden Regler müssen aber noch umgerechnet werden, bevor sie an den Motorsteller weitergegeben werden. Der eine Motorsteller bekommt die Stellgrösse von Fahrt- plus der Stellgrösse des Wendegeschwindigkeitsregler, der andere bekommt die Stellgrösse des Fahr- minus der Stellgrösse des Wendegeschwindigkeits-Reglers.
Du wirst sehen, so klappt's :-).

Ciao,

mare_crisium

robvoi
12.02.2013, 11:24
Super. So werde ich es mal probieren.
Es wird ein paar Tage dauern, da ich noch beim Umbau der Plattform bin. (und gestern den einen 5V Downstepper per Kurzschluss geröstet habe).

Ich melde mich dann, wenn die Tests durch sind. :-)

robvoi
22.02.2013, 14:37
Hallo,

- So, langsam bin ich soweit. Ich habe die Fahrgeschwindigkeit zum Anfang mal fest gesetzt. Die Wendegeschwindigkeit regelt ein PID Regler. Bei den Werten experimentiere ich noch. Er kommt zwar irgendwann in eine Geradeausfahrt, fährt aber trotzdem schräg vom Startpunkt weg, da er schon schräg ist, bevor der Regler den Ausgleich schafft. Mal schauen ob das überhaupt anders möglich ist. Sollte aber machbar sein. Ohne Regler fährt er fasst geradeaus.
Eigentlich müsste der Regler ja erstmal überkompensieren, um die Schrägfahrt auszugleichen. Oder mache ich dass über die Positionsberechnung (x/y vom Startpunkt)?

- Gibt es Erfahrungswerte, wie oft man bei einem solchen Szenario den Regler die Geschwindigkeit anpassen lässt? Alle 10ms nachzuregeln macht ja auch keinen Sinn.

Gruß
Robert

mare_crisium
23.02.2013, 08:33
Robvoi,

prima, dass Du schon so weit bist :-).

Fürs Einstellen der Regler werden Dir viele Leute alle möglichen Formeln vorschlagen (Ziegler-Nicols, Spungantwort auswerten usw.). Wenn's aber ohne alle Mathematik und zuverlässig gehen soll, dann gehst Du am Besten so vor:

Zuerst bringst Du die Regelparameter in die Grundeinstellung: Kp = 1, Ki = 0 (oder Integrationszeit = unendlich, Kd = 0). Jetzt lässt Du den Regler laufen und beobachtest, ob er die Regelabweichung wegregelt oder zu schwingen anfängt. Wenn er die Regelabweichung nicht wegregelt, dann verdoppelst Du den Kp-Parameter. Wenn er zu Schwingen anfängt, dann nimmst Du den Kp um die Hälfte des letzten Schrittes herunter. Also, wenn der letzte Verdopplungschritt eine Vergrösserung von Kp um +8 war, dann stellst Du ihn jetzt um 4 kleiner ein. So machst Du das immer weiter, bis Du eine Einstellung von Kp findest, bei der der Regler gerade so nicht mehr schwingt.

Dann beginnt dasselbe Spielchen mit Ki; nur darfst Du dabei Kp nicht verändern! Der Anfangswert ist Ki = 1. Wieder gucken, ob der Regler zu weit unter dem Sollwert bleibt (zu träge), oder schwingt (zu schnell). Ist er zu träge, dann Ki verdoppeln, ist er zu schnell, dann um die halbe letzte Schrittweite verkleinern. Auch diese Einstellerei ist beendet, wenn der Regler mit der gewünschten Geschwindigkeit und Genauigkeit den Sollwert erreicht, ohne zu lange zu schwingen. Ideal ist, wenn der Sollwert sehr genau erreicht wird und der Regler maximal einmal leicht überschwingt.

Anschliessend kannst Du versuchen, den Kp-Wert noch ein bisschen hochzukitzeln ohne Ki dabei zu verändern. Das Rezept für die Verstellung ist wieder dasselbe, wenn's anfängt zu schwingen, den letzten Schritt von Kp halbieren und abziehen.

Erst jetzt kommt Kd dran. Sehr oft braucht man gar keinen D-Anteil, um ein gutes Regelverhalten zu erreichen; im Gegenteil - sehr oft macht der D-Anteil eine Regelung eher instabil und nervös. Aber Ausprobieren kann nichts schaden: Die Methode ist wieder diesselbe: Kp und Ki werden nicht ver‰ndert, sondern nur Kd verdoppelt oder um die halbe Schrittweite verkleinert. Ziel ist wieder, Kd so einzustellen, dass der Regler den Sollwert erreicht und dabei nicht zu oft überschwingt (max. 1 bis 3 mal).

Abschliessend kannst Du, wenn Du jetzt noch die Nerven und den Überblick hast, zuerst Kp, dann Ki nocheinmal nachzujustieren. Apropos Überblick: Es empfiehlt sich, die Grösse (mit Vorzeichen!) und das Ergebnis jedes Einstellschrittes zu notieren, sonst kommt man unweigerlich ins Schleudern.

Wie oft der Regelalgorithmus laufen muss, musst Du auch ausprobieren. Wenn's Dein MC verträgt, lass' ihn ruhig erstmal mit 10ms laufen; Vergrössern kannst du das Intervall später immer noch.

Ciao,

mare_crisium

P.S.: Schick' mir doch eine Nachricht mit Deiner Mailady, dann kann ich Dir auch Zeichnungen schicken - hier im Forum geht das nicht, weil ich immer Schwierigkeiten mit dem Upload-Limit bekomme.

robvoi
26.02.2013, 07:50
Hallo mare_crisium,

danke für die super Informationen.

Nach zwei Stunden ohne Erfolg die Werte auch nur halbwegs stabil zu bekommen ist mir aufgefallen, dass ich Störungen bei den Messwerten auf einem der Encoder habe. Zum Glück scheint es an meiner Schaltung zu liegen. Wenn ich die Encoder direkt an den MC anschließe sind die Störungen praktisch bei null. Damit haben sich dann bei den ersten Tests auch gleich wesentlich bessere Werte eingestellt.
Ich werde jetzt also die Schaltung prüfen und wenn das nichts hilft die Encoder direkt an den MC anschließen. Bei der Gelegenheit habe ich auch noch gelesen, dass die Encoder besser per Timer Interrupt als per externem Interrupt ausgelesen werden. Bisher habe ich nur eine der beiden Datenleitungen direkt per externem Interrupt ausgelesen. Hat (bis auf die elektrische Störungen) gut funktioniert. Ich hadere noch mit mir, ob es die Änderungen wert sind auf zwei Datenleitungen und Timer Interrupt zu wechseln. Die Drehrichtung kenne ich und die Auflösung mit einer Datenleitung reicht mir eigentlich auch.

Eigentlich wollte ich ja mal zur Winkelgenauen Drehung kommen. Jetzt stecke ich wieder beim geradeaus fahren  Aber das muss ja zumindest erstmal stabil funktionieren.

Meine Mailadresse schicke ich dir. Danke für das Angebot.

Gruß
Robert

PICture
26.02.2013, 09:31
Hallo!


ich würde gerne eure Meinung zur Herangehensweise für die Integration eines Kompass in meinen PID Regelkreis hören.

Meine Meinung: ein PID Regler und ein Kompas haben nix gemeinsames und können nicht sinvol in einer Regelung von Motor verbunden werden. Sonst ist für mich dein Problem unklar beschrieben. ;)

robvoi
26.02.2013, 11:10
Hallo!
Meine Meinung: ein PID Regler und ein Kompas haben nix gemeinsames und können nicht sinvol in einer Regelung von Motor verbunden werden. Sonst ist für mich dein Problem unklar beschrieben. ;)
@PICture
Danke für dein Feedback.
Beispiel Geradeausfahrt: Die Abweichung von Soll/Start-Winkel zu Ist-Winkel ist der Input für den PID Regelkreis. Der Output Regelt den rechten und linken Motor (+/- Output) und steuert entsprechend gegen.

Warum das nicht gehen soll, verstehe ich nicht. Habs noch nicht probiert also...
Meine Frage war davon ausgegangen, dass das funktioniert. Ich wollte dann Encoder (encLeft-encRight) als Input mit dem Kompass kombinieren.

Gruß
Robert

Che Guevara
26.02.2013, 11:21
Hi,

hast du dich den schon mit der Datenfusion beschäftigt?
Ich mache momentan etwas sehr ähnliches, nämlich die Fusionierung von einem Gyro und einem Kompass.

Gruß
Chris

PICture
26.02.2013, 11:49
@ robvoi

Sorry, aber für mich Regelung vom Drehzahl eines Motors per PID Regler und Steuerung der Fahrrichtung per Kompas, nicht in einen Topf passen.

robvoi
26.02.2013, 11:54
Hi,
hast du dich den schon mit der Datenfusion beschäftigt?
Ich mache momentan etwas sehr ähnliches, nämlich die Fusionierung von einem Gyro und einem Kompass.
Gruß
Chris

@Chris

Nein, noch nicht. Aber sowas wird es wohl werden. mare_crisium hat schon in Richtung Vectoren gezeigt. Aber erstmal muss ich die Vorarbeit sauber hinbekommen. :-)
Guter Lesestoff schadet aber auch jetzt nicht :-)

Gruß
Robert

Che Guevara
26.02.2013, 12:02
Hi,

also ich werds wohl mit einem Komplementärfilter versuchen, der braucht nicht viel Rechenzeit und ist bei geeigneter Parametrisierung sehr zuverlässig.
Lesestoff hab ich keinen für dich, aber da sollte sich schon was finden lassen ;)

Gruß
Chris

mare_crisium
26.02.2013, 18:42
Robert,

wegen der Auswertung der Encoder kann ich Dir den Artikel
http://www.mikrocontroller.net/articles/Drehgeber/
sehr empfehlen. Da wird auch beschrieben, warum die Auswertung mit Timern praktischer ist, als die mit Flankeninterrupts.

Du hast schon recht es mit der Drehwinkelmessung sehr genau zu nehmen, denn darauf baut alles andere auf - und je wackliger dieses Fundament ist, desto mehr Zeit vertust Du dann später beim Fehlersuchen und -reparieren.

Ciao,

mare_crisium