Implementierung eines Algorithmus zur LIDAR-basierten Exploration mit einer mobilen Roboterplattform

Die Seite wird erstellt Hannes Schweizer
 
WEITER LESEN
Implementierung eines Algorithmus zur LIDAR-basierten Exploration mit einer mobilen Roboterplattform
Implementierung eines Algorithmus zur
LIDAR-basierten Exploration mit einer mobilen
              Roboterplattform

                 Thanaancheyan Thavapalan

                          Bachelorarbeit

      Martikelnummer      00089452
              Fakultät   Elektro- und Informationstechnik
         Studiengang      Elektro- und Informationstechnik
            Erstprüfer   Prof. Dr. Christian Pfitzner
          Zweitprüfer    Prof. Dr. Johann Schweiger
       Ausgabedatum       25.11.2020
        Abgabedatum       15.01.2021
Danksagung
Hiermit möchte ich mich bei allen herzlich bedanken, die mich während der Verfassung meiner Bachelor-
arbeit unterstützt und motiviert haben und dabei auch die nötige Geduld mit mir hatten:
Besonderer Dank geht an Herrn Professor Dr. Christian Pfitzner, der mich sehr motiviert hat, mich
mit dieser Thematik zu beschäftigen. Darüber hinaus hatte er immer die nötige Zeit und Ruhe, wenn
es zu Schwierigkeiten kam, bei denen ich nicht mehr weitergekommen bin. Außerdem betreute er
nicht nur diese Bachelorarbeit, sondern unterstützte mich mit konstruktiver Kritik und hilfreichen
Verbesserungsvorschlägen bei der Erstellung dieser Arbeit.
Bei Herrn Professor Dr. Johann Schweiger möchte ich mich bedanken, der mir den Roboter zur Verfügung
gestellt hat und der sich bereit erklärte, mein Zweitkorrektor zu sein.
Bei meinen Freunden und bei meiner Familie möchte ich mich für die Hilfe und die Geduld bedanken.

Thanaancheyan Thavapalan

                                                  2
Erklärung
Hiermit erkläre ich, dass ich die vorliegende Bachelorarbeit selbstständig verfasst habe. Dabei wurden
keine anderen als die angegebenen Quellen oder Hilfsmittel benutzt. Wörtliche und sinngemäße Zitate
wurden als solche gekennzeichnet.

Ingolstadt, den 15.01.2021                                               Thanaancheyan Thavapalan

                                                   3
Abkürzungsverzeichnis
Formelzeichen:

Abkürzung                               Bedeutung                                 Einheit

    d                                     Distanz                                    m

   DC                                   Gleichstrom                                  V

    λ                                   Wellenlänge                                nm

    o               Orientierung mit den Rotationswinkeln φ, θ und ψ

    p                Punkt im dreidimensionalen Raum mit x,y und z

    P                                   Punktwolke

    q        Quaternion mit einem Realteil w und drei Imaginärteilen i, j und k

    R                               3x3 Rotationsmatrix

    s                    Standort mit Punkt p und Orientierung o

    t                                Translationsvektor

    T                              Transformationsmatrix

    t                                       Zeit                                      s

                                                   4
Abkürzungen:

 Abkürzung                      Bedeutung

     D                           Dimension

    GUI                   Graphical User Interface

  LIDAR                 Light Detection And Ranging

   PNG                   Portable Network Graphics

   ROS                    Robot Operation System

   SLAM           Simultaneous Localization And Mapping

 TCP / IP     Transmission Control Protocol / Internet Protocol

    TF                    TransForm (ROS-Paket)

   USB                      Universal Serial Bus

 (W-)LAN               (Wireless-) Local Area Network

   XML                  Extensible Markup Language

   YAML                YAML Ain’t Markup Language

                                                   5
Inhaltsverzeichnis

1 Einleitung                                                                                                                                                                8
  1.1 Motivation . . . . . . . .    .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   8
  1.2 Konvention dieser Arbeit      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   8
  1.3 Ziel der Arbeit . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   9
  1.4 Aufbau der Arbeit . . . .     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   9

2 Grundlagen                                                                                                                                                                11
  2.1 Mobile Robotik . . . . . . . . . . . . . .                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
  2.2 Mathematische Grundlagen . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
      2.2.1 Punkte und Orientierungen . . . .                           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
      2.2.2 Koordinatensysteme . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   11
      2.2.3 Transformationen . . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   12
  2.3 Navigation . . . . . . . . . . . . . . . . .                      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   14
  2.4 Lokalisierung . . . . . . . . . . . . . . . .                     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
      2.4.1 Problemdynamik und -unsicherheit                            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
      2.4.2 Umweltwissen . . . . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   15
  2.5 Kartierung . . . . . . . . . . . . . . . . .                      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
  2.6 Pfadplanung . . . . . . . . . . . . . . . .                       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
      2.6.1 Dijkstra . . . . . . . . . . . . . .                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   16
      2.6.2 A-Star . . . . . . . . . . . . . . .                        .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   18
  2.7 ROS . . . . . . . . . . . . . . . . . . . .                       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
      2.7.1 ROS-Package . . . . . . . . . . .                           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
      2.7.2 ROS-Master . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   19
      2.7.3 ROS-Nodes . . . . . . . . . . . .                           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
      2.7.4 ROS-Topics . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
      2.7.5 ROS-Messages . . . . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
      2.7.6 ROS-Action . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   20
      2.7.7 ROS-Parameter . . . . . . . . . .                           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21
      2.7.8 ROS-Launch . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   21

3 Verwendete ROS-Pakete                                                                                                                                                     22
  3.1 Transformationsbäume . . . . . . . . . . .                           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   22
  3.2 STDR-Simulator . . . . . . . . . . . . . . .                          .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   22
      3.2.1 STDR-Server . . . . . . . . . . . .                             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
      3.2.2 STDR-Robot . . . . . . . . . . . .                              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
      3.2.3 STDR-Ressourcen . . . . . . . . . .                             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   23
  3.3 Gmapping und Hector SLAM . . . . . . . .                              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
  3.4 Navigation Stack und Move Base . . . . . .                            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   24
      3.4.1 Sensorquellen und -transformationen                             .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
      3.4.2 Robotersteuerung . . . . . . . . . .                            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   25
      3.4.3 Karten Server . . . . . . . . . . . .                           .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26
      3.4.4 Die 2D-Kostenkarte . . . . . . . . .                            .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   26

                                                                    6
Inhaltsverzeichnis

         3.4.5   Robotersteuerung (Base Local Planner) . . . . . . . . . . . . . . . . . . . . . . 27

4 Implementierung des thi exploration node                                                                                                                             28
  4.1 Aufbau einer Karte . . . . . . . . . . .                 .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
  4.2 Berechnung der Nachbarpixel . . . . . .                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   28
  4.3 Frontierpixel . . . . . . . . . . . . . . .              .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
  4.4 Pixelarten . . . . . . . . . . . . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   30
  4.5 Gruppieren der Frontiers . . . . . . . . .               .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   31
  4.6 Koordinatentransformation . . . . . . .                  .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   33
  4.7 Orientierung eines Pixels . . . . . . . .                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   34
  4.8 Auswahl eines Zielfrontiers . . . . . . .                .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   35

5 Experimente und Ergebnisse                                                                                                                                           36
  5.1 Simulation . . . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36
      5.1.1 Vorbedingungen . . .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   36
      5.1.2 Start einer Simulation     .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
      5.1.3 Durchführung . . . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   37
  5.2 Realer Roboter . . . . . . . .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   43
      5.2.1 Stand der Technik . .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   43
      5.2.2 Vorkonfigurationen .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   45
      5.2.3 Start des Roboters .       .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   46
      5.2.4 Testen des Roboters .      .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   .   47

6 Ausblick                                                                                           48
  6.1 Zusammenfassung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
  6.2 Ausblick . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48

7 Anhang                                                                                            50
  7.1 Verwendete Programme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
  7.2 Anlagen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51

                                                               7
1 Einleitung

1.1 Motivation

