kramann.info
© Guido Kramann

Login: Passwort:










kramann.info
© Guido Kramann

Login: Passwort:




Entwicklung autonomer mobiler Systeme MBM im Sommersemester 2023

(EN google-translate)

(PL google-translate)

  • Angaben zu Veranstaltungszeiten und Räumen dieser Lehrveranstaltung finden Sie auf der Startseite kramann.info dieses Portals.
  • Hier bei "day by day" werden chronologisch im Verlauf des Semesters die behandelten Inhalte vermerkt.
  • Meistens werden Links innerhalb von kramann.info angegeben, wo der jeweils behandelte Stoff dargestellt wird.
  • Zur Orientierung finden Sie auf kramann.info auch noch das "day by day" der gleichen Lehrveranstaltung vom vorangehenden Jahr.
  • Die Prüfung in diesem Fach ist eine Projektarbeit mit Ausarbeitung, die nur anerkannt werden kann, wenn sie Semester begleitend betreut wurde.
  • Die folgenden vorab angegebenen Links stellen Quellen dar, aus denen die hier behandelten Inhalte genommen werden.
  • Jedoch sollen die Inhalte in diesem Semester neu ausgerichtet werden und gehen über das hinaus, was unter nachfolgenden Links zu finden ist:

kramann.info -- Angaben zu Veranstaltungszeiten und Räumen dieser Lehrveranstaltung
83_AV
05_esp32AV
67_Echtzeitsysteme
72_COACH2
73_COACH3
74_EmbSyst
50_Simulationstechnik
62_Regelungssysteme
79_Deep_Learning
78_Processing
77_Android

#1 Fr 24.03.2023

  • Autonomes Fahren ist ein weites Feld.
  • Insbesondere existieren seit den 50er Jahren gut funktionierende Fahrerlose Transportsysteme (FTS), wohingegen autonomes Fahren auf der Straße seit den 80er Jahren entwickelt wird, aber bisher nur Teilerfolge erzielt wurden.
  • Dieser Kurs soll Einblick in aktuelle Entwicklungen auf dem Feld geben aber es soll auch autonomes Fahren exemplarisch modellhaft umgesetzt werden.
  • Als Grundlage soll die aus "Fehlertoleranter Software Entwurf" bekannte Plattform esp32AV dienen.
  • Parallel soll eine rudimentäre Simulationsumgebung umgesetzt werden, um auch KI basierte, bzw. auf Softcomputing basierende automatische Lernvorgänge umsetzen zu können.
  • Die Softwareentwicklung erfolgt mittels Java/Processing.
  • Als Hilfsmittel soll erstmalig ChatGPT zum Einsatz kommen.

