Wie haben wir einen Fußballroboter gebaut?

Am 25. November 2012 fand in Tallinn der größte Roboterwettbewerb im Baltikum statt - Robotex. Wir haben uns entschieden, einen Roboter in der Kategorie Profifußball zu bauen. Natürlich wird dies nicht Cristiano Ronaldo sein, aber die Herausforderung ist interessant. Ich werde die Details der Erstellung und Programmierung eines Roboters beschreiben. Er heißt Palmer.

Der Fußball selbst findet auf einer Grünfläche statt, auf der sich 11 orangefarbene Golfbälle befinden. Es gibt ein 15 cm hohes und ca. 37 cm breites Tor, das auf der einen Seite gelb und auf der anderen blau ist. Der Roboter muss auf dem Spielfeld nach Bällen suchen, diese greifen, das gewünschte Tor auswählen und Punkte erzielen. Es gibt zwei Roboter auf dem Feld. Derjenige, der die meisten Tore erzielt, gewinnt. Technische Voraussetzungen für den Roboter: ein Zylinder mit einer Höhe von 35 cm und einem Durchmesser von 35 cm. Alles ist einfach.

Nachdem wir die Details besprochen hatten, kamen ein paar Kisten Bier zu dieser Konfiguration. An Bord ist ein Mini-Motherboard mit Atom-Prozessor. Vorteile - keine Kühlung und separate Stromversorgung erforderlich, kompakt. Nachteile bzw. niedrige Produktivität. Das Bild wird von der Kamera der Sony Playstation 3 aufgenommen, der idealen Kamera für Preis und Qualität. Die Bildrate ist kritisch, da die maximal mögliche Geschwindigkeit des Roboters davon abhängt. Bei einer Frequenz von 30 Bildern pro Sekunde und einer Robotergeschwindigkeit von 3 Metern pro Sekunde bewegt er sich beispielsweise zwischen zwei 10-cm-Bildern, was für die Genauigkeit der Ballerfassung eindeutig nicht ausreicht. PS3 liefert bis zu 125 Bilder pro Sekunde. Der Kameratreiber passt gut in den Linux-Kernel. Ubuntu USB bootfähiges Betriebssystem. Zur Erkennung von Bildern wird der Favorit OpenCV verwendet.

Zusätzlich zur Kamera werden IR-Sensoren und Beacons verwendet, um die umliegende Welt zu erkunden. Infrarotsensoren vermeiden Kollisionen mit einem anderen Roboter oder Tor. Stromversorgung - Eine Lithiumbatterie mit einer Leistungsreduzierung von 14,8 V auf 12 V für das Motherboard. Stromversorgung für LiPo-Motorbatterien (2x 4S 14,8V 2200mAh + 2x 2S 7,4V ~ 2000mAh). Separate Stromversorgung für Motoren wird verwendet, da beim Starten der Motoren ein starker Spannungsabfall in der Schaltung auftritt, der wiederum den Mikrocontroller zurücksetzen kann. Ja, und ein separates Netzteil ermöglicht es Ihnen, hochfrequente Geräusche von den Motoren zu entfernen, wodurch auch der Mikrocontroller gestört wird. Es gibt zwei Arten von Kondensatoren in der Schaltung, einige gleichen Spannungsabfälle aus, andere glätten hochfrequentes Rauschen schneller aus. Breitbandgeräusche entstehen beim Zünden der Motorbürsten, die entlang der Kette schaltet Mikrocontroller aus. Um dieses Problem zu lösen, wird eine H-Brücke mit optischen Unterbrechern verwendet. Die H-Brücke ist eine Relaisbrücke, mit deren Hilfe Sie die Polarität des Stroms an den Motoren ändern können, ohne dass die Gefahr eines Kurzschlusses besteht. Signale, die sich der Brücke nähern, werden durch optische Zerhacker geleitet. Optische Unterbrecher unterbrechen das Netzwerk, und die Motorgeräusche gelangen nicht in den Steuerungskreis. Sie bestehen aus einer LED und einer Fotozelle in einem Gehäuse, d.h. Der Stromkreis ist offen, aber die Signale gehen. Solche Brücken werden zur Kontrolle von allem eingesetzt. Wir stellen selbst Bretter für die Brücke her. Motorengeräusche gelangen nicht in den Regelkreis. Sie bestehen aus einer LED und einer Fotozelle in einem Gehäuse, d.h. Der Stromkreis ist offen, aber die Signale gehen. Solche Brücken werden zur Kontrolle von allem eingesetzt. Wir stellen selbst Bretter für die Brücke her. Motorengeräusche gelangen nicht in den Regelkreis. Sie bestehen aus einer LED und einer Fotozelle in einem Gehäuse, d.h. Der Stromkreis ist offen, aber die Signale gehen. Solche Brücken werden zur Kontrolle von allem eingesetzt. Wir stellen selbst Bretter für die Brücke her.

