B-Human

Das Projekt B-Human nimmt seit 2009 an den Roboterfußballwettbewerben des RoboCup und dessen regionalen Ablegern in der Standard Platform League teil. In dieser verwenden sämtliche Teams den humanoiden Roboter Nao der Firma SoftBank Robotics, um gleiche Hardwarevoraussetzungen zu gewährleisten. Somit konzentriert sich die Arbeit des Projektes vornehmlich darauf, die Software der Roboter weiterzuentwickeln und zu verbessern. Dies umfasst diverse verschiedene Aufgabenfelder, unter anderem Bilderkennung, Lokalisierung sowie autonome Agenten. Dem Projekt B-Human gelang es, aufbauend auf der Software der Vorgänger, bisher neunmal die RoboCup GermanOpen für sich zu entscheiden. Auch international ist B-Human äußerst erfolgreich: Insgesamt konnten wir sieben Weltmeistertitel nach Hause bringen, den letzten 2019 aus Sydney.

Aufgrund der diesjährigen Corona-Pandemie und den damit einhergehenden Kontaktbeschränkungen, musste der Robocup für dieses Jahr leider abgesagt werden. Die German Open in Magdeburg wurden in den Spetember verschoben. Da leider auch der Projekttag nur digital stattfinden kann, haben wir stattdessen ein paar Videos für euch gedreht, welche einen Einblick in die diversen Tätigkeitsbereiche des Projektes geben sollen. Wenn ihr Interesse habt, könnt ihr euch auf unserem Kanal auch richtige Fußballmatches anschauen, die wir bei vergangenen Wettbewerben aufgenommen haben.

Torpfostenerkennung

von Alpay Yildiray

Obwohl unsere Roboter bereits Objekte wie Gegner, Feldlinien, den Ball selbst und Hindernisse erkennen können fehlt ihnen nach wie vor die Fähigkeit Torpfosten zu erkennen. Ganz intuitiv hört sich das wie eine triviale Aufgabe an, letztendlich stehen die Torpfosten doch sowieso immer an der gleichen Stelle und wir wissen ja bereits recht genau wo wir uns auf dem Feld befinden, doch in der Praxis ist es oft gar nicht so einfach herauszufinden wo sich nun das Tor und der Roboter selbst befindet, besonders wenn man sich in Tornähe bewegt. Hier sind oft kaum Feldlinien und Feldlinienkreuzungen sichtbar und andere Roboter schränken die Sicht auf das Geschehen sehr ein. In solchen Situationen Torpfosten erkennen zu können, würde dem Roboter Referenzpunkte zur Selbstlokalisierung geben und beim Torschuss das Navigieren um den Torpfosten ermöglichen ohne versehentlich dagegen zu laufen und damit dem Gegner die Chance zu geben den Ball zu klären.

Jedoch sind Torpfosten oft gar nicht so einfach zu erkennen. Der Großteil eines Torpfostens ragt über den Feldrand hinaus und je nach Spielort und Feld kann es sein, dass hinter dem Feld Menschen oder andere Objekte stehen und manchmal ist das Feld sogar von weißen Barrikaden umrundet, die den Torpfosten für die niedrig auflösenden Kameras des Roboters fast unsichtbar machen. Auch können Arme und Beine von anderen Robotern oft fälschlicherweise als Torpfosten erkannt werden, da sie in Kameranähe wie große, Säulen-ähnliche Gebilde erscheinen. Eine Reihe von Filtern und das Betrachten des Bildes in unterschiedlichen Repräsentationen und Nachbearbeitungseffekten hat es jedoch ermöglicht diese Falscherkennungen fast vollständig auszuschließen.

Verbesserung der Armkontakterkennung

von Lukas Rust

Die Möglichkeit zur Erkennung von Armkontakten, wenn der Roboter mit diesen gegen Hindernisse stößt, verleiht einem Roboterfußballteam mit einer solchen Funktion einen erheblichen Wettkampfvorteil. Im Zweikampf stoßen die Arme des Roboters ständig gegen den gegnerischen Roboter. Falls es keine Möglichkeit zur Armerkennung gibt, schubst der Roboter seinen Kontrahenten dabei und man muss viele Strafen gegen die eigenen Roboter in Kauf nehmen. Die Erkennung von Armkontakten impliziert auch immer die Erkennung von Hindernissen und damit Robotern in direkter Nähe zum Roboter. Es geht bei diesem Modul also auch um Informationsgewinn.