In seiner Historie ist der Mensch stets durch seine Neugier geprägt. Dabei erkundet er aktiv unbekannte
Gebiete und sammelt Informationen über die explorierte Umgebung. Aus diesen Informationen wird
dann eine Karte erstellt, damit eine spätere Orientierung wieder möglich ist und sichergestellt wird,
dass die Informationen über das Gebiet gespeichert sind. Die Karten enthalten dann charakteristische
Bezugspunkte, wie z.B. Wege, Vegetation und Hindernisse. Im Laufe der Zeit wurden diese Karten
verbessert, wie z.B. mit den Höhenprofilen eines Bergs. Wenn nun ein mobiler Roboter mithilfe der
erstellten Karten navigieren soll, muss die Karte davor aktualisiert worden sein. Ansonsten ist der
Roboter nicht imstande fehlerfrei zu navigieren. Jedoch möchte der Mensch auch, dass eine mobile
Roboterplattform selbstständig unbekannte Umgebungen exploriert, weil die Umgebung gefährlich sein
könnte oder weil es für den Menschen schwierig werden kann, gewisse Umgebungen zu erkunden. Bei
einer solchen Exploration hat ein mobiler Roboter die Möglichkeit sich von den genannten Begrenzungen
zu befreien. Für einen mobilen Roboter bedeutet eine Exploration, sich durch eine unbekannte Umgebung
zu bewegen, während eine Karte erstellt wird, die für eine spätere Navigation verwendet werden kann.
Bei einer Exploration ist es immer wichtig zu wissen, welche Informationen es über die Umgebung
gibt und wohin navigiert werden soll, um möglichst viele und neue Informationen zu erhalten. Eine
gute Explorationsstrategie ist es, eine Karte zu erstellen, die möglichst viel aus der Umgebung in einer
vernünftigen Zeit abspeichern kann. Ein Ansatz für eine Explorationsstrategie ist die Erkennung der
sogenannten frontiers.

Frontier Exploration

Die sogenannte frontier Exploration basiert auf der Erkennung der Grenzen zwischen bekanntem und
unexploriertem Gebiet. Diese Grenzen werden als sogenannte frontiers bezeichnet. Der zentrale Ansatz
der frontier basierten Exploration ist es, sich zur Grenze zwischen bekanntem und unbekanntem Gebiet
zu bewegen, um die meisten Informationen über die neue Umgebung zu erhalten. Wenn eine mobile
Roboterplattform zu einem frontier fährt, dann kann die Plattform den unexplorierten Bereich erfassen
und die neuen Informationen seiner aktuellen Karte hinzufügen. Das Ergebnis dieser Explorationsstrategie
ist es, dass die erfasste Umgebung vergrößert wird und die Grenzen zwischen bekanntem und unbekanntem
Gebiet nach hinten verschoben werden. Wenn sich der mobile Roboter stets zu den nachfolgenden frontiers
bewegt, kann er sein Wissen über die Umwelt stets erweitern. So kann eine mobile Roboterplattform
unter der Verwendung der frontier Exploration jedes zugängliche Gebiet erkunden.

1.2 Konvention dieser Arbeit

Im Rahmen dieser Arbeit wird eine eigene Formatierung verwendet. Die runden Klammern mit einer Zahl
(0.1) verweisen auf eine Abbildung, einen Abschnitt oder eine Tabelle. Die eckigen Klammern mit einer
Zahl [0] verweisen auf eine Quelle im Literaturverzeichnis. Ein fettgedruckter Großbuchstabe M stellt eine

                                                    8
1 Einleitung

Matrix dar und ein fettgedruckter Kleinbuchstabe v stellt einen Vektor dar. So werden auch englische
Fachbegriffe innerhalb eines Satzes benutzt, da es sich bei den Begriffen zum Teil, um Eigennamen
handelt. Darüber hinaus sind der implementierte Quellcode sowie die erstellten Dateien, die im Git-
Repository zur Verfügung gestellt werden, in englischer Sprache kommentiert. Bei den physikalischen
Größen und Formeln gelten die SI-Basiseinheiten, wenn keine andere Einheit angegeben wurde.

1.3 Ziel der Arbeit

                          Kartierung
                         Lokalisierung                Laserdaten      Laserscanner
                    (Gmapping/Hector SLAM)                           Sick nanoScan3

                          Karte

                                                                           Roboter
                     Exploration (C++-Datei:                          ( STDR-Simulator/
                      thi exploration node)                             Pioneer 3-AT )

                              Zielkoordinate                          Geschwindigkeit

                                                   Pfadplanung
                                               /Bewegungssteuerung
                                                   (Move Base)

                              Abbildung 1.1: Klassendiagramm Exploration

Zunächst soll eine Simulation mit einem Roboter, an dem ein Laserscanner montiert ist, starten. Der
Laserscanner liefert wiederum Laserdaten an die Kartierung, die wiederum eine Karte erstellt und den
Roboter mit dem Laserscanner in dieser Karte lokalisiert. Diese Karte wird in einer Explorationsdatei
verarbeitet und es soll eine Zielkoordinate festgelegt werden, die der Roboter anfahren soll. Damit diese
Zielkoordinate angefahren werden kann, wird sie an die Pfadplanung und Bewegungssteuerung geschickt.
Die Pfadplanung ist für die Navigation des Roboters verantwortlich. Für eine Bewegungsteuerung wird
dann ein Geschwindigkeitsvektor an die Simulation geschickt. Damit geht dieser Regelzyklus, der in der
Abbildung 1.1 dargestellt wird, wieder von vorne los. Das Hauptziel dieser Arbeit ist es, dass mithilfe des
implementierten Programms eine mobile Roboterplattform selbstständig exploriert.

1.4 Aufbau der Arbeit

Die Bachelorarbeit ist folgendermaßen gegliedert:

   • Kapitel 2 gibt einen Überblick über die Grundlagen, die für das Verständnis der Arbeit hilfreich
     sind.

                                                       9
1 Einleitung

• Kapitel 3 erklärt den Aufbau und die Funktionsweise der verwendeten Softwarepakete innerhalb
  von ROS.
• Kapitel 4 erklärt die Funktionsweise des Programms, das im Rahmen dieser Arbeit implementiert
  wurde.
• Kapitel 5 beinhaltet die Simulationen, die durchgeführt wurden, und die Durchführung eines ersten
  Tests an einem Roboter.
• Kapitel 6 fasst nochmal die wesentlichen Aspekte der Arbeit zusammen und stellt einen Ausblick
  dar.

                                               10
2 Grundlagen

Dieses Kapitel enthält die Grundlagen, die für das Verständnis dieser Arbeit relevant sind.

2.1 Mobile Robotik

Die mobile Robotik ist eines der bedeutendsten Teilgebiete der allgemeinen Robotik. So befindet sich
beispielsweise ein Roboterarm in der Industrierobotik bei der Fertigung eines Automobils stationär in einem
strukturierten Umfeld und erledigt meistens immer dieselbe Aufgabe. Im Gegensatz dazu soll sich eine
mobile Roboterplattform in einer unexplorierten Umgebung bewegen können und eigenständig Aufgaben
erfüllen. Dabei müssen bei der Planung der Bewegungen unterschiedliche Faktoren, wie beispielsweise die
Batterielaufzeit und Bodenbeschaffenheit, berücksichtigt werden. Damit ein mobiler Roboter mit seiner
Umgebung interagieren kann, werden verschiedene Sensoren verwendet. In den folgenden Abschnitten
werden die wichtigsten Themengebiete der mobilen Robotik genauer erläutert.

2.2 Mathematische Grundlagen

2.2.1 Punkte und Orientierungen

Damit sich ein mobiler Roboter in seiner Umgebung orientieren kann, werden Koordinatensysteme
definiert und verwendet. Ein Punkt im dreidimensionalen Koordinatensystem wird mithilfe eines Vektors
p = (px py pz )T definiert. Dabei beschreibt dieser Vektor die relative Position des Punktes vom
Koordinatenursprung. Eine beliebige Anzahl von Punkten wird als eine Punktewolke P bezeichnet.
Da in der Literatur (z.B. [1], [2] und [3]) als auch in ROS (siehe Kapitel 2.7) ein rechtshändiges
Koordinatensystem verwendet wird, wird für diese Arbeit ebenfalls ein solches Koordinatensystem
festgelegt, das mit den Achsen x, y und z aufgespannt wird. Dabei zeigt die positive x-Achse in
die Richtung des Roboterantriebs. Vom Mittelpunkt des Roboters liegt die positive y-Achse in der
Fahrtrichtung links. Die Höhe wird durch die positive z-Achse definiert. Darüber hinaus können in der
mobilen Robotik mithilfe der Eulerwinkel Drehungen realisiert und Orientierungen festgelegt werden. Die
Winkel φ, θ und ψ geben jeweils eine Rotation um die x-, y- und z-Achse an.

