Was ist der RoboCup?

Der Robot Soccer World Cup ist die Fußball WM für Roboter. Beim RoboCup lassen verschiedene Teams aus aller Welt ihre Roboter gegeneinander wetteifern und dabei um den Fußball kämpfen.

Der erste Wettkampf wurde 1997 bestritten und heute werden neben Fußball auch viele andere Wettkampf Arten ausgefochten, wie z.Bsp. auch die  RoboCupRescue, bei dem die Roboter auf eine Rettungsmission entsandt werden.

Der RoboCup soll die Robotik und KI Forschung fördern und das vor einem öffentlichen Publikum. Ein Fußball spielender Roboter mag  wie eine wissenschaftliche Herausforderung aussehen, aber er ist eine Fülle von Standard Problemen, wie man sie aus der heutigen Industrie kennt und damit ein guter Einstieg in die Welt der KI. Zu diesen Standard Problemen gehören unter anderem die Bilderkennung und die Pfad-Findung, wofür moderne Algorithmen und Neuronale Netze angewandt werden.

RoboCupSoccer – Standard Platform

Bei der Standard Platform League bestehen die Teams festgelegt aus fünf NAOs v6.

Die kleinen Roboter müssen sich vollständig autonom über das Spielfeld bewegen und dürfen nur wenig miteinander kommunizieren, um dennoch eine Team Strategie zu entwickeln, die zum Sieg führt. Dabei sollen sie trotz allem unabhängig voneinander agieren können.

Arbeiten mit dem NAO












Arbeitsumgebung

Der kleine humanoide Roboter NAO ist unser Spieler auf dem Spielfeld und wir sind sein Trainer.
Bei uns wird er sowohl mit C++ als auch mit Python programmiert. Dabei wird Python bei der Bilderkennung, wie zur Erkennung des Balls und des Tors, verwendet und C++ für den ganzen Rest. Darunter fällt zum Beispiel seine Bewegung über den Fussballrasen.

Voraussetzung hierfür ist die im Projekt bereits mitgelieferte IDE CodeLite und das Betriebssystem Ubuntu 18.04 LTS.

Außerdem gibt es auch einen Simulator. Dann muss man nicht immer vor Ort sein um seinen Code zu testen. Der Simulator ‘SimRobot’ ist sogar von einem mehrfachen Siegerteam des RoboCup (B-Human, Uni Bremen und DFKI) entworfen.


Beispiel Code

Wie gut müsst ihr programmieren können? Beantwortet es euch selbst.

Unten seht ihr ein paar Code Beispiele. Wenn ihr in der Lage seid, nachzuvollziehen was dort passiert, dann seid ihr bestens vorbereitet.

Sollte der NAO umfallen muss er laut Regelwerk selbst in der Lage sein wieder auf zu stehen. Der folgende Code erreicht das.

void FallEngine::safeFall(FallEngineOutput& output) const
{
  // set stiffness of each joint
  for(int i = 0; i < Joints::numOfJoints; i++)
    output.stiffnessData.stiffnesses[i] = 10;

  // falling backwards ? sit up.
  if(output.fallingBackwards)
  {
    MotionUtilities::sit(output);
  }

  // falling forward ? stand up.
  else if(output.fallingForward)
  {
    MotionUtilities::stand(output);
  }
}

Zuerst wird die Festigkeit alle Gelenke des Roboters festgelegt und anschließend das Bewegungsmuster zum Aufstehen zu starten. Dabei wird unterschieden, ob er nach vorne oder hinten umgefallen war. Als humanoider Roboter muss der NAO ebenso wie wir Menschen unterschiedliche Bewegungen ausführen um aufzustehen, je nachdem in welche Richtung er gefallen ist.



Dieser Code positioniert die NAOs innerhalb des Simulators SimRobot an zufällige Positionen.