Grundsätzlich ist die Idee einen Armfehler aus der Differenz zwischen Soll-, also der angestrebten Handposition, und der Ist-Position, also der momentan gemessenen zu berechnen. Wenn dieser Wert einen Grenzwert für eine gewisse Zeit überschreitet, wird ein Armkontakt als erkannt angesehen. Die Fehler der Armpositionen entstehen jedoch auch ohne Einfluss eines Hindernisses. Die Herausforderung besteht also darin, die Fehler, die ohne Einfluss entstehen, zu prognostizieren und heraus zu filtern. Lockere oder sogar lose Gelenke des Roboters sind dabei immer der Ursprung des Fehlers. Es lässt sich feststellen, dass die Gelenke dabei immer ein wenig nach unten fallen, beim Laufen besonders stark wackeln und dass die Richtung des Fehlers natürlich stark mit der Laufrichtung des Roboters korreliert. Diese Zusammenhänge versuchte ich in meinem Modul zu nutzen, um zuverlässig zwischen Fehler durch Hindernisse und Fehler durch Ungenauigkeiten der Gelenke zu unterscheiden und somit Armkontakte sicher aber dennoch sensibel zu erkennen.

Verbesserung der Kopfsteuerung

von Johanna Tholen

Bei der Kopfsteuerung ist wichtig immer einen guten Überblick übers Feld zu haben und immer die wichtigsten Punkte anzuschauen. Hierbei kann man einmal betrachten in was für einer Verhaltenssituation sich der Roboter befindet (z.B. der Roboter geht zum Ball und der Roboter guckt deswegen auf den Ball). Außerdem kann man dabei auch betrachten, was in der sichtbaren Umgebung des Roboters ist und was man deswegen gut ansehen könnte. Also wenn er zum Beispiel einen Gegner mit einer kleinen Kopfbewegung sehen könnte, wäre dies auch sinnvoll. Außerdem ist es gerade bei der Ballsuche oft wichtig zu berücksichtigen welchen Teil des Feldes man selbst oder das Team schon durchsucht hat, um den Kopf optimal zu steuern.

Kreisförmige Bewegung um den Ball

von Nikolai Bahr

Wer B-Human mit anderen Teams vergleicht wird feststellen, dass es immer wieder Situationen gibt, in denen wir gar nicht gut aussehen. Eine davon ist die Bewegung um den Ball herum. Sei es von nah oder fern. Hier wird ein Ansatz vorgestellt, der das besser macht

Konzeptionell sieht der Ansatz folgendermaßen aus:
Nimm den Weg a zum ursprünglichen Ziel und konstruiere damit den Weg b wie folgt: Drehe a um 90 Grad, verkürze ihn (durch eine Multiplikation mit einer Konstanten) und lege ihn genau ans Ende von a (Addition von a). Aus den beiden Vektoren a und b lässt sich ein Dreieck bauen, dessen Hypothenuse genau dem neuen Weg entspricht. Führt man dies nun für jeden Zeitschritt aus, ergibt sich eine Kreisförmige Bewegung um den Ball. Die Rotation/Orientierung des Roboters ist zunächst in Richtung der Translation. Erst wenn er sich dem Ball nähert, wird zwischen aktueller Rotation und Zielrotation interpoliert.

Hindernismodellierung im Team

von Nele Matschull

Um ein erfolgreiches Fußballspielen zu ermöglichen, müssen die Spieler wissen, wo sich auf dem Feld Hindernisse befinden. Hindernisse sind Roboter der eigenen oder der gegnerischen Mannschaft, sowie Torpfosten. Die Roboter können mithilfe der Daten von verschiedenen Sensoren Hindernisse in ihrer Umgebung finden. Jedoch können aufgrund von Verdeckung, Unsicherheit etc. und durch die sich ändernde Position und Rotation des Roboters nicht alle Hindernisse korrekt und dauerhaft wahrgenommen werden.

Um den Zustand der Umgebung dennoch möglichst gut einzuschätzen, wird ein Modell mit den relevanten Informationen angelegt. Jeder Roboter hat ein lokales Hindernismodell, das durch die eigenen Perzepte aktualisiert wird. Damit ein möglichst vollständiges und verlässliches Modell entsteht, gibt es zusätzlich das Teammodell, das sich aus den gesammelten Hindernissen aller Mannschaftsmitglieder zusammensetzt. Da jeder Roboter nur einen Teil des Spielfeldes wahrnimmt, vergrößert sich dadurch der insgesamt beobachtete Bereich, sodass ein umfassenderes Bild entsteht. Außerdem können die Wahrnehmungen der einzelnen Roboter durch andere Roboter evaluiert werden. So wird angestrebt mithilfe der lokalen Modelle der anderen Spieler die von einem Spieler übersehenen Hindernisse zu ergänzen sowie sogenannte false positives – also Hindernisse, die gefunden wurden, obwohl sich dort in der Realität keines befindet – zu vermeiden. Für das Teammodell gab es bereits eine Lösung, welche allerdings zu viele Hindernisse beinhaltet und daher erneuert werden sollte.