2.2.2 Koordinatensysteme

Weil an einem mobilen Roboter meist verschiedene Sensoren und Aktoren angebracht sind, die wie-
derum unterschiedliche Koordinatensysteme verwenden, müssen die Systeme aufeinander abgestimmt
werden, damit der Roboter auch fehlerfrei funktioniert. Im folgenden Abschnitt werden die wesentlichen
Koordinatensysteme zusammengefasst:

                                                    11
2 Grundlagen

Roboterkoordinatensystem

Der Ausgangspunkt des Roboterkoordinatensystems liegt in der Mitte des Roboters. Es bildet die
Grundlage für alle Aktor- und Sensorkoordinatensysteme, die an einem mobilen Robotor befestigt sind.

Sensorkoordinatensystem

Da jeder Sensor sein eigenes Koordinatensystem benutzt, muss eine Anpassung erfolgen. Wenn sich
beispielsweise ein Laserscanner etwas hinter dem Zentrum des mobilen Roboters befindet, dann muss
dem Datensatz ein Offset hinzugefügt werden. Dieser berücksichtigt, dass der vorderste Punkt des
Roboters sich näher am Hindernis befindet als der Laserscanner, und somit wird gewährleistet, dass
der Roboter vorzeitig einem Hindernis ausweicht. Des Weiteren muss beachtet werden, dass es sowohl
dreidimensionale Sensoren, wie z.B. Laserscanner, als auch zweidimensionale Sensoren, wie z.B. Kameras,
gibt. Bei zweidimensionalen Sensoren fällt eine Achse weg.

Aktorkoordinatensystem

Ähnlich wie bei den Sensoren besitzt auch jeder Aktor eines mobilen Roboters ein Koordinatensystem.
Ein Beispiel für ein Aktorkoordinatensystem ist ein Rad, das durchgehend rotieren muss. Auch bei den
Aktoren muss eine Anpassung erfolgen, damit sie rechtzeitig reagieren können, wie z.B. beim Ausweichen
von Hindernissen.

Weltkoordinatensystem

Das Weltkoordinatensystem hat seinen Ursprung an der Position, an dem der mobile Roboter hochgefahren
wurde. Für einen mobilen Roboter ist es essentiell diesen Standort zu kennen, da er sich in einer
unbekannten Umgebung zurechtfinden muss und da er den Ursprung als Orientierungspunkt für eine
Lokalisierung benutzt.

2.2.3 Transformationen

Es gibt zwei Möglichkeiten, eine Transformation eines Punktes durchzuführen:

Translation

Die Translation ist der simpelste Fall einer Transformation. Dabei wird auf einen Punkt p ein Translati-
onsvektor t aufaddiert und dabei entsteht wiederum ein neuer Punkt p’:
                                                           
                                                    px + tx
                                             p’ = py + ty                                       (2.1)
                                                    pz + tz

                                                  12
2 Grundlagen

Rotation

Eine weitere Art der Transformation ist die Rotation. Sie wird benutzt, damit ein Punkt sich um eine
oder mehrere Achsen dreht, und sie wird durch eine allgemeine Rotationsmatrix definiert:

                                                             
                                                  r11 r12 r13
                                        R3x3   = r21 r22 r23                                     (2.2)
                                                  r31 r32 r33

                                                                                        
                1    0       0                                            cos(θ) 0 sin(θ)
      Rx (ψ) = 0 cos(ψ) − sin(ψ)             (2.3)            Ry (θ) =  0       1   0          (2.4)
                0 sin(ψ) cos(ψ)                                           − sin(θ) 0 cos(θ)

                                                              
                                             cos(φ) − sin(φ) 0
                                   Rz (φ) =  sin(φ) cos(φ) 0                                     (2.5)
                                                 0      0    1

Wenn man alle drei Rotationsmatrizen multipliziert, erhält man eine neue Rotationsmatrix R3x3 =
Rx,y ,z (ψ, θ, φ), die eine gleichzeitige Rotation um alle drei Achsen ermöglicht:

                                                                                                  
           cos(φ) cos(θ) cos(φ) sin(θ) sin(ψ) − sin(φ) cos(ψ) cos(φ) sin(θ) cos(ψ) + sin(φ) sin(ψ)
 R3x3   =  sin(φ) cos(θ) sin(φ) sin(θ) sin(ψ) + cos(φ) cos(ψ) sin(φ) sin(θ) cos(ψ) − cos(φ) sin(ψ)
               − sin(θ)               cos(θ) sin(ψ)                        cos(θ) cos(ψ)
                                                                                                  (2.6)
Da es bei diesen Rotationsmatrizen zu Rundungsfehlern kommen kann, wird die Orthogonalität nicht mehr
gewährleistet. Um beliebig viele und fehlerfreie Rotationen durchführen zu können, werden Quaternionen
verwendet. Ein Quaternion q verhält sich ähnlich wie eine komplexe Zahl und hat auch einen Realteil w
und Imaginärteil i. Die Rechenregeln sind ebenfalls wie bei den komplexen Zahlen gleich. Jedoch besteht
der wesentliche Unterschied darin, dass ein Quaternion um zwei weitere Imaginärteile j, k erweitert
wird:

                                         q = w + ix + jy + kz                                      (2.7)
Dabei stellen die Imaginärteile i, j und k eine Rotation um die jeweiligen Achsen x,y und z dar. Der
Realteil w gibt den Radius der Drehung um die Achse an. Quaternionen werden beispielsweise für die
Orientierung eines mobilen Roboters in Move Base (Abschnitt 3.2) verwendet.

Zusammenfassung

Nun werden die beiden Transformationsarten mithilfe folgender Gleichung zusammengefasst:

                                               p’ = R · p + t                                      (2.8)

                                                    13
2 Grundlagen

Jedoch ist es in der Praxis schwierig diese Zusammenfassung auszudrücken, da es sich bei der Translation
nicht um eine Matrixmultiplikation handelt. Deswegen werden homogene Koordinaten verwendet, damit
eine einheitliche Repräsentation aller Transformationsarten gewährleistet werden kann. Dazu wird die
Rotationsmatrix R und der Translationsvektor t in eine Transformationsmatrix T hinzugefügt. Dabei wird
die Hauptdiagonale mit einer 1 ergänzt und die restliche untere Zeile mit einem Nullvektor befüllt:

                                                      
                                                R3x3 t
                                            T=                                                     (2.9)
                                                 0   1

Dank der Transformationsmatrix können die Koordinaten eines Punktes mit geringem Aufwand in ein
anderes Koordinatensystem umgewandelt werden. Darüber hinaus wird der Translation eine 1 hinzugefügt,
um eine Translation ebenfalls mit einer einfachen Matrizenmultiplikation berechnen zu können:

                                                 
                                                  px
                                                py 
                                              p=    
                                                 pz                                             (2.10)
                                                  1

Durch die Erweiterung einer zusätzlichen Dimension können die Translation und die Rotation in eine
homogene Transformationsmatrix zusammengeführt werden:

                                                        
                                 px 0     r11 r12 r13 tx     px
                                py 0  r21 r22 r23 ty  py 
                                pz 0  r31 r32 r33 tz  · pz 
                                 =                                                          (2.11)
                                  1        0   0   0 1       1

Nun können mithilfe der Position und der Orientierung ein Standort s des mobilen Roboters in einem
Koordinatensystem angegeben werden. Diese beinhaltet alle sechs Freiheitsgrade für einen Punkt p und
Orientierung o:

                                                   
                                                    tx
                                                  ty 
                                                 
                                               t  tz 
                                           s=    =                                              (2.12)
                                               o  φ
                                                   
                                                  θ
                                                    ψ

2.3 Navigation

Einer der wichtigsten Eigenschaften einer mobilen Roboterplattform ist es, in einer dynamischen Um-
gebung zu navigieren. Dafür muss die Betriebsfähigkeit des Roboters stets gewährleistet werden. Das
bedeutet, dass gefährliche Situationen wie beispielsweise Kollisionen zu verhindern sind und dass geeig-
nete Betriebsvoraussetzungen, wie z.B. Temperatur, Witterungsverhältnisse und Bodenbeschaffenheit,
beizubehalten sind. Wenn der mobile Roboter zusätzlich auch noch Aufgaben zu erfüllen hat, dann muss
er imstande sein, sich zu orientieren und schließlich zu navigieren. Der Begriff Navigation wird in der
mobilen Robotik vom Autor im Werk [4] folgendermaßen untergliedert:

   1. Lokalisierung des Roboters (Kapitel 2.4)

                                                   14