srand(Time::getCurrentSystemTime());
      
      for(int i = 0; i < numOfRobots; i++)
      {
          if(robots[i].simulatedRobot)
          {
              // calculate the difference between the outermost points for length and width of the field
              // scale down by 50% to end up in a quadrant
              float dx = (fieldDimensions.xPosOpponentGroundline - fieldDimensions.xPosOwnGroundline) * 0.5f;
              float dy = (fieldDimensions.yPosLeftSideline - fieldDimensions.yPosRightSideline) * 0.5f;
              
              // randomize pos by getting a random value and clamping it to the respective x / y range by using modulo
              float x = fieldDimensions.xPosOwnGroundline + fmodf(static_cast<float>(rand()), dx);
              float y = fieldDimensions.yPosRightSideline + fmodf(static_cast<float>(rand()), dy);
              
              // move robot to the randomized position
              robots[i].simulatedRobot->moveRobot(Vector3f(x, y, dropHeight), Vector3f(), false);
              
              // generate another random position
              x = fieldDimensions.xPosOwnGroundline + fmodf(static_cast<float>(rand()), dx);
              y = fieldDimensions.yPosRightSideline + fmodf(static_cast<float>(rand()), dy);
              
              // move ball
              robots[i].simulatedRobot->moveBall(Vector3f(x + 100, y + 100, 0), false);
          }
      }

Der Code wirkt zwar recht groß ist aber doch sehr simpel.

Nachdem der Seed festgelegt wurde iteriert eine Schleife über alle im Simulator vorhandene NAOs. Mit ‘dx ‘und ‘dy’ wird ein Bereich im Spielfeld definiert, in dem die NAOs positioniert werden. Dieses Feld wird aus den Größenverhältnisse des Fußballfelds erzeugt, die im Objekt ‘fieldDimensions’ hinterlegt sind.

Mit den Informationen über den Rahmen werden nun die NAOs auf zufälligen x und y Koordinaten des Spielfelds platziert und anschließend erhält auch der Ball eine zufällige Position.

In diesem Code Abschnitt passiert also nicht mehr als die verschiedenen Roboter und den Ball auf zufälligen Positionen auf dem Spielfeld zu verteilen.

Teilnahme des AK Smart Machines

Der Arbeitskreis Smart Machines der HS KL plant eine Teilnahme zur Qualifikationsphase. 2021.



Durch die Teilnahme wollen wir allen Studenten für die KI begeistern und sie im selben Moment fördern. Das bietet ihnen die einzigartige Möglichkeit den kleinen NAO als Freund und Helfer kennen zu lernen und mit ihm zu arbeiten. Vielleicht ergibt sich sogar Kontakt zu einer KI orientierten Firma, da der RoboCup auch außerhalb Deutschlands sehr populär ist.

Also was brauchen wir noch für eine erfolgreiche Teilnahme am RoboCup German Open 2021?

5x NAO V6
Ein Fußballfeld als Testumgebung
Eine Arbeitsumgebung
Einen Simulator
Einen Monster PC mit 3 GPUs und 64 GB RAM
Insider Wissen von ehemaligen Weltmeistern
Einen Gitlab Server
Ein Team  

Ein Link zum Gitlab Server findet ihr hier.

Wenn ihr ganz neugierig seid, findet ihr hier das Laborbuch, indem unser derzeitiger Fortschritt und Arbeitsweise beschrieben wird.

Da wir auch selbst über die nötigen NAOs verfügen, ist man keineswegs auf den Simulator angewiesen. Es kann ebenso mit den realen NAOs gearbeitet werden.

Die Vorarbeit ist also bereits getan; das einzige was fehlt bist du!

Hast du Interesse? Dann melde dich einfach und mach mit. Es gibt keinen Zwang, keine Verpflichtungen, keine Bürokratie. Also wenn du mit machen möchtest, dann meld dich einfach bei uns.

Erste Schritte, Juli 2020

Auf den folgenden Videos sieht man unsere Naos im Keller des O028 auf einem 1/4 Wettbewerbsfeld:

torschuss leeres Tor

Und hier kommt ein Verteidiger zur Hilfe, und klärt die Situation:

InShot_20200716_143222217

 

 


Teile diese Seite