Implementierung des PID-Algorithmus mithilfe von Computer Vision


10

Ich konstruiere einen automatischen Labyrinth-Labyrinthlöser und verwende eine Webcam, um mein Labyrinth zu steuern.

Aufgrund von Vorschlägen in anderen Foren versuche ich derzeit, die Ballbewegung des Labyrinths mindestens in eine Richtung zu steuern. Ich versuche also, meine Ballbewegung zwischen zwei Koordinaten 466.288 und 466.152 zu steuern. Die Eingabe in die Schrittmotor-Steuerplatine ist die Zeit, keine Anzahl von Schritten, die für jede Achse gedreht werden müssen, dh x und y.

Die von mir verwendete Schrittmotor-Steuerplatine ist die Steppmotor-Steuerplatine für Eierbot: http://www.sparkfun.com/products/10025

Um zwischen zwei Punkten zu wechseln, sollte ich eine Reihe von Wegpunkten zwischen den beiden Punkten erstellen, nämlich 288 und 152 (z. B. 260 240 230 ... 150), und meine Ballbewegung korrigieren?

Mein Bildverarbeitungsalgorithmus ist nicht schnell genug, um den Ball so zu verfolgen, dass sich der Ball nur dreht und in ein Loch fällt.

Einige schlugen vor, dass ich eine Standardvorlage verwende, wie im folgenden Video gezeigt, und meine Ballbewegungen auf Abweichungen im Pfad korrigiere:

http://www.youtube.com/watch?v=Prq78ctJ2Rk&feature=player_embedded

Ich bin auch auf ein Bildverarbeitungswerkzeug gestoßen, bei dem das gleiche Problem mithilfe von Wegpunkten für die Ballbewegung gelöst wurde. Da ich zu viele Lösungen für dasselbe Problem sehe, bin ich völlig verwirrt, wenn es darum geht, das Problem zu lösen. Mir ist bewusst, dass ich einen PID-Regler implementieren sollte. Aber wie soll ich die Probleme schrittweise lösen? Ich stecke fest und bin nur frustriert, einen Vorsprung bei der Lösung des Problems zu finden.

Mein Setup sieht folgendermaßen aus:

Bild des Setups

... und hier ist ein Screenshot meiner Software:

Bildschirmfoto

Revision 2: Ich stehe jetzt auch vor einem neuen Problem: Früher habe ich die Schrittmotoren über das Java-Applet der seriellen Arduino-Schnittstelle gesteuert. Ich kann die Stepper mit dem Applet fahren.

Ich muss die Karte jedes Mal zurücksetzen, wenn ich versuche, über die serielle Schnittstelle zu kommunizieren. Außerdem schaltet sich der Schrittmotor in kleinen Intervallen ein, wenn kein Befehl an ihn gesendet wird. Wenn der Schrittmotor in diesen Modus wechselt, kann ich meine Karte nicht steuern, ohne die Karte zurückzusetzen. Jede Unterstützung wäre dankbar.

Revision 3:

Ich habe einige Fortschritte gemacht, als ich den PID-Algorithmus implementiert habe. Das Video finden Sie unten: http://www.youtube.com/watch?v=MEfp7RqPmqY

Jetzt habe ich ein Problem mit der Geschwindigkeit, mit der der PID-Algorithmus implementiert wird. Tatsächlich beendet meine Bildverarbeitung einen Zyklus in 200 ms, identifiziert eine Kugel und sendet die Befehle an die Schrittmotor-Steuerplatine. Obwohl meine serielle Schnittstelle Befehle zum Umschalten der Richtung erhält, dreht sich mein Stepper weiter in die gleiche Richtung. Sie finden das seltsame Verhalten im Video oben.

Mein Gedanke ist, dass ich die PID-Werte mit einer Obergrenze einschränken sollte. Wenn der berechnete PID-Wert größer als 100 ist, sollte ich einfach eine 100 senden. Ich freue mich darauf, Ihre Gedanken dazu zu hören.

Die Art und Weise, wie ich den PID-Regler implementiert habe, besteht darin, dass ich den Startpunkt der Vorlage mithilfe des Vorlagenanpassungsalgorithmus identifiziert und den Ball mithilfe eines anderen Vorlagenanpassungsalgorithmus identifiziert habe. Jetzt habe ich den Ball zum Schwerpunkt der Startpunktvorlage bewegt. Wie kann ich mit dem PID-Algorithmus der geraden Linie folgen?