Zum Schlagen der Kugel wird ein Magnet verwendet, der einen eigenen Kondensatorblock parallel geschaltet hat, um einen großen Impuls zu erzeugen. Eine separate Batterie dient zum Betreiben des Solenoids.

Bild

Weiter im Kit sind Elektrolytkondensatoren zur Spannungsstabilisierung und Keramikkondensatoren und Ferritringe zur Bekämpfung des allgegenwärtigen Rauschens, da alles laut ist. Und es gibt so kleine Dinge wie einen Rahmen, Räder, Motoren, Bolzen und andere Zahnräder. Und hier ist der Anfang.

Bild

Und in ein paar Tagen.

Bild

Mechaniker und Elektronik versammelten sich ununterbrochen und arbeiteten manchmal nachts. Der Code wurde parallel mit C ++ und als Qt-Entwicklungsumgebung geschrieben. Ein Roboter ist ein klassischer abstrakter Automat mit einer Reihe von Zuständen (ein Ball wird gefunden, eine Bewegung, eine Zielsuche oder ein Ziel wird gefunden, eine Rakete wird zielgerichtet). Dabei spielt es keine Rolle, ob es sich um einen Militärroboter, einen Spielzeugroboter oder einen Industrieroboter handelt. Das Problem ist, dass es so wenige Staaten wie möglich und so viele wie nötig geben sollte. Wenn der Algorithmus zu verwirrend ist, werden Sie irgendwann nicht verstehen, warum der Roboter auf diese Weise reagiert. Wir haben die Zustände 8: Starten, Auf der Suche nach dem Ball, Auf der Suche nach den Toren, Zielen, Ausweichen von Hindernissen, Aufladen der Kondensatoren des Solenoids, Aufprall, Endgültig. Übergänge zwischen ihnen bilden einen Graphen, der der Algorithmus ist.

Die meiste Zeit wird für das Schreiben und Debuggen des Codes, Testen und Kalibrieren aufgewendet. Welches ist eigentlich das Wichtigste.

Die Erkennung des Roboters in getrennten Klassen ist so aufgebaut. Jeder Frame wird einer Verarbeitung unterzogen, bei der die Farben zuerst von RGB in HSL konvertiert werden, was unserer Wahrnehmung näher kommt und das Arbeiten angenehmer macht. Zur Vereinfachung der Konvertierung wird die integrierte OpenCV-Funktion nicht verwendet, da die Konvertierung eine Berechnung ist und so viel Zeit in Anspruch nimmt, sondern eine vorberechnete Farbtabelle (Lookup-Tabelle), in der der RGB-Wert zum Abrufen des Offsets in der Tabelle verwendet wird. Anschließend wird die Farbe anhand der Adresse ausgewählt. Wir gewinnen an Geschwindigkeit, wir verlieren an Gedächtnis, alles ist wie in der Theorie. Als nächstes werden Objekte (Bälle, Tore) nacheinander gesucht und in die Liste geschrieben. Objekte werden nach dem allgemeinen Algorithmus gesucht, jedes Pixel wird in einem Zyklus abgearbeitet, und wenn es in den Farbbereich des Objekts fällt, wird ein Bit auf die Karte gesetzt. Das Ergebnis ist eine Bitmap-Karte mit ausgewählten Objekten. Die Bitmap-Karte wird an den Eingang der OpenCV-Funktion gesendet, die eine Liste von Schaltkreisen zurückgibt. Als nächstes finden wir die Fläche der Konturen und wenn die Fläche der Konturen mehr als 40-50% der Fläche des Kreises (Rechteck) oder im 4 / Pi-Bereich ist, betrachten wir dieses Objekt als erkannt und fügen es der Liste hinzu. Bälle werden in einem bestimmten Bereich gesucht (kleines Rauschen, es gibt kein großes, es macht auch keinen Sinn, nach Bällen an der Decke zu suchen). Da die Kamera bis zu 125 Bilder pro Sekunde produziert, können Sie einige der in OpenCV integrierten Funktionen nicht verwenden. Sie sind lang, aber die Bibliothek ist bequem angeordnet und Sie können die gesamte Matrix durch Zeiger durchlaufen. Es bleibt zu prüfen, ob der Ball über den Feldrand gerollt ist (begrenzt auf Schwarz), da der Roboter die schwarze Linie nicht überschreiten darf. Die Prüfung ist ganz einfach. Zeichnen Sie eine Linie von der Mitte des unteren Bereichs des Bilds zum Ball und prüfen Sie, ob dieser den schwarzen Bereich überquert.

