Legosortiermaschine Bildverarbeitung: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
Zeile 204: Zeile 204:


{|
{|
!bla
!
!bla
!
|-
|-
|
|Funktionsaufrufe: 267
|
|Funktionsaufrufe: 404
|-
|-
|
|[[Datei:LegoSortier Ausgangszustand.PNG | 500px]]
|
|[[Datei:LegoSortier Iteration1.PNG | 500px]]
|-
|Ausgangszustand:
 
 
 
 
 
0,13s pro Call
 
 
|Erste Iteration:
*imshow verschoben -> wird nur auseführt wenn Teil auch ausgewertet wird
*Pause bei seriellen Befehlen entfernt
*Lightdelay um die Hälfte reduziert
 
0,082s pro Call
 
 
|-
|Funktionsaufrufe: 287
|Funktionsaufrufe: 297
|-
|[[Datei:LegoSortier Iteration2.PNG | 500px]]
|[[Datei:LegoSortier Iteration3.PNG | 500px]]
|-
|Zweite Iteration:
*0,2s Pause für Bewegungserkennung innerhalb der Bildverarbeitungsbox hinzugefügt
*Funktion figure(HauptFigure) entfernt
 
 
0,12s pro Call
|Dritte Iteration:
*Pause der Bewegungserkennung auf 0,1 reduziert
 
 
 
 
0,117s pro Call
|}
|}



Version vom 15. Juli 2018, 11:12 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

Basiered auf einer Liste offener Punkte aus dem Vorsemester wurden für das Wintersemester 17/18 folgende Anforderungen festgelegt:

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

Die Benutzeroberfläche für dieses Projekt wurde bereits von Vorsemestern erstellt und kann verwendet werden, um das Projekt zu steuern. In diesem Semester galt es, die vorhandenen Funktionen der GUI zu prüfen und eine neue Funktion der manuellen Vorsortierung zu implementieren

Sicherstellung

Für die Sicherstellung der vorhandenen GUI Funktionen wurde ein Test jedes Buttons innerhalb der Software durchgeführt und dokumentiert.

Der Startbildschirm (1) führt zu den Bereichen Sortierung (2), Teach-In (3) und Baukasten bearbeiten (4).


Die Hilfeknöpfe blenden einen Hilfetext für den jeweiligen Programmteil ein und beenden öffnet ein Bestätigungsfenster, welches das Programm beendet oder das Fenster wieder schließt


In dem Teilbereich der Sortierung lässt sich eine Kasten-ID auswählen, wodurch eine Tabelle mit allen in diesem Kasten enthaltenen Teilen angezeigt wird. Dort lässt sich eine manuelle Vorsortierung der Teile eintragen, wie in dem Abschnitt Vorsortierung beschrieben. Zurück führt zu dem Startbildschirm (1) und Beenden öffnet das Bestätigungsfenster zum Beenden oder abbrechen


Mit betätigen des Speichern Knopfes kommt man nach einem Fortschrittsbalken der Kamerakalibrierung zu einem Kontrollbildschirm, wo Echtzeitinformationen der Maschine angezeigt werden und die Maschine wird gestartet. Oben links wird das Kamerabild der Bildverarbeitung angezeigt und oben rechts ein Binärbild, welches bei der Bildverarbeitung aufgenommen wird. Unten links sieht man das Kamerabild der Seperierung und unten rechts das Binärbild aus der Seperierung. Mit Drücken der Escape-Taste wird die Maschine beendet und eine Inventurliste generiert, wo die Anzahlen der erkannten Teile angezeigt werden.


In dem Bereich Teach-In kann in dem ersten Fenster eine Bauteile-ID eingegeben werden. Zurück kehrt zu dem Startbildschirm (1) zurück und Beenden führt zu dem Bestätigungsfenster. Mit Speichern & Weiter wird die Kamera der Bildverarbeitung angezeigt. Mit Enter wird ein Foto aufgenommen und mit Space wird dieses Foto in ein Binärbild umgewandelt und neu angezeigt. Erneutes Space speichert das Teil mit der eingegebenen Nummer in der Datenbank


Bei Baukasten bearbeiten lässt sich oben im Fenster mit dem Knopf Speichern & Weiter ein neuer Baukasten erzeugen. Danach kann mit Eingaben ändern die Kasten-ID und die Anzahl der Teile nachträglich angepasst werden. In der Tabelle darunter können Teile in diesen Kasten eintragen. Änderungen speichern speichert diese Änderungen an dem Kasten in der Datenbank. Unten links kann dann Wahlweise ein Bauteil aus dem Kasten, ein Teil komplett oder ein ganzer Kasten gelöscht werden. Auswahl anwenden führt dabei die jeweils gewählte Aktion aus.


Unten rechts lassen sich einzelne Bauteile in dem Kasten hinsichtlich ihrer Anzahl und Fachnummer in dem Kasten bearbeiten. Diese Änderungen werden jedoch mit dem Betätigen des Knopfes Änderungen speichern nicht in die Datenbank übernommen. Diese Funktion muss somit noch implementiert werden und ist damit nicht in Ordnung.