2 Grundlagen

   2. Erstellung einer Karte sowie deren Interpretation (Kapitel 2.5)
   3. Planung von Routen (Kapitel 2.6)

Das Bezugssystem, welches letztendlich der Referenzpunkt für die Navigation ist, stellt einen wesentlichen
Bestandteil für jede der drei Navigationskomponenten dar. In dieser Arbeit wurde in Kapitel 2.2 das
rechtshändige Koordinatensystem als Bezugssystem festgelegt. Für alle drei genannten Vorgänge innerhalb
des Bezugssystem werden alle Standorte als kartesische Koordinaten dargestellt.

2.4 Lokalisierung

Eine Lokalisierung im Bereich der mobilen Robotik bedeutet, dass ein Robotersystem über die Kompetenz
verfügt, die Position eines wichtigen Merkmals innerhalb eines Bezugssystems zu ermitteln. Dabei
spielt die Selbstlokalisation des Roboters in der Navigation eine zentrale Rolle, da das Robotersystem
selbst immer wissen muss, wo es sich gerade befindet. Aus der Selbstlokalisierung resultiert stets die
gegenwärtige Position der mobilen Roboterplattform. Sowohl die aktuellen regionalen als auch vorher
aufgezeichnete Informationen können abgespeichert und für eine Lokalisierung verwendet werden. Damit
sich ein Roboter überhaupt lokalisieren kann, braucht er Sensoren, wie z.B einen Laserscanner. Für
verschiedene Aufgabenstellungen werden unterschiedliche Ansätze gewählt, um die bestmögliche Lösung
zu erzielen. Die Lokalisierung wird vom Autor im Werk [5] in unterschiedliche Kriterien untergliedert.

2.4.1 Problemdynamik und -unsicherheit

Die Grundschwierigkeit bei der Positionsbestimmung wird mit steigender Schwierigkeitsstufe in drei
Bereiche vom Autor [5] unterteilt:
In der einfachsten Stufe handelt es sich lediglich um eine Berichtigung, bei der ein bekannter Standort
nachvollzogen werden muss, sodass es ausschließlich einer Korrektur bedarf. Wenn jedoch die Anfangsbe-
dingungen nicht korrekt festgelegt wurden oder die Abweichungen durch unvorhergesehene Ereignisse zu
groß sind, kann eine adäquat funktionierende Lokalisierung nicht mehr gewährleistet werden. Die nächste
Stufe besteht aus einer globalen Lokalisierung, bei der ohne Informationen eine Selbstlokalisierung des
mobilen Robotersystems erfolgen muss. Die schwierigste Stufe ist die sogenannte Relokalisierung, bei
der eine fehlerhafte und gegenwärtige Position erkannt werden muss und der mobile Roboter sich neu
lokalisieren muss. Ein weiterer Faktor bei der Problemdynamik ist auch die Struktur der Umwelt. So
ist beispielsweise ein langer Gang für eine Lokalisierung von größerem Vorteil als eine Umgebung mit
Verzweigungen oder Schleifen.

2.4.2 Umweltwissen

Beim Umweltwissen gibt es zwei abhängige Dimensionen. Einerseits der Bekanntheitsgrad der Umwelt
und andererseits die Dynamik der Umweltveränderungen. Bei einer Umgebung mit hoher Dynamik ist
es vorteilhaft, wenn die Lokalisierung imstande ist, zwischen den veränderlichen und statischen Teilen
zu differenzieren. Der größte Teil der Lokalisierungsmethoden geht von einer statischen Umgebung aus
und berücksichtigt den dynamischen Anteil als eine zunehmende Unsicherheit oder als Fehlmessung der
Sensoren.

                                                    15
2 Grundlagen

2.5 Kartierung

Für eine erfolgreiche Lokalisierung führt ein mobiler Roboter eine Kartierung durch. In der Literatur
(wie z.B. in [4] und [6]) wird unter einer Kartierung verstanden, die Fähigkeit eines mobilen Roboters
eine Umweltkarte zu erstellen. In einer Umweltkarte wird die reale Umgebung eines Roboters auf ein
internes Bezugssystem repräsentiert. Zur Kartierung gehört nicht nur die Kompetenz, eine Karte zu
erstellen, sondern auch Informationen über erforschtes Gebiet abzuspeichern. Darüber hinaus muss ein
mobiler Roboter ebenfalls imstande sein, mit seiner erstellten Karte zu interagieren, wie z.B. Positionen
anzufahren, und diese dabei auch zu interpretieren, wie z.B. Hindernisse zu erkennen. Um eine solche
Karte zu erstellen, benutzt ein Roboter vielfältige Sensoren wie z.B. einen Laserscanner. Nun müssen die
verschiedenen Sensordaten, die unterschiedliche Informationen beinhalten, in eine geeignete Form gebracht
werden, um einerseits möglichst viele Informationen zu speichern und andererseits den Speicherbedarf
auf ein Minimum zu reduzieren. Dafür können in der mobilen Robotik zweidimensionale Gitterkarten
verwendet werden, in der Sensorinformationen in Gitterzellen abgespeichert werden.

2.6 Pfadplanung

Eine Planung von Routen stellt grundsätzlich eine Erweiterung der Lokalisierung dar, weil die mobile
Roboterplattform sowohl seine aktuelle Position als auch die gewünschte Zielposition innerhalb des
gleichen Bezugssystems bestimmen muss. Das Ziel der Pfadplanung besteht darin, die kürzeste Route zu
finden. Damit dieses Problem modelliert werden kann, wird ein Netzplan verwendet. Die verschiedenen
Koordinaten, die ein mobiler Roboter anfahren kann, werden als Knoten und ein Weg zwischen zwei
Koordinaten wird als Kante dargestellt. Die Eigenschaften eines Weges werden mithilfe eines Labels
an einer Kante beschrieben. Diese Eigenschaften können beispielsweise die Distanz, die Steigung oder
Hindernisse sein. Darüber hinaus müssen die Merkmale des mobilen Roboters, wie z.B. die Batterielaufzeit
oder die Maße, als Kriterien berücksichtigt werden. Üblicherweise gibt es mehrere Möglichkeiten, um
vom Start zum Ziel zu gelangen. Die Aufgabe der Pfadplanung ist es unter diesen Kriterien eine optimale
Route zu finden. Sobald eine Lösung gefunden wurde, kann es sein, dass diese nur für eine kurze Zeit
gültig ist, da sich die Bedingungen dynamisch ändern können. Deswegen müssen diese Informationen
immer wieder aktualisiert werden und somit auch die Routen neu berechnet werden. Die unterschiedlichen
Informationen (Distanz, Akkulaufzeit, etc.), die für das Routingverfahren relevant sind, werden in einem
Wert zusammengefasst. Je niedriger dieser Wert ist, desto kürzer ist der Weg. Mithilfe dieser Abstraktion
kann der Dijkstra-Algorithmus den kürzesten Weg berechnen.

2.6.1 Dijkstra

Der Dijkstra-Algorithmus wird anhand eines Beispiels (Abbildung 2.1) aus der Literatur [7] erklärt.

Initialisierung

Zu Beginn des Algorithmus werden die Knoten initialisiert, indem alle Knoten außer dem Startknoten
A als unbesucht gekennzeichnet werden. Jeder Knoten erhält einen Label, das die Pfadkosten vom
Startknoten zum aktuellen besuchten Knoten und den Vorgängerknoten auf dem Pfad beinhaltet. Die
Pfadkosten aller Knoten werden am Anfang auf unendlich gesetzt. Zusätzlich wird der Vorgänger jedes
Knotens auf Null gesetzt. Beim Startknoten jedoch werden die Pfadkosten auf Null gesetzt und Vorgänger
des Startknoten ist er selbst. Die folgenden Iterationsschritte sind in der Abbildung 2.2 dargestellt.

                                                   16
2 Grundlagen

                                            1
                                A                      B           1
                                        4        2

                                    3                                  C
                                            D
                                                           3               6
                                                  2
                                        7                      5
                                E                     F                    G

                          Abbildung 2.1: Dijkstra Initialisierung (Quelle: [7])

1. Iteration (grün)