Weiter ist das interessanteste. Der Roboter hat eine bestimmte Anzahl von Bedingungen, in die er abhängig von den Bedingungen eintritt. Das ist einfach. Der Algorithmus wird genau zu diesem Zeitpunkt geschrieben. Der schwierigste Teil ist die Kalibrierung. Wie kann man aus den erhaltenen Objekten und ihren Koordinaten eine Funktion von Geschwindigkeit, Richtung aufbauen?

Wir durchlaufen die gesamte Liste und finden den flächenmäßig größten Ball. Dies ist der nächste. Um die Funktion von Geschwindigkeit und Richtung aus den Koordinaten des Objekts zu erhalten, müssen Sie einen Matan denken und rauchen. Je höher die Koordinaten des Balls im Bild sind und je kleiner er in der Fläche ist, desto weiter ist er. Je weiter die Verschiebung entlang der X-Achse und je weiter die Verschiebung entlang der X-Achse erfolgt, desto spitzer ist der stumpfe Winkel. Um die Koeffizienten zu erhalten, wird der Roboter an einem Ende in der Mitte auf die Plattform gestellt, dann beginnt der Prozess des Kriechens mit einem Maßband, Messen von Punkten mit einem bestimmten Schritt (33 cm) und Ablesen der Werte des Objekts im Erkennungssystem (Konturbereich). Wir wenden Werte an und versuchen, eine Funktion zu finden, die die Verbindung einiger Werte mit anderen darstellt. Eine hohe Genauigkeit ist nicht erforderlich, da der Roboter den Pfad nicht ein für alle Mal erstellt, sondern sich selbst 17 bis 18 Mal pro Sekunde korrigiert. So viel ist unser kleines System. Das heißt Wir müssen eine Funktion finden, deren Grenze zu den gewünschten Ergebnissen mit kleinen Änderungen in den Argumenten tendiert. Dann werden den Rädern der Winkel und die Richtung zugeführt, von wo aus die Geschwindigkeiten durch die einfachsten Vektorgleichungen berechnet werden. Die Abbildung wird erklären.

Bild

Wenn wir uns zu Objekten bewegen können, ist es nicht so schwierig, einen Fußballspielalgorithmus zu schreiben. Und jetzt ist es nah an der Konkurrenz. Mein recht.

Bild

Ergebnis in Aktion:



Am Samstagabend sind wir bereits in eine Sporthalle umgezogen, in der Wettbewerbe stattfinden. Nachts war es großartig, mein Freundeskreis, verschiedene Clubs und Labors aus verschiedenen Ländern. Ein Haufen Leute. Niemand schläft. Alle kommunizieren miteinander und interessieren sich für alles, was möglich ist. Ich selbst habe 2,5 Stunden geschlafen. Und die ganze Zeit wurde gestimmt. Als zum ersten Mal teilnehmender Mensch wusste er nichts über die Feinheiten und Probleme, die auftreten.

Vor allem ist es unmöglich, alles zu berechnen, und der Schwerpunkt liegt auf dem Testen. Wer länger testet und bringt, der und der Haupt. Nehmen wir an, es ist besser, nicht mit dem ganzen Roboter zu drehen, und der Roboter sollte sich um den Ball drehen, weil Wenn der Roboter den Ball dreht, wird der Impuls des Roboters zum Ball addiert, und wenn er auf kurze Distanz geschlagen werden kann und der Fehler nicht signifikant ist, ist die lineare Geschwindigkeit des Ziels relativ zum Roboter groß und das Schussmoment sollte noch proaktiver sein. Hier treten die Probleme auf. Die erste ist, dass Sie nicht wissen, welche Drehzahl der Roboter zuvor hatte. Das heißt, wenn der Roboter in einem Winkel von Blei direkt auf den Ball fährt, schlägt er sofort und durch, weil er keine Rotation hatte. Oder umgekehrt - es nähert sich dem Ball von einer Drehung in die andere Richtung, beginnt sich zu drehen und zu schlagen, aber es ist vorbei. da aufgrund der Trägheit seine Drehzahl noch nicht berechnet wird. Das heißt zu viele Optionen zum Überlegen. Wenn Sie sich um die Achse des Balls drehen, entsteht kein Drehimpuls, und Sie können sofort schießen.

Das zweite ist das Erkennungsproblem. Wenn sich der Roboter dreht, haben die Bälle und Tore über große Entfernungen wieder eine große lineare Geschwindigkeit, und der Rahmen für die Erkennung ist verschwommen. Die Kontursuchfunktion arbeitet nach Verläufen, aber die eingefetteten Tore haben keine deutlichen Verläufe, und daher entstehen am Ausgang Dutzende von Konturen (dies frisst Ressourcen) oder es passiert nichts (der Ball wird zu einem kleinen orangefarbenen Nebel verschmiert). Ich hatte 17 Bilder pro Sekunde am Eingang bzw. entfernte Objekte während der Rotation standen mir nicht zur Verfügung. Plus eine Verzögerung in der Verarbeitung. Das heißt Wenn der Roboter versteht, dass es Tore in der Ferne gibt, sind sie noch nicht da (obwohl ich es zu meinem Vorteil ausgenutzt habe, als ich von meinen Toren aus rotiert habe, und die Verzögerung war nur so groß, dass mein Roboter sich fast den feindlichen Toren zugewandt hat).

