ArduMower: Kartierung in Matlab/Simulink: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Zeile 224: Zeile 224:
! style="font-weight: bold;" | ID
! style="font-weight: bold;" | ID
! style="font-weight: bold;" | Testfallbeschreibung
! style="font-weight: bold;" | Testfallbeschreibung
! style="font-weight: bold;" | Eingang <math>_Kv_{Lx} [\mbox{m/s}]</math>
! style="font-weight: bold;" | Eingänge x,y,PosAlt,Ausrichtung,Karte,Bumper,Ultraschall,Perimeterschleife
! style="font-weight: bold;" | Eingang <math>_Kv_{Rx}[\mbox{m/s}] </math>
! style="font-weight: bold;" | Erwartetes Ergebnis
! style="font-weight: bold;" | Erwartetes Ergebnis
! style="font-weight: bold;" | Testergebnis
! style="font-weight: bold;" | Testergebnis
Zeile 232: Zeile 231:
|-
|-
| 1
| 1
| Das Fahrzeugmodell steht.
| Der Mäher steht.
| 0
| 0.3, 0.0, [0;0], 0, Karte, 0, 0, 1000
| 0
| Neues Feld wird Blau markiert.
| Alle Ausgänge sind Null.
| OK
| OK
| Prof. Göbel
| Prof. Schneider
| 10.06.2017
| 21.01.2018
|-
|-
| 2
| 2
| Das Fahrzeugmodell fährt eine Rechtskurve.
| Das Fährt auf der Perimeterschleife.
| 1
| 0.6, 0.0, [0.3;0.0], 0, Karte, 0, 0, 1000
| 0
| Neues Feld wird blau markiert, altes Feld wird rot markiert.
| Rechtskurve: Negative Gierrate, negativer Gierwinkel.
| OK
| OK
| Prof. Göbel
| Prof. Schneider
| 10.06.2017
| 21.01.2018
|-
|-
| 3
| 3
| Das Fahrzeugmodell fährt eine Linkskurve.
| Das Fährt auf ungemähtem Rasen.
| 0
| 0.6, 0.6, [0.3;0.3], 0, Karte, 0, 0, 1000
| 1
| Neues Feld wird blau markiert, altes Feld wird hellgrün markiert.
| Linkskurve: Positive Gierrate, positiver Gierwinkel.
| OK
| OK
| Prof. Göbel
| Prof. Schneider
| 10.06.2017
| 21.01.2018
|-
|-
| 4
| 4
| Das Fahrzeugmodell fährt geradeaus.
| Das Fährt auf gemähtem Rasen.
| 1
| 0.6, 0.6, [0.3;0.3], 0, Karte, 0, 0, 1000
| 1
| Neues Feld wird blau markiert, altes Feld wird hellgrün markiert.
| Keine Gierrate und Gierwinkel, <math>_Kv_M = _Kv_L = _Kv_R</math>.
| OK
| Prof. Schneider
| 21.01.2018
|-
| 5
| Das Fährt auf ein Objekt.
| 0.6, 0.6, [0.3;0.3], 0, Karte, 1, 0, 1000
| Neues Feld wird magenta markiert, altes Feld wird hellgrün markiert.
| OK
| OK
| Prof. Göbel
| Prof. Schneider
| 10.06.2017
| 21.06.2017
|-
|-
|}
|}

Version vom 21. Januar 2018, 15:32 Uhr

Matrix-basierte Karte der zu mähenden Fläche in Matlab/Simulink

Autor: Prof. Dr.-Ing. Schneider


Einleitung

Dieser Artikel beschreibt den Aufbau einer Matrix-basierten Karte zur Darstellung des aktuellen Mähstandes eines Rasenmähroboters. Der Anstoß zur Entwicklung dieser Karte lieferte das Projekt "ArduMower", in dem der Kollege Prof. Göbel und der Autor dieses Artikels mit Studierenden gemeinsam einen autonomen Rasenmäher entwickeln, siehe Projekt_ArduMower.

Das systematische Vorgehen bei der Entwicklung des Modells orientiert sich am V-Prozessmodell.

Anforderungen

Im Lastenheft des Projektes ArduMower wird die Erstellung einer selbstlernenden Karte gefordert:

Im Pflichtenheft taucht daraufhin der Punkt Selbstlernende Karte auf, konkrete Anforderungen an werden jedoch nicht näher spezifiziert:

Folgende Anforderungen wurden an die Karte gestellt:

ID Inhalt Ersteller Datum Geprüft von Datum
1 Die Karte muss als Matrix mit der Rastergröße 30cm umgesetzt werden (Grid-Map). Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018
2 Die Perimeterschleife muss rot markiert werden. Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018
3 Die aktuelle Position des Mähers muss Blau markiert werden. Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018
4 Hindernisse müssen magenta markiert werden. Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018
5 Unbekannte Bereiche müssen weiß bleiben. Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018
6 Ungemähter Rasen muss dunkelgrün und gemähter Rasen hellgrün markiert werden. Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018
7 Die Karte muss zyklisch aktualisiert werden. Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018
8 Die Umsetzung muss als Matlab-Skript erfolgen, so dass eine Einbindung in Simulink als Matlab-Funktion möglich ist. Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018
9 Eingangsgrößen der Funktion Kartenfunktion.m sind
  1. Aktuelle Positionen in m: xNeu,yNeu
  2. Alter Positionsvektor in m: PosAlt
  3. Ausrichtung der Karte in deg: Ausrichtung
  4. Aktuelle Karte: Karte
  5. Signale zur Objekterkennung: Bumper,Ultraschall
  6. Signalstärke der Perimeterschleife: Perimeterschleife
Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018
10 Ausgangsgrößen der Funktion Kartenfunktion.m sind
  1. Aktueller Positionsvektor in m: PosNeu
  2. Aktuelle Karte: Karte
Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018
11 Die Initialisierung muss 1s und die zyklische Darstellung muss 1ms unterschreiten. Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018
12 Bei Kommentierung und Dokumentation muss sich an die Projektrichtlinien gehalten werden. Prof. Schneider 18.01.2018 Hr. Kreuer 18.01.2018

Funktionaler Systementwurf / Technischer Systementwurf

Bei der Größe des zu erstellenden Modells werden die Schritte Funktionaler Systementwurf/Technischer Systementwurf des V-Modells zusammen gelegt und bereits Schnittstellen zwischen den einzelnen Blöcken definiert.

Schnittstellen für die Modellierung einer selbstlernenden Karte

Komponentenspezifikation

Das Modell wird insgesamt als Komponente aufgefasst, d. h. die einzelnen Blöcke aus dem Systementwurf werden als Bestandteil der Komponente "Selbstlernende Karte" definiert. Die Funktion der Komponente "Selbstlernende Karte" wird in Form eines PAP spezifiziert.

Spezifikation der selbstlernenden Karte

Programmierung

die Programmierung unterscheidet sich

  1. in die Initialisierung und
  2. die zyklische Aktualisierung

der selbstlernenden Karte.

Initialisierung

In der einmaligen Initialisierung werden die Farben der Karteninhalte entsprechend der Anforderungen festgelegt. Die aColorMap wird anderen Programmteilen als globale Variable zur Verfügung gestellt.

% Farben festlegen
cUnbekannt = [1 1 1];        nUnbekannt    = 0;
cPerimeter = [1 0 0];        nPerimeter    = 1;
cNichtGemaeht = [0.5 0.8 0]; nNichtGemaeht = 2;
cGemaeht = [0 1 0];          nGemaeht      = 3;
cArduMower = [0 0 1];        nArduMower    = 4;
cHindernis = [1 0.5 1];      nHindernis    = 5;

aColorMap = [ cUnbekannt ; cPerimeter ; cNichtGemaeht ; cGemaeht  ; cArduMower ; cHindernis ];

Die Karte wird aus einer Datei geladen und in Form und Größe initialisiert. Hierzu gehört auch die beschriftung der Achsen und die Darstellung des Gitters in Meter. Die Handles hierzu werden persistent gespeichert.

Karte = imread('libraries/mKarte.png'); % Karte laden
%% Karte in Größe und Form initialisieren
mKarte = Karte; % Ursprüngliche Karte sichern
hKarte = figure;
set(hKarte,'WindowStyle', 'normal')
hImg = imshow(Karte,aColorMap); set(gca,'YDir','normal');
hAxes = gca;
set(hKarte,'Position',[1     1   500   600],'OuterPosition',[ 550   300   500   600]); % 589
set(hAxes,'OuterPosition',[-0.1068   0    1.1819    1])
set(hAxes,'Visible','on')
xt = 0: 10:size(Karte, 2)-1;
yt = 0: 10:size(Karte, 1)-1;
for i=1:length(xt)
    xtLabel{i}=num2str(xt(i)*0.3);
end
for i=1:length(yt)
    ytLabel{i}=num2str(yt(i)*0.3);
end
set(gca, 'xgrid', 'on', 'ygrid', 'on', 'xtick', xt, 'ytick', 1/2+yt, 'xticklabel', xtLabel, 'yticklabel', ytLabel)
xlabel('x in m'); ylabel('y in m');

Aktualisierung

Bei der zyklischen Aktualisierung muss:

  • die Position in m in die Kartenmatrix umgerechnet,
  • eine Aktualisierung überprüft,
  • die neue Position eingetragen und
  • die alte Position aktualisiert

werden.

Die Umrechnung erfolgt über:

nKartenPosAlt = floor((PosAlt/0.30))+1;
nKartenPosNeu  = floor((PosNeu/0.30))+1;

Eine Aktualisierung ist notwenig, wenn ein neues Matrixfeld erreicht wurde:

if ~isequal(nKartenPosNeu,nKartenPosAlt)

Hindernisse werden in der Karte vermerkt oder die neue Mäherposition eingetragen:

if Bumper==1
    Karte(nKartenPosNeu(1),nKartenPosNeu(2))  = nHindernis;
    mKarte(nKartenPosNeu(1),nKartenPosNeu(2)) = nHindernis; % Hindernisse nicht aus Karten löschen
else
    Karte(nKartenPosNeu(1),nKartenPosNeu(2)) = nArduMower; % Neue Position des Mähers markieren
end

Anschließend werden die alten Mäherpositionen gemäß Anforderungen eingefärbt:

switch mKarte(nKartenPosAlt(1),nKartenPosAlt(2))
    case nNichtGemaeht
        Karte(nKartenPosAlt(1),nKartenPosAlt(2)) = nGemaeht;
    case nPerimeter
        Karte(nKartenPosAlt(1),nKartenPosAlt(2)) = nPerimeter;
    case nHindernis
        Karte(nKartenPosAlt(1),nKartenPosAlt(2)) = nHindernis;
    case nUnbekannt
        Karte(nKartenPosAlt(1),nKartenPosAlt(2)) = nUnbekannt;
end

Abschließend wird der aktualisierte Inhalt der Karte dargestellt:

set(hImg,'CData',Karte); % Karte aktualisieren
end

Komponententest

Da es sich bei dieser Entwicklung um die einer einzelnen Komponente handelt, schließt der Komponententest mit dem Testbericht die Entwicklung ab.

ID Testfallbeschreibung Eingänge x,y,PosAlt,Ausrichtung,Karte,Bumper,Ultraschall,Perimeterschleife Erwartetes Ergebnis Testergebnis Testperson Datum
1 Der Mäher steht. 0.3, 0.0, [0;0], 0, Karte, 0, 0, 1000 Neues Feld wird Blau markiert. OK Prof. Schneider 21.01.2018
2 Das Fährt auf der Perimeterschleife. 0.6, 0.0, [0.3;0.0], 0, Karte, 0, 0, 1000 Neues Feld wird blau markiert, altes Feld wird rot markiert. OK Prof. Schneider 21.01.2018
3 Das Fährt auf ungemähtem Rasen. 0.6, 0.6, [0.3;0.3], 0, Karte, 0, 0, 1000 Neues Feld wird blau markiert, altes Feld wird hellgrün markiert. OK Prof. Schneider 21.01.2018
4 Das Fährt auf gemähtem Rasen. 0.6, 0.6, [0.3;0.3], 0, Karte, 0, 0, 1000 Neues Feld wird blau markiert, altes Feld wird hellgrün markiert. OK Prof. Schneider 21.01.2018
5 Das Fährt auf ein Objekt. 0.6, 0.6, [0.3;0.3], 0, Karte, 1, 0, 1000 Neues Feld wird magenta markiert, altes Feld wird hellgrün markiert. OK Prof. Schneider 21.06.2017

Als Abschluss zeigt die letzte Abbildung dieses Artikels eine Ergebnisdarstellung der Fahrzeugbewegung in I-Koordinaten (Draufsicht).

Ergebnisdarstellung der Modellierung einer selbstlernenden Karte
Ergebnisdarstellung der Modellierung einer selbstlernenden Karte

Zusammenfassung

Eine selbstlernende Karte wurde gemäß Anforderungen programmiert, getestet und dokumentiert. Als Ansteuerung wurde eine einfache Mäanderfahrt implementiert. Nun kann die Mähstrategie anahnd dieser Karte in Echtzeit visualisiert werden.

Link zum Quelltext in SVN

SVN: ArduMower Softwareprojekt



→ zurück zum Hauptartikel: Projekt ArduMower