Anschließend folgt der erste Iterationsschritt, bei dem die Pfadkosten zu den Nachbarknoten berechnet
werden. Die Nachbarknoten von A sind B, D und E. Nun wird für jede dieser Nachbarknoten ein Label mit
den Pfadkosten und den Namen des Vorgängerknotens erstellt. So erhält der Knoten D in diesem Beispiel
das Label (4,A), da sein Vorgänger A ist und die Pfadkosten 4 betragen. Da in einem Iterationsschritt
stets das Minimum der Pfadkosten gewählt wird und der Wert der Pfadkosten größer gleich Null sein
muss, kann das Minimum nur ein Nachbarknoten sein. In diesem Fall ist es der Knoten B, der als besucht
gekennzeichnet wird. Der Knoten A ist nun abgeschlossen.

2. Iteration (rot)

Ausgehend vom Knoten B wird im zweiten Iterationsschritt für die Knoten A und B jeweils der kürzeste
Pfad zu den Nachbarknoten C, D und E berechnet. Auch hier werden wieder die Minima der Pfadkosten
zu den Nachbarn ausgewählt. So erhält der Knoten D ein neues Label (3,B), da der kürzeste Weg von
A nach D über B führt und die Gesamtpfadkosten von 3 hat. Nun wird der Knoten C besucht, da er
insgesamt die kleinsten Kosten von 2 hat.

3. Iteration (hellblau)

Ausgehend von Knoten C werden die Nachbarn berechnet. Der Knoten C hat nur Knoten G als Nachbar.
Die Informationen werden nun aktualisiert. Als Nächstes kann entweder der Knoten D oder E besucht
werden, weil sie die gleichen Pfadkosten besitzen und kleiner sind als die Pfadkosten zu Knoten G. Nun
wird Knoten E besucht.

4. Iteration (orange)

Der Nachbar vom Knoten E ist Knoten F. Da die Pfadkosten zu F größer sind als zu Knoten D, wird
Knoten D nun besucht.

                                                      17
2 Grundlagen

5. Iteration (lila)

Die Nachbarn vom Knoten D sind F und G. Da der Knoten F noch nicht besucht wurde, wird noch
überprüft, ob sich kürzere Pfadkosten ergeben.

6. Iteration (schwarz)

Da sich keine kürzeren Pfadkosten ergeben, weiß der Knoten A, dass er den Zielknoten G über B und D
erreicht. Die abgeschlossen Iterationen des Startknotens A zum Zielnoten werden in der Abbildung 2.2
dargestellt.

                                             1
                                A                       B           1
                                        4         2

                                    3                                   C
                                            D
                                                            3               6
                                                   2
                                         7                      5
                               E                       F                    G

                                   Abbildung 2.2: Dijkstra Iterationen

2.6.2 A-Star

Der A-Star-Algorithmus ist eine Erweiterung des Dijkstra-Algorithmus, da er eine zusätzliche Heuristik
verwendet. Dabei wird als Heuristik meistens die euklidische Distanz bzw. die Luftlinie zum Zielknoten
benutzt. Diese Größe muss bei der Berechnung der Kosten berücksichtigt werden. Darüber hinaus
ist der A-Star-Algorithmus mindestens genauso schnell wie der Dijkstra-Algorithmus, jedoch ist der
A-Star-Algorithmus meistens schneller als der Dijkstra-Algorithmus, wodurch Rechenzeit gespart werden
kann. Das Beispiel 2.1 wird nun um eine euklidische Distanz erweitert und es erfolgen die Iterationen,
wie in der Abbildung 2.3 dargestellt:
   1. grün: Knoten B mit den geringsten Kosten (29)
   2. orange: Knoten D mit den geringeren Kosten (32,5) als Knoten C (34)
   3. braun: Knoten E mit den geringeren Kosten (34) als Knoten G über D (35,5)
   4. rot: Knoten C mit den geringeren Kosten (40) als Knoten F über E (47)
   5. lila: Knoten G über D mit den geringeren Kosten (35,5) als Knoten G über D (47)
Der A-Star-Algorithmus ist in diesem Beispiel um eine Iteration schneller als der Dijkstra-Algorithmus,
da nicht zwangsläufig jeder Knoten besucht werden muss.

                                                       18
2 Grundlagen

                                           1
                               A                      B
                              h=17                   h=11           1
                                       4        2
                                                                         C
                                  3     D                               h=4
                                       h=11                 3                 6
                                                 2
                               E       7                        5
                              h=14                    F                        F
                                                     h=6                      h=0

                                  Abbildung 2.3: Astar Iterationen

2.7 ROS

Das Robot Operating System (ROS) ist ein Robotik-Framework, welches für mobile Roboterplattformen
unterschiedliche Klassen und Programme zur Verfügung stellt, sodass für jeden Roboter nicht immer
wieder alles neu entwickelt werden muss. Die Hauptaufgabe von ROS ist es, zwischen den einzelnen
Programmbausteinen zu vermitteln, da die Programme über ein Nachrichtensystem, dem sogenannten
ROS-Master, miteinander kommunizieren. Der Vorteil dieser Architektur besteht darin, dass, wenn es in
einem Programm zu einem Fehler kommt, nicht zwangsläufig das gesamte ROS-System abstürzt. Hierbei
erfolgt die Übertagung von Nachrichten durch das TCP/IP Protokoll über LAN bzw. WLAN. Darüber
hinaus verwendet ROS das sogenannte publish- und subscribe-Prinzip. Es gibt also ROS-Programme, die
Nachrichten publizieren, und ROS-Programme, die Nachrichten abonnieren.

2.7.1 ROS-Package

Ein ROS-Package bildet den einfachsten Baustein innerhalb der ROS-Umgebung. In einem Package
können beispielsweise ROS-Knoten, Programme, Bibliotheken und Konfigurationsdateien enthalten sein.
Ein fertiges Package hat das Ziel, eine Funktion bzw. Aufgabe zu erfüllen. Dabei sollte es möglichst
übersichtlich und strukturiert aufgebaut sein, damit eine hohe Wiederverwendbarkeit bzw. Weiterent-
wicklung gewährleistet wird. Eine häufige Fehlerursache beim Erstellen von ROS-Packages ist es, dass
die CMakeLists.txt nicht konfiguriert wurde, während Dateien bereits definiert sind. Wenn beispiels-
weise ein Programm in der Programmiersprache C++ geschrieben wurde, muss in der CMakeLists.txt
folgender Befehl noch ergänzt werden: add executable (mein programm src/ paket name/mein.cpp).
ROS-Programme suchen immer zuerst nach der package.xml-Datei, um Abhängigkeiten aufzulösen oder
zur Laufzeit benötigte Programme zu starten.

2.7.2 ROS-Master

Der ROS-Master ist wie ein Vermittler, der allen ROS-Programmen die notwendigen Informationen
sendet, damit eine Verbindung zwischen den richtigen Knoten über TCP/IP hergestellt wird. Wenn ein
Knoten gestartet wird, wird zunächst die IP-Adresse des Masters abgefragt. Anschließend wird eine
Verbindung mit dem Master aufgebaut, um ihm mitzuteilen, ob ein Knoten publizieren oder abonnieren
möchte. Wenn davor noch kein Master mithilfe den Befehlen roscore oder roslaunch gestartet wurde,

                                                     19
2 Grundlagen

kommt es zu einem Fehler. Sobald die Knoten miteinander verbunden sind, können diese über den
Master untereinander Nachrichten austauschen. Die Knoten sind dann lose verbunden, d.h., dass ein
Knoten jederzeit beendet werden kann und ein neuer Knoten hinzugefügt werden kann, ohne dass das
Gesamtsystem beeinflusst wird.

2.7.3 ROS-Nodes

Ein Node ist eine Instanz eines ausführbaren Programms, d.h., dass ein Programm mehrmals gleichzeitig
gestartet werden kann, indem verschiedene Namen beim Aufruf verwendet werden. Die Programme
innerhalb der ROS-Architektur werden mithilfe des Startbefehls rosrun aufgerufen und werden beim
Start zu einem vollwertigen Knoten gemacht. Der ROS-Master sorgt dann dafür, dass ein Knoten
erreichbar ist und mit anderen Nodes kommunizieren kann. Sobald eigene Knoten programmiert werden,
können diese grundsätzlich Topics und Actions implementiert werden, welche gleichzeitig und mehrfach
in einem Knoten vorkommen können. Ein Beispiel für einen ROS-Node ist die implementierte Datei
thi exploration node.cpp (Kapitel 4).

2.7.4 ROS-Topics