Ein Beispiel mit ChatGPT (21.03.2023 https://chat.openai.com/chat):

FRAGE:

Schreibe eine Klasse "Matrix" in Java/Processing, die die folgende Schnittstelle iMatrix
implementiert und mit show() die gespeicherte zweidimensionale Integer-Matrix im Grafik-Fenster anzeigt.
Dieses zweidimensionale Integer-Array wird bei Erzeugen eines Objektes dem Konstruktor übergeben 
und eine Referenz der Matrix soll im Objekt als private Attribut gespeichert werden.
Die Darstellung soll die Zahlen in den Zeilen und Spalten der Matrix in einem rechteckigen Schema darstellen. 
Die Matrix soll zudem so angezeigt werden, dass Einer, Zehner usw. untereinander in Flucht dargestellt werden.

Hier ist die Schnittstelle:

public interface iMatrix
{     
    public abstract void show();
}

ANTWORT:

Hier ist eine mögliche Implementierung der Klasse "Matrix" in Java/Processing, 
die die Schnittstelle iMatrix implementiert und eine zweidimensionale 
Integer-Matrix im Grafik-Fenster anzeigt:

public class Matrix implements iMatrix {
  
  private int[][] matrix;
  private PApplet parent;
  
  public Matrix(PApplet parent, int[][] matrix) {
    this.parent = parent;
    this.matrix = matrix;
  }
  
  public void show() {
    int numRows = matrix.length;
    int numCols = matrix[0].length;
    
    int cellSize = 40;
    int startX = 50;
    int startY = 50;
    
    parent.textSize(20);
    parent.noStroke();
    
    for (int i = 0; i < numRows; i++) {
      for (int j = 0; j < numCols; j++) {
        int value = matrix[i][j];
        int x = startX + j * cellSize;
        int y = startY + i * cellSize;
        
        parent.fill(255);
        parent.rect(x, y, cellSize, cellSize);
        
        parent.fill(0);
        parent.text(value, x + cellSize/2, y + cellSize/2);
      }
    }
  }
}

Die Klasse nimmt im Konstruktor eine Referenz auf das Processing-Objekt 
parent sowie ein zweidimensionales Integer-Array matrix als Argumente. 
Die Matrix wird als private Attribut matrix gespeichert.

Die Methode show() zeichnet die Matrix im Grafik-Fenster. Die Größe der 
Zellen wird auf cellSize festgelegt, der Abstand zum linken und oberen 
Rand auf startX und startY. Die Methode iteriert über die Zeilen und 
Spalten der Matrix und zeichnet für jede Zelle ein weißes Rechteck mit 
schwarzer Zahl in der Mitte.

Die Zahlen werden mit der Processing-Methode text() in der Mitte der 
Zelle platziert und mit der Methode textSize() auf 20 Pixel gesetzt. 
Die Methode noStroke() sorgt dafür, dass keine Umrandung der Zellen gezeichnet wird.

Um die Klasse zu nutzen, kann ein Objekt von Matrix mit einer Matrix-Referenz 
erstellt und die show-Methode aufgerufen werden:

int[][] matrix = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} };
Matrix matrixObj = new Matrix(this, matrix);
matrixObj.show();

Code 0-1: Frage an ChatGPT und dessen Antwort.

Ohne Anspruch auf Vollständigkeit zergliedert sich die Lehrveranstaltung in folgende Einzelthemen:

  1. FTS kennenlernen
  2. Aktuellen Stand beim autonomen Fahren auf der Straße kennenlernen
  3. Ethische Implikationen kennenlernen (Moral machine vom MIT)
  4. Softcomputing-Techniken: Evolutionäre Algorithmen, Neuronale Netze, Fuzzy-Logik
  5. Modellierung und Simulation eines Fahrzeugschwarms
  6. Aufbau eines Fahrzeugschwarms in Hardware
  7. Umsetzung kleiner Aufgaben im Zusammenhang des autonomen Fahrens

Ergänzend sollen auch aktuelle Forschungsergebnisse angeschaut werden. Dies erfolgt seminaristisch.

FTS
Savant Automation Overview
Autonomes Fahren Level 1 bis 5
Autonomes Fahren: Die fünf Level
Warum ist autonomes Fahren noch nicht so weit?
Why self-driving cars have stalled | It's Complicated
Miteinander zu kombinierende Teilsysteme
Volkswagen Spurhalteassistent "Lane Assist"
Automatischer Abstandshalte-Tempomat
Mercedes-Benz S-Klasse 2017: Aktiver Abstands-Assistent DISTRONIC - Geschwindigkeitsanpassung
Autonomes Fahren und Sicherheit

Schaut man sich das zweite Video an, so wird einem sofort klar, dass es hier auch um Sicherheit gehen soll. So hat Schweden sich das Ziel gesetzt, keine Verkehrstoten mehr zu haben und die Firma Volvo, dass es keine Unfälle mehr mit Autos dieser Marke geben soll.

esp32AV -- Linienverfolgung mit PID-Regler
Personenkutschfahrt
Autonomes Fahren und Ethik
Moral Machine

Gehen Sie in Zweiergruppen die Szenarien durch.



Diskutieren Sie anschließend im Plenum Ihre Erfahrungen.


Feedback

Was sind Ihre Erwartungen an diesen Kurs?


#2 Fr 31.03.2023

Themen:
  1. Auswahl des Seminarthemas
  2. Wiederholung zu Java/Processing
  3. Wiederholung zu OOP mit Java
  4. Einführung des Schwarmsimulators
  5. Übungen zum Schwarmsimulator
public void setup()
{
    size(500,500);
    frameRate(1);
}

boolean AN = true;
public void draw()
{
     background(255);
     if(AN)
        fill(0,255,0);
     else
        fill(255,0,0);
     ellipse(width/2, height/2, height/2, height/2);   
     AN = !AN;
}

Code 0-2: Unterrichtsbeispiel zu Processing.

public void setup()
{
  size(500,500);
  frameRate(1);
}

boolean AN = true;
public void draw()
{
  background (255);
  textSize(100);
  if(AN)
    {
      fill (0,255,0);
    }
  else
      {
      fill (255,0,0);
      }
      
   ellipse(width/2, height/2, height/2, height/2);
      
  if(AN)
    {
      fill (0);
      text("AN", 175, 275);
    }
  else
      {
      fill (0);
      text("AUS", 150, 275);
      }
     
      AN = !AN;
      
}

Code 0-3: Variante 2

public void setup()
{
  size(500,500);
  frameRate(1);
}

boolean AN = true;
public void draw()
{
  background (255);
  textSize(100);
  if(AN)
  {
      fill (0,255,0);
      ellipse(width/2, height/2, height/2, height/2);
      fill(0);
      text("AN", 175, 275);
  }
  else
  {
      fill (255,0,0);
      ellipse(width/2, height/2, height/2, height/2);
      fill(0);
      text("AUS", 150, 275);
  }          
   AN = !AN;      
}

Code 0-4: Variante 3

public void drawSchild(int[] FARBE, String text)
{
      fill (FARBE[0],FARBE[1],FARBE[2]);
      ellipse(width/2, height/2, height/2, height/2);
      fill(0);
      text(text, 175, 275);    
}

public void setup()
{
  size(500,500);
  frameRate(1);
}

boolean AN = true;
public void draw()
{
  background (255);
  textSize(100);
  if(AN)
  {
      drawSchild(new int[] {0,255,0},"AN");
  }
  else
  {
      drawSchild(new int[] {255,0,0},"AUS");
  }          
   AN = !AN;      
}

Code 0-5: Variante 4

Screenshot.

Bild 0-1: Screenshot.

OOP
Auto auto1,auto2;

public void setup()
{
    auto1 = new Auto(new int[] {255,0,0},new int[] {0,255,0});
    auto2 = new Auto(new int[] {255,0,255},new int[] {128,0,0});
    size(500,500);  
}

public void draw()
{
    for(int i=0;i<width;i+=250)
       auto1.draw(i,height/2);
    for(int i=0;i<width;i+=220)
       auto2.draw(i,height/4);
}

Code 0-6: Hauptsketch

public class Auto
{
     int[] COL1;
     int[] COL2;
     public Auto(int[] COL1, int[] COL2)
     {
         this.COL1 = COL1.clone();
         this.COL2 = COL2.clone();
     }
     
     public void draw(float x, float y)
     {
          fill(COL1[0],COL1[1],COL1[2]);
          rect(x,y,200,50);
          rect(x+30,y-30,80,30);
          fill(COL2[0],COL2[1],COL2[2]);
          ellipse(x+30,y+50,20,20);
          ellipse(x+200-30,y+50,20,20);
     }
}

Code 0-7: Tab "Auto"

Screenshot

Bild 0-2: Screenshot

Auto auto1,auto2;

public void setup()
{
    int[] arr = new int[3];
    int[] arr1 = {1,2,3};
    // arr[0]=9;
  
    auto1 = new Auto(new int[] {255,0,0},new int[] {0,255,0});
    auto2 = new Auto(new int[] {255,0,255},new int[] {128,0,0});
    size(600,600);  
}

int x=0;
public void draw()
{
    background(123);
    for(int i=-width;i<width;i+=200)
       auto1.draw(x+i,height/2);
    for(int i=-width;i<width;i+=200)
       auto2.draw(x*2+i,height/4);
       
    x+=4;   
    x%=width/2;
}

Code 0-8: Variante: Fahrende Kolonne.

Auto auto1,auto2,auto3;

public void setup()
{
    int[] arr = new int[3];
    int[] arr1 = {1,2,3};
    // arr[0]=9;
  
    auto1 = new Auto(new int[] {255,0,0},new int[] {0,255,0});
    auto2 = new Auto(new int[] {255,0,255},new int[] {128,0,0});
    auto3 = new Auto(new int[] {0,255,0},new int[] {128,128,0});
    size(800,600);  
}