Freistoßverhalten

von Lukas Malte Monnerjahn und Jonah Jaeger

Teil der Robocup-Challenge ist, dass jährlich die Regeln erweitert werden, um die Ähnlichkeit zum menschlichen Fußball zu erhöhen und die Teams vor neue Herausforderungen zu stellen. Durch die Regeländerungen musste in diesem Jahr auch das Freistoßverhalten unserer Roboter angepasst werden. So ist es nicht mehr erlaubt, ein direktes Tor durch einen Freistoß zu erzielen. Das zwingt uns, unser Freistoßverhalten so zu verändern, dass immer vorher ein Pass zu einem Mitspieler gespielt wird. Dabei haben wir das Verhalten für Freistöße komplett neu implementiert, um die Roboter situationsunabhängig agieren zu lassen. Im Gegensatz zu vorher spielt es jetzt keine Rolle mehr, welche Art von Freistoß auszuführen ist (Ecke, Abstoß, Freistoß, etc.). Stattdessen ist das Verhalten jetzt an die Möglichkeiten der Situation angepasst. Generell verhalten sich die Roboter nach dem "KickToOwnRobot"-Muster. Hierbei soll der Ball zu einem Mitspieler geschossen werden. Die Herausforderung war hierbei insbesondere die Abstraktion der Situation, d.h. wie definieren wir das Verhalten an beliebiger Position in einem Verhaltensmuster?

Bei Freistößen in der Nähe des eigenen Tores existiert eine bestimmte Variante des Freistoßes. Hier wird sich nach dem "DistantKick"-Muster verhalten, um sicher zu gehen, dass der Ball nicht durch ein zu riskantes Passverhalten direkt bei einem Gegner landet, der direkt im Gegenzug ein Tor erzielen kann.

Für die Situationen in denen wir gerne direkt auf das Tor schießen würden, haben wir uns eine komplett neue Variante überlegt. Dabei positioniert sich ein Roboter etwas neben dem Ball, sodass er, sobald er den Ball erhält, direkt schießen kann. Ein zweiter Roboter schiebt ihm dann den Ball zu, um für die indirekte Ausführung des Freistoßes zu sorgen. Das erfordert gezielte Abstimmung zwischen den Robotern und gute Kontrolle der Passlänge. Dieses "TapFreeKick"-Muster wird ausgeführt, wenn der Ball in Schussreichweite und in einem flachen Winkel zum gegnerischen Tor liegt.

Implementierung des Strafstoßes

von Bjarne Schröder

Die diesjährigen Regelanpassungen beinhalteten die Einführung des Elfmeters während der regulären Spielzeit. Damit B-Human auch dieses Jahr legal spielen kann, musste für die Roboter entsprechendes Verhalten implementiert werden. Dieses beinhaltet die Positionierung, den Abschluss und die Abwehr des Elfmeters. Herausfordernd an der Aufgabe ist, dass jeder Spieler dabei selber kalkulieren muss, was zu tun ist und wo sein Platz auf dem Feld ist. Die Kalkulation basiert dabei auf der Wahrnehmung des jeweiligen Roboters, in welcher es immer wieder zu Messfehlern kommt. Besonders wichtig ist also die Korrektur von falschen Ergebnissen und den daraus resultierenden Entscheidungen um dafür zu sorgen, dass jeder Roboter die richtige Aufgabe erhält.

Semantische Segmentierung durch ein neuronales Netz

von Laurens Müller-Groh und Bent Focken

Es gibt bereits diverse neuronale Netze in unserem Projekt, die versuchen Gegenstände und Hindernisse zu erkennen und auf dem Feld zu verorten. Dies klappt jedoch bisher vor allem für liegende und sehr nahe Roboter nicht zuverlässig. Daher haben wir uns daran gesetzt, diesen speziellen Fall, zugeschnitten auf die nach unten gerichtete Kamera des Roboters, zu behandeln und zu verbessern.

Ballerkennung

von Fabian Fröhlich