Ein Kommunikationsvorgang zwischen Nodes läuft ab, indem ein Knoten ein oder beliebig viele Topics
abonnniert oder publiziert. Ein Topic ist ein Thema, unter dem es Nachrichten zu senden oder zu
empfangen gibt. Nachdem ein Topic abonniert wurde, entsteht ein Nachrichtenfluss vom publizierenden
zum abonnierenden Knoten. Ein Topic kann beispielsweise eine Karte sein.(Kapitel 3.3).

2.7.5 ROS-Messages

Die ROS-Messages sind Datenströme, die mindestens zwischen zwei Knoten ausgetauscht werden.
Sie werden in sogenannten msg-Dateien definiert. Diese Nachrichten können sowohl aus primitiven
Datentypen als auch aus Datenstrukturen bestehen. Der Datenfluss erfolgt nur unidirektional.

2.7.6 ROS-Action

Die ROS-Actions werden verwendet, um zeitintensive Aufgaben zu lösen. Dafür stellt das ROS-Framework
das actionlib-Paket zur Verfügung. Bei den Actions gibt es einen ActionServer und einen ActionClient.
Die Definition erfolgt in den sogennanten action-Dateien. Eine parallele Verarbeitung von verschiedenen
Anfragen ist möglich. Ein Beispiel für eine ROS-Action ist Move-Base (Kapitel 3.4). Actions bestehen
aus drei Teilen:
  1. Goal: Ein ActionClient sendet ein Ziel an einen ActionServer. Ein Beispiel könnte eine Zielkoordinate
     sein, die erreicht werden soll.
  2. Result: Nachdem die Action beendet wurde, gibt der ActionServer dem ActionClient ein Ergebnis
     zurück, ob z.B. die Zielkoordinate erreicht wurde.
  3. Feedback: Der ActionServer gibt den Fortschritt der aktuellen Action an.

                                                   20
2 Grundlagen

2.7.7 ROS-Parameter

In ROS können unter Verwendung des Parameterservers Konfigurationen ausgelagert werden. Die
Parameter sind in YAML-Dateien definiert und befinden sich meistens im config-Ordner innerhalb eines
ROS-Pakets. Ein Knoten kann diese Parameter lesen, schreiben oder löschen. Der ROS-Master ist
für den Parameterserver zuständig. Da eine Abfrage von Parameterwerten zeitaufwendig ist, wird der
Parameterserver hauptsächlich für Werte verwendet, die sich nicht verändern. Die Parameter, die von
einem Knoten gesetzt werden, werden erst gelöscht, wenn der ROS-Master deaktiviert wurde. Eine
weitere Möglichkeit, Parameter abzuspeichern, sind launch-Dateien.

2.7.8 ROS-Launch

In einer launch-Datei können beliebig viele Knoten, die gestartet werden sollen, zusammengefasst werden.
Dies erleichtert die Arbeit mit mehreren Knoten und hilft den Überblick zu bewahren. Ein weiterer
Vorteil von launch-Dateien ist, dass auch andere launch-Dateien problemlos eingebunden werden können.
Darüber hinaus muss beim Ausführen einer launch-Datei lediglich ein Terminal offen sein, weil beim
Start einer launch-Datei automatisch ein ROS-Master gestartet wird. Diese Dateien befinden sich
normalerweise innerhalb eines ROS-Pakets im gleichnamigen Ordner und werden im XML-Format verfasst.
Es können Nodes, Parameter und weitere launch-Dateien definiert werden. Mithilfe von Funktionen
können auch Berechnungen und Namensauflösungen verwendet werden. Im ROS-Framework bilden
diese launch-Dateien einen wesentlichen Bestandteil, weil beliebig viele Knoten zusammengestellt und
organisiert werden können. Der Dateiname sollte so gewählt werden, dass die Funktionalität leicht zu
erkennen ist.

                                                   21
3 Verwendete ROS-Pakete

Im folgenden Kapitel werden die ROS-Pakete, die im Rahmen dieser Arbeit verwendet wurden, genauer
erklärt.

3.1 Transformationsbäume

Anhand eines Roboters mit einem Laserscanner werden die Transformationsbäume erläutert. Das erste
Koordinatensystem befindet sich im Mittelpunkt des Roboters und wird robot0 genannt. Das zweite
Koordinatensystem befindet sich im Zentrum des Laserscanners und wird robot0 laser 0 genannt. Nun
sollen die Laserdaten vom robot0 laser 0 benutzt werden, um Hindernissen aus der Umwelt auszuweichen.
Damit dies erfolgreich funktioniert, müssen die Laserdaten vom robot0 laser 0 in das Koordinatensystem
des robot0 transformiert werden. Dafür muss eine Beziehung zwischen robot0 laser 0 und robot0
Koordinatensystemen festgelegt werden. Der Laserscanner befindet sich beispielsweise 0,1 m vor und 0,3
m über dem Zentrum des Roboters. Wenn nun Daten des Lasers verarbeitet werden, muss eine Translation
vom robot0 laser 0 zum robot0 mithilfe des Offsetvektors t = (0, 1 0 − 0, 3)T durchgeführt werden.
Weil es bei vielen Koordinatensystemen schwierig ist, den Überblick zu behalten, können die Beziehungen
zwischen Koordinatensystemen mithilfe des ROS-Pakets TF definiert werden und dabei übernimmt
es die Transformation der Koordinatensysteme. In diesem Beispiel werden Koordinatensysteme robot0
und robot0 laser 0 einem sogenannten Transformationsbaum hinzugefügt. Dabei stellt jeder Knoten ein
Koordinatensystem und jede Kante eine Transformation zwischen zwei Knoten dar. TF benutzt diese
Baumstruktur und nimmt an, dass alle Kanten im Baum vom Elternknoten zum Kindknoten gerichtet
sind. Um eine Kante zu erstellen, muss entschieden werden, welcher Knoten den Elternknoten darstellt
und welche den Kindknoten. Hier wird robot0 als Elternknoten festgelegt, da das Roboterzentrum für
die Navigation wichtiger ist als das Zentrum des Lasers.

3.2 STDR-Simulator

Bevor am mobilen Roboter das implementierte Programm getestet werden kann, muss es zunächst in einer
Simulation funktionieren. Dazu muss die Simulation erst aufgebaut werden. Das hat den wesentlichen
Vorteil, dass die neu geschriebenen Veränderungen in der Implementierung ohne größeren Aufwand
und schnell getestet werden kann. Darüber hinaus wird mithilfe einer Simulation vermieden, dass der
Roboter z.B. durch Kollision Schaden nimmt, falls das Programm noch einen unentdeckten Fehler
enthält. Für den Aufbau der Simulation wird der STDR-Simulator verwendet, der bereits vorgefertigt in
ROS-Community zu finden ist. Der STDR Simulator basiert auf einer Server-Client Architektur. Jeder
Knoten des STDR-Simulators kann über die ROS-Schnittstellen kommunizieren. Darüber hinaus stellt
der Simulator eine GUI für eine Visualisierung zur Verfügung. Jedoch können alle Funktionen des Pakets
auch über die Kommandozeilenbefehle ausgeführt werden, ohne dass die GUI gestartet werden muss.

                                                   22
3 Verwendete ROS-Pakete

3.2.1 STDR-Server

Der STDR-Server besteht aus dem STDR-Server-Node und dem Map-Loader-Node:

STDR-Server-Node

Dieser Knoten ist für die Synchronisierung und Funktionalität des Simulators verantwortlich. Er liefert eine
statische Karte, welche die Umgebung repräsentiert und überwacht die aktiven Roboter. Darüber hinaus
stellt der Knoten verschiedene Befehle zur Verfügung, die für die Steuerung von Robotern verwendet
werden können.

Map-Loader-Node

Der Knoten verwendet den Kartenserver, der von ROS zur Verfügung gestellt wird, um eine Karte von
diesem Server in den Simulator zu laden. Diese Karte kann dann von anderen Paketen benutzt werden.

3.2.2 STDR-Robot

Dieses Paket ist für die Realisierung der Roboter, Laserscanner und eine Bewegungssteuerung verant-
wortlich. Um einen neuen Roboter in den Simulator zu laden, muss zunächst der STDR-Server gestartet
werden. Darüber hinaus können verschiedene Befehle aufgerufen werden. Außerdem benötigt ein Roboter
einen Transformationsbaum, damit er seine eigene Position und den Standort der Sensoren ermitteln
kann. Dabei ist für jeden Sensor ein eigenes Koordinatensystem zu definieren, um Namenskollisionen zu
vermeiden. Außerdem stellt jeder Roboter einen Transformationsbaum mit seiner aktuellen Position zur
Verfügung und der Name des Koordinatensystems wird automatisch zugewiesen, wie z.B robot0.

3.2.3 STDR-Ressourcen

Der Simulator ermöglicht eigene Roboter und Sensoren für den STDR-Simulator zu implementieren, die
dann vom STDR-Robot-Knoten verwendet werden, um mit der Simulation zu interagieren. Dafür können
sogenannte YAML-Dateien geschrieben werden. Es werden bereits Ressourcen bereitgestellt, die der
Simulator für seine Funktionalität benötigt. Die Ressourcen sind in Karten, Roboter- und Sensordateien
unterteilt. In einer YAML-Datei können dann die Eigenschaften parametriert werden. Jede Karte besteht
dabei aus einer PNG- und YAML-Datei. Eine PNG-Datei ist eine Bilddatei, die eine Umgebung darstellen
kann. Diese Dateien können beispielsweise über ein Bildbearbeitungsprogramm wie GIMP eigenständig
erstellt werden. Der STDR-Simulator stellt bereits sechs Karten zur Verfügung. Ein Roboter und ein
Sensor bestehen jeweils aus einer YAML-Datei. Jedoch kann ein Roboter mit seinen Sensoren auch in
einer Datei implementiert werden. In der Abbildung 3.1 wird der STDR-Simulator mit einem Roboter,
einem Laserscanner und einer verfügbaren Karte aus dem Simulator gezeigt.

                                                     23
3 Verwendete ROS-Pakete

                                    Abbildung 3.1: STDR-Simulator

3.3 Gmapping und Hector SLAM

Die Anforderungen der Lokalisierung und Kartierung einer mobilen Roboterplattform, die jeweils in den
Kapiteln 2.4 und 2.5 erläutert werden, werden mithilfe des SLAM Verfahrens erfüllt. Dabei bedeutet
SLAM eine gleichzeitige Positionsbestimmung und Kartierung. D.h., dass ein mobiler Roboter mithilfe von
unterschiedlichen Sensoren eine Karte seiner unmittelbaren Umgebung erstellt und eine Selbstlokalisierung
durchführt ([6]). Darüber hinaus muss der Roboter imstande sein, Hindernissen auszuweichen und zu
navigieren. Wenn die aktuelle Position des Roboters mithilfe eines Sensors ermittelt wurde, kann daraus
eine Karte erstellt werden. Dabei werden die Positionen der Hindernisse zu seinem aktuellen Standort
gemessen und mithilfe seiner eigenen Position können schließlich die genauen Standorte der Hindernisse
bestimmt werden, die anschließend in der Karte markiert werden. Mit den Daten der Robotersensoren
soll ohne Vorkenntnisse über die Umgebung eine Karte erstellt werden und die Position sowie die
Orientierung ermittelt werden. Dafür stehen in ROS die Pakete Gmapping und Hector SLAM zur
Verfügung. Beide Pakete funktionieren sehr ähnlich. Die beiden Knoten nehmen die Laserdaten und
erstellen daraus zweidimensionale Gitterkarten, in der Zustände der einzelne Gitterzellen abgespeichert
werden. Dabei kann eine Gitterzelle die Zustände besetzt, unexploriert oder frei annehmen. Im Rahmen
dieser Arbeit wurde der Gmapping Knoten in der Simulation (Kapitel 5.1) verwendet, da er besser mit
der Simulationsumgebung funktionierte als Hector SLAM. Bei dem Test mit dem realen Roboter wurde
hingegen Hector SLAM verwendet, weil die Kartierung und Lokalisierung Gmapping nicht funktionierte.

3.4 Navigation Stack und Move Base

Das Navigation Stack ist ein fertiges ROS-Paket, das für die Navigation eines Roboters verantwortlich
ist. Die bestmögliche Leistung wird bei quadratischen oder kreisförmigen Robotern erzielt. Prinzipiell
funktioniert es bei allen Roboterformen, außer bei großen rechteckigen Formen. Damit das Navigation
Stack und Move Base optimal funktioniert, muss der Roboter so konfiguriert sein, wie in der Abbildung
3.2 dargestellt.

                                                   24
3 Verwendete ROS-Pakete

                    Sensortransformationen             Kartenserver

                         global_planner               global_costmap

                                          Move Base                    Sensorquellen

                          local_planner               local_costmap

                        Robotersteuerung

                    Abbildung 3.2: Navigation Stack und Move Base (Quelle: [8])

In der Abbildung 3.2 sind die weiß markierten Komponenten ein hauptsächlicher Bestandteil von Move
Base. Diese sind bereits implementiert und können für die Navigation verwendet werden. Die grauen
Komponenten sind optional und ebenfalls bereits implementiert. Die blauen Komponenten müssen für
jede Roboterplattform erstellt werden und sind Teil des Navigation Stacks. Die einzelnen Komponenten
werden im Folgenden beschrieben.

3.4.1 Sensorquellen und -transformationen

Damit ein Roboter mit diesem Paket navigieren kann, muss ROS und das Paket TF konfiguriert sein,
da ein lokaler Transformationsbaum verwendet wird. Dieser Transformationsbaum stellt der mobilen
Roboterplattform Informationen über die Transformationen zwischen den unterschiedlichen Koordinaten-
systemen zur Verfügung. Darüber hinaus muss ein Laserscanner eingebunden werden, der für Kartierung
und Lokalisierung verantwortlich ist. Für eine erfolgreiche Navigation werden brauchbare Sensordaten
benötigt. Dazu müssen die Sensoren ihre Daten über die jeweiligen ROS-Nachrichten publizieren.

3.4.2 Robotersteuerung

Mithilfe dieser Sensordaten werden Geschwindigkeitsbefehle an die mobile Roboterplattform gesendet
werden. Für die Ansteuerung eines Roboters werden ROS-Nachrichten verwendet, die x-, y- und θ-
Geschwindigkeiten beinhalten. Diese Geschwindigkeitsbefehle werden abonniert und in die jeweiligen
Motorbefehle eines Roboters konvertiert.

                                                       25
3 Verwendete ROS-Pakete

3.4.3 Karten Server

Der Karten Server ist für die Kartierung der Umgebung verantwortlich. Dafür wird wiederum ein anderes
ROS-Paket benötigt, das in Kapitel 3.3 beschrieben wurde.

3.4.4 Die 2D-Kostenkarte

Die 2D-Kostenkarte stellt eine konfigurierbare Kartenstruktur zur Verfügung, auf deren Basis entschieden
wird, wohin der Roboter navigieren soll. Sie stellt eine xy-Ebene dar. D.h., dass sich beispielsweise
ein Gegenstand, der auf einem Regal abgelegt wurde, in der gleichen Zelle befindet und dieselben
Kosten besitzt wie das Regal, obwohl sie sich in der z-Koordinate unterscheiden. Um Informationen über
Hindernisse in der Umgebung zu speichern, verwendet die Kostenkarte Sensordaten und gegebenenfalls
die Informationen von einer statischen Karte. Ferner kann jeder Sensor Hindernisse in einer Zellen
markieren und löschen. Die Kostenwerte hängen von der Distanz zu den besetzten Zellen ab. Es gibt
fünf Kostenwerte, die für eine mobile Roboterplattform relevant sind:

Lethal

Der Kostenwert bedeutet, dass sich ein Hindernis in der aktuellen Zelle befindet. Wenn die Distanz
zwischen dem Zentrum des Roboters und dieser Zelle Null ist, dann kam es zu einer Kollision zwischen
dem Roboter und dem Hindernis.

Inscribed

Dieser Kostenwert bedeutet, dass die Entfernung zwischen dem Roboterzentrum und der besetzten Zelle
kleiner als der Roboterradius ist.

Possibly circumscribed

Dieser Kostenwert ist ähnlich zu dem Inscribed-Kostenwert, außer dass der Roboterradius als Distanz be-
nutzt wird. Wenn sich das Roboterzentrum in einer besetzten Zelle befindet, das diesen Wert überschreitet,
dann hängt es von der Orientierung des Roboters ab, ob es zur Kollision kommt.

Freespace

Der Kostenwert ist Null und bedeutet, dass der Roboter dort problemlos hinfahren kann.

Unknown

Der Kostenwert bedeuten, dass es keine Informationen über diese Zelle gibt.
Basierend auf der 2D-Kostenkarte verwendet Move Base drei Kostenkarten, um Informationen zu
speichern:

                                                    26
3 Verwendete ROS-Pakete

Globale und lokale Kostenkarte

Die globale Kostenkarte wird für die globale Pfadplanung, d.h. das Erstellen eines langfristigen Plans
über die gesamte Umgebung, verwendet. Die lokale Kostenkarte wird für eine lokale Pfadplanung und zur
Vermeidung von Hindernissen in der unmittelbaren Umgebung des Roboters benutzt. In den Kostenkarten
werden dann verschiedene Eigenschaften der Karten definiert, wie z.B. welche Koordinatensysteme
verwendet werden sollen oder die Höhe, Breite und Auflösung.

Allgemeine Konfiguration

Es gibt eine allgemeine Kostenkarte, die für beide Karten zunächst konfiguriert werden muss. In der
allgemeinen Konfiguration werden dann die Eigenschaften des Roboters und der Sensoren festgelegt, die
für die Erstellung der Kostenkarte relevant sind, wie z.B. die Größe des Roboters oder ob ein Laserscanner
Hindernisse hinzufügen oder entfernen darf.

3.4.5 Robotersteuerung (Base Local Planner)

Der Base Local Planner stellt eine Steuerungseinheit zur Verfügung, die eine mobile Roboterplattform
in der Ebene fahren lässt. Diese Steuerungseinheit verbindet die Pfadplanung mit dem Roboter. Auf
dem Weg zu einer Zielposition erstellt die Planung um den Roboter eine Gitterkarte in der Größe der
lokalen Kostenkarte. Eine Gitterzelle beinhaltet die Kosten für das Durchqueren dieser Zelle. Dabei ist
der globale Pfad in diesem Bereich abgebildet. Das Ziel des globalen Wegs liegt meist außerhalb des
Bereichs der Gitterkarte. Diese Gitterkarte wird dann für eine Bewertung der jeweiligen kinematischen
Trajektorien benutzt. Bei der Erstellung einer Trajektorie für die Annäherung an das Ziel wird zunächst
das lokale Ziel gesucht. Das lokale Ziel ist dann der erste Pfadpunkt, der sich innerhalb der lokalen
Kostenkarte befindet und einen weiterführenden Pfadpunkt außerhalb der lokalen Kostenkarte besitzt.
Bei der Bewertung der kinematischen Trajektorien werden zunächst die Geschwindigkeiten in x-, y- und θ-
Richtung einzeln betrachtet. Unter Berücksichtigung der aktuellen Roboterposition werden die einzelnen
Geschwindigkeiten simuliert, d.h. es wird das Resultat überprüft, wenn der Roboter mit einer bestimmten
Geschwindigkeit für eine kurze Zeitspanne fährt. Anschließend wird jedes Ergebnis einer simulierten
Trajektorie anhand von den Kriterien Schnelligkeit, Distanzen zu Hindernissen, zum lokalen Ziel und zum
globalen Pfad bewertet. Unzulässige Trajektorien wie beispielsweise Kollisionen werden verworfen. Ein
Beispiel für die Erstellung solcher Trajektorien wird in Abbildung 3.3 dargestellt. Es wird die optimale
Trajektorie ausgewählt und die damit verbundenen Geschwindigkeiten an den Roboter gesendet. Dieser
Vorgang wird solange wiederholt, bis das Ziel erreicht ist.

                   Abbildung 3.3: Erstellung verschiedener Trajektorien (Quelle: [9])

                                                    27
4 Implementierung des thi exploration node

In diesem Kapitel wird die Funktionsweise des Programms erläutert, das im Rahmen dieser Arbeit
implementiert wurde.

4.1 Aufbau einer Karte

Zunächst abonniert bzw. empfängt dieser Knoten eine zweidimensionale Gitterkarte vom Laserscanner
bzw. vom SLAM-Algorithmus. Darüber hinaus bekommt das Programm den Kartenursprung, -breite,
-höhe und die Auflösung der Karte. Die Gitterkarte ist in einzelne Pixel unterteilt und jeder Pixel ist
in einem Vektor gespeichert. Außerdem wird ein Array mitgeliefert, in dem Informationen über ein
Pixel gespeichert sind. Über einen Index kann auf einen Pixel und seine Information zugegriffen werden.
Diese Informationen enthalten den Zustand eines Pixels. Ein Pixel kann entweder den Zustand besetzt,
der schwarz bzw. mit dem Wert 100 gekennzeichnet wird, oder frei, der weiß bzw. mit dem Wert
0 gekennzeichnet wird, oder unexploriert, der grau bzw. mit dem Wert -1 gekennzeichnet wird. Die
Abbildung 4.1 zeigt einen beispielhaften Aufbau einer solchen Gitterkarte.

                                             Kartenbreite = 5
                                      0          1        2        3          4
                     Kartenhöhe = 4

                                      5          6        7        8          9

                                      10        11       12       13          14

                                      15       16        17       18          19

                                          Abbildung 4.1: Aufbau einer Karte

4.2 Berechnung der Nachbarpixel

Ein Pixel kann bis zu acht Nachbarn besitzen, wie in Abbildung 4.2 dargestellt wird. Diese können
mithilfe der Kartenbreite folgendermaßen berechnet werden:

                                                         28
4 Implementierung des thi exploration node

   • Rechts: Für die Berechnung des rechten Nachbarpixels, muss der aktuelle Pixelwert um eins erhöht
     werden. Jedoch darf der Wert nur um eins erhöht werden, wenn sich der aktuelle Pixelwert nicht
     in der letzten Spalte befindet.
   • Links: Für die Berechnung des linken Nachbarpixels, wird der aktuelle Pixelwert um eins verringert.
     Jedoch darf der Wert nur um eins verringert werden, wenn sich der aktuelle Pixelwert nicht in der
     ersten Spalte befindet.
   • Oben: Für die Berechnung des oberen Nachbarpixels, muss die Kartenbreite vom aktuellen Pixelwert
     subtrahiert werden. Jedoch darf die Kartenbreite nur subtrahiert werden, wenn sich der aktuelle
     Pixelwert nicht in der ersten Zeile befindet.
   • Unten: Für die Berechnung des unteren Nachbarpixels, wird die Kartenbreite auf den aktuellen
     Pixelwert addiert. Jedoch darf die Kartenbreite nur addiert werden, wenn sich der aktuelle Pixelwert
     nicht in der letzten Zeile befindet.
   • Links, oben: Für die Berechnung eines diagonalen Nachbarpixels, der sich links oben befindet, wird
     die Kartenbreite um eins erhöht und dann vom aktuellen Pixelwert subtrahiert. Jedoch darf diese
     Berechnung nur erfolgen, wenn sich der aktuelle Pixelwert weder in der ersten Zeile noch in der
     ersten Spalte befindet.
   • Rechts, oben: Für die Berechnung eines diagonalen Nachbarpixels, der sich rechts oben befindet,
     wird die Kartenbreite um eins verringert und dann vom aktuellen Pixelwert subtrahiert. Jedoch
     darf diese Berechnung nur erfolgen, wenn sich der aktuelle Pixelwert weder in der ersten Zeile noch
     in der letzte Spalte befindet.
   • Links, unten: Für die Berechnung eines diagonalen Nachbarpixels, der sich links unten befindet,
     wird die Kartenbreite um eins verringert und dann auf den aktuellen Pixelwert aufsummiert. Jedoch
     darf diese Berechnung nur erfolgen, wenn sich der aktuelle Pixelwert weder in der letzten Zeile
     noch in der ersten Spalte befindet.
   • Rechts, unten: Für die Berechnung eines diagonalen Nachbarpixels, der sich rechts unten befindet,
     wird die Kartenbreite um eins erhöht und dann auf den aktuellen Pixelwert aufsummiert. Jedoch
     darf diese Berechnung nur erfolgen, wenn sich der aktuelle Pixelwert weder in der letzten Zeile
     noch in der letzten Spalte befindet.

                                      links                rechts
                                                 oben
                                      oben                 oben

                                                 akt.
                                      links                rechts
                                                 Pixel

                                      links                rechts
                                                unten
                                      unten                unten

                             Abbildung 4.2: Berechnung der Nachbarpixel

Ein Beispiel für die Berechnung des unteren Nachbarpixel sowie die Bedingung, dass der Pixel nicht in
der letzten Zeile sein darf, sieht dann folgendermaßen aus:

                                                  29
4 Implementierung des thi exploration node

int unten = aktueller Pixel + Kartenbreite ;

if      ( unten
Sie können auch lesen