Revision 4:

Blob-Flugbahn isoliert

Ich habe die Flugbahn isoliert, kann jedoch nicht die richtige Funktion zum Drucken der richtigen Pixelkoordinaten vom Startpunkt aus finden. Irgendwelche Gedanken?


1
Zu PS: Dann
poste

@ Matt - Behoben! Ich würde es jedoch vorziehen, wenn der Benutzer den Text zu den Bildern bereitstellt, nicht nur die Links zu den Bildern. Ich bin mir nicht sicher, wo @Sai sie haben wollte, ich habe sie einfach unten platziert.
Kevin Vermeer

Wow ... Haben diese Stepper irgendwo genug Drehmoment, um das Board mit irgendeiner Geschwindigkeit zu bewegen? Ich hoffe, dass es irgendwo eine Untersetzung gibt.
Connor Wolf

@Fake - Die Stepper sollten damit kein Problem haben. Das Board wiegt nicht viel und sein Gewicht ist ausgeglichen. Ich habe eine Wanduhr mit 40 cm langen Zeigern, die von demselben kleinen Mechanismus wie jeder andere gesteuert wird. Das ist auch ein Stepper. (Der 5cmx5cm Mechanismus sieht im Vergleich zum 80cm Durchmesser der Uhr lächerlich klein aus)
Stevenvh

@Fake: Steve hat recht. Ich habe kein Problem mit dem Stepper. Es dreht sich alles um den PID-Algorithmus
Sai

Antworten:


2

Erstens sollten Sie, da Stepper hervorragend positionieren können (es ist keine Positionsrückmeldung erforderlich), ihre Bewegung auf jeden Fall einschränken, wie Sie selbst gesagt haben. Ich bin mir nicht sicher, wie die Motorwelle derzeit konstruiert ist, aber wenn sie am Motor befestigt wäre, könnte die Ausrüstung beschädigt werden, wenn sie sich weiter dreht.

Als nächstes ist die Transportverzögerung von 200 ms in Ihrem Sensor wahrscheinlich zu langsam, andernfalls müssen Sie die Dinge stark verlangsamen, um den Ball selbst zu verlangsamen. Ähnlich wie bei Rocket Surgeon sollten Sie den Bildverarbeitungsalgorithmus vereinfachen, um den Pfad nur einmal zu berechnen , und dann schnell nur die Position des Balls in jedem Frame berechnen. Wenn Sie diesen Schritt schnell überspringen möchten, suchen Sie eine rote Kugel anstelle dieser und überprüfen Sie dann nur die rote Komponente in Ihrem RGB-Bild, bis Sie einen besseren Algorithmus gefunden haben.

Beginnen Sie für die PID-Regelung mit der Tatsache, dass Sie tatsächlich zwei separate PID-Regler benötigen, einen für den Ost-West-Motor und einen für den Nord-Süd-Motor. Wenn Sie zwei exakte Motoren haben, müssen deren Parameter gleich sein.

Damit ein PID-Regler funktioniert, muss er den Fehler kennen : die Differenz zwischen der gewünschten Position und der tatsächlichen Position der Kugel. X- und Y-Komponenten dieses Offsets sind die Eingänge für zwei PID-Regler (einer für jeden Motor). Um den Fehler zu erhalten, müssen Sie zuerst die gewünschte Position auf Ihrem Pfad haben: eine Flugbahn .

Um die Flugbahn zu erhalten, müssen Sie das Bild verarbeiten und den Pfad sowie den Start- und Endpunkt ermitteln. Ich bin mir nicht sicher, ob Ihr Algorithmus derzeit in der Lage ist, den Pfad vom Rest der Karte zu unterscheiden. Wenn nicht, beachten Sie, dass dies ein eigener Algorithmus ist, bevor Sie fortfahren. Sie können diesen Teil wieder überspringen, indem Sie die Verbindungspunkte manuell eingeben, wenn Sie schnell einige Ergebnisse sehen möchten. In jedem Fall sollten Sie in der Lage sein, die Sollgeschwindigkeit zu definieren und Ihre Software die gewünschte Koordinatenposition vom Anfang bis zum Ende über den Pfad verschieben zu lassen. Offensichtlich beginnen Sie mit einer niedrigen gewünschten Geschwindigkeit.

