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:
... und hier ist ein Screenshot meiner Software:
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:
Ich habe die Flugbahn isoliert, kann jedoch nicht die richtige Funktion zum Drucken der richtigen Pixelkoordinaten vom Startpunkt aus finden. Irgendwelche Gedanken?
Antworten:
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:
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).
quelle
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:
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.
quelle