int x=0;
public void draw()
{
    background(123);
    for(int i=-width;i<width;i+=200)
       auto1.draw(x+i,height/2);
    for(int i=-width;i<width;i+=200)
       auto2.draw(x*2+i,height/4);
    for(int i=-2*width;i<width*2;i+=200)
       auto3.draw(x*4+i,height/4+height/2);
       
    x+=4;   
    x%=width/2;
    //if(x>=width/2) x=0;
    
}

Code 0-9: Variante: drei fahrende Kolonnen.

Eine Klasse, die Vektoren erzeugt
public class Vektor
{
    private double x,y;
    
    public Vektor(double xx, double yy)
    {
        x = xx;
        y = yy;
    }
    
    public double length()
    {
        return Math.sqrt(x*x+y*y);
    }
}
public void setup()
{
    Vektor v1 = new Vektor(1,2);
    Vektor v2 = new Vektor(3,4);
    
    println("|v1|="+v1.length());
    println("|v2|="+v2.length());
    
    println("v1.x="+v1.x);
}

public void draw()
{
}

Code 0-10: Eine Klasse, die Vektoren erzeugt

Variante: drei fahrende Kolonnen.

Bild 0-3: Variante: drei fahrende Kolonnen.

Modellierung und Simulation eines Fahrzeugschwarms
Screenshot zu AVSIM004_multiCar

Bild 0-4: Screenshot zu AVSIM004_multiCar

AVSIM001.zip -- Kinematik und Minimalistische Darstellung eines Fahrzeugs in Vogelperspektive.
AVSIM002_Video.zip -- Simulation des Kameraerfassungsbereiches des Fahrzeugs.
AVSIM003_Speed.zip -- Berechnung der Bewegung des Fahrzeugs in Abhängigkeit von den Radgeschwindigkeiten links und rechts.
AVSIM004_multiCar.zip -- Simulation mehrerer Fahrzeuge und Integration der Fahrzeuge in die Szene.
Vorübungen mit AVSIM zur Einarbeitung (jeweils allein):
  1. Sorgen Sie dafür, dass das Kamerabild aller drei Fahrzeuge nebeneinander in passender Größe sichtbar wird.
  2. Ergänzen Sie ein viertes Fahrzeug und sorgen Sie wieder dafür, dass das Kamerabild aller vier Fahrzeuge gut sichtbar ist.
  3. Positionieren Sie alle vier Fahrzeuge jeweils in einem Viertelkreis Abstand auf dem Kreis.
  4. Sorgen Sie dafür, dass alle vier Fahrzeuge gleichschnell halbwegs genau gegen den Uhrzeigersinn im Kreis fahren.
Übungen mit AVSIM (jeweils in Zweiergruppen):
  1. Ergänzen Sie eine Schwerpunktsberechnung, die den Schwerpunkt der im jeweiligen Kamerabild sichtbaren roten Pixel entlang der Querachse eines Fahrzeugs bestimmt.
  2. "Spurhalteassistent": Setzen Sie mit Hilfe der Schwerpunktsberechnung eine Lenkregelung um, die die Fahrzeuge auf der Bahn hält.
  3. "Tempomat": Wird ein anderes Fahrzeug voraus im Kamerabild sichtbar, soll das aktuell betrachtete fahrzeug seine Geschwindigkeit mit dem vorderen Fahrzeug angleichen.
  4. Testen Sie das Gesamtsystem: Zu Beginn sei ein Fahrzeug das langsamste. Das danach ist etwas schneller, das danach noch etwas schneller usw. Nach einiger Zeit sollten alle Fahrzeuge im Konvoi fahren.

#3 Fr 14.04.2023

#4 Fr 21.04.2023

#5 Fr 28.04.2023

#6 Fr 05.05.2023

#7 Fr 12.05.2023

#8 Fr 26.05.2023

#9 Fr 02.06.2023

#10 Fr 09.06.2023

#11 Fr 16.06.2023

#12 Fr 23.06.2023

#13 Fr 30.06.2023 Projektpräsentationen