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.