Vorsortierung

In der Benutzeroberfläche der Sortierung (2.1) wird nach der Auswahl einer Kasten-ID eine Liste mit Teilen angezeigt, die in dem Kasten enthalten sind zusammen mit der vorgesehenen Anzahl des Teils in diesem Kasten. In der dritten Spalte sollte dann die Möglichkeit bestehen die Anzahl der Teile einzutragen, die bereits mit der Hand vorsortiert worden sind. Dazu muss im ersten Schritt der Data Array der Tabelle, welcher die Inhalte speichert um eine dritte Nullspalte erweitert werden. Dazu wird die Funktion horzcat verwendet, die zwei Arrays horizontal miteinander verbindet:

% Datei SortierStart.m
Nullreihe = cell(size(curs.Data,1),1);
Nullreihe(:,1) = {0};
handles.uitable1.Data = horzcat(curs.Data, Nullreihe);

global GUI_vorsortierteTeile
GUI_vorsortierteTeile = handles.uitable1.Data;


Der Inhalt der Tabelle wird zuletzt in eine globale Variable gespeichert, um bei der Erstellung der Inventurliste auf die Anzahl der vorgezählten Teile zugreifen zu können. Dabei wird auf die Anzahl der automatisch gezählten Teile, gespeichert in der vierten Spalte von InventurListeContent, die Anzahl der manuell gezählten Teile, gespeichert in der dritten Spalte von GUI_vorsortierteTeile, addiert und später ausgegeben:

% Datei InventurlistenTemplateMultiKaesten.m
InventurListeContent(2:end,4) = num2cell(cell2mat(InventurListeContent(2:end,4)) + cell2mat(GUI_vorsortierteTeile(:,3)));
...
xlswrite(InventurlisteName,InventurListeContent);


Für diese hinzugefügte Funktion wurde in der Anleitung für die Gesamtanlage der entsprechende Abschnitt bearbeitet: Wiki-Artikel

Software

Echtzeit

Geschwindigkeit erhöhen

Zum Testen der Echtzeit der Bildverarbeitung wurde ein Versuch entworfen. Dabei werden Teile auf das Förderband direkt vor der Bildverarbeitungsbox gelegt und zeitgleich eine Zeitmessung gestartet. Sobald ein Teil in die Bildverarbeitunngsbox gefallen ist, wird an die gleiche Stelle ein neues Teil gelegt, sodass fast permanent ein Teil in der Box liegt und die Pause zwischen den Teilen minimal ist.

BILD VON EINLEGESTELLE

Um die Ausgangssituation zu bewerten, wurde dieser Test mit verschiedenen Teilearten und -mengen ausgeführt.

Test Anzahl Teile Anzahl erkannt Gesamtzeit [s] Zeit pro Teil [s] Erkennungsrate [%] Teileart
1 15 10 43 2,86 66,6 gemischt
2 30 16 86 2,86 53,3 gemischt
3 20 15 60 3 75 klein
4 15 9 42 2,8 60 groß

Hier kann man erkennen, dass die Zeit pro Teil nur leichte Änderungen aufweist zwischen den unterschiedlichen Teilegruppen und dadurch festgestellt werden kann, dass die Echtzeit nicht stark von der Teileart beeinflusst wird.


In einem zweiten Testdurchgang wurde dann eine zufällige Teilegruppe verwendet und keine externe Zeitmessung mehr durchgeführt, sondern nur das Ergebnis des Matlab Profilers analysiert. Dieses Tool verfolgt zur Laufzeit des Programmes die Anzahl von Funktionsaufrufen und deren Ausführungsdauer. So wird für jede ausgeführte Programmzeile die Gesamtzeit gemessen, die diese Zeile beansprucht. Außerdem wird eine Übersicht erstellt mit den zeitaufwändigsten Zeilen und wie viel Zeit diese prozentual von der Gesamtzeit beansprucht haben.

Funktionsaufrufe: 267 Funktionsaufrufe: 404
Ausgangszustand:



0,13s pro Call


Erste Iteration:
  • imshow verschoben -> wird nur auseführt wenn Teil auch ausgewertet wird
  • Pause bei seriellen Befehlen entfernt
  • Lightdelay um die Hälfte reduziert

0,082s pro Call


Funktionsaufrufe: 287 Funktionsaufrufe: 297
Zweite Iteration:
  • 0,2s Pause für Bewegungserkennung innerhalb der Bildverarbeitungsbox hinzugefügt
  • Funktion figure(HauptFigure) entfernt


0,12s pro Call

Dritte Iteration:
  • Pause der Bewegungserkennung auf 0,1 reduziert



0,117s pro Call

Prozentsatz

Teile

Basisteile werden erkannt

Erkennung verbessert

Anlernen nicht erkannter Teile

Fehlteilliste

SVN

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