Bevor Sie mit der Kontrolle beginnen, sollten Sie zunächst die folgende Checkliste durchgehen:

  • Vereinfachen Sie Ihren Bildverarbeitungsalgorithmus, um eine schnellere Antwort zu erhalten
  • Erstellen Sie einen Algorithmus, der mit einer vordefinierten Geschwindigkeit eine Flugbahn über Ihren Pfad erstellt
  • In jedem Frame:
    • Berechnen Sie die Differenz zwischen der Flugbahn und der Ballposition
    • Übergeben Sie die Delta-X-Komponente an die Ost-West-PID und das Delta-Y an die Nord-Süd-PID

Es kann sich herausstellen, dass es besser ist, die Flugbahn segmentweise zu erstellen und mit dem nächsten Segment fortzufahren, wenn dieser Ball das vorherige beendet. Andernfalls müssen Sie darauf achten, dass der Ball die gewünschte Flugbahn nicht überschreitet (was möglicherweise schwer zu erreichen ist).


1

Wenn Sie für beide Achsen eine feste Position für die Kamera- und Momentablesung haben, müssen Sie gemalte Pfade, Löcher und Wände in Rahmen nicht erkennen. Dies kann während der Rüstzeit einmalig durchgeführt werden. Zur Laufzeit müssen Sie möglicherweise nur die genaue Position der einzelnen glänzenden Metallkugel erkennen.

Um den Ball zu erkennen, können Sie 1 IR-LED mit festem Punkt und einen Schmalbandfilter an der Kamera verwenden. Der Algorithmus muss das hellste Pixel berechnen und X, Y in reales X, Y übersetzen, wobei folgende Schritte berücksichtigt werden:

  • finde das hellste Pixel
  • Verwenden Sie den Winkel für beide Achsen (Ablesen vom Servo), um den Abstand zur Kamera wiederherzustellen
  • Verwenden Sie den Zeitstempel zum Ablesen der Achsposition
  • Wenden Sie bei Bedarf eine zeitliche Interpolation zum Positionslesen an
  • Verwenden Sie bekannte Verzerrungen der Linse
  • Übersetzen Sie die Welt X, Y des Pixels in den Reflexionswinkel von der perfekten Kugel, um das wahre Zentrum der Kugel in der Welt X, Y zu finden
  • Delta-Zeit, um die wahre Zeit des Rahmens wiederherzustellen
  • Interpolation der Position der Position in der Platinenebene X, Y, falls erforderlich
  • Senden Sie das Ergebnis X, Y (t) an den PID-Algorithmus
  • Senden Sie das zweite Feed-Ziel X, Y (t) vom Trajektoriengenerator / der Trajektoriensequenz
  • Lassen Sie PID über die Ausgabe entscheiden
  • Ausgabe ausführen (letzte Schritte können parallel ausgeführt werden)

Es sollte nicht rechenintensiv sein und hängt hauptsächlich von einigen absoluten Werten ab.

Normalerweise sollte eine kleine CPU dies mit der Geschwindigkeit der Bildrate tun.


Ich bin nicht sicher, ob ich Ihre Lösung verstehe. Ich finde Ihre Lösung interessant. Wie stelle ich sicher, dass mein Ball dem richtigen Weg folgt? Sollte ich sicherstellen, dass ich eine Reihe von Wegpunkten habe, denen ich folgen kann?
Sai

Ja. Die Bewegungssteuerungssoftware muss immer einen "Trajektoriengenerator" haben, eine Routine, die für jeden gegebenen Zeitschritt eine ideale endliche Folge von X, Y (t) erzeugt. Diese Sequenz wird dem ersten Eingang des Regelkreises zugeführt, der zweite Eingang des Regelkreises ist eine Folge von realen Positionen. Die Steuerroutine muss Positions- / Geschwindigkeits- / Beschleunigungsfehler berechnen und alle Fehler entsprechend der PID verstärken / summieren und resultierende Korrektursignale erzeugen.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.