EM2019WSP03/Implementierungsdetails

Aus Verteilte Systeme - Wiki
Zur Navigation springen Zur Suche springen

Um einen Einblick in die Implementierung des Projektes zu gewähren, finden sich hier kurze Code Beispiele. Die genaue Umsetzung der Funktionalität ist aufgrund der sehr verbreiteten Copy-Paste Mentalität, nur auf Anfrage im Gitlab Repository zu finden. Die zuständigen Professoren haben selbstverständlich Zugriff.


Bewegungssteuerung

Instanziieren und Ansteuern eines Motors

In diesem Code Stückchen, wird ein Motor mit Namen 'DriveMotor' erstellt, bei Aufruf der Prozedur dreht sich dieser vorwärts.

DriveMotor : constant Motor_ID := Motor_A;

procedure Forward is
    begin
      Control_Motor(DriveMotor, Speed_Drive,Forward);
  end Forward;

Fahren einer wählbaren Distanz

Dieses Beispiel wurde im Projekt dazu benutzt um gewünschte Distanzen genau abfahren zu können. Nach einer Prüfung in welche Richtung gefahren werden soll wird mit der Prozedur 'Measure_Distance' aus dem Modul 'sensors' die Distanz gemessen. Nach Abschluss der Messung wird der Motor angehalten.

procedure Drive_Distance(dist : in Integer; direction : in String) is
    begin
      if direction = "forward" then
        Forward;
        Measure_Distance(dist, direction);
      else
        Backward;
        Measure_Distance(dist, direction);
      end if;

      Brake_DriveMotor;
  end Drive_Distance;

Drehen der Vorderräder nach links

Hier wird der Motor der für die Drehung der Vorderräder zuständig ist im Rückwärtslauf eingeschaltet. In der zusätzlichen Prozedur 'Measure_Degrees' aus dem Modul 'sensors' wird der Motor Encoder ausgelesen, bei erreichen der Gradzahl wird der Motor gestoppt.

procedure Turn_Left is
    begin
      Control_Motor(TurnMotor, Speed_Turn, Backward);
      Measure_Degrees(45, "left");
      Brake_TurnMotor;
  end Turn_Left;

Stopp an einem parallelen Hindernis

Diese Prozedur erkennt Hindernisse auf der rechten Seite des Fahrzeuges, je nach gewähltem 'mode' wird erkannt ob der gemessene Abstand größer oder kleiner wird. Beim erreichen des selbst gewählten Schwellwertes wird das Fahrzeug gestoppt.

procedure Side_Stop(right_space : in Natural; mode : in String) is
    begin
      Forward;
      Side_Space(right_space, mode);
      Brake_DriveMotor;
  end Side_Stop;

Testen der Parkplatzgröße

Um eine Entscheidung treffen zu können ob ein Parkplatz groß genug ist liefert diese Prozedur einen Boolean Wert der diese Entscheidung repräsentiert. Dazu wird eine Prozedur des Modules 'sensors' aufgerufen, diese misst die zurückgelegte Wegstrecke ab Aufruf.

procedure Parkspot_Test(result : out Boolean) is
    parkspot_length : Float;
    begin
      Measure_Length(parkspot_length);

      if parkspot_length < 600.0 then
        result := False;
        Put_Noupdate(Integer(parkspot_length));
        delay until Clock + Seconds (1);
      else
        result := True;
        delay until Clock + Seconds (1);
      end if;