Eine der Lösungen, die unser anderes Team verwendete, bestand darin, das Bild zu schneiden, d. H. Wenn wir den Ball sehen, dann beginnen wir, den Überschuss zu schneiden, ihn zu zentrieren und die Seiten zu schneiden und ihn wegzuwerfen, der FPS springt auf 60. Dieselbe Logik und wenn wir das Ziel erkennen, besonders wenn wir suchen, wird der untere Teil nicht benötigt, wir schneiden ihn.

Ich hatte eine andere Kamera und es würde Probleme mit den Scheiben geben. Gute Lösung mit zwei Kameras. Ein Weitwinkel, sieht Richtungen und gibt einen Überblick. Das zweite Gegenteil gibt Abstand und sieht weit.

Um das Problem der Roboterdrehungen zu lösen, benutzte ich einen Stopp, wenn er nach ein paar Sekunden während der Drehung nichts fand. Die Haltestelle gibt Ihnen die Möglichkeit, weiter zu schauen, aber in einem Winkel von 60 Grad, der von unserer Kamera ausgegeben wurde. Dann erneut suchen.

Meine zweite Auslassung ist, dass ich nicht wusste, dass Roboter aus der rechten Ecke starten würden. Der Roboter muss sich merken, auf welcher Seite des feindlichen Tors und wo er abbiegen soll, da sonst die falsche Abbiegung viel Zeit in Anspruch nimmt. Ich habe die Seiten des Tors anhand der Farbe bestimmt, aber bis das Tor im Sichtfeld erschien, wurde die Richtungsmultiplikatorvariable (plus oder minus eins setzt die Drehrichtung) standardmäßig auf -1 gegen den Uhrzeigersinn gesetzt, aber dies war im Uhrzeigersinn erforderlich. Aus diesem Grund haben wir in einem verlorenen Spiel die ersten beiden Tore erzielt und Zeit verloren. Das Ergebnis ist 6-4 und beim zweiten Unentschieden 5-5 und unser Verlust. 5. Platz von 18 Mannschaften. Der hohe Schwerpunkt war immer noch im Weg und beschleunigte nicht - er beginnt zu tanzen. Ich habe seinen Drucker genannt.

Im Allgemeinen gibt es viele Nuancen. Ich erinnere mich an eine interessante Party. Und der Rhythmus. Das heißt Geschwindigkeit und ständige Weiterentwicklung der Maschinen. Nach jedem Spiel. Mit dem Champion haben wir 4-3 gespielt! (Verteidigungstaktik, die Tore geschlossen und aus der Ferne getroffen). Das erste Einzelspiel, das wir beim Wettbewerb hatten! Daher die Unfähigkeit, die Verhaltensstrategie zu testen. Eine Woche lang folgten uns Pannen. Außerdem ist unsere Kamera vom rechten Weg abgekommen (Achse), ich habe versucht, die Probleme der Mechanik mit einem Code zu lösen, der niemals gemacht werden sollte, aber es gab keine Zeit und erst vor dem letzten Spiel habe ich alles entschieden. Insgesamt haben wir 4 Spiele gespielt.
Der erste wurde von einem Roboterwürfel gewonnen.

Bild

In der zweiten Runde gewannen sie das Skype-Team, das einen sehr interessanten Roboter hatte. Wahnsinnig schnell, klein, mit 8 Kameras und FPGA! Das heißt, sie haben etwas getan, das überhaupt nicht funktionieren sollte. Er flog schnell raus, war aber charmant. Da ist er.

Bild

Es gab sehr interessante Lösungen. Der Roboter, der den ersten Platz belegte (3 Jahre Entwicklungszeit), hat eine 360-Grad-Ansicht. Die Kamera schaut auf einen kegelförmigen Spiegel. Das Bild wird in Polarkoordinaten angezeigt.

Bild

Und um alles zu berechnen, gibt es in den Anmerkungen von Roboteks eine Geschichte, über die alle ständig lachen.

Vor ungefähr 5 Jahren kamen zwei Meister zum Wettbewerb und sagten, dass sie alle einen Roboter entwickelt und gebaut hätten. Sie wurden von einer Explosion des Lachens getroffen. Und die anschließende Niederlage.

Vielen Dank für Ihre Aufmerksamkeit.

Jetzt auch beliebt: