Legosortiermaschine Bildverarbeitung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
(Gliederung erstellt)
(Artikel aus dem Vorsemester entfernt)
Zeile 103: Zeile 103:




= Ziele und Aufgaben im Semeseter 2017/2018 = 
Team: [[Benutzer:Jan Auf der Landwehr|Jan Auf der Landwehr]], [[Benutzer:Matthias Maas|Matthias Maas]]
Ziel: Alle Teile werden richtig erkannt und aufgelistet. Dabei soll eine GUI die Bedienung benutzerfreundlich machen und ein Teach-In von neuen Teilen zur Verfügung stellen.
Aufgaben:
* Hardware und Software starten und Bedienungsanleitung ergänzen
* GUI verbessern
* Datenbank pflegen
* Teach-In über GUI ermöglichen
*Alle Teile in die Datenbank übernehmen
=== Schnittstellen ===
Damit die Bildverarbeitung und damit auch das Erkennen der Legoteile erfolgreich verlaufen kann, müssen zunächst die Legoteile vereinzelt in die Bildverarbeitungsbox gelangen ([http://193.175.248.52/wiki/index.php/Legoteil_Z%C3%A4hlmaschine_2016_2017#Gruppe:_Separierung Separierung]). Sobald ein Legoteil erkannt wurde, wird es aus der Box per Druckluft gefördert und muss anschließend sortiert werden. Damit das Legoteil richtig sortiert wird, wird dem jeweiligen Legoteil anhand der ID eine Box zugeorndet. Der Schnittstellenplan lässt sich zusammengefasst folgendermaßen darstellen:
<br /><br />
[[Datei:Schnittstellen BV Legoteilzaehlmaschine.png|600px|thumb|zentriert|Abbildung 7: Schnittstellen der Legoteilerkennung]]
<br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref> <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<br />
<br />
=== Mechanischer Aufbau ===
Um die Lichtreflexionen und Schatten an den Legoteilen während der Bilderkennung zu vermeiden, wurde ein neues Konzept entwickelt. Wenn ein Legoteil sich auf einem halb-transparentem Milchglas befindet (siehe Skizze), wird zuerst die untere Beleuchtung eingeschaltet und mittels einem Durchlichtverfahren die genaue Kontur des Legoteils mit der Kamera ermittelt. Hier können bereits einige Merkmale genau extrahiert werden (geometrische) und eine Maske erzeugt werden. Anschließend wird das untere Licht ausgeschaltet und das obere Licht eingeschaltet. Nach diesem Schritt wird mit Hilfe der Maske, nur in dem Bereich wo das Legoteil liegt, die Farbe ermittelt.
<br />
[[Datei:Konzept Skizze.png|800px|thumb|zentriert|Abbildung 8: BV-Box Funktionskonzept Skizze]]
<br />
<br />
Im nächsten Schritt wurde die Idee mit Hilfe eines CAD-Programms ausgearbeitet. Die Konstruktion wurde für den ersten Prototypen einfach gehalten und sich so für miteinander verschraubte Holzbretter entschieden.
In der unteren Box am oberen Rand wurde die halb-transparente Plexiglasplatte angebracht. In einem bestimmten Abstand wurde unter der Plexiglasscheibe eine weitere Ebene mit LEDs platziert. Der Abstand wurde so gewählt, dass bei angeschalteten LEDs das Licht durch das Plexiglas optimal gestreut wird (ohne helle Punkte, ohne Licht-Spots).
In der oberen Box wurde im Deckel eine Bohrung durchgeführt, wo die Stromleitungen der Kamera und der LEDs durchlaufen können. Die LEDs wurden in rechteckiger Form angeordnet und von innen an Deckplatte befestigt (siehe Abbildung 9). Auf einer weiteren halb-transparenten Plexiglasplatte  wurde die Kamera befestigt. Für die Kamera wurde eine weitere Bohrung erzeugt. In der oberen Box wurden Ein- und Ausgänge für die Legoteile erzeugt, sowie eine Aussparung für eine flache Druckluftdüse. Zur besseren Vorstellung befindet sich unter den folgenden Link das CAD-Modell als 3dxml-Datei:
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/Dokumentation/05_3D_Modelle/CAD_NEUE_Bildverarbeitung/BV_CAD_2016_2017\BV_Box_Komplett.3dxml BV_Box_Komplett.3dxml]. Der 3dxml viewer ist unter folgenden Link zu finden: [https://www.3ds.com/de/produkte-und-services/3d-xml/download/ Link]
<br />
[[Datei:Mechanik BV-Box.JPG|800px|thumb|zentriert|Abbildung 9: CAD-Konzept BV-Box]]
<br />
<br />
Anhand des CAD-Modells wurde die Bildverarbeitungsbox fertiggestellt und in Gesamtsystem integriert.
Desweiteren wurde eine "Drosselklappe" prototypisch für die Vor-Separierung in Y-Richtung realisiert.
<br />
[[Datei:BV-Box.JPG|400px|thumb|zentriert|Abbildung 10: BV-Box fertiggestellt]]
<br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref> <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<br />
<br />
=== Grober Ablauf der Legoteilerkennung ===
<br />
[[Datei:Grober Ablaufplan Legoteilerkennung.png|1200px|thumb|zentriert|Abbildung 11: Grober Ablaufplan Legoteilerkennung]]
<br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref> <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<br />
<br />
=== Matlabimplementierung ===
Das Programm für die Erkennung von Legoteilen befindet sich hier: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/Bildverarbeitung/AutomatischesZaehlen.m  AutomatischesZaehlen]. Der Funktion wird ein kalibriertes Kameraobjekt, die Schnittstelle zur Datenbank, die serielle Schnittstelle zum Arduino und das Kalibrierbild übergeben. Als Rückgabewert wird eine Liste mit den gezählten Legoteil-IDs zurückgegeben. Das Programm wird in der Hauptfunktion in einer Schleife abwechselnd mit dem Separierungsprogramm aufgerufen. Bei jedem Durchlauf werden dann die jeweiligen Kameras aufgerufen und ein Frame ausgewertet.
<br /><br /><br />
'''Ablaufplan:'''
<br />
[[Datei:Ablaufplan Legoteilerkennung2.png|250px|Ablaufplan Legoteilerkennung]]
<br /><br /><br />
'''Parametrisierung der Kamera:'''<br />
Für die Einstellungen der Paramter wurde das Matlabtool '''Image Acquisition Toolbox''' benutzt. Dort wurden einzelne Parameter so ausgetestet/eingestellt, dass sich zum einen die Legoteile beim Durchlichtverfahren gut vom Hintergrund abgrenzen und zum anderen die unterschiedlichen Legofarben beim Auflichtverfahren erkennen lassen. Folgende Einstellungen wurden getroffen ([https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/Kamerakalibrierung/KameraKalibrierungBild.m Die Einstellungsdatei ist hier zu finden]):
<source lang=matlab>
cam.BacklightCompensation = 0;
cam.Tilt = 0;
cam.Sharpness = 128;
cam.Pan = 0;
cam.Saturation = 128;
cam.Brightness = 128;
cam.Contrast = 128;
cam.Gain = 0;
cam.ExposureMode = 'manual';
cam.FocusMode = 'manual';
cam.WhiteBalanceMode = 'manual';
cam.WhiteBalance = 4000;
cam.Focus = 10;
cam.Exposure = -3;
</source>
<br /><br /><br />
'''Kamera-Kalibrierung:'''<br />
Obwohl die Parameter der Kamera konstant und unverändert waren, stellte sich heraus, dass das Bild der Kamera bei einigen Programmstarts trotzdem heller war. Um Neustarts des Programms zu vermeiden wurde so eine Kalibrierfunktion geschrieben, welche anhand eines aufgenommenen Bildes erkennt, ob die Kameraeinstellungen korrekt vorgenommen.<br />
Dabei wird in einer Schleife ein Kameraobjekt erzeugt und mit den oben aufgeführten Einstelllungen/Parametern versehen. Nun wird ein Bild mit diesen Einstellungen geschossen (im Auflichtverfahren) und mit einem zuvor gespeicherten Bild (siehe Abbildung 12), welches die richtigen Einstellungen beinhaltet, verglichen. Sollten sich die durchschnittliche Helligkeiten der Bilder Unterschiede aufweisen, wird das Kameraobjekt neu erzeugt und der Vorgang wiederholt sich, bis die richtigen Einstellungen getroffen wurden.<br />
Zusammenfassend beschreibt folgendes Diagramm den Ablauf der Selbstkalibrierung:
<br />
[[Datei:Kalibrierbild.png|250px|rechts|thumb|Abbildung 12: Kalibrierbild]]
[[Datei:Kamera Kalibrierung Legoteilerkennung.png|250px|Ablaufplan Kamerakalibrierung]]
<br />
Das Kalibrierbild befindet sich im folgenden Ordner: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/Kamerakalibrierung\Calib_Img.png  Calib_Img].
<br /><br /><br />
'''Legoteilerkennung:'''<br />
Die Legoteilerkennung erfolgt in einer Schleife, in welcher jeder einzelne Frame ausgewertet wird. Zum Beenden der Schleife und damit des Programms muss hier die Escape-Taste gedrückt werden.
<br /><br /><br />
''Vorverarbeitung, Segmentierung & Nachverarbeitung:''<br />
Zunächst wird das im Durchlichtverfahren aufgenommene Bild zugeschnitten, damit unnötige Bildregionen nicht bearbeitet werden müssen. Die Anzahl an Pixeln, welche in Höhe und Breite weggeschnitten werden, wurde experimentell ermittelt und so ausgelegt, dass sich das größte Legoteil immer im Blickfeld befindet.<br />
Daraufhin erfolgt die Binarisierung bzw. Segmentierung. Die Schwellwerte für die jeweiligen Farbkanäle und die Funktion zur Binarisierung wurden mithilfe des Matlabtools '''Color Thresholder''' ermittelt. Sollte sich im Laufe des Projektes die Kamerabox verändern (z.B. mehr LEDs eingebaut oder ein anderer Lichteinfall) muss diese Funktion ersetzt werden, da es sonst zu Segmentierungsfehlern kommen kann.
[[Datei:Thresholder Binaerbild Legoteilerkennung.PNG|500px|thumb|zentriert|Abbildung 13: Segmentierung der Legoteile mithilfe des Color Thresholder Tools]]
<br />
Die Funktion zur Segmentierung findet man hier: [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/Bildverarbeitung\createBinary_V3.m  createBinary_V3]<br />
Im Anschluss werden noch kleine, einzelne Pixel im Hintergrund und im Legoteil gelöscht. Damit ist das Bild bereinigt und vollständig segmentiert.
<br /><br /><br />
''Legoteilerfassung:''<br />
Damit ein Legoteil erfasst werden kann, müssen folgende Kriterien eingehalten werden:
#Legoteil muss sich an der Kante befinden
#Legoteil muss sich in einer Ruhelage befinden
#Es darf nur ein Legoteil im Bild vorhanden sein
Sollte mehr als ein Legoteil ein Bild sein, werden alle vorhandenen Legoteile in der Box herausgepustet und als "nicht erkannt" deklariert. Um zu verhindern, dass ein Teil rausgepustet wird, weil zum Beispiel anders beleuchtete Bereiche der Seiten/Löcher als einzelne Teile erkannt werden, wird das Teil zunächst um einige Pixel dilatiert (vergrößert) und anschließend kontrahiert (verkleinert). Auf diese Art können kleine Lücken geschlossen werden und die Anzahl an falsch erkannten richtigen Teilen vermieden werden. 
<br /><br /><br />
''Farbliche Merkmale extrahieren:''<br />
[[Datei:Farberkennung.jpg|200px|thumb|right|Abbildung 14: Farberkennung]]
Damit die Farbe erkannt werden kann, wird das Auflichtverfahren angewendet.
Die Funktion "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/Bildverarbeitung\FARBERKENNUNG_V2.m FARBERKENNUNG_V2]" bekommt als Übergabewerte zwei Matrizen:
* RGB-Bild aus Auflichtverfahren und Binärbild vom erkannten Objekt
* mit Hilfe der Übergabeparameter wird eine 3D-Farbmaske erstellt (3D --> RGB).
** Farbmaske: Aus dem Originalbild werden nur die Pixel in die Masken übernommen, die im Binärbild dem Objekt zugeordnet werden können (weiße Pixel)
* Anschließend werden Mittelwerte für Rot-, Grün- und Blau-Anteil berechnet.
<br />
Zuordnung zur nächstgelegenen Farbe:
* Es werden die RGB-Mittelwerte mit einer Farbtabelle verglichen:
** die Differenzen von jedem Farbanteil zur Farbtabelle werden ermittelt. Davon werden die Differenzen des Farbanteils mit dem größten Wert (Abweichung) gespeichert.
** Anschließend wird der minimalste Wert von den maximalen Abweichungen ermittelt --> '''Es wird genau die Farbe ermittelt, welches die kleinste Abweichung zu der Legoteil-Farbe hat.'''
<br />
Die ermittelte Farbe wird als String zurückgegeben. Es können weitere Farben im Nachhinein hinzugefügt werden oder Farbschwellwerte verändert werden, falls sich die Lichtverhältnisse in der Kamerabox durch Umbauten verändern.
</source>
<br />
Die Farbe wird als Durchschnitt der an R-, G- und B-Anteile pro Fläche berechnet:
<source lang=matlab>
FARBE(1,1) = (sum(sum(Farbmaske(:,:,1))))/Pixel_Flaeche;                   
FARBE(1,2) = (sum(sum(Farbmaske(:,:,2))))/Pixel_Flaeche;
FARBE(1,3) = (sum(sum(Farbmaske(:,:,3))))/Pixel_Flaeche;
</source>
<br />
Sollten diese (z.B. nach einem Umbau der Bildverarbeitungsbox) von den Werten in der hinterlegten Tabelle stark abweichen, müssen diese mit dem gemessenen Wert überschrieben werden:
<source lang=matlab>
%% Farbwerte-Tabelle mit normierten Lego-Farben
% %          R(1) G(1) B(1) 
Farbwerte=[  0.5273 0.5489 0.5362; %'weiss'         
              0.4138 0.3891 0.3115; %'beige'       
              0.3230 0.0622 0.0623; %'rot'         
              0.0087 0.1275 0.3309; %'blau'         
              0.5409 0.4596 0.2026; %'gelb'         
              0.0450 0.0664 0.0659; %'schwarz'     
              0.0509 0.1826 0.1287; %'gruen'       
              0.2182 0.2038 0.1518; %'hellbraun'         
              0.2709 0.3230 0.3345; %'hell-grau'       
              0.1391 0.1804 0.1878; %'dunkel-grau' 
%              0.0565 0.0629 0.0552; %'dunkelbraun' 
              ];
</source>
<br /><br />
''Geometrische Merkmale extrahieren:''<br />
[[Datei:Merkmalsextraktion.png|200px|thumb|right|Abbildung 15: geometrische Merkmalsextraktion]]
Die Funktion "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/Bildverarbeitung\Merkmalsberechnung_V3.m Merkmalsberechnung_V3]" erhält als Übergabeparameter ein Binärbild eines einzelnen Objektes (Legoteil). Aus diesem Objekt werden dann folgende Merkmale extrahiert, welche dann zurückgegeben werden:
* Umfang --> Anzahl der Pixel, die sich am Rand des Objektes befinden
* Fläche --> Anzahl der Pixel, die sich innerhalb des Objektes befinden (Löcher ausgeschlossen)
* Flächenschwerpunkt --> Pixelkoordinaten {x/y}
* Minimaler Abstand von Flächenschwerpunkt zu äußerem Rand des Objektes
* Maximaler Abstand von Flächenschwerpunkt zu äußerem Rand des Objektes
<br />
Die Berechnung der Fläche erfolgt über die Summenbildung der Zeilen und Spalten des Binärbildes. Da so nur die weißen Pixel addiert werden, handelt es sich hierbei nur um die Pixel, die zum Objekt gehören.<br />
Die Schwerpunktskoordinaten lassen sich mit der Matlab-Funktion '''Regionprops''' berechnen, welche als Übergabeparameter das Binärbild des Objektes und die Option 'centroid' erhält.<br />
Mithilfe des Kantenbildes des Objektes (erzeugt mit der Matlab-Funktion '''bwperim'''), kann eine Liste mit allen Kantenkoordinaten erstellt werden (Matlab-Funktion: '''Regionprops(Kantenbild, 'Pixellist')'''). Aus der Differenz zwischen jedem einzelnen dieser Kantenpixel und dem Schwerpunkt bestimmt man nun die Abstände vom Schwerpunkt zum Rand, welche nach minimalen und maximalen Wert durchsucht werden.
Anhand der Größe der Kantenpixelliste kann außerdem der Umfang des Objektes bestimmt werden.
<br />
Diese Merkmale dienen, zusätzlich zu der Farbe des Objektes und die Anzahl der Löcher im Objekt, als Indikatoren für den Abgleich zwischen aktuellen Legoteil in der Box und den hinterlegten Daten in der Datenbank (siehe Funktion: "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/SQL_+_Excel\Datenbankabgleich.m Datenbankabgleich.m]"). <br />
Sollten sich herausstellen, dass diese Merkmale nicht genügen, um alle Legoteile voneinander unterscheiden zu können, sind weitere Merkmalsberechnungen möglich (z.B. Die Seitenlängen einer um das Objekt aufgespannten Boundingbox).
<br /><br /><br />
''Herauspusten der Legoteile:''<br />
Sobald alle Merkmale erfasst wurden, werden diese mit einer Datenbank abgeglichen und einer Legoteil-ID zugeordnet, anhand derer man die zugehörige Box (des Linearläufers) ermittelt und mitteilt (siehe Funktion: "[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/SQL_+_Excel\BoxausID_SwitchCaseDB.m BoxausID_SwitchCaseDB.m]"). Danach erfolgt das Herauspusten des Legoteils aus der Kamerabox. Um herauszufinden, wann der Herauspusten beendet werden kann, wird das aktuelle Kamerabild (bei Auflichtverfahren) mit dem Kalibrierbild verglichen. Sollten hier keine großen unterschiede vorliegen, ist die Box leer und das Ventil der Druckluftdüse kann geschlossen werden.
<br />
<ref name="Autor: Penner"> Autor Kevin Penner</ref> <ref name="Autor: Tsibadze"> Autor Christo Tsibadze</ref>
<ref name="Autor: Auf der Landwehr"> Autor Jan Auf der Landwehr</ref> <ref name="Autor: Maas"> Autor Matthias Maas</ref>
<br />
<br />
=== Teach In ===
Das Teach In erfolgt über die Auswahl im Hauptmenu. Dazu muss das Programm über die Funktion [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab\START.m START] gestartet werden.
<br/>
[http://193.175.248.52/wiki/index.php/Anleitung_Legoteilz%C3%A4hlmaschine Die Anleitung, wie die Hauptfunktion zu benutzen ist, ist hier zu finden.]
Zur Erkennung der Merkmale werden die gleichen Funktionen verwendet wie in der Hautpunktion. Nach der Aufnahme eines Bildes wird mit [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/Bildverarbeitung\createBinary_V3.m createBinary_V3] das Binärbild erstellt und die Merkmale über
[https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/Bildverarbeitung\Bildverarbeitung_Teach_In.m Bildverarbeitung_Teach_In] berechnet.
<br/>
Mit [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/Bildverarbeitung\FARBERKENNUNG_V2.m FARBERKENNUNG_V2] wird die Farbe des eingelegten Legoteils erkannt. Anschließend werden die Merkmale in einem cell-Array gespeichert.
<br/>
<source lang=matlab>
    Header{1,1} = 'LegoteileID';
    Header{1,2} = 'Bezeichnung';
    Header{1,3} = 'Farbe';
    Header{1,4} = 'Form';
    Header{1,5} = 'Umfang';
    Header{1,6} = 'Flaeche';
    Header{1,7} = 'MaxSchwerpunkt';
    Header{1,8} = 'MinSchwerpunkt';
    Header{1,9} = 'Rundloch';
    Header{1,10} = 'AnzPerspektive';
    Header{1,11} = 'Scanbar';
</source>
Die Einträge "Bezeichnung", "Form", "AnzPerspektive" und "Scanbar" werden in der aktuellen Version nicht verwendet und sind nur noch im Code, weil die Einträge an anderen Stellen erwartet werden (beispielsweise in der SQL Datenbank). Zur besseren Übersichtlichkeit des Codes können diese in zukünftigen Versionen noch entfernt werden.
<ref name="Autor: Auf der Landwehr"> Autor Jan Auf der Landwehr</ref>
===Fortschritt im SoSe 2017===
Am Anfang haben wir uns in das Programm eingearbeitet und uns mit verschiedenen Problemen auseinandergesetzt:
*Wie funktioniert das Programm?
*Welche Unterprogramme sind entscheidend?
*Wie funktioniert die Verbindung zu SQL?
*Wie funktioniert die GUI-Programmierung?
Danach haben wir begonnen, kleinere Bugfixes zu programmieren, damit das Programm allgemein runder läuft.
Es ist nun ohne Abstürze über eine GUI steuerbar und Teile werden direkt in SQL gespeichert.
Wir haben auch bereits begonnen, neue Teile einzuteachen.
Wir haben alles geschafft, was wir uns für dieses Semester vorgenommen haben und sogar mit Aufgaben begonnen, die eigentlich für das nächste Semester geplant waren.
<ref name="Autor: Auf der Landwehr"> Autor Jan Auf der Landwehr</ref> <ref name="Autor: Maas"> Autor Matthias Maas</ref>
===Test des GUI===
{| class="mw-datatable"
! style="font-weight: bold;" | ID
! style="font-weight: bold;" | Testfallbeschreibung
! style="font-weight: bold;" | Erwartetes Ergebnis
! style="font-weight: bold;" | Testergebnis
! style="font-weight: bold;" | Testperson
! style="font-weight: bold;" | Datum
|-
| 1
| Der Button "Sortierfunktion starten" wird gedrückt.
| Die Lichter gehen an, die Laufbänder starten.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 2
| Der Button "Teach In" wird gedrückt.
| Die Teile-ID soll eingegeben werden, das Teach-In startet danach.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 3
| Eine neue Box wird angelegt.
| Die neue Box wird mit den Teilen in der Datenbank gespeichert.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 4
| Ein bestehendes Teil wird komplett gelöscht.
| Das Teil kann ausgewählt und komplett aus der Datenbank gelöscht werden.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 5
| Ein bestehendes Teil wird nur aus dem Bausatz gelöscht.
| Das Teil kann ausgewählt und aus dem Bausatz gelöscht, bleibt aber in der Merkmalsdatenbank erhalten.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 6
| Ein bestehender Baukasten wird gelöscht.
| Der Baukasten wird samt Inhalt gelöscht, die Merkmalsdatenbank bleibt erhalten.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 7
| Die Fachnummer wird eingetragen und gespeichert.
| Die Fachnummer wird in der Datenbank hinterlegt.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 8
| Die Zurück-Taste wird gedrückt.
| Das aktuelle Menü wird geschlossen und das vorherige Menü wird geöffnet.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 9
| Die Beenden-Taste wird gedrückt.
| Es erscheint eine Abfrage, ob wirklich beendet werden soll.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 10
| Es wird eine falsche ID im Teach-In eingegeben.
| Eine Meldung weist auf die falsche ID hin, sonst passiert nichts.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 11
| Die Zurück-Taste öffnet das vorherige Menü.
| Das aktuelle Menü wird geschlossen und das vorherige Menü wird geöffnet.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 12
| Ein Teil wird eingeteacht und in der Datenbank gespeichert.
| Die ID-Abfrage erscheint erneut. Die Kalibrierung startet nicht neu.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 13
| Ein "?"-Button wird gedrückt.
| Der Hilfetext erscheint.
| OK
| Jan Auf der Landwehr
| 11.01.2018
|-
| 14
| Ein bestehendes Teil wird bearbeitet.
| Die Änderungen werden in der Datenbank übernommen
| FAIL - Speichern ist noch nicht implementiert
| Jan Auf der Landwehr
| 11.01.2018
|-
|}
<br/>
===Fortschritt im WiSe 2017/18===
Im letzten Semester wurden die Bildverarbeitung und die Separierung getrennt verwendet, da unterschiedliche Gruppen daran gearbeitet haben. Damit das Programm wie gewünscht läuft, musste in diesem Semester die Separierung mit der Bildverarbeitung im [http://193.175.248.52/wiki/index.php/Legosortiermaschine_gesamte_Anlage#Softwareumsetzung Hauptprogramm] zusammengeführt werden. Die Bildverarbeitung wurde angepasst, sodass das Programm nicht mehr in einer Dauerschleife läuft, sondern zyklisch vom Hauptprogramm aufgerufen wird. Das Programm wurde weiter verschlankt, indem Funktionen verkleinert wurden (zum Beispiel die Funktion, die die Anzahl der Teile in die Ausgabeliste schreibt). Es wurden generell einige kleine Anpassungen und Fixes vorgenommen, wie eine vernünftige Darstellung der Kamerabilder in der gleichen Figur.
<br/>
<br/>
<source lang=matlab>
while(abbruch == 0)     
    AutomTeile(:, end+1) = AutomatischesZaehlen(cam_bild, DatenbankVerbindung, s, Calib_Img, HauptFigure);   
    Separierung(cam_sep,s, HauptFigure); 
end
</source>
*Die SQL-Legoteileliste war voll mit vielen nutzlosen Einträgen, die entweder keine oder falsche Merkmalsinformationen beinhaltet haben. Um eine bessere Übersicht zu erhalten, wurde die Liste daher komplett geleert und anschließend wieder vollständig mit den Daten des Grundsets und des Erweiterungssets eingeteacht(ausgenommen der großen Legoteile wie Motor, Sensoren und EV3 Brick, die vorher händisch aussortiert werden müssen).
*Darüberhinaus wurden alle Teile aus Grund- und Erweiterungsset in der Datenbank kasten hinterlegt.
*Es wurde ein Fehler korrigiert, bei dem nicht alle Teile des Sets in der Fehlteileliste enthalten sind.
*[http://193.175.248.52/wiki/index.php/Anleitung_Legoteilz%C3%A4hlmaschine Für das GUI wurde eine grafische Anleitung erstellt.]
*Die Datenbank wurde um die Spalte "Fachnummer" erweitert. Dort können die Fachnummern hinterlegt werden, in die die Teile einsortiert werden.
*Die Legoteile aus Grundset und Erweiterungsset wurden samt Fachnummern in der Merkmalsdatenbank legoteileliste hinterlegt.
*Die Funktion [https://svn.hshl.de/svn/MTR_SDE_Praktikum_2015/trunk/SRC/Matlab/Bildverarbeitung\AutomatischesZaehlen.m AutomatischesZaehlen] wurde so ergänzt, dass die Fachnummern von erkannten Teilen aus der Datenbank gezogen werden und der Servostellbefehl für die entsprechende Fachnummer an Arduino gesendet wird.
*Die GUI wurde komplett überarbeitet. Dadurch ist eine einfache Bearbeitung der Datenbank möglich.
*Die Befehle für die Fachansteuerung werden jetzt an den Arduino gesendet, wenn ein Teil erkannt und das entsprechende Fach hinterlegt ist.
*Das Programm für die Ausgabe der Teileliste wurde kompakter und übersichtlicher gestaltet.
*Es wurden Testfälle für das Testen der GUI erstellt.
<ref name="Autor: Maas"> Autor Matthias Maas</ref>
<ref name="Autor: Auf der Landwehr"> Autor Jan Auf der Landwehr</ref>


== Liste offener Punkte ==
== Liste offener Punkte ==

Version vom 14. Juli 2018, 15:04 Uhr

Dies ist ein Unterarikel von der Legoteil_Zählmaschine, welcher die aktuellen Änderungen an dem Teilgebiet der Bildverarbeitung der Lego Sortiermaschine beschreibt.

Autor: Torben Müller

Anforderungen

Spezifikations-ID Anforderungs-ID Anforderungstitel Beschreibung der Spezifikation
0061 REQ10.2050 Bauteile Basissatz wird unterstützt und alle entsprechenden Teile werden erkannt
0063 REQ10.2050 Bauteile Vorsortierung via GUI
0060.1 REQ10.2050 Bauteile Visuelle Anleitung erstellen
0120 REQ10.2250 Bildverarbeitung Echtzeit mit Matlab/Simulink
0120.1 REQ10.2250 Bildverarbeitung Echtzeit mit Matlab/Simulink. Teile werden erkannt und mit Seriennummer klassifiziert
0122 REQ10.2220 Bildverarbeitung Geschwindingkeit erhöhen: Software analysieren und den Code beschleunigen z.B. Schleifen sparen, Variablen global speichern
0123 REQ10.2220 Bildverarbeitung Prozentsatz der erkannten Teile errechnen
0124 REQ10.2220 Bildverarbeitung Nicht erkannte Teile in der Position des nicht erkannten Teils anlernen
0141 REQ10.2300 Teileliste Geeignetes Format für eine Fehlteilliste planen, also welche Informationen enthalten sein müssen um eine Neubeschaffung zu ermöglichen zb Seriennummer oder Onlinelink
0181 REQ10.2330 Teach-In Sicherstellung der vorhanden GUI- und Datenbankfunktionen
0320 REQ10.3220 Ablagestruktur für Versionsverwaltung Geeignete Struktur für SVN definieren und einrichten
0432.1 REQ10.3272 Nachhaltigkeit SVN-Nachhaltigkeit

GUI

Sicherstellung

Vorsortierung

Visuelle Anleitung


Software

Echtzeit

Geschwindigkeit erhöhen

Prozentsatz

Teile

Basisteile werden erkannt

Erkennung verbessert

Anlernen nicht erkannter Teile

Fehlteilliste

SVN

Liste offener Punkte

  • Geschwindigkeit der Bilderkennung erhöhen
  • Prozentsatz der erkannten Teile rausfinden
  • Nicht erkannte Teile in der Position des nicht erkannten Teils anlernen
  • Statische und dynamische Codeanalyse durchführen

Autoren



Dies ist ein Unterartikel von der Legoteil_Zählmaschine, welcher den genauen Aufbau der Bildbearbeitung beschreibt.