In dem diesjähriegen Projekt wurde thematisiert, dass die Ballerkennung mittels eines neuronalen Netzes verbessert werden soll. Bereits aus den Vorgängerprojekten gab es ein entsprechendes neuronales Netz zur Erkennung des Balls. Bei dem vorhandenen Netz wurden oft Teile des Roboters als Ball erkannt und echte Bälle, überwiegend in weiterer Entfernung oder verschwommene, wurden teilweise nicht erkannt. Ersteres lag überwiegend daran, dass es zu wenig Trainingsdaten mit Roboterteilen gab, letzteres daran, dass das Netz nicht mit verschwommenen Bildern sowie sehr kleinen Bällen trainiert war. Als großes Problem bei der Neutrainierung des neuronalen Netzes stellte sich heraus, dass es keinerlei Dokumentation über das neuronale Netz sowie die Aufbereitung der Trainingsdaten gab. Auch war der Quellcode hierfür nicht vollständig, sodass ich mich stark mit der Funktionsweise von neuronalen Netzen beschäftigen und diversen Code schreiben musste, um überhaupt einen Ball erkennen zu können. Dieser Prozess war sehr zeitintensiv, da man erst alle Schritte mehr oder weniger blind durchführen musste und alle Teilschritte abgeschlossen sein mussten, um ein Ergebnis zu bekommen. Als die Datenaufbereitung abgeschlossen war, konnte ich mich auf das Neutrainieren des Netzes konzentrieren.

Dies lief fast problemlos. Nach etwas Feintuning der Models der neuronalen Netze sowie dem Finden der richtigen Anzahl von Trainingsdurchläufen und Testdaten konnte ich die Genauigkeit der Ballerkennung verbessern. Statt früher 93,76% werden nun 97,32% der Bälle richtig erkannt. Die falsch positiv Rate ist von 11,24% auf 6,71% gesunken. Diese Werte wurden mittels Logs alter Spiele berechnet, wodurch eine hohe Vergleichbarkeit gegeben ist. Rechts in dem Video seht Ihr eine Sequenz der verbesserten Version und links die alte Version der Ballerkennung.

Erkennung von Strafstoßpunkten

von Fabian Fröhlich

Als zweites Ziel der Verbesserung des neuronalen Netzes soll das neuronale Netz zur Ballerkennung auch Strafstoßpunkte erkennen können. Hierfür habe ich die Datenaufbereitung erneut komplett überarbeiten müssen. Auch musste hier das neuronale Netz sehr stark angepasst werden, damit dies zwischen Bällen und Strafpunkten unterscheiden kann. Hierbei stellte sich als großes Problem heraus, dass durch die Pandemie die Uni geschlossen worden ist und ich keine echten Testbilder erzeugen konnte. Daher habe ich aus unserem Bildgenerator erzeugte Bilder genommen. Hier wurden aber nicht die genauen Koordinaten und Radien der Bälle und Strafstoßpunkte in den Metadaten übermittelt, sondern lediglich der Bereich, in dem ein Ball bzw. ein Strafpunkt ist.

Um hieraus brauchbare Informationen erstellen zu können habe ich ein Skript geschrieben, welches die entsprechenden Bereiche in dem Bild errechnet und positionieren kann. Hieraus konnte ich nun den Mittelpunkt sowie den Radius ermitteln. Anhand dieser Informationen konnte ich nun quadratische Bildausschnitte erzeugen. Diese habe ich mit unterschiedlich großen Ausschnitten erstellt und anschließend auf 32x32 px und 64x64 px Bilder runterskaliert. Als Problem stellte sich heraus, dass man nur Objekte verwenden darf, welche sich komplett im Originalbild befinden, da sonst die Koordinaten und Radien falsch berechnet worden sind.

Als Nächstes wurde das Skript erweitert um auch negative Bilder, wie z. B. Roboterteile oder Feldlinien, erkennen und einordnen zu können. Nach langer Rechenzeit hatte ich einige tausend positive und negative Bilder. Nun konnte ich die Trainingsdaten aufbereiten und die Netze anpassen. Es stellte sich sehr schnell heraus, dass es ein paar Bilder gab, auf denen ein Strafstoßpunkt und ein Ball übereinander lagen. Solche Bilder sind für das Training der neuronalen Netze nicht geeignet, da hier das Netz nicht unterscheiden konnte, welcher Bereich vermutlich noch zum Strafstoßpunkt gehört und welcher nicht, da der Ball Teile davon überdeckt hat. Eine Anpassung der Datenaufbereitung wurde entsprechend vorgenommen und solche Bilder wurden verworfen. Bilder auf denen sich ein positives Objekt und ein oder mehrere negative Objekte befinden sind dagegen unproblematisch.

Stand heute ist die Unterscheidung zwischen solchen Strafpunkten und Bällen nicht abgeschlossen. Das neuronale Netz liefert im Simulator derzeit leider sehr viele falsch positive Ergebnisse und sehr wenige echt positive, trotz recht guter Performance auf den Validierungsdaten. Ich gehe aktuell davon aus, dass hier das Netz noch nicht gut genug angepasst ist und die automatisch generierten und gelabelten Bilder nicht gerade förderlich sind. Auch kann es sein, dass das Netz derzeit übertrainiert ist und dies durch geringere Trainingsdurchläufe und Trainingsdaten verbessert werden kann.