Abschlussbericht - Universität Oldenburg
Abschlussbericht - Universität Oldenburg
Abschlussbericht - Universität Oldenburg
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
Projektgruppe 2012/13<br />
Roboarm<br />
<strong>Abschlussbericht</strong><br />
Erstgutachter<br />
Claas Diederichs<br />
Zweitgutachter<br />
Tobias Tiemerding<br />
<strong>Oldenburg</strong> den, 10. Oktober 2013
Inhaltsverzeichnis<br />
Präambel 2<br />
Inhaltsverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9<br />
Abbildungsverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . 16<br />
Tabellenverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . . 18<br />
Quellcodeverzeichnis . . . . . . . . . . . . . . . . . . . . . . . . . . . 19<br />
1 Lastenheft 20<br />
1.1 Einleitung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
1.1.1 Motivation . . . . . . . . . . . . . . . . . . . . . . . . . . 20<br />
1.1.2 Zielsetzung . . . . . . . . . . . . . . . . . . . . . . . . . 23<br />
1.1.2.1 Szenarien . . . . . . . . . . . . . . . . . . . . . 24<br />
1.1.3 Vorstellung der Gruppe . . . . . . . . . . . . . . . . . . 25<br />
1.1.4 Darstellung aktueller Technologien . . . . . . . . . . . 25<br />
1.1.5 Abgrenzung des Systems . . . . . . . . . . . . . . . . . 27<br />
1.1.6 Beschreibung der Ausgangslage . . . . . . . . . . . . . 28<br />
1.2 Anforderungsdefinition . . . . . . . . . . . . . . . . . . . . . . 29<br />
1.2.1 Anwendungsfälle . . . . . . . . . . . . . . . . . . . . . . 29<br />
1.2.2 Gobaler Anwendungsfall . . . . . . . . . . . . . . . . . 30<br />
1.2.3 Primäre Anwendungsfälle . . . . . . . . . . . . . . . . . 31<br />
1.2.3.1 Armhaltung nachahmen . . . . . . . . . . . . 31<br />
1.2.3.2 Objekt bewegen . . . . . . . . . . . . . . . . . 33<br />
1.2.3.3 Roboter steuern durch alternative Gesten . . 36<br />
1.2.3.4 Skizze zeichnen . . . . . . . . . . . . . . . . . 40<br />
1.2.4 Enthaltene Anwendungsfälle . . . . . . . . . . . . . . . 42<br />
1.2.4.1 Kalibrierung für Gestenerkennung . . . . . . 42<br />
1.2.4.2 Initialisierung für Roboterarmsteuerung . . . 45<br />
1.2.4.3 Roboterarm bewegen . . . . . . . . . . . . . . 47<br />
1.2.4.4 Greifer ansteuern . . . . . . . . . . . . . . . . 49<br />
1.2.4.5 Kalibrierung für alternative Gestenerkennung 50<br />
1.2.4.6 Kalibrierung für Portraitaufnahme . . . . . . 53<br />
1.2.4.7 Portrait aufnehmen . . . . . . . . . . . . . . . 54<br />
1.2.5 Funktionale Anforderungen . . . . . . . . . . . . . . . 55<br />
2
Inhaltsverzeichnis 10. Oktober 2013<br />
1.2.6 Nicht funktionale Anforderungen . . . . . . . . . . . . 57<br />
1.3 Risikoanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61<br />
1.4 Entwicklungszyklus . . . . . . . . . . . . . . . . . . . . . . . . 63<br />
1.5 Systemarchitektur . . . . . . . . . . . . . . . . . . . . . . . . . . 63<br />
1.6 Lieferumfang . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64<br />
2 Implementation 65<br />
2.1 Sprintplanung Sprint 2 . . . . . . . . . . . . . . . . . . . . . . . 66<br />
2.1.1 Machbarkeitsstudie Eye-Tracking . . . . . . . . . . . . 66<br />
2.1.2 Anbindung des Kameramoduls . . . . . . . . . . . . . 68<br />
2.1.3 Roboter-Arm . . . . . . . . . . . . . . . . . . . . . . . . 70<br />
2.1.4 Objektverfolgung . . . . . . . . . . . . . . . . . . . . . . 72<br />
2.2 Sprint 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74<br />
2.2.1 Machbarkeitsstudie Eye-Tracking . . . . . . . . . . . . 74<br />
2.2.1.1 Einleitung . . . . . . . . . . . . . . . . . . . . . 75<br />
2.2.1.2 Systemdefinition . . . . . . . . . . . . . . . . . 78<br />
2.2.1.3 Systemparameter . . . . . . . . . . . . . . . . 79<br />
2.2.1.4 Ansätze . . . . . . . . . . . . . . . . . . . . . . 81<br />
2.2.1.5 Messungen . . . . . . . . . . . . . . . . . . . . 92<br />
2.2.1.6 Probleme . . . . . . . . . . . . . . . . . . . . . 97<br />
2.2.1.7 Evaluation . . . . . . . . . . . . . . . . . . . . 99<br />
2.2.1.8 Fazit . . . . . . . . . . . . . . . . . . . . . . . . 101<br />
2.2.1.9 Datenstruktur . . . . . . . . . . . . . . . . . . 102<br />
2.2.2 Anbindung des Kameramoduls . . . . . . . . . . . . . 103<br />
2.2.2.1 Toolbox Plugin . . . . . . . . . . . . . . . . . . 109<br />
2.2.2.2 Aufgetretene Probleme . . . . . . . . . . . . . 109<br />
2.2.2.3 Ausblick . . . . . . . . . . . . . . . . . . . . . 110<br />
2.2.3 Roboter-Arm . . . . . . . . . . . . . . . . . . . . . . . . 112<br />
2.2.3.1 Ziel . . . . . . . . . . . . . . . . . . . . . . . . 112<br />
2.2.3.2 Vorwärtskinematik . . . . . . . . . . . . . . . 117<br />
2.2.3.3 Rückwärtskinematik . . . . . . . . . . . . . . 124<br />
2.2.4 Objektverfolgung . . . . . . . . . . . . . . . . . . . . . . 140<br />
2.2.4.1 Bewegungsrichtungserkennung der Hand . . 140<br />
2.2.4.2 Arm mit Winkeln . . . . . . . . . . . . . . . . 144<br />
2.2.5 Zusammenführung von Objektverfolgung und Roboterarmsteuerung<br />
. . . . . . . . . . . . . . . . . . . . . . . . 153<br />
2.2.5.1 Integration von Objektverfolgung und Roboterarmsteuerung<br />
. . . . . . . . . . . . . . . . . . 153<br />
2.2.5.2 Erstellung eines stabilen Demonstators . . . . 153<br />
2.2.5.3 Ausblick . . . . . . . . . . . . . . . . . . . . . 154<br />
3
Inhaltsverzeichnis 10. Oktober 2013<br />
2.2.6 Fazit und Ausblick . . . . . . . . . . . . . . . . . . . . . 155<br />
2.3 Sprintplanung Sprint 3 . . . . . . . . . . . . . . . . . . . . . . . 157<br />
2.3.1 Image Bus Switch . . . . . . . . . . . . . . . . . . . . . . 157<br />
2.3.2 Filter Cores . . . . . . . . . . . . . . . . . . . . . . . . . 158<br />
2.3.3 HDMI Analyse . . . . . . . . . . . . . . . . . . . . . . . 159<br />
2.3.4 Histogramm . . . . . . . . . . . . . . . . . . . . . . . . . 160<br />
2.3.5 Notwendigkeit eines Histogramms . . . . . . . . . . . 161<br />
2.4 Sprint 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162<br />
2.4.1 Image Bus Switch . . . . . . . . . . . . . . . . . . . . . . 162<br />
2.4.1.1 image_bus_switch 1.00.a . . . . . . . . . . . . 163<br />
2.4.1.2 xps_timer 1.02.a . . . . . . . . . . . . . . . . . 164<br />
2.4.1.3 simple_i2c 2.00.a . . . . . . . . . . . . . . . . . 165<br />
2.4.1.4 Toolbox Plugin . . . . . . . . . . . . . . . . . . 168<br />
2.4.1.5 Dateistruktur . . . . . . . . . . . . . . . . . . . 169<br />
2.4.1.6 Aufgetretene Probleme . . . . . . . . . . . . . 169<br />
2.4.1.7 Ergebnis . . . . . . . . . . . . . . . . . . . . . . 170<br />
2.4.2 Filter Cores . . . . . . . . . . . . . . . . . . . . . . . . . 171<br />
2.4.2.1 schwellwertfilter_v1_00_a . . . . . . . . . . . 171<br />
2.4.2.2 rgb2grey_v1_00_a . . . . . . . . . . . . . . . . 172<br />
2.4.2.3 morphology_v1_00_a . . . . . . . . . . . . . . 175<br />
2.4.3 HDMI Analyse . . . . . . . . . . . . . . . . . . . . . . . 177<br />
2.4.3.1 hdmi_out . . . . . . . . . . . . . . . . . . . . . 177<br />
2.4.3.2 VFBC . . . . . . . . . . . . . . . . . . . . . . . 178<br />
2.4.3.3 Ergebnis HDMI . . . . . . . . . . . . . . . . . 180<br />
2.4.3.4 Ergebnis ImageCache . . . . . . . . . . . . . . 181<br />
2.4.4 Histogramm . . . . . . . . . . . . . . . . . . . . . . . . . 182<br />
2.4.4.1 Umsetzung . . . . . . . . . . . . . . . . . . . . 182<br />
2.4.5 Notwendigkeit eines Histogramms . . . . . . . . . . . 184<br />
2.4.5.1 Evaluation . . . . . . . . . . . . . . . . . . . . 184<br />
2.4.5.2 Beschreibung Der Arbeitsumgebung . . . . . 184<br />
2.4.5.3 Aufnahmen und Ergebnisanalyse . . . . . . . 185<br />
2.4.6 Fazit und Ausblick . . . . . . . . . . . . . . . . . . . . . 187<br />
2.5 Sprintplanung Sprint 4 . . . . . . . . . . . . . . . . . . . . . . . 189<br />
2.5.1 Softwareprototyp Kopfsteuerung . . . . . . . . . . . . 189<br />
2.5.2 Tiefenerkennung . . . . . . . . . . . . . . . . . . . . . . 192<br />
2.5.3 Echtzeitbildausgabe auf HDMI . . . . . . . . . . . . . . 194<br />
2.5.4 Hardware Umsetzung der Bewegungserkennung . . . 196<br />
2.6 Sprint 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 198<br />
2.6.1 Softwareprototyp Kopfsteuerung . . . . . . . . . . . . 198<br />
2.6.1.1 1. Ansatz: Kopfsteuerung ohne Markierungen198<br />
4
Inhaltsverzeichnis 10. Oktober 2013<br />
2.6.1.2 2. Ansatz: Kopfsteuerung mit Markierungen 198<br />
2.6.1.3 Servo IP-Core . . . . . . . . . . . . . . . . . . 203<br />
2.6.1.4 USB Driver IP-Core . . . . . . . . . . . . . . . 207<br />
2.6.1.5 Cam-USB IP-Core . . . . . . . . . . . . . . . . 209<br />
2.6.1.6 VmodCam . . . . . . . . . . . . . . . . . . . . 210<br />
2.6.1.7 Kinematik . . . . . . . . . . . . . . . . . . . . . 210<br />
2.6.1.8 Anbindung an die Rückwärtskinematik . . . 213<br />
2.6.2 Tiefenerkennung . . . . . . . . . . . . . . . . . . . . . . 214<br />
2.6.2.1 Vorgehen . . . . . . . . . . . . . . . . . . . . . 214<br />
2.6.2.2 Planungsphase: identifizierte Aufgaben . . . 215<br />
2.6.2.3 Tiefenberechnung . . . . . . . . . . . . . . . . 216<br />
2.6.2.4 Tests . . . . . . . . . . . . . . . . . . . . . . . . 218<br />
2.6.2.5 Probleme in der Testphase . . . . . . . . . . . 231<br />
2.6.2.6 Vergleich mit OpenCV . . . . . . . . . . . . . 232<br />
2.6.2.7 Problemlösungen . . . . . . . . . . . . . . . . 234<br />
2.6.2.8 Implementierung . . . . . . . . . . . . . . . . 235<br />
2.6.3 Echtzeitbildausgabe auf HDMI . . . . . . . . . . . . . . 239<br />
2.6.4 Hardware Umsetzung der Bewegungserkennung . . . 248<br />
2.6.4.1 Umsetzung der Bildverarbeitungskette auf<br />
dem FPGA . . . . . . . . . . . . . . . . . . . . 248<br />
2.6.4.2 Anpassung des Schwellwertfilter IP-Core . . 250<br />
2.6.4.3 IP-Core ImageBusConverter . . . . . . . . . . 251<br />
2.6.4.4 IP-Core Erkennung von Regionen in Bildern 253<br />
2.6.4.5 Armerkennung und Verfolgungstreiber . . . 254<br />
2.6.4.6 Übertragung und Darstellung der Armposition<br />
mit der OFFIS-Automation-Toolbox . . . 257<br />
2.6.4.7 Schwierigkeiten . . . . . . . . . . . . . . . . . 258<br />
2.6.4.8 Fazit . . . . . . . . . . . . . . . . . . . . . . . . 258<br />
2.6.5 Fazit und Ausblick . . . . . . . . . . . . . . . . . . . . . 259<br />
2.7 Sprintplanung Sprint 5 . . . . . . . . . . . . . . . . . . . . . . . 260<br />
2.7.1 Softwareprototyp Handsteuerung . . . . . . . . . . . . 260<br />
2.7.2 Überarbeitung der Dokumentation . . . . . . . . . . . 262<br />
2.8 Sprint 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264<br />
2.8.1 Softwareprototyp Handsteuerung . . . . . . . . . . . . 264<br />
2.8.1.1 State-of-the-Art . . . . . . . . . . . . . . . . . 264<br />
2.8.1.2 Ansatz zur Handsteuerung . . . . . . . . . . 266<br />
2.8.2 Fazit und Ausblick . . . . . . . . . . . . . . . . . . . . . 271<br />
2.9 Sprintplanung Sprint 6 . . . . . . . . . . . . . . . . . . . . . . . 272<br />
2.9.1 ImageBus Overlay . . . . . . . . . . . . . . . . . . . . . 272<br />
2.9.2 3D Armerkennung - Portierung auf den Microblaze . 274<br />
5
Inhaltsverzeichnis 10. Oktober 2013<br />
2.9.3 Aufbau der dreidimensionalen Bildverarbeitungskette 275<br />
2.9.4 Spezifikation eines neuen Roboterarms . . . . . . . . . 276<br />
2.9.5 Erweiterung des Servo-IP-Cores . . . . . . . . . . . . . 278<br />
2.9.6 Entwicklung einer Trajektorienführung . . . . . . . . . 279<br />
2.9.7 Erweitern des Zeichenbereiches und Untersuchung<br />
des Zig-Zag Verhaltens . . . . . . . . . . . . . . . . . . 281<br />
2.9.8 Drehgelenk . . . . . . . . . . . . . . . . . . . . . . . . . 283<br />
2.9.9 Referenztakt für den cam_bootloader . . . . . . . . . . 284<br />
2.10 Sprint6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285<br />
2.10.1 ImageBus Overlay . . . . . . . . . . . . . . . . . . . . . 285<br />
2.10.1.1 FIFO-VHDL-Modul . . . . . . . . . . . . . . . 285<br />
2.10.1.2 image_bus_overlay_1_00_a . . . . . . . . . . . 286<br />
2.10.1.3 Overlay Microblaze Code . . . . . . . . . . . . 290<br />
2.10.2 3D Armerkennung - Portierung auf den Microblaze . 297<br />
2.10.2.1 Datenstrukturen der Armerkennung . . . . . 297<br />
2.10.2.2 Klassen der Armerkennung . . . . . . . . . . 298<br />
2.10.2.3 Dateistruktur . . . . . . . . . . . . . . . . . . . 301<br />
2.10.3 Aufbau der dreidimensionalen Bildverarbeitungskette 302<br />
2.10.3.1 Bildgrößen Anpassung . . . . . . . . . . . . . 302<br />
2.10.3.2 Dreidimensionale Hardware Bildverarbeitungskette<br />
. . . . . . . . . . . . . . . . . . . . . . . . 303<br />
2.10.3.3 Dateistruktur . . . . . . . . . . . . . . . . . . . 304<br />
2.10.4 Spezifikation eines neuen Roboterarms . . . . . . . . . 305<br />
2.10.4.1 Schwachstellen der aktuellen Konfiguration . 305<br />
2.10.4.2 State of the Art . . . . . . . . . . . . . . . . . . 306<br />
2.10.4.3 Anforderungen . . . . . . . . . . . . . . . . . 309<br />
2.10.4.4 Erarbeitung der Grundlagen . . . . . . . . . . 311<br />
2.10.4.5 Ansätze neuer Roboterkonfigurationen . . . . 322<br />
2.10.5 Erweiterung des Servo-IP-Cores . . . . . . . . . . . . . 333<br />
2.10.5.1 VHDL-Code . . . . . . . . . . . . . . . . . . . 334<br />
2.10.5.2 Treiber . . . . . . . . . . . . . . . . . . . . . . . 335<br />
2.10.6 Entwicklung einer Trajektorienführung . . . . . . . . . 337<br />
2.10.6.1 Algorithmus . . . . . . . . . . . . . . . . . . . 338<br />
2.10.6.2 Ermittlung der theoretischen Schrittweite . . 340<br />
2.10.6.3 Anpassung der Kinematik auf 2D Ebene . . . 341<br />
2.10.6.4 Implementierung . . . . . . . . . . . . . . . . 342<br />
2.10.6.5 Aufbau . . . . . . . . . . . . . . . . . . . . . . 345<br />
2.10.7 Erweitern des Zeichenbereiches und Untersuchung<br />
des Zig-Zag Verhaltens . . . . . . . . . . . . . . . . . . 349<br />
2.10.7.1 Strategiewechsel . . . . . . . . . . . . . . . . . 349<br />
6
Inhaltsverzeichnis 10. Oktober 2013<br />
2.10.7.2 Tests und Erkenntnisse/Bericht . . . . . . . . 351<br />
2.10.7.3 Ermittelter Arbeitsbereich für Skizze Zeichnen352<br />
2.10.8 Drehgelenk . . . . . . . . . . . . . . . . . . . . . . . . . 354<br />
2.10.8.1 Algorithmus . . . . . . . . . . . . . . . . . . . 354<br />
2.10.8.2 Implementierung . . . . . . . . . . . . . . . . 358<br />
2.10.8.3 Testfälle . . . . . . . . . . . . . . . . . . . . . . 359<br />
2.10.8.4 Probleme . . . . . . . . . . . . . . . . . . . . . 362<br />
2.10.8.5 Dateistruktur . . . . . . . . . . . . . . . . . . . 363<br />
2.10.9 Referenztakt für den cam_bootloader . . . . . . . . . . 364<br />
2.10.9.1 Modifizierter cam_bootloader . . . . . . . . . 364<br />
2.10.10 Fazit und Ausblick . . . . . . . . . . . . . . . . . . . . . 365<br />
2.11 Sprintplanung Sprint 7 . . . . . . . . . . . . . . . . . . . . . . . 367<br />
2.11.1 Portierung der Kinematik . . . . . . . . . . . . . . . . . 367<br />
2.11.2 Portierung der alternativen Gestensteuerung . . . . . . 369<br />
2.11.3 Integration der Komponenten zum Demonstrator Armhaltung<br />
nachahmen . . . . . . . . . . . . . . . . . . . . . . 370<br />
2.11.4 Kinematik für neuen Roboterarm . . . . . . . . . . . . 371<br />
2.11.5 Anbindung des Grauwertfilters an den PLB . . . . . . 372<br />
2.11.6 Vektorisieren eines Portraits . . . . . . . . . . . . . . . . 373<br />
2.12 Sprint 7 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 374<br />
2.12.1 Portierung der Kinematik . . . . . . . . . . . . . . . . . 374<br />
2.12.1.1 Durchgeführte Änderungen . . . . . . . . . . 374<br />
2.12.1.2 Dateistruktur . . . . . . . . . . . . . . . . . . . 375<br />
2.12.2 Portierung der alternativen Gestensteuerung . . . . . . 376<br />
2.12.2.1 Umstellung des Graustufenfilters auf mehrere<br />
Farben . . . . . . . . . . . . . . . . . . . . . . . 376<br />
2.12.2.2 Probleme . . . . . . . . . . . . . . . . . . . . . 376<br />
2.12.2.3 Dateistruktur . . . . . . . . . . . . . . . . . . . 376<br />
2.12.3 Kinematik für neuen Roboterarm . . . . . . . . . . . . 378<br />
2.12.3.1 Umstellung der Entwicklungsstrategie . . . . 379<br />
2.12.3.2 Vorwärtskinematik . . . . . . . . . . . . . . . 379<br />
2.12.3.3 Rückwärtskinematik . . . . . . . . . . . . . . 380<br />
2.12.3.4 OFFIS-Automation-Toolboxplugin für neue<br />
Kinematik . . . . . . . . . . . . . . . . . . . . . 381<br />
2.12.3.5 Generierung des Quelltextes der Kinematik . 383<br />
2.12.3.6 Probleme . . . . . . . . . . . . . . . . . . . . . 385<br />
2.12.3.7 Dateistruktur . . . . . . . . . . . . . . . . . . . 386<br />
2.12.3.8 Ausblick . . . . . . . . . . . . . . . . . . . . . 387<br />
7
Inhaltsverzeichnis 10. Oktober 2013<br />
2.12.4 Integration der Komponenten zum Demonstrator Armhaltung<br />
nachahmen . . . . . . . . . . . . . . . . . . . . . . 389<br />
2.12.4.1 Integration der Hardware Komponenten . . . 389<br />
2.12.4.2 Integration der Software . . . . . . . . . . . . 391<br />
2.12.4.3 Probleme . . . . . . . . . . . . . . . . . . . . . 391<br />
2.12.4.4 Testfälle . . . . . . . . . . . . . . . . . . . . . . 393<br />
2.12.4.5 Geschwindigkeitsanalyse . . . . . . . . . . . . 398<br />
2.12.4.6 Optimierung . . . . . . . . . . . . . . . . . . . 407<br />
2.12.4.7 Dateistruktur . . . . . . . . . . . . . . . . . . . 409<br />
2.12.5 Anbindung des Grauwertfilters an den PLB . . . . . . 410<br />
2.12.5.1 Herangehensweise . . . . . . . . . . . . . . . . 410<br />
2.12.5.2 Dateistruktur . . . . . . . . . . . . . . . . . . . 410<br />
2.12.6 Vektorisierung von Portraitaufnahme . . . . . . . . . . 412<br />
2.12.6.1 Bildvorverarbeitung . . . . . . . . . . . . . . . 412<br />
2.12.6.2 Vektorisierung . . . . . . . . . . . . . . . . . . 415<br />
2.12.6.3 Ausblick auf anstehende Aufgaben . . . . . . 416<br />
2.12.6.4 Dateistruktur . . . . . . . . . . . . . . . . . . . 417<br />
2.12.7 Design und Bau des Roboterarms . . . . . . . . . . . . 418<br />
2.12.7.1 Designentscheidungen . . . . . . . . . . . . . 418<br />
2.12.7.2 CAD-Zeichnungen . . . . . . . . . . . . . . . 418<br />
2.12.7.3 Zusammenbau . . . . . . . . . . . . . . . . . . 427<br />
2.12.7.4 Ausblick . . . . . . . . . . . . . . . . . . . . . 427<br />
2.12.7.5 Dateistruktur . . . . . . . . . . . . . . . . . . . 428<br />
2.12.8 Fazit und Ausblick . . . . . . . . . . . . . . . . . . . . . 429<br />
2.13 Sprintplanung Sprint 8 . . . . . . . . . . . . . . . . . . . . . . . 430<br />
2.13.1 Fertigstellung und Optimierung des Demonstrators<br />
„Armhaltung nachahmen“ . . . . . . . . . . . . . . . . 430<br />
2.13.2 Semi-Demonstrator „Gestensteuerung“ . . . . . . . . . 432<br />
2.14 Sprint 8 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 433<br />
2.14.1 Fertigstellung und Optimierung des Demonstrators<br />
„Armhaltung nachahmen“ . . . . . . . . . . . . . . . . 433<br />
2.14.1.1 Verbesserung der Performanz . . . . . . . . . 433<br />
2.14.1.2 Gesamtzeit . . . . . . . . . . . . . . . . . . . . 438<br />
2.14.1.3 Stabilisierung . . . . . . . . . . . . . . . . . . . 439<br />
2.14.1.4 Ausblick . . . . . . . . . . . . . . . . . . . . . 439<br />
2.14.1.5 Dateistruktur . . . . . . . . . . . . . . . . . . . 440<br />
2.14.1.6 Finale Methoden . . . . . . . . . . . . . . . . . 440<br />
2.14.2 Semi-Demonstrator „Gestensteuerung“ . . . . . . . . . 443<br />
2.14.2.1 Greiferansteuerung . . . . . . . . . . . . . . . 443<br />
2.14.2.2 Tool-Center-Point-Ansteuerung . . . . . . . . 444<br />
8
Inhaltsverzeichnis 10. Oktober 2013<br />
2.14.2.3 Hardware der Bildverarbeitungskette . . . . . 445<br />
2.14.2.4 Ausblick . . . . . . . . . . . . . . . . . . . . . 446<br />
2.14.2.5 Dateistruktur . . . . . . . . . . . . . . . . . . . 447<br />
2.14.3 Fertigstellung und Optimierung „Skizze Zeichen “ . . 448<br />
2.14.3.1 Umsetzung der Anforderungen . . . . . . . . 448<br />
2.14.3.2 Optimierungen für die Anforderungen . . . . 448<br />
2.14.3.3 Optimierungen der Bildaufnahme . . . . . . 450<br />
2.14.3.4 Verwendete Komponenten . . . . . . . . . . . 451<br />
2.14.3.5 Prozess Steuerung . . . . . . . . . . . . . . . . 452<br />
2.14.3.6 Ergebnis und Ausblick . . . . . . . . . . . . . 454<br />
2.14.4 Fazit und Ausblick . . . . . . . . . . . . . . . . . . . . . 455<br />
3 Fazit 457<br />
4 Ausblick 461<br />
Literaturverzeichnis 464<br />
Glossar 465<br />
9
Abbildungsverzeichnis<br />
1.1 Roboter spielt Jenga, TU Braunschweig . . . . . . . . . . . . . 21<br />
1.2 Industrieroboter zeichnet eine Skizze . . . . . . . . . . . . . . 22<br />
1.3 Kinect der Firma Microsoft . . . . . . . . . . . . . . . . . . . . 26<br />
1.4 LeapMotion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26<br />
1.5 Hardwarebestandteile . . . . . . . . . . . . . . . . . . . . . . . 28<br />
1.6 Globaler Anwendungsfall . . . . . . . . . . . . . . . . . . . . . 30<br />
1.7 Skizze einer Aufnahme . . . . . . . . . . . . . . . . . . . . . . . 40<br />
1.8 Kalibrierung für Gestenerkennung . . . . . . . . . . . . . . . . 42<br />
1.9 Beispiel einer Kalibrierung . . . . . . . . . . . . . . . . . . . . . 43<br />
1.10 Initialisierung für Roboterarmsteuerung . . . . . . . . . . . . . 45<br />
1.11 Roboterarm bewegen . . . . . . . . . . . . . . . . . . . . . . . . 47<br />
1.12 Greifer ansteuern . . . . . . . . . . . . . . . . . . . . . . . . . . 49<br />
1.13 Kalibrierung für alternative Gestenerkennung . . . . . . . . . 50<br />
1.14 Beispiel einer Kalibrierung für alternative Gestenerkennung . 51<br />
1.15 Kalibrierung für Portraitaufnahme . . . . . . . . . . . . . . . . 53<br />
1.16 Portrait aufnehmen . . . . . . . . . . . . . . . . . . . . . . . . . 54<br />
1.17 Greifen eines Objekts, Anwendungsfall 1.2.3.2 . . . . . . . . . 59<br />
1.18 Systemarchitektur . . . . . . . . . . . . . . . . . . . . . . . . . . 64<br />
2.1 Struktur eines Sprints . . . . . . . . . . . . . . . . . . . . . . . 65<br />
2.2 Steuerungsschichten . . . . . . . . . . . . . . . . . . . . . . . . 70<br />
2.3 Bewegungsrichtungen des Auges . . . . . . . . . . . . . . . . . 75<br />
2.4 TrackEye Projekt . . . . . . . . . . . . . . . . . . . . . . . . . . 76<br />
2.5 Kamera DMK21F04 . . . . . . . . . . . . . . . . . . . . . . . . . 78<br />
2.6 Aufbauten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79<br />
2.7 Raumbeleuchtung . . . . . . . . . . . . . . . . . . . . . . . . . . 80<br />
2.8 Kameraposition . . . . . . . . . . . . . . . . . . . . . . . . . . . 80<br />
2.9 Infrarot-Scheinwerfer . . . . . . . . . . . . . . . . . . . . . . . . 81<br />
2.10 Reihenfolge und Prioritäten der Prozessoren . . . . . . . . . . 82<br />
2.11 Input Processor . . . . . . . . . . . . . . . . . . . . . . . . . . . 83<br />
2.12 Eye-Tracking Processor . . . . . . . . . . . . . . . . . . . . . . . 84<br />
2.13 Formen unterschiedlicher Augentemplates . . . . . . . . . . . 85<br />
2.14 Probleme beim Template Matching . . . . . . . . . . . . . . . . 85<br />
10
Abbildungsverzeichnis 10. Oktober 2013<br />
2.15 Reference Processor . . . . . . . . . . . . . . . . . . . . . . . . . 87<br />
2.16 Referenzpunktes . . . . . . . . . . . . . . . . . . . . . . . . . . 88<br />
2.17 Blob Tracking Processor . . . . . . . . . . . . . . . . . . . . . . 89<br />
2.18 Kalibrierungsbild um die Ecken des Anzeigefläche zu erkennen<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91<br />
2.19 Bewegung der CoGs zwischen zwei Kalibrierungspunkten . . 92<br />
2.20 Quadrantenaufteilung zur Visualisierung . . . . . . . . . . . . 93<br />
2.21 Aufnahme des Eingangsbildes der ersten Messung . . . . . . 93<br />
2.22 Festgelegter Blickweg der ersten Messung . . . . . . . . . . . 94<br />
2.23 Aufnahme des Eingangsbildes der zweiten Messung . . . . . 96<br />
2.24 Probleme die durch das Tragen einer Brille entstehen . . . . . 98<br />
2.25 weitere mögliche Einteilungen zur Quadrantenbestimmung . 100<br />
2.26 Kamerabild vom GazeTracker . . . . . . . . . . . . . . . . . . . 100<br />
2.27 Aufbau der Kameraansteuerung . . . . . . . . . . . . . . . . . 103<br />
2.28 Signal Sequenz zur initialen Ansteuerung der Kamera . . . . 104<br />
2.29 Blockschaltbild des cam_data IP-Core . . . . . . . . . . . . . . 106<br />
2.30 Konfigurationmenü des cam_deserializer IP-Cores . . . . . . 107<br />
2.31 Blockschaltbild des cam_deserializer IP-Cores . . . . . . . . . 108<br />
2.32 Blockschaltbild des RGB565 zu RGB888 IP-Cores . . . . . . . 108<br />
2.33 Blockschaltbild des Cam-USB IP-Cores . . . . . . . . . . . . . 109<br />
2.34 Steuerungsschichten des Roboterarms (rot markiert = In diesem<br />
Sprint entwickelt) . . . . . . . . . . . . . . . . . . . . . . . . . . 113<br />
2.35 Kinematisches Modell des Roboarms . . . . . . . . . . . . . . 118<br />
2.36 Kalibrierung der Drehwinkel der Gelenke mit den Tasten auf<br />
dem FPGA-Board. . . . . . . . . . . . . . . . . . . . . . . . . . . 124<br />
2.37 Der TCP befindet sich im 3D-Raum. Der Winkel α wird geometrisch<br />
bestimmt. . . . . . . . . . . . . . . . . . . . . . . . . 126<br />
2.38 Winkeläquivalenz für die virtuelle Drehung. . . . . . . . . . . 126<br />
2.39 Nach der Drehung um die z-Achse befindet sich der TCP<br />
genau über der x-Achse. Der TCP ist im 2D-Raum . . . . . . . 127<br />
2.40 Fall 1: Kreis um TCP (grün) und Basis (schwarz) überlappen<br />
sich nicht . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129<br />
2.41 Fall2: Kreis um TCP (grün) und Basis (schwarz) überlappen<br />
sich . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131<br />
2.42 Winkelberechnung aus den Ergebnispunkten . . . . . . . . . . 132<br />
2.43 Problem der Auswahl der korrekten Winkels . . . . . . . . . . 138<br />
2.44 Lösung der Auswahl der korrekten Winkels mittels Hilfswinkel<br />
(real r/virtuell v) . . . . . . . . . . . . . . . . . . . . . . . . . . 138<br />
2.45 Beispielbild: Probleme durch Extraktion des Hintergrundes . 141<br />
11
Abbildungsverzeichnis 10. Oktober 2013<br />
2.46 Beispielbild: Verfolgung der Hand mit Hilfe von Schwerpunkten<br />
innerhalb einer Kontur. . . . . . . . . . . . . . . . . . 142<br />
2.47 Bildverarbeitungskette: Verfolgung der Hand mit Hilfe von<br />
Schwerpunkten innerhalb einer Kontur . . . . . . . . . . . . . 143<br />
2.48 Aufbau des resultierenden Ergebnisses . . . . . . . . . . . . . 144<br />
2.49 Beispielbild: Kalibrierung des Systems auf die Gelenke des<br />
Akteurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145<br />
2.50 Beispielbild: Trennung der Kontur durch Reflekton des Lichtes<br />
am Klebeband . . . . . . . . . . . . . . . . . . . . . . . . . . 146<br />
2.51 Beispielbild: Zusammenfließen der Konturen durch Berührung147<br />
2.52 Bildverarbeitungskette: Verfolgung des Arms mit Hilfe von<br />
Posen . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148<br />
2.53 Beispielbild: Springen der Posen . . . . . . . . . . . . . . . . . 149<br />
2.54 Beispielbild: Berechnung der Winkel mit Hilfe des Schnittpunktes<br />
der Orthogonalen zu Phi . . . . . . . . . . . . . . . . . . . . 150<br />
2.55 Beispielbild: Verfolgung des Arms mit Hilfe von Posen . . . . 151<br />
2.56 Grafische Oberfläche für die Interaktion mit dem Skript . . . 154<br />
2.57 Verwischungseffekt bei schnellen Bewegungen durch die geringe<br />
Geschwindigkeit der WebCam . . . . . . . . . . . . . . . . . . 155<br />
2.58 Aufbau mit ImageBus Schalter IP-Core . . . . . . . . . . . . . 162<br />
2.59 Blockschaltbild des ImageBusSwitch IP-Cores . . . . . . . . . 163<br />
2.60 Blockschaltbild des xps_timer IP-Cores . . . . . . . . . . . . . 164<br />
2.61 Bilder von linker und rechter Kamera . . . . . . . . . . . . . . 170<br />
2.62 Blockschaltbild des Schwellwertfilters . . . . . . . . . . . . . . 172<br />
2.63 Blockschaltbild des RGB888 zu Graustufenwandler . . . . . . 173<br />
2.64 Testbilder rgb2grey_v1_00_a in AMiR Automation Toolbox,<br />
Quellbild (link oben), Ergebnis Toolbox (rechts oben), Ergebnis<br />
Hardware (links unten), Ergebnis modifizierter Toolbox<br />
Filter (rechts unten) . . . . . . . . . . . . . . . . . . . . . . . . . 174<br />
2.65 Blockschaltbild des Morphologiefilter . . . . . . . . . . . . . . 175<br />
2.66 Konfigurationsoberfläche des Morphologiefilter . . . . . . . . 176<br />
2.67 Blockdiagramm vom IP-Core hdmi_out . . . . . . . . . . . . . 177<br />
2.68 Blockdiagramm vom Video Frame Buffer Controller (VFBC) . 179<br />
2.69 VFBC: VGA Fenster in 1080p Frame . . . . . . . . . . . . . . . 180<br />
2.70 Aufname mit Autokorrekturfunktionen bei dunklen Lichtverhältnissen<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185<br />
2.71 Aufname ohne Autokorrekturfunktionen bei dunklen Lichtverhältnissen<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186<br />
2.72 Aufname ohne Autokorrekturfunktionen bei durchschnittlichen<br />
Lichtverhältnissen . . . . . . . . . . . . . . . . . . . . . . . . . . 186<br />
12
Abbildungsverzeichnis 10. Oktober 2013<br />
2.73 Aufname ohne Autokorrekturfunktionen bei durchschnittlichen<br />
Lichtverhältnissen . . . . . . . . . . . . . . . . . . . . . . . . . . 187<br />
2.74 OLVIS-Bildverarbeitungskette zum Ansatz 1 . . . . . . . . . . 199<br />
2.75 Ergebnis der OLVIS-Bildverarbeitungskette zum Ansatz 1 . . 200<br />
2.76 OLVIS-Bildverarbeitungskette zum Ansatz 2 . . . . . . . . . . 201<br />
2.77 Ausgaben der OLVIS-Bildverarbeitungskette zum Ansatz 2 . 202<br />
2.78 Blockschaltbild des Servo IP-Core . . . . . . . . . . . . . . . . 203<br />
2.79 Servo Signal . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203<br />
2.80 Zustandsautomat im Servo IP-Core . . . . . . . . . . . . . . . 204<br />
2.81 Blockschaltbild des USB Driver IP-Core . . . . . . . . . . . . . 207<br />
2.82 Blockschaltbild des Cam USB IP-Core . . . . . . . . . . . . . . 209<br />
2.83 Testumgebung . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215<br />
2.84 Skizze zur Tiefenberechnung . . . . . . . . . . . . . . . . . . . 217<br />
2.85 Skizze zur Tiefenberechnung . . . . . . . . . . . . . . . . . . . 217<br />
2.86 Skizze zur Tiefenberechnung . . . . . . . . . . . . . . . . . . . 218<br />
2.87 Bildverarbeitungskette mit Binary Large Object-Erkennung<br />
(ohne Morphologiefilter) . . . . . . . . . . . . . . . . . . . . . . 219<br />
2.88 Bildverarbeitungskette mit Morphologiefilter . . . . . . . . . . 220<br />
2.89 Bildverarbeitungskette mit mehreren Morphologiefiltern . . . 221<br />
2.90 Stereobildpaar der Armbinde (Bild manueller Drehung beider<br />
Bilder) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222<br />
2.91 Zwei rote Armbinden mit unterschiedlicher Tiefe . . . . . . . 223<br />
2.92 Stereobilder mit blauer und roter Armbinde ohne automatische<br />
Helligkeitsanpassung . . . . . . . . . . . . . . . . . . . . 223<br />
2.93 Stereobilder mit blauer und roter Armbinde mit automatische<br />
Helligkeitsanpassung . . . . . . . . . . . . . . . . . . . . . 224<br />
2.94 Bildverarbeitungskette mit heller grüner Armbinde in Form<br />
eines angemalten Papiers . . . . . . . . . . . . . . . . . . . . . 225<br />
2.95 Bildverarbeitungskette mit grüner Armbinde und mehreren<br />
Morphologiefiltern . . . . . . . . . . . . . . . . . . . . . . . . . 226<br />
2.96 Testbilder mit rückwärtiger Beleuchtung und BLOB-Erkennung229<br />
2.97 Fehlerbild mit voller Kameraauflösung . . . . . . . . . . . . . 230<br />
2.98 Abstandsmessung bei zwei Armbinden . . . . . . . . . . . . . 231<br />
2.99 Beispielstereobild. . . . . . . . . . . . . . . . . . . . . . . . . . . 233<br />
2.100Beispieltiefenbild zu Abbildung 2.99. . . . . . . . . . . . . . . 233<br />
2.101Tiefenbild zu Abbildung 2.90 . . . . . . . . . . . . . . . . . . . 234<br />
2.102Aufnahme eines Bildes durch eine der beiden Kameras. Verhältnis<br />
von Breite auf dem Sensor zur Brennweite verhält<br />
sich wie das Verhältnis der realen Breite zur realen Tiefe im<br />
Raum. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235<br />
13
Abbildungsverzeichnis 10. Oktober 2013<br />
2.103Blockschaltbild des imagebus_to_memory IP-Core . . . . . . 239<br />
2.104VFBC Write Timing . . . . . . . . . . . . . . . . . . . . . . . . . 240<br />
2.105Zustandsautomat des image_bus_switch IP-Cores . . . . . . . 242<br />
2.106Blockschaltbild des memory_to_usb IP-Core . . . . . . . . . . 243<br />
2.107VFBC Read Timing . . . . . . . . . . . . . . . . . . . . . . . . . 244<br />
2.108Timing der Lese-/Schreiboperationen . . . . . . . . . . . . . . 245<br />
2.109Zustandsautomat zum ersten Ansatz des IPCores . . . . . . . 246<br />
2.110Auf dem FPGA realisierte Bildverarbeitungskette mit IP-Cores248<br />
2.111Schematische Darstellung des aufgezeichneten Arms und der<br />
berechneten Winkel . . . . . . . . . . . . . . . . . . . . . . . . . 249<br />
2.112Ergebnisaufnahme mit der VmodCamBlob Erweiterung für<br />
die OFFIS-Automation-Toolbox . . . . . . . . . . . . . . . . . . 250<br />
2.113Schwellwertfilter mit Anbindung an den Microblaze . . . . . 250<br />
2.114IP-Core ImageBusConverter mit 24 Bit RGB Ausgangssignal . 252<br />
2.115IP-Core ImageBusConverter Signalkonvertierung . . . . . . . 252<br />
2.116Erkannte Regionen in einem Bild mit ihren eingezeichneten<br />
Schwerpunkten . . . . . . . . . . . . . . . . . . . . . . . . . . . 253<br />
2.117Vereinfachter Ablauf der Unterbrechungsroutine . . . . . . . . 254<br />
2.118Mögliche Lage von drei Punkten zueinander . . . . . . . . . . 256<br />
2.119Visualisierung der Gelenkpositionen durch die VmodCam-<br />
Blob Erweiterung . . . . . . . . . . . . . . . . . . . . . . . . . . 257<br />
2.120Hand in farbigem Handschuh. . . . . . . . . . . . . . . . . . . 264<br />
2.121Hand-Erkennung . . . . . . . . . . . . . . . . . . . . . . . . . . 265<br />
2.122OLVIS Bildverarbeitungskette . . . . . . . . . . . . . . . . . . . 268<br />
2.123Erkennung des Schließzustandes der Hand mittels Markierungen<br />
an den Fingerkuppen von Zeigefinger und Daumen . . . 270<br />
2.124Blockschaltbild des First in First out (FIFO)-Very High Speed<br />
Integrated Hardware Description Language (VHDL)-Modul . 286<br />
2.125Blockschaltbild des ImageBus-Overlay-IP-Core . . . . . . . . . 287<br />
2.126Schematischer Aufbau des ImageBus-Overlay-IP-Core . . . . 287<br />
2.127Funktionsweise des pixelSkipping IP-Cores . . . . . . . . . . . 302<br />
2.128Blockschaltbild des pixelSkipping IP-Cores . . . . . . . . . . . 303<br />
2.129Bildverarbeitungskette für zwei Kamerabildströme . . . . . . 304<br />
2.130Modell des Industrieroboterarms KUKA KR5 . . . . . . . . . 307<br />
2.131Modell des Industrieroboterarms Puma . . . . . . . . . . . . . 307<br />
2.132Pick & Place Roboter der Fa. SCARA . . . . . . . . . . . . . . 308<br />
2.133Modell des Hobby Roboterarms Oomlout Thingiverse . . . . 309<br />
2.134Schachbrett der Standard-Größe innerhalb des Arbeitsbereiches<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 311<br />
2.135Arbeitsbereich des Roboterarms . . . . . . . . . . . . . . . . . 312<br />
14
Abbildungsverzeichnis 10. Oktober 2013<br />
2.136Arbeitsbereich des Roboterarms . . . . . . . . . . . . . . . . . 313<br />
2.137Drehmoment (M) . . . . . . . . . . . . . . . . . . . . . . . . . . 315<br />
2.138Berechnung des Drehmomentes für den Servomotor G 2 . . . 316<br />
2.139Servo-Überblick . . . . . . . . . . . . . . . . . . . . . . . . . . . 318<br />
2.140Greifervarianten . . . . . . . . . . . . . . . . . . . . . . . . . . . 321<br />
2.141Kinematische Konfiguration des neuen Roboarms . . . . . . . 323<br />
2.142Ausrichtung der Arbeitsbereiche der Servos . . . . . . . . . . 324<br />
2.143Längen des Greifers und des Base . . . . . . . . . . . . . . . . 324<br />
2.144Minimal benötigte Länge des Teilarmes. Sicht von oben . . . 325<br />
2.145Längen der restlichen Verbindungsstücke . . . . . . . . . . . . 326<br />
2.146Berechnung der Drehmomente . . . . . . . . . . . . . . . . . . 328<br />
2.147Modell der Gelenkgenkonfiguration mit Längen und Gewichten<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329<br />
2.148Konfiguration des alten Roboterarms . . . . . . . . . . . . . . 330<br />
2.149Servovarianten . . . . . . . . . . . . . . . . . . . . . . . . . . . . 331<br />
2.150Kinematische Konfiguration Scara . . . . . . . . . . . . . . . . 333<br />
2.151Funktion der Rampen im Servo-IP-Core . . . . . . . . . . . . . 334<br />
2.152Blockschaltbild Servo-IP-Core . . . . . . . . . . . . . . . . . . . 335<br />
2.153Lineare Interpolation eines Vektors . . . . . . . . . . . . . . . . 338<br />
2.154Berechnung der minimalen Schrittweite . . . . . . . . . . . . . 340<br />
2.155Aufbau des vorläufigen Demonstrators . . . . . . . . . . . . . 345<br />
2.156erste Zeichnungen . . . . . . . . . . . . . . . . . . . . . . . . . 346<br />
2.157Arbeitsbereich nach neuen Strategiewechsel . . . . . . . . . . 350<br />
2.158Quadrat ohne Strategiewechsel . . . . . . . . . . . . . . . . . . 350<br />
2.159Quadrat über Eckpunkte ohne Interpolation der Trajektorie . 351<br />
2.160Koordinaten des Arbeitsbereichs . . . . . . . . . . . . . . . . . 353<br />
2.161Virtuelle Punkte am Benutzer . . . . . . . . . . . . . . . . . . . 355<br />
2.162Ebene und Winkel . . . . . . . . . . . . . . . . . . . . . . . . . 355<br />
2.163Angewinkelter Arm . . . . . . . . . . . . . . . . . . . . . . . . 357<br />
2.164Gestreckter Arm . . . . . . . . . . . . . . . . . . . . . . . . . . . 357<br />
2.165Blockschaltbild des geänderten cam_bootloader . . . . . . . . 364<br />
2.166Kinematische Konfiguration des neuen Roboarms . . . . . . . 380<br />
2.167Modell des neuen Roboarm in Open Robotics Automation<br />
Virtual Environment (OpenRAVE) . . . . . . . . . . . . . . . . 381<br />
2.168Arbeitsfluss für IKfast-Generierung . . . . . . . . . . . . . . . 384<br />
2.169Aufbau der Verwendeten Hardwarekomponenten . . . . . . . 390<br />
2.170Falsche Berechnung des Ellenbogenwinkels . . . . . . . . . . . 397<br />
2.171Korrekte Berechnung des Ellenbogenwinkels . . . . . . . . . . 398<br />
2.172Profiling im Board Support Package Settings aktivieren . . . . 400<br />
2.173Compileroption für Profiling setzen . . . . . . . . . . . . . . . 400<br />
15
Abbildungsverzeichnis 10. Oktober 2013<br />
2.174Konfiguration des Profilings . . . . . . . . . . . . . . . . . . . . 401<br />
2.175Farbbild und resultierende schematische Darstellung, als Anforderung<br />
an die Vektorisierung . . . . . . . . . . . . . . . . . 412<br />
2.176Zwischenergebnis der Bildverarbeitungskette . . . . . . . . . . 413<br />
2.177die gesammte Bildverarbeitungskette . . . . . . . . . . . . . . 414<br />
2.178Farbbild und resultierende schematische Darstellung von einer<br />
Testperson . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415<br />
2.179Farbbild und resultierende schematische Darstellung von einer<br />
weiteren Testperson . . . . . . . . . . . . . . . . . . . . . . . 415<br />
2.180Farbbild, Zwischenschritt und resultierende schematische vektorisierte<br />
Darstellung . . . . . . . . . . . . . . . . . . . . . . . . 416<br />
2.181Darstellung des generierten Gcodes . . . . . . . . . . . . . . . 416<br />
2.182Bildausschnitt und die Komplexität der Pfade aus der generierten<br />
Vektorgrafik . . . . . . . . . . . . . . . . . . . . . . . . . 417<br />
2.183Base Seiten . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 419<br />
2.184Base Axialverbindung zum zweiten Link . . . . . . . . . . . . 420<br />
2.185Zweiter Link . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 421<br />
2.186Dritter Link . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422<br />
2.187Vierter Link . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423<br />
2.188Axialverbindung . . . . . . . . . . . . . . . . . . . . . . . . . . 424<br />
2.189Fünfter Links . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425<br />
2.190Differential . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425<br />
2.191Kugellager-Halterung . . . . . . . . . . . . . . . . . . . . . . . 426<br />
2.192Gripper for Micro Robot Arm . . . . . . . . . . . . . . . . . . . 426<br />
2.193Gesamter Arm . . . . . . . . . . . . . . . . . . . . . . . . . . . . 427<br />
2.194einzelne Abschnitte des Roboterarms . . . . . . . . . . . . . . 427<br />
2.195Optimierungsdiagramm . . . . . . . . . . . . . . . . . . . . . . 434<br />
2.196Handgesten zur Ansteuerung des Greifers . . . . . . . . . . . 443<br />
2.197Steuerung der Tool-Center-Point-Position . . . . . . . . . . . . 444<br />
2.198Bildverarbeitungskette für die Gestensteuerung . . . . . . . . 446<br />
2.199Bildverarbeitungsketten die verwendet wurden . . . . . . . . 449<br />
2.200Links vor und rechts nach der Optimierung der Bildverarbeitungskette<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . 450<br />
2.201Aufbau der Benutzeroberläche für den Benutzer . . . . . . . . 451<br />
2.202Aufbau des Demonstrator Skizze zeichnen . . . . . . . . . . . . 452<br />
2.203Programmablauf der Hauptfuntion . . . . . . . . . . . . . . . 453<br />
2.204Links ist das Ausgangsbild gezeigt, und in der Mitte und<br />
Rechts die Roboterumsetzung mit verschiedenen Stiften . . . 455<br />
16
Tabellenverzeichnis<br />
1.1 Teambetreuer . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
1.2 Teammitglieder . . . . . . . . . . . . . . . . . . . . . . . . . . . 25<br />
1.3 Anwendungsfallschablone - Armbewegung nachahmen . . . 33<br />
1.4 Anwendungsfallschablone - Objekt bewegen . . . . . . . . . . 36<br />
1.5 Anwendungsfallschablone - Steuerung durch alternative Gesten<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39<br />
1.6 Anwendungsfallschablone - Skizze zeichnen . . . . . . . . . . 42<br />
1.7 Anwendungsfallschablone - Kalibrierung für Gestenerkennung<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45<br />
1.8 Anwendungsfallschablone - Initialisierung für Roboterarmsteuern<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46<br />
1.9 Anwendungsfallschablone - Roboterarm bewegen . . . . . . . 48<br />
1.10 Anwendungsfallschablone - Greifer ansteuern . . . . . . . . . 50<br />
1.11 Anwendungsfallschablone - Kalibrierung für alternative Gestensteuerung<br />
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53<br />
1.12 Anwendungsfallschablone - Kalibrierung für Portraitaufnahme 54<br />
1.13 Anwendungsfallschablone - Portrait aufnehmen . . . . . . . . 55<br />
1.14 Risikoanalyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />
1.15 Eintrittswahrscheinlichkeit . . . . . . . . . . . . . . . . . . . . . 62<br />
1.16 Wirkung . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />
1.17 Risiko . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62<br />
2.1 Messwerte der Erkennungsrate des ersten Ansatzes . . . . . . 95<br />
2.2 Messwerte der Erkennungsrate des zweiten Ansatzes . . . . . 95<br />
2.3 Messwerte der Quadrantenbestimmung des ersten Ansatzes . 96<br />
2.4 Messwerte der Quadrantenstabilität von Ansatz 2 . . . . . . . 97<br />
2.5 VFBC Steuerpaket . . . . . . . . . . . . . . . . . . . . . . . . . . 180<br />
2.6 Parameter für eine Auflösung von 1280x720 im Speicherbereich<br />
0x00000000. . . . . . . . . . . . . . . . . . . . . . . . . . . . 240<br />
2.7 Image Bus Overlay PLB Register . . . . . . . . . . . . . . . . . 288<br />
2.8 Servospezifikationen der Fa. Dago Metall . . . . . . . . . . . . 317<br />
2.9 Servospezifikationen der Fa. Hitec . . . . . . . . . . . . . . . . 319<br />
2.10 Servospezifikationen der Fa. Hitec . . . . . . . . . . . . . . . . 319<br />
17
Tabellenverzeichnis 10. Oktober 2013<br />
2.11 Konnektor zwischen FPGA-Board und Servoplatine . . . . . . 347<br />
2.12 Laufzeitmessung Übersicht . . . . . . . . . . . . . . . . . . . . 404<br />
2.13 Laufzeitmessung Sortieren . . . . . . . . . . . . . . . . . . . . . 405<br />
2.14 Laufzeitmessung Tracking ohne Armbewegung . . . . . . . . 405<br />
2.15 Laufzeitmessung Tracking mit Armbewegung . . . . . . . . . 405<br />
2.16 BLOB-Treiber . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406<br />
2.17 Laufzeit des Image-Overlays . . . . . . . . . . . . . . . . . . . 406<br />
2.18 Laufzeit der Winkelberechnung . . . . . . . . . . . . . . . . . . 406<br />
2.19 Laufzeitmessung nach Treiberoptimierung . . . . . . . . . . . 434<br />
2.20 Laufzeitmessung nach erster Overlayoptimierung . . . . . . . 435<br />
2.21 Laufzeitmessung nach zweiter Overlayoptimierung . . . . . . 435<br />
2.22 Laufzeitmessung Tracking ohne Armbewegungg . . . . . . . 436<br />
2.23 Laufzeitmessung nach Trackingoptimierung . . . . . . . . . . 436<br />
2.24 Laufzeitmessung nach Array und Vektor Optimierung . . . . 437<br />
2.25 Laufzeitmessung nach inline-Optimierung . . . . . . . . . . . 437<br />
2.26 Laufzeitmessung im Releasemodus . . . . . . . . . . . . . . . 438<br />
2.27 Beobachtete Reaktionszeit . . . . . . . . . . . . . . . . . . . . . 438<br />
18
Quellcodeverzeichnis<br />
2.1 Formel zur Bestimmung von M & N für WolframAlpha . . . 166<br />
19
1 Lastenheft<br />
Dieses Kapitel beschreibt die Gesamtheit der Forderungen des Auftraggebers<br />
an die Lieferungen und Leistungen des Auftragnehmers. Es enthält<br />
die Motivation mit daraus folgender Zielsetzung, Anforderungserhebung,<br />
Risikoanalyse und den angestrebten Entwicklungszyklus. Weiter wird die<br />
Systemarchitektur beschrieben und der Umfang der Lieferung definiert.<br />
1.1 Einleitung<br />
Heutige automatisierte Anlagen werden zunehmend durch Kamerasysteme<br />
gesteuert oder mit deren Hilfe überwacht. Seien es Sicherheitssysteme,<br />
Industrieanlagen, Verkehrsüberwachung oder die Konsumerelektronik,<br />
in allen diesen Bereichen sind Kameralösungen gegenwärtig nicht<br />
mehr weg zu denken.<br />
Die Verwendung von auf Kameras basierenden Lösungen erleichtert die<br />
Bedienung von Robotersystemen in vielen Aspekten. Ein Roboterarm könnte<br />
anstelle eines menschlichen Arms in gefährlichen Umgebungen, z.B.<br />
bei der Entschärfung von Sprengstoffen eingesetzt werden. Darüber hinaus<br />
kann ein Roboterarm als Alltagshilfe für Menschen dienen, welche nur<br />
über einen oder keinen Arm verfügen.<br />
Zwar kann hier auch ein durch mechanische oder elektronische Kontrolle<br />
gesteuertes System gewählt werden, jedoch ist die Nachahmung eines Roboters<br />
der vom Benutzer ausgeführten Bewegungen einfacher und intuitiver.<br />
Die Intuitivität ist dadurch gegeben, dass das System genau die Bewegungen<br />
des Benutzers ausführt. Im Rahmen der Projektgruppe RoboArm<br />
der <strong>Universität</strong> <strong>Oldenburg</strong> wird ein System aus kamerabasierter Raumwahrnehmung,<br />
eingebetteter Steuerung sowie einem Roboterarm zur Nachahmung<br />
von menschlichen Bewegungen entwickelt.<br />
1.1.1 Motivation<br />
Die Möglichkeiten eines Systems aus Roboterarm, 3D-Kamera und eingebetteter<br />
Bildverarbeitung sind vielfältig. Eine direkte Steuerung des Ro-<br />
20
Kapitel 1. Lastenheft 10. Oktober 2013<br />
boterarmes kann zum Beispiel durch die Nachahmung des menschlichen<br />
Armes erzielt werden. Es kann außerdem eine Hilfestellung für körperlich<br />
beeinträchtigte Personen sein. Für solche Menschen wäre eine Anwendung<br />
möglich, um einen Telefonhörer aufzunehmen. Eine weitere Möglichkeit<br />
wäre der Einsatz des Roboterarmes als Hilfe beim Anziehen. Natürlich<br />
sind auch weitere Szenarien im täglichen Leben denkbar, in denen ein<br />
teleoperierter Roboterarm eine Hilfe sein könnte.<br />
Diese Szenarien erfordern jedoch, dass der Roboter auch durch andere<br />
Gesten als denen des menschlichen Armes gesteuert werden kann, da es<br />
auch Menschen gibt, die keinen Arm zur Steuerung zur Verfügung haben.<br />
Eine solche Steuerung muss keine direkte Nachahmung sein, sondern eine<br />
Interpretation. Denkbar wären hier Bewegungen des Kopfes oder der Augen<br />
zu verfolgen.<br />
Abbildung 1.1: Roboter spielt Jenga, TU Braunschweig 1<br />
Eine weitere Anwendung eines solchen Systems könnte z.B. spielerischer<br />
Natur sein, wie in der Abb. 1.1 dargestellt ist. Dabei wird der Roboter<br />
verwendet, um in Spielen wie Jenga oder Mikado gezielt die Spielsteine zu<br />
greifen und abzusetzen.<br />
Bei den bisher genannten Szenarien ist die exakte Position der Armgelenke<br />
nicht immer relevant. Dies ändert sich jedoch, sobald Armbewegun-<br />
1 Informationsdienst Wissenschaft, Die TU Braunschweig auf der Hannover Messe,<br />
http://www.idw-online.de/pages/de/newsimage?id=16541&size=screen, letzter Zugriff<br />
30.11.2012<br />
21
Kapitel 1. Lastenheft 10. Oktober 2013<br />
gen nachgeahmt werden sollen. Beispielsweise bei der Führung des Armes<br />
zwischen verschiedenen Hindernissen hindurch ist dies von Bedeutung.<br />
Eine weitere Möglichkeit wäre ein Szenario, in dem der Roboterarm für<br />
die Zeichnung einer Skizze, wie in Abb. 1.2, verwendet wird. Eine solche<br />
Skizze kann auch automatisch gezeichnet werden, indem das Kamerasystem<br />
ein Bild, der vor der Kamera stehenden Person, aufnimmt und dieses<br />
zu einer Skizze umrechnet. Die Skizze wird dann vom Roboterarm auf eine<br />
Oberfläche übertragen.<br />
In der Industrie könnte dieses System verwendet werden, um die Position<br />
und Ausrichtung eines zu verarbeitenden Werkstücks gegebenenfalls zu<br />
korrigieren. Hierbei wird dieses durch das 3D-Kamerasystem wahrgenommen<br />
und mit einem Soll-Muster verglichen. Sollten die Position und Ausrichtung<br />
des Werkstücks vom Sollwert abweichen, wird es durch den Roboter<br />
in die richtige Stellung versetzt.<br />
Abbildung 1.2: Industrieroboter zeichnet eine Skizze 2<br />
Damit die aufgeführten Anwendungen schneller und kostengünstiger realisiert<br />
werden können als bisherige Produkte, bietet sich ein eingebettetes<br />
System an. Das heißt, dass die Bildverarbeitung und die Robotersteuerung<br />
in Hardware umgesetzt werden. Durch den Einsatz von Hardware<br />
ist eine Bildverarbeitung gegenüber einer Softwarelösung in der Regel<br />
um ein Vielfaches schneller. Dies liegt darin begründet, dass es der Hardware<br />
möglich ist Berechnungen ohne Speicherzugriff nacheinander und<br />
/ oder parallel zueinander durchzuführen. Auch kann bei einer modularen<br />
Lösung schnell Hardware ausgetauscht werden, um verschiedenen<br />
2 Materialsgate, Robotik Artikel, http://www.materialsgate.de/de/mnews/9053/Robotik,<br />
letzter Zugriff 30.11.2012<br />
22
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Anwendungsgebieten gerecht zu werden. Es können, je nach Szenario, unterschiedliche<br />
Module in Form von Filtern benutzt werden.<br />
Im Vergleich zu industriellen Robotersystemen wird das im Rahmen der<br />
Projektgruppe entwickelte System sehr kostengünstig und einfach gehalten<br />
sein. Dies ist dadurch begründet, dass Komponenten verwendet werden,<br />
welche einem breitem Publikum zur Verfügung stehen und von jeder<br />
Privatperson im Handel erworben werden können. Bei dem Roboterarm<br />
handelt es sich um einen Arexx der nur einen Bruchteil eines Industrieroboters<br />
kostet. Jedoch müssen dabei die Grenzen solcher Komponenten in<br />
Betracht gezogen werden, sodass z.B. das Gewicht der zu handhabenden<br />
Objekte den geringen Maximalwert nicht überschreitet.<br />
Im Folgenden werden die Ziele der Projektgruppe ausführlicher dargestellt.<br />
Im Abschnitt 1.2 werden diese durch die entsprechenden Anwendungsfälle<br />
präzisiert.<br />
1.1.2 Zielsetzung<br />
Die im Abschnitt 1.1.1 aufgeführten Szenarien stellen die Vorteile und<br />
Möglichkeiten der Anwendung einer hardware- und kamerabasierten Robotersteuerung<br />
dar. Das bedeutet, dass die Informationen über die Umwelt<br />
über ein Kamerasystem aufgenommen werden. Diese Daten werden dann,<br />
je nach Szenario, mit Hilfe von Software oder Hardware verarbeitet. Außerdem<br />
wurde die Möglichkeit der Realisierung durch günstige Komponenten<br />
dargestellt.<br />
Das Ziel der Projektgruppe RoboArm ist es, ein kamerabasiertes Echtzeitsystem<br />
zur Erfassung menschlicher Gesten und Merkmale zu realisieren.<br />
Ein solches System wird, anhand des zur Verfügung gestellten Roboterarms,<br />
demonstrativ vorgestellt werden.<br />
Der Schwerpunkt liegt dabei auf der Umsetzung des Echtzeitsystems. Dieses<br />
liefert Ansteuerungssignale, sodass sich der Roboterarm entsprechend des<br />
aktuellen Szenarios, bewegt. Bei bestimmten Szenarien darf ein nicht echtzeitfähiges<br />
System hinzugenommen werden.<br />
Das Echtzeitsystem muss auf den vorgegebenen Hardwarekomponenten<br />
aufbauen, siehe Unterabschnitt 1.1.6. Aus diesem Grund werden aus den<br />
im Unterabschnitt 1.1.1 vorgestellten Szenarien einige ausgewählt, die sich<br />
mit der gegebenen Technik realisieren lassen. Somit können Einsätze demonstriert<br />
werden, die auch auf weitere Szenarien übertragbar sind.<br />
23
Kapitel 1. Lastenheft 10. Oktober 2013<br />
1.1.2.1 Szenarien<br />
Das erste zu realisierende Szenario ist die Nachahmung der Haltung und Bewegung<br />
des menschlichen Arms. Dies spiegelt die Führung des Roboterarmes<br />
durch die Hindernisse und das Greifen des Objektes aus der gewünschten<br />
Richtung wieder.<br />
Das zweite Szenario geht aus dem Fall des Aufnehmens und Bereitstellens<br />
eines Telefonhörers hervor. Das Gewicht eines Telefonhörers überschreitet<br />
die maximal tragbare Last des Roboterarms. Der zur Verfügung gestellte<br />
Greifer ist zudem kleiner als ein Telefonhörer. Das Szenario wird daher auf<br />
das Aufheben, Bewegen und Ablegen eines für den Roboterarm greif- und<br />
tragbaren Objekts reduziert. Das Szenario Objekt bewegen spiegelt den Fall<br />
des Jenga oder Mikado spielens wieder. Hier ist das präzise Greifen eines<br />
Objektes von Bedeutung.<br />
Das dritte Szenario realisiert das Zeichnen der Skizze vom Gesicht einer<br />
Person. Der Fall Skizze zeichnen spiegelt sich hier wieder. Dieses wird nicht<br />
in Echtzeit erfolgen, wobei hier jedoch am stärksten auf die Ansteuerung<br />
des Roboterarms gesetzt wird. Das Zeichnen der Skizze durch die Führung<br />
des Roboterarms wird daher durch komplizierte Steuerungsalgorithmen<br />
realisiert.<br />
Das vierte Szenario spiegelt die Hilfestellung für körperlich beeinträchtigte<br />
Personen wider. Wegen der Größe und den Freiheitsgraden, über welche<br />
der Roboterarm verfügt, ist es nicht möglich eine Hilfestellung beim Anziehen<br />
zu realisieren. Dieses Szenario wird daher auf die Steuerung durch<br />
alternative Gesten reduziert.<br />
Im Folgenden werden die Gruppenmitglieder vorgestellt, die die beschriebenen<br />
Ziele realisieren werden. Auch werden die Betreuer der Projektgruppe<br />
vorgestellt.<br />
24
Kapitel 1. Lastenheft 10. Oktober 2013<br />
1.1.3 Vorstellung der Gruppe<br />
Im Rahmen der Projektgruppenarbeit an der <strong>Universität</strong> <strong>Oldenburg</strong> in der<br />
Abteilung Mikrorobotik und Regelungstechnik (AMiR) hat sich im Wintersemester<br />
2012/13 die Gruppe RoboArm zusammengeschlossen. Das Projekt<br />
wird betreut durch folgende Personen.<br />
Name<br />
Claas Diederichs<br />
Tobias Tiemerding<br />
E-Mail-Adresse<br />
claas.diederichs@uni-oldenburg.de<br />
tobias.tiemerding@uni-oldenburg.de<br />
Tabelle 1.1: Teambetreuer<br />
Die Gruppe RoboArm besteht aus den folgenden studentischen Mitgliedern.<br />
Name<br />
Vitaliy Beguchiy<br />
Fabian Diefenbach<br />
Patrick Elfert<br />
Peter Gewald<br />
Markus Müller<br />
Sebastian Reichel<br />
Tobias Schüürhuis<br />
Matthias Stasch<br />
E-Mail-Adresse<br />
vitaliy.beguchiy@uni-oldenburg.de<br />
fabian.diefenbach@uni-oldenburg.de<br />
patrick.elfert@uni-oldenburg.de<br />
peter.gewald@uni-oldenburg.de<br />
markus.mueller@uni-oldenburg.de<br />
sebastian.reichel@uni-oldenburg.de<br />
tobias.schueuerhuis@uni-oldenburg.de<br />
matthias.stasch@uni-oldenburg.de<br />
Tabelle 1.2: Teammitglieder<br />
1.1.4 Darstellung aktueller Technologien<br />
Es gibt heute bereits einige Produkte, welche kamerabasiert eine Umgebung<br />
dreidimensional untersuchen sowie gegebenenfalls zeitliche Änderungen<br />
wahrnehmen und verarbeiten. Ein paar derartige 3D-Kamerasysteme<br />
sind z.B. die Kinect 3 für die XBox 360, das Asus Xtion 4 und die LeapMotion<br />
5 als eine Erweiterung für den Personal Computer (PC).<br />
Die Kinect, dargestellt in Abb. 1.3, ist ein zusätzliches Eingabegerät für<br />
die Spielekonsole XBox 360 der Firma Microsoft und dient primär der<br />
Unterhaltung. Sie besteht aus zwei Kameras und einer Infrarotlichtquelle.<br />
Diese strahlt ein Raster aus, das von den Kameras aufgezeichnet wird. Die<br />
Spielekonsole setzt die Aufzeichnungen in Bewegungsinformationen um.<br />
3 Produktseite der Kinect für die XBox 360 - http://www.xbox.com/de-DE/Kinect letzter<br />
Zugriff 28.11.2012<br />
4 Asus Xtion Produktseite - http://goo.gl/wKUzG letzter Zugriff 28.11.2012<br />
5 Leap Motion Artikel - https://leapmotion.com letzter Zugriff 28.11.2012<br />
25
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Abbildung 1.3: Kinect der Firma Microsoft 6<br />
Ein ähnliches Produkt ist die LeapMotion, welche als Eingabegerät für<br />
herkömmliche PCs dient und auf dem Schreibtisch positioniert wird, wie<br />
in Abb. 1.4. Der Fokus der zwei Kameras ist dabei auf die Hände gerichtet.<br />
Die Kameras nehmen das Infrarotlicht der Emitter auf, wobei die LeapMotion<br />
drei Emitter einsetzt, um die Genauigkeit der Messung zu verbessern.<br />
Bisher existiert die LeapMotion nur als Prototyp, soll jedoch ab 2013 erhältlich<br />
sein.<br />
Abbildung 1.4: LeapMotion 7<br />
6 Produktseite der Kinect für die XBox 360 - http://www.xbox.com/de-DE/Kinect letzter<br />
Zugriff 28.11.2012<br />
7 Leap Motion Artikel - https://leapmotion.com letzter Zugriff 28.11.2012<br />
26
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Das Asus Xtion ist technisch vergleichbar mit der Microsoft Kinect, jedoch<br />
ausschließlich an PCs nutzbar und nicht für den Konsumermarkt vorgesehen.<br />
1.1.5 Abgrenzung des Systems<br />
Das von der Projektgruppe zu entwickelnde System wird ein Field Programmable<br />
Gate Array (FPGA) einsetzen, um die Informations- und Bildverarbeitung<br />
zu realisieren und somit die Algorithmen in Hardware umzusetzen.<br />
Dies ermöglicht eine schnellere Verarbeitung von Daten gegenüber<br />
einer auf Software basierenden Realisierung. Begründet ist dies durch die<br />
Eigenschaften einer Realisierung in Hardware. Hardware bietet den Vorteil,<br />
dass verschiedene Prozesse parallel zueinander ausgeführt werden können,<br />
wie im Unterabschnitt 1.1.1 angeführt wurde. Somit können zum<br />
Beispiel mehrere Bildverarbeitungsalgorithmen zur gleichen Zeit arbeiten.<br />
Dies ist zum Beispiel bei der Stereoskopie erforderlich. Hier wird jeweils<br />
eine Bildverarbeitungskette pro Kamera benötigt. Durch die Hardware ist<br />
es möglich, dass diese parallel zueinander laufen können. Die Stereoskopie<br />
wird benötigt, um die Tiefeninformationen zu erhalten, welche z.B. für die<br />
Verfolgung des Arms in der dritten Ebene von Bedeutung ist.<br />
Ein weiterer Vorteil, den Hardware bietet, ist die Geschwindigkeit der<br />
Berechnung, da spezialisierte Schaltungen verwendet werden. Ebenfalls ist<br />
es möglich einen Zuwachs an Performanz zu erhalten, indem man den<br />
Datenstrom ohne Zwischenspeicherung der Daten an den nächsten IP-Core<br />
gibt.<br />
Ebenfalls ist es mit der Lösung der Projektgruppe möglich Hardwaremodule,<br />
wie zum Beispiel einen Roboterarm, direkt anzusteuern ohne dafür<br />
einen PC oder ähnliches einzusetzen. Weiterhin ist hervorzuheben, dass,<br />
bei Bedarf, die Kamera oder auch der Roboterarm gegen andere Module<br />
ausgetauscht werden können, um gegebenenfalls das System zu optimieren.<br />
Alle in Unterabschnitt 1.1.4 genannten Lösungen bieten ihre Informationen<br />
nur über eine Universal Serial Bus (USB) Schnittstelle an. Das<br />
von der Projektgruppe eingesetzte Kameramodul besitzt eine Very-High-<br />
Density Cable Interconnect (VHDCI) Schnittstelle und wird über das I 2 C-<br />
Protokoll angesprochen. Das System ist zwar stationär, jedoch durch die<br />
Größe seiner Komponenten dennoch portabel.<br />
Das resultierende Produkt stellt einen Prototypen da, welcher einige Möglichkeiten<br />
aufzeigt, die aus der Verbindung eines Roboterarms und hardwarebasierender<br />
Bildverarbeitung von dreidimensionalen Bildinformationen hervorgehen.<br />
27
Kapitel 1. Lastenheft 10. Oktober 2013<br />
1.1.6 Beschreibung der Ausgangslage<br />
Für den Aufbau wird die Entwicklungsplatine ATLYS der Firma Digilent<br />
eingesetzt. Dieses Entwicklungsboard besitzt einen FPGA der Firma Xilinx<br />
aus der Baureihe Spartan-6, welcher die Signale des Kameramoduls<br />
empfängt und verarbeitet. Die Verarbeitung erfolgt durch IP-Cores, in denen<br />
die Algortihmen in Hardware implementiert sind. Bei der Entwicklung<br />
der Algorithmen wird die OFFIS-Automation-Toolbox für den Softwareprototypenentwurf<br />
eingesetzt. Um die Algorithmen in Hardware zu implementieren<br />
und zu Testen wird neben dem ATLYS, die Nexus 2 Entwicklungsplatine<br />
eingesetzt. Da dieses Board nicht über eine VHDCI-Schnittstelle<br />
verfügt, wird eine virtuelle Kamera eingesetzt. Diese ermöglicht es über die<br />
OFFIS-Automation-Toolbox Bilder an das Nexus 2 zu übertragen. Bei dem<br />
Kameramodul handelt es sich ebenfalls um ein Produkt der Firma Digilent<br />
mit zwei unabhängigen 2 Megapixel Bildsensoren. Die Bilder werden<br />
mittels des FPGA in Bewegungen auf eine Roboterarm umgesetzt, welcher<br />
einen eingeschränkten drei dimensionalen Raum mit seinem Endeffektor<br />
erreichen kann. Der Roboterarm ist von der Firma AREXX und besitzt<br />
die Produktbezeichnung Robot ARM Pro (RA1-Pro). Um Bewegungen<br />
umzusetzen steuert der FPGA sechs Servos über Pulspositionsmodulation<br />
an. Eine schematische Darstellung der einzelnen Hardwarekomponenten<br />
findet sich im Abb. 1.5.<br />
Abbildung 1.5: Hardwarebestandteile<br />
28
Kapitel 1. Lastenheft 10. Oktober 2013<br />
1.2 Anforderungsdenition<br />
Die Anforderungsdefinition präzisiert die in der Zielsetzung festgelegten<br />
Szenarien. Aus diesen Szenarien ergeben sich durch Verallgemeinerung die<br />
im Folgenden behandelten Anwendungsfälle. Diese werden jeweils durch<br />
ein Anwendungsfalldiagramm, eine textuelle Beschreibung und eine Anwendungsfallschablone<br />
beschrieben. Aus den verschiedenen Darstellungen<br />
der unterschiedlichen Anwendungsfälle werden die funktionalen und<br />
nichtfunktionalen Anforderungen erhoben.<br />
Funktionale Anforderungen beschreiben dabei das, was das System leisten<br />
soll. Die nichtfunktionalen Anforderungen hingegen geben die qualitativen<br />
Eigenschaften des Systems an. Diese werden in den Unterabschnitten für<br />
die funktionalen Anforderungen 1.2.5 und nicht funktionalen Anforderungen<br />
1.2.6 aufgeführt.<br />
1.2.1 Anwendungsfälle<br />
In diesem Unterabschnitt werden die ausgewählten Anwendungsfälle beschrieben.<br />
Hierzu wird zunächst eine grafische Darstellung des jeweiligen<br />
Anwendungsfalles gezeigt und durch eine textuelle Beschreibung erläutert.<br />
Für die verschiedenen Möglichkeiten innerhalb eines Anwendungsfalles<br />
ist zusätzlich noch eine Anwendungsfallschablone mit den beteiligten Akteuren,<br />
dem Standardablauf, dem alternativen Ablauf, der Reaktion des<br />
Systems, den Vorbedingungen, den Nachbedingungen, den Qualitätsanforderungen<br />
und den enthaltenden Anwendungsfällen beigefügt.<br />
Akteure sind alle Beteiligten des entsprechenden Anwendungsfalls. Diese<br />
können Teile des Systems oder Personen sein, welche das System verwenden.<br />
Der Standardablauf beschreibt den störungsfreien Ablauf des Anwendungsfalles.<br />
Der Alternative hingegen beschreibt den Verlauf des Anwendungsfalls<br />
bei einer Störung oder einem vom Standard abweichendem<br />
Ablauf. Die Reaktion des Systems beschreibt die Aktionen des Systems im<br />
Falle des alternativen Ablaufs. Die Vorbedingung gibt den Zustand der<br />
Umgebung vor dem Start des Anwendungsfalles an und die Nachbedingung<br />
den Zustand der Umgebung nachdem der Anwendungsfall ausgeführt<br />
wurde. Die Qualität macht Angaben darüber, welche qualitativen<br />
Eigenschaften der Anwendungsfall einhalten muss. Unter die enthaltenen<br />
Anwendungsfälle fallen alle im jeweiligen Anwendungsfall Aufgeführten.<br />
Im nächsten Unterabschnitt wird zunächst eine globale Übersicht über<br />
sämtliche Anwendungsfälle gegeben.<br />
29
Kapitel 1. Lastenheft 10. Oktober 2013<br />
1.2.2 Gobaler Anwendungsfall<br />
In diesem Unterabschnitt wird zunächst der globale Anwendungsfall 1.6<br />
dargestellt, um eine Übersicht über das zu implementierende System zu<br />
erhalten. Dieses beinhaltet sämtliche Anwendungsfälle, welche aus den<br />
Szenarien ermittelt wurden.<br />
Abbildung 1.6: Globaler Anwendungsfall<br />
30
Kapitel 1. Lastenheft 10. Oktober 2013<br />
1.2.3 Primäre Anwendungsfälle<br />
Im Folgenden werden die primären Anwendungsfälle Armhaltung nachahmen,<br />
Objekt bewegen, Roboter steuern durch alternative Gesten und Skizze zeichnen<br />
im Detail beschrieben. Anschließend werden die jeweils enthaltenen<br />
Anwendungsfälle betrachtet und ebenfalls im Detail beschrieben. Diese<br />
werden jedoch jeweils nur einmal ausgeführt, auch wenn sie zu mehreren<br />
primären Anwendungsfällen gehören.<br />
1.2.3.1 Armhaltung nachahmen<br />
Im Anwendungsfall Armhaltung nachahmen kann der Benutzer den Roboter<br />
über Bewegungen seines Arms steuern. Dabei muss sich der Roboterarm,<br />
im Rahmen seiner Einschränkungen, äquivalent zu den Bewegungen<br />
des menschlichen Arms verhalten und sie somit nachahmen. Vorher<br />
wird jedoch das System initialisiert und kalibriert, damit dieses die Gesten<br />
des Benutzers korrekt erkennen kann und sich der Roboterarm an einer<br />
definierten Startposition befindet.<br />
Sollte während Nachahmung der Armposition durch das System ein Fehler<br />
festgestellt werden, so begibt sich das System in einen Fehlerzustand. Um<br />
diesen Fehlerzustand zu verlassen, ist es notwendig das System, bzw. einen<br />
Teil des Systems neu zu starten.<br />
Name<br />
Akteure<br />
Standardablauf<br />
Armbewegung nachahmen<br />
Benutzer<br />
1. Das System wird initialisiert.<br />
2. Das System wird für die Erkennung<br />
der Gesten kalibriert.<br />
3. Benutzer startet Eingabe durch eine<br />
initiale Geste.<br />
4. Benutzer bewegt seinen Arm im<br />
Sichtbereich der Kamera.<br />
31
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Alternativer Ablauf<br />
1. Tracking geht verloren. Dies kann<br />
z.B. geschehen, wenn sich die Bewegungen<br />
außerhalb des Sichtbereiches<br />
der Kamera befinden.<br />
2. System reagiert auf keine Eingabe.<br />
3. System läuft im Fehlerzustand.<br />
4. Das System gibt eine Warnmeldung<br />
aus und stoppt an seiner aktuellen<br />
Position.<br />
Reaktion des Systems<br />
1. Roboter ahmt Bewegungen nach,<br />
die durch den Benutzer vor dem<br />
Kamerasystem durchgeführt werden.<br />
Die nachzuahmenden Bewegungen<br />
sind jedoch auf die des<br />
Arms beschränkt.<br />
2. Benutzer beendet Eingabe durch<br />
eine entsprechende Geste oder<br />
durch das Verlassen des Sichtbereiches<br />
der Kameras.<br />
Vorbedingung<br />
1. Das System ist aktiviert.<br />
2. Das System ist nicht im Fehlerzustand.<br />
3. Benutzer befindet sich im<br />
Wahrnehmungsbereich des Systems.<br />
Nachbedingung 1. Bewegungen des Benutzers<br />
wurden durch den Roboterarm<br />
nachgeahmt.<br />
32
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Qualität<br />
1. Das System reagiert mit einer maximalen<br />
Latenz von 500 ms auf die<br />
Bewegung des Benutzers.<br />
2. Das System ahmt die Bewegung<br />
des Benutzer, mit einer maximalen<br />
Winkelabweichung von 10 Grad,<br />
nach.<br />
Enthaltene Anwendungsfälle<br />
1. Kalibrierung für Gestenerkennung,<br />
siehe Unterabschnitt 1.2.4.1.<br />
2. Initialisierung für Roboterarmsteuerung,<br />
siehe Unterabschnitt 1.2.4.2.<br />
3. Roboterarm bewegen, siehe Unterabschnitt<br />
1.2.3.2.<br />
Tabelle 1.3: Anwendungsfallschablone - Armbewegung nachahmen<br />
1.2.3.2 Objekt bewegen<br />
Im Anwendungsfall Objekt bewegen kann der Benutzer den Roboter über<br />
Bewegungen seines Arms steuern. Dabei muss der Roboterarm ausschließlich<br />
die Zielposition der Hand des Benutzers nachahmen. Die Gelenkstellungen<br />
bzw. die Haltung ist dabei dem System überlassen. Zusätzlich muss es<br />
dem Benutzer möglich sein, durch eine entsprechende Geste, den Greifer<br />
des Roboterarms zu öffnen oder zu schließen, damit dieser ein Objekt aufnehmen<br />
und wieder ablegen kann.<br />
33
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Name<br />
Akteure<br />
Standardablauf<br />
Objekt bewegen<br />
Benutzer<br />
1. Benutzer startet Eingabe durch initiale<br />
Geste.<br />
2. Benutzer bewegt Arm.<br />
3. Benutzer führt Geste fürs Schließen<br />
des Greifers aus.<br />
4. Benutzer bewegt Arm.<br />
5. Benutzer führt Geste fürs Öffnen<br />
des Greifers aus.<br />
6. Benutzer beendet Eingabe durch<br />
Geste oder durch das Verlassen des<br />
Sichtbereiches des Kamerasystems.<br />
Alternativer Ablauf 1. Roboter verliert Tracking. Dies<br />
kann durch das Verlassen des<br />
Sichtbereiches des Kamerasystems<br />
geschehen oder durch zu schneller<br />
Bewegungen des Benutzers.<br />
2. System läuft im Fehlerzustand.<br />
3. Das System gibt eine Warnmeldung<br />
aus und stoppt an aktueller Position.<br />
4. System kann nun erneut gestartet<br />
werden.<br />
34
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Reaktion des Systems<br />
1. Roboterarm fährt Zielposition zum<br />
Aufnehmen eines Objektes an.<br />
2. Roboterarm schließt Greifer, um ein<br />
Objekt zu greifen.<br />
3. Roboterarm fährt Zielposition für<br />
das Ablegen eines Objektes an.<br />
4. Roboterarm öffnet Greifer, um ein<br />
Objekt abzulegen.<br />
Vorbedingung<br />
1. Das System ist aktiviert.<br />
2. Das System ist nicht im Fehlerzustand.<br />
3. Benutzer befindet sich im<br />
Wahrnehmungsbereich des Systems.<br />
4. Das zu greifende Objekt befindet<br />
sich im Arbeitsbereich des Roboters.<br />
5. Das zu greifende Objekt darf ein<br />
Gewicht von 20 g nicht überschreiten.<br />
Nachbedingung 1. Objekt wurde gegriffen, bewegt<br />
und abgelegt. Dabei wurden jeweils<br />
die Positionen durch den Roboterarm<br />
abgedeckt, welche vom Benutzer<br />
über die Steuerung des<br />
Greifers mit Hilfe seines Arms<br />
angefahren werden.<br />
35
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Qualität<br />
1. Das System reagiert mit einer maximalen<br />
Latenz von 500 ms auf die<br />
Bewegung des Benutzers.<br />
2. Das System ahmt die Bewegung<br />
des Benutzer, mit einer maximalen<br />
Winkelabweichung von 10 Grad,<br />
nach.<br />
3. Das System behält das gegriffene<br />
Objekt fest, bis es abgelegt wird.<br />
Enthaltene Anwendungsfälle<br />
1. Kalibrierung für Gestenerkennung,<br />
siehe Unterabschnitt 1.2.4.1.<br />
2. Initialisierung für Roboterarmsteuerung,<br />
siehe Unterabschnitt 1.2.4.2.<br />
3. Greifer ansteuern, siehe Unterabschnitt<br />
1.2.4.4.<br />
4. Roboterarm bewegen, siehe Unterabschnitt<br />
1.2.4.3.<br />
Tabelle 1.4: Anwendungsfallschablone - Objekt bewegen<br />
1.2.3.3 Roboter steuern durch alternative Gesten<br />
Im Anwendungsfall Roboter steuern durch alternative Gesten kann der Benutzer<br />
den Roboterarm durch definierte alternative Gesten steuern. Diese<br />
müssen es ihm ermöglichen den Roboterarm ohne die Verwendung seines<br />
eigenen Arms zu steuern.<br />
Hierzu wird eine Machbarkeitsstudie für die Wahl der Art der alternativen<br />
Gestensteuerung erstellt. Untersucht wird die Möglichkeit der Implementierung<br />
eines Eye-Tracking Verfahrens. Dabei steuert der Benutzer<br />
den Roboterarm durch die Bewegung seiner Augen. Sollte diese Machbarkeitsstudie<br />
ergeben, dass dies nicht mit der zur Verfügung stehenden Zeit<br />
bzw. Hardware zu realisieren ist, so wird eine andere alternative Gestensteuerung<br />
gewählt. Diese beinhaltet die Steuerung des Roboterarms durch<br />
verschiedene Bewegungen, welche der Benutzer mit Hilfe seines Kopfes<br />
durchführt.<br />
36
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Name<br />
Akteure<br />
Standardablauf<br />
Steuerung durch alternative Gesten<br />
Benutzer<br />
1. Benutzer startet Eingabe durch initiale<br />
Geste.<br />
2. Benutzer führt alternative Gesten<br />
für Armbewegung aus.<br />
3. Benutzer führt Geste aus, um die<br />
zu bewegende Achse auszuwählen.<br />
Dabei wird pro Ausführung der<br />
entsprechenden Geste eine Achse<br />
weitergeschaltet.<br />
4. Benutzer führt alternative Geste<br />
fürs Schließen des Greifers aus.<br />
5. Benutzer führt alternative Geste<br />
fürs Öffnen des Greifers aus.<br />
Alternativer Ablauf 1. Roboter verliert Tracking. Dies<br />
kann durch das Verlassen des<br />
Sichtbereiches des Kamerasystems<br />
geschehen oder durch zu schneller<br />
Bewegungen des Benutzers.<br />
2. System läuft im Fehlerzustand.<br />
3. System reagiert auf keine Eingabe.<br />
4. Das System gibt eine Warnmeldung<br />
aus und stoppt an seiner aktuellen<br />
Position.<br />
37
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Reaktion des Systems 1. Roboterarm übertragt die alternative<br />
Geste des Benutzers auf<br />
eine Bewegung der entsprechenden<br />
Achse.<br />
2. Roboterarm fährt Zielposition an.<br />
3. Roboterarm schließt Greifer.<br />
4. Roboterarm öffnet Greifer.<br />
Vorbedingung<br />
1. Das System ist aktiviert.<br />
2. Das System ist nicht im Fehlerzustand.<br />
3. Der Benutzer ist im<br />
Wahrnehmungsbereich des Systems.<br />
4. System wird initialisiert für<br />
Roboterarmsteuerung.<br />
5. System wird kalibriert für alternative<br />
Gestenerkennung.<br />
Nachbedingung 1. Objekt wurde gegriffen, bewegt<br />
und abgelegt.<br />
38
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Qualität<br />
1. Das System reagiert mit einer maximalen<br />
Latenz von 500 ms auf die<br />
Bewegung des Benutzers.<br />
2. Das System ahmt die Bewegung<br />
des Benutzer, mit einer maximalen<br />
Winkelabweichung von 10 Grad,<br />
nach.<br />
3. Das System behält das gegriffene<br />
Objekt fest, bis es abgelegt wird.<br />
4. Das System erkennt in der Regel<br />
(über 80gehören, welche für<br />
die Alternative Gestensteuerung<br />
vorgesehen sind. Hinzu kommt<br />
noch, dass die Lichtverhältnisse<br />
den Anforderungen des Systems<br />
entsprechen müssen. Dabei ist die<br />
Art des Lichtes (sehr helles Tageslicht)<br />
und der Einfallwinkel des<br />
Lichtes auf die Kameras wichtig.<br />
Enthaltene Anwendungsfälle<br />
1. Kalibrierung für alternative Gestenerkennung,<br />
siehe Unterabschnitt<br />
1.2.4.1.<br />
2. Initialisierung für Roboterarmsteuerung,<br />
siehe Unterabschnitt 1.2.4.2.<br />
3. Roboterarm bewegen, siehe Unterabschnitt<br />
1.2.4.3.<br />
4. Greifer ansteuern, siehe Unterabschnitt<br />
1.2.4.4.<br />
Tabelle 1.5: Anwendungsfallschablone - Steuerung durch alternative Gesten<br />
39
Kapitel 1. Lastenheft 10. Oktober 2013<br />
1.2.3.4 Skizze zeichnen<br />
Im Anwendungsfall Skizze zeichnen muss das System eine Skizze vom Gesicht<br />
des Benutzers erstellen. Dabei muss sich der Benutzer im Sichtbereich<br />
der Kamera befinden, sodass ein Bild von ihm aufgenommen werden kann.<br />
Dieses Bild muss vom System verarbeitet werden und daraufhin entsprechende<br />
Steuersignale an den Roboterarm senden, sodass dieser eine Skizze<br />
zeichnen kann. Diese wird dabei vom Roboterarm auf einer planaren Oberfläche<br />
angefertigt.<br />
Dabei soll die vom System verarbeitete und durch den Roboterarm gezeichnete<br />
Skizze mindestens der Qualität der im Folgenden gezeigten Abbildung<br />
1.7 von Bild und Skizze entsprechen.<br />
Abbildung 1.7: Skizze einer Aufnahme<br />
Name<br />
Akteure<br />
Skizze zeichnen<br />
Benutzer<br />
40
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Standardablauf 1. Initialisierung für Skizzenzeichnung.<br />
2. Kalibrierung für Portraitaufnahme.<br />
3. Portrait aufnehmen.<br />
4. Portrait verarbeiten.<br />
Alternativer Ablauf<br />
Reaktion des Systems<br />
1. Es gibt keinen alternativen Ablauf,<br />
da das System über keine Sensorik<br />
verfügt. Sollte jedoch während des<br />
Zeichnens ein Fehler auftreten, so<br />
kann der Prozess vom Benutzer<br />
abgebrochen werden.<br />
1. Roboter zeichnet Skizze.<br />
2. Roboterarm fährt Ausgangsstellung<br />
an.<br />
Vorbedingung<br />
1. Das System ist aktiviert.<br />
2. Das System ist nicht im Fehlerzustand.<br />
3. Der zu skizzierende Benutzer ist im<br />
Sichtbereich des Systems.<br />
4. Die Umgebungseigenschaften<br />
liegen innerhalb der gültigen<br />
Konfiguration.<br />
Nachbedingung<br />
1. Das System begibt sich in einen<br />
Standby-Zustand.<br />
2. Das System fährt den Roboterarm<br />
zurück in seine Ausgangslage.<br />
Qualität 1. Die Skizze ähnelt dem Vorbild,<br />
siehe Abb. 1.7.<br />
41
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Enthaltene Anwendungsfälle<br />
1. Portrait aufnehmen, siehe Unterabschnitt<br />
1.2.3.4.<br />
2. Kalibrierung für Portraitaufnahme,<br />
siehe Unterabschnitt 1.2.4.6.<br />
Tabelle 1.6: Anwendungsfallschablone - Skizze zeichnen<br />
1.2.4 Enthaltene Anwendungsfälle<br />
Im Folgenden werden die enthaltenen Anwendungsfälle Kalibrierung für<br />
Gestenerkennung, Initialisierung für Roboterarmsteuerung, Roboterarm bewegen,<br />
Greifer ansteuern, Kalibrierung für alternative Gestenerkennung, Kalibrierung für<br />
Portraitaufnahme und Portrait aufnehmen im Detail beschrieben.<br />
1.2.4.1 Kalibrierung für Gestenerkennung<br />
Abbildung 1.8: Kalibrierung für Gestenerkennung<br />
Es muss eine Kalibrierung durchgeführt werden, um das System auf den<br />
Benutzer anzupassen. Dazu gehört die definierte Bewegung des Armes des<br />
Benutzers in verschiedene Positionen, siehe Abb. 1.9, damit das System<br />
42
Kapitel 1. Lastenheft 10. Oktober 2013<br />
diese erfassen kann. Ob die Kalibrierung erfolgreich ist, soll dem Benutzer<br />
über einen externen Bildschirm mitgeteilt werden, sodass dieser darauf<br />
entsprechend reagieren kann. Möchte der Benutzer ein Objekt greifen, so<br />
muss dieser die definierte Greifbewegung ebenfalls durchführen, sodass<br />
diese vom System erkannt werden kann. Ob die Kalibrierung erfolgreich<br />
ist, wird dem Benutzer durch das System mitgeteilt. Ebenfalls wird<br />
in diesem Anwendungsfall die Kalibrierung der Kamera durchgeführt, um<br />
z.B. einen Weißabgleich durchzuführen.<br />
Abbildung 1.9: Beispiel einer Kalibrierung<br />
Der Roboterarm kann um 90 Grad gedreht werden, damit dieser die selbe<br />
Stellung bzw. Ausrichtung hat wie der menschliche Arm. Dies soll eine<br />
bessere und intuitive Bedienung ermöglichen.<br />
Name<br />
Kalibrierung für Gestenerkennung<br />
43
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Akteure<br />
Standardablauf<br />
Benutzer<br />
1. Benutzer startet Kalibrierung für Gestenerkennung.<br />
2. Kalibrierung der Kamera. Hier wird zum<br />
Beispiel der Weißabgleich der Kamera<br />
durchgeführt.<br />
3. Benutzer bewegt seinen Arm nacheinander<br />
an unterschiedliche Positionen. Diese<br />
müssen vom System erkannt und bestätigt<br />
werden.<br />
4. Benutzer führt Greifbewegungen durch,<br />
welche ebenfalls durch das System erkannt<br />
und bestätigt werden müssen.<br />
5. System teilt dem Benutzer die erfolgreiche<br />
Kalibrierung mit.<br />
6. Benutzer beendet Kalibrierung.<br />
Alternativer Ablauf<br />
1. Benutzer startet Kalibrierung.<br />
2. Kalibrierung schlägt fehl, dies kann z.B.<br />
durch zu schlechte Lichtverhältnisse oder<br />
durch zu schnelle Bewegungen des Benutzer<br />
geschehen.<br />
3. System teilt dem Benutzer die fehlgeschlagene<br />
Kalibrierung mit.<br />
4. Möchte der Benutzer den Vorgang wiederholen,<br />
so kann es dies dem System mitteilen<br />
und von vorne beginnen.<br />
44
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Reaktion des Systems<br />
Vorbedingung<br />
1. Das System ist auf den Benutzer kalibriert<br />
und der Benutzer kann das System verwenden.<br />
1. System muss eingeschaltet werden.<br />
2. Lichtverhältnisse müssen sich im Bereich<br />
der für die Kamera gültigen Werte befinden.<br />
3. Der Arm des Benutzers muss entsprechend<br />
markiert sein. Hierzu werden rote Armbinden<br />
verwendet.<br />
Nachbedingung<br />
Qualität<br />
1. Das System ist auf den Benutzer kalibriert<br />
und erkennt die definierten Gesten.<br />
1. Die Erfolgsrate bei der Kalibrierung des<br />
Systems muss bei mindestens 75 % liegen.<br />
Tabelle 1.7: Anwendungsfallschablone - Kalibrierung für Gestenerkennung<br />
1.2.4.2 Initialisierung für Roboterarmsteuerung<br />
System<br />
Initialisierung<br />
für Roboterarmsteuerung<br />
<br />
Roboterarm<br />
fährt in Startposition<br />
Benutzer<br />
Abbildung 1.10: Initialisierung für Roboterarmsteuerung<br />
Nach dem Start erfolgt im ersten Schritt die Initialisierung des Systems.<br />
Dazu gehört die Bewegung des Roboterarms in die Ausgangsstellung. Diese<br />
Ausgangsstellung ist wichtig, damit das System eine definierte Position<br />
hat.<br />
Name<br />
Initialisierung für Roboterarmsteuern<br />
45
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Akteure<br />
Standardablauf<br />
Alternativer Ablauf<br />
Benutzer<br />
1. Benutzer startet System.<br />
1. System kann nicht initialisiert werden.<br />
2. System gibt eine Fehlermeldung aus.<br />
3. System gibt dem Benutzer die Möglichkeit<br />
für einen Neustart.<br />
Reaktion des Systems<br />
1. System begibt sich in Ausgangslage.<br />
2. System wartet auf entsprechende Kalibrierung.<br />
Vorbedingung<br />
Nachbedingung<br />
1. System ist deaktiviert.<br />
1. System ist initialisiert und kann nun kalibriert<br />
werden.<br />
Qualität 1. Das System beendet die Initialisierung<br />
nach maximal 5 Sekunden.<br />
Tabelle 1.8: Anwendungsfallschablone - Initialisierung für Roboterarmsteuern<br />
46
Kapitel 1. Lastenheft 10. Oktober 2013<br />
1.2.4.3 Roboterarm bewegen<br />
System<br />
Roboterarm<br />
bewegen<br />
<br />
Ansteuerung<br />
der Servos<br />
Benutzer<br />
Abbildung 1.11: Roboterarm bewegen<br />
Damit der Roboterarm bewegt werden kann, müssen die aufgenommenen<br />
und erkannten Gesten in Signale für die Servos des Roboterarms umgesetzt<br />
werden.<br />
47
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Name<br />
Akteure<br />
Standardablauf<br />
Alternativer Ablauf<br />
Roboterarm bewegen<br />
Benutzer<br />
1. Benutzer führt eine Geste aus<br />
1. Ansteuerung der Servos schlägt fehl.<br />
2. System gibt eine Fehlermeldung aus.<br />
3. System gibt dem Benutzer die Möglichkeit<br />
für einen Neustart.<br />
Reaktion des Systems<br />
1. System erkennt die Geste.<br />
2. System berechnet die auszuführende Aktion<br />
des Roboterarms.<br />
3. System berechnet die Signale für die Servos.<br />
4. System steuert Servomotoren an.<br />
5. Servomotoren bewegen den Roboterarm.<br />
Vorbedingung<br />
Nachbedingung<br />
Qualität<br />
1. Das System ist initialisiert und kalibriert.<br />
1. Der Roboterarm hat die gewünschte Position<br />
angefahren.<br />
1. Das System reagiert mit einer maximalen<br />
Latenz von 500 ms auf die Bewegung des<br />
Benutzers.<br />
2. Das System ahmt die Bewegung des Benutzers,<br />
mit einer maximalen Winkelabweichung<br />
von 10 Grad, nach.<br />
Tabelle 1.9: Anwendungsfallschablone - Roboterarm bewegen<br />
48
Kapitel 1. Lastenheft 10. Oktober 2013<br />
1.2.4.4 Greifer ansteuern<br />
Abbildung 1.12: Greifer ansteuern<br />
Befindet sich der Benutzer im primären Anwendungsfall Objekt bewegen<br />
1.2.3.2, ist es diesem möglich mit einer entsprechenden Geste den Greifer<br />
des Roboterarms zu öffnen und zu schließen, um damit ein Objekt zu<br />
greifen und dieses an anderer Stelle wieder ablegen zu können.<br />
Name<br />
Akteure<br />
Standardablauf<br />
Greifer ansteuern<br />
Benutzer<br />
1. Benutzer führt mit der Hand eine Geste<br />
zum Öffnen des Greifers aus.<br />
2. Roboterarm öffnet den Greifer.<br />
3. Benutzer führt mit der Hand eine Geste<br />
zum Schließen des Greifers aus.<br />
4. Roboterarm schließt den Greifer.<br />
Alternativer Ablauf<br />
1. Benutzer führt eine Geste zum Öffnen oder<br />
Schließen des Greifers aus.<br />
2. System reagiert nicht auf die Eingabe.<br />
3. Benutzer startet System neu.<br />
Reaktion des Systems<br />
1. System startet neu.<br />
49
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Vorbedingung<br />
Nachbedingung<br />
Qualität<br />
1. System muss kalibriert und initialisiert<br />
worden sein.<br />
1. Greifer wurde geöffnet und danach wieder<br />
geschlossen und hat das entsprechend zu<br />
greifende Objekt gegriffen.<br />
1. Die Objekte, die vom Greifer gegriffen werden<br />
sollen, müssen die entsprechenden<br />
Spezifikationen einhalten. Diese Spezifikationen<br />
sind in den nicht funktionalen Anforderungen<br />
1.2.6 im Abschnitt Effizienz<br />
beschrieben.<br />
Tabelle 1.10: Anwendungsfallschablone - Greifer ansteuern<br />
1.2.4.5 Kalibrierung für alternative Gestenerkennung<br />
System<br />
<br />
Kalibrierung<br />
der Kamera<br />
Benutzer<br />
Kalibrierung<br />
für alternative<br />
Gestenerkennung<br />
<br />
Erkennung<br />
der die alternative<br />
Geste ausführenden<br />
Körperteile<br />
Abbildung 1.13: Kalibrierung für alternative Gestenerkennung<br />
Bei der Kalibrierung für alternative Gesten wird der Benutzer und dessen<br />
alternative Gesten, siehe Abb. 1.14, zur Steuerung des Roboters auf das<br />
System angepasst. Ebenfalls wird an dieser Stelle die Kamera des Systems<br />
kalibriert.<br />
50
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Abbildung 1.14: Beispiel einer Kalibrierung für alternative Gestenerkennung<br />
Name<br />
Akteure<br />
Standardablauf<br />
Kalibrierung für alternative Gestensteuerung<br />
Benutzer<br />
1. Benutzer startet durch eine Geste die Kalibrierung<br />
für alternative Gestenerkennung.<br />
2. Kalibrierung der Kamera.<br />
3. Benutzer führt nacheinander drei unterschiedliche<br />
alternative Gesten aus. Diese<br />
müssen vom System erkannt und bestätigt<br />
werden.<br />
51
Kapitel 1. Lastenheft 10. Oktober 2013<br />
4. Benutzer führt alternative Geste für<br />
Greiferansteuerung aus, welche ebenfalls<br />
durch das System erkannt und bestätigt<br />
werden muss.<br />
5. Benutzer beendet Kalibrierung.<br />
Alternativer Ablauf<br />
1. Benutzer startet Kalibrierung.<br />
2. Kalibrierung schlägt fehl.<br />
3. System teilt dem Benutzer die fehlgeschlagene<br />
Kalibrierung mit.<br />
Reaktion des Systems<br />
1. Das System Kalibriert sich auf die Gesten<br />
des Nutzers.<br />
2. Das System teilt dem Benutzer mit, ob<br />
die Kalibrierung erfolgreich durchgeführt<br />
wurde.<br />
Vorbedingung<br />
1. System muss eingeschaltet werden.<br />
2. Lichtverhältnisse müssen sich im Bereich<br />
der für die Kamera gültigen Werte befinden.<br />
3. Der für die Ausführung der alternativen<br />
Geste verwendete Körperteil muss<br />
sich im Wahrnehmungsbereich der Kamera<br />
befinden.<br />
Nachbedingung<br />
Qualität<br />
1. Das System ist auf den Benutzer kalibriert<br />
und erkennt die definierten Gesten.<br />
1. Die Erfolgsrate bei der Kalibrierung des<br />
Systems muss bei mindestens 75 % liegen.<br />
52
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Tabelle 1.11: Anwendungsfallschablone - Kalibrierung für alternative<br />
Gestensteuerung<br />
1.2.4.6 Kalibrierung für Portraitaufnahme<br />
System<br />
<br />
Kalibrierung<br />
von Schreibgerät<br />
und Oberfläche<br />
Kalibrierung<br />
für Portraitaufnahme<br />
<br />
Benutzer<br />
Kalibrierung<br />
der Kamera<br />
Abbildung 1.15: Kalibrierung für Portraitaufnahme<br />
Die Kalibrierung für die Portraitaufnahme beinhaltet die Kalibrierung der<br />
Kamera sowie die Kalibrierung des verwendeten Schreibgerätes mit der<br />
entsprechenden Oberfläche.<br />
Name<br />
Akteure<br />
Standardablauf<br />
Alternativer Ablauf<br />
Kalibrierung für Portraitaufnahme<br />
Benutzer<br />
1. Benutzer startet Kalibrierung.<br />
1. Benutzer startet Kalibrierung.<br />
2. Kalibrierung schlägt fehl.<br />
3. System teilt dem Benutzer die fehlgeschlagene<br />
Kalibrierung mit.<br />
4. System bietet dem Benutzer die<br />
Möglichkeit die Kalibrierung neu zu<br />
starten.<br />
53
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Reaktion des Systems<br />
1. Das System führt eine Kalibrierung der<br />
Kamera durch.<br />
2. Das System führt eine Kalibrierung des<br />
Roboterarm zur Position vom Schreibgerät<br />
und Oberfläche durch.<br />
Vorbedingung<br />
1. System muss eingeschaltet werden.<br />
2. Lichtverhältnisse müssen sich im Bereich<br />
der für die Kamera gültigen Werte befinden.<br />
3. Der Roboterarm muss mit einem<br />
Schreibgerät ausgestattet sein.<br />
4. Es muss eine Oberfläche für die Ausführung<br />
der Skizze vor dem Roboterarm<br />
aufgestellt sein.<br />
Nachbedingung<br />
Qualität<br />
1. Das System ist für die Portraitaufnahme<br />
kalibriert.<br />
1. Die Erfolgsrate bei der Kalibrierung des<br />
Systems muss bei mindestens 75 % liegen.<br />
Tabelle 1.12: Anwendungsfallschablone - Kalibrierung für Portraitaufnahme<br />
1.2.4.7 Portrait aufnehmen<br />
System<br />
Portrait aufnehmen<br />
<br />
Kamera auslösen<br />
Benutzer<br />
Abbildung 1.16: Portrait aufnehmen<br />
54
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Damit der Benutzer ein Portrait von sich aufnehmen lassen kann, muss<br />
er dies durch eine definierte Aktion dem System mitteilen. Dieses Portrait<br />
wird dann weiter durch das System verarbeitet.<br />
Name<br />
Akteure<br />
Standardablauf<br />
Alternativer Ablauf<br />
Portrait aufnehmen<br />
Benutzer<br />
1. Benutzer führt Aktion zum Auslösen der<br />
Kamera aus.<br />
1. Benutzer führt Aktion zum Auslösen der<br />
Kamera aus.<br />
2. System reagiert nicht auf die Eingabe.<br />
3. System gibt dem Benutzer die Möglichkeit<br />
für einen Neustart.<br />
Reaktion des Systems<br />
1. System nimmt ein Bild mit der Kamera auf.<br />
2. System erzeugt ein Portrait auf Basis des<br />
Bildes.<br />
Vorbedingung 1. Benutzer sitzt in Position um Portrait<br />
aufzunehmen.<br />
Nachbedingung<br />
1. Portrait wurde aufgenommen.<br />
Qualität 1. Das Portrait muss von seiner Auflösung,<br />
Kontrast und Helligkeit ausreichend<br />
sein, damit das System daraus eine<br />
entsprechende Skizze erstellen kann.<br />
Tabelle 1.13: Anwendungsfallschablone - Portrait aufnehmen<br />
1.2.5 Funktionale Anforderungen<br />
Im Folgenden sind die Eigenschaften aufgelistet, welche das System besitzen<br />
soll bzw. muss:<br />
55
Kapitel 1. Lastenheft 10. Oktober 2013<br />
F 1 Das System muss sich vor dem Einsatz kalibrieren lassen.<br />
F 2 Das System muss sich innerhalb der Freiheitsgrade des Roboterarms<br />
bewegen lassen.<br />
F 3 Der Roboterarm muss durch die Steuerung des Benutzers in der Lage<br />
sein ein Objekt innerhalb des Bewegungsradius zu greifen und abzulegen,<br />
siehe Abb. 1.17).<br />
F 4 Das System muss einem Benutzer die Bewegung des Roboterarms<br />
ermöglichen.<br />
F 5 Das System muss das Öffnen der menschlichen Hand erkennen können,<br />
um bei geöffneter Hand den Greifer zu öffnen und bei geschlossener<br />
Hand den Greifer zu schließen.<br />
F 6 Das System muss Personen innerhalb des Sichtbereichs der Kamera<br />
erkennen.<br />
F 7 Der Roboterarm soll eine Skizze, siehe Abb. 1.7) einer Person auf<br />
einer dafür vorgesehenen Oberfläche malen können.<br />
F 8 Das System muss eine alternative Gestensteuerung des Roboterarms<br />
anhand von Kopf- oder Augenbewegung zulassen.<br />
F 9 Das System muss Informations-, Warn- und Fehlermeldungen ausgeben<br />
können.<br />
F 10 Das System muss durch den Benutzer neu gestartet werden können.<br />
Alternative Steuerung durch Kopfbewegungen<br />
F 1 Die Kopfbewegungen müssen erkannt und nachverfolgt werden, um<br />
anhand derer die Bewegungsrichtung in der x-Achse und y-Achse<br />
des Roboterarms zu steuern.<br />
F 2 Durch eine Geste, die vom System erkannt wird, muss in den z-<br />
Modus gewechselt werden können. Nun kann durch die Kopfbewegung<br />
die z-Position angepasst und der Greifer gesteuert werden.<br />
56
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Alternative Steuerung durch Eye-Tracking<br />
F 1 Die Augenbewegungen müssen nachverfolgt werden, um anhand derer<br />
die Bewegungsrichtung in der x-Achse und y-Achse des Roboterarms<br />
zu steuern.<br />
F 2 Durch ein Geste, die vom System erkannt wird, muss in den z-Modus<br />
gewechselt werden. Nun kann durch die Augenbewegung die z-Position<br />
angepasst und der Greifer gesteuert werden.<br />
F 3 Die Umsetzbarkeit einer alternativen Steuerung durch Eye-Tracking<br />
wird in einer Machbarkeitsstudie untersucht. Abhängig von dem Ergebnis<br />
der Machbarkeitsstudie, wird bei einem posetiven Ergenis ein<br />
Eye-Tracking Verfahren umgesetzt. Sollte die Machbarkeitsstudie ergeben,<br />
dass ein Eye-Tracking nicht umgesetzt werden kann, wird eine alternative<br />
Steuerung durch Kopfbewegungen 1.2.5 umgesetzt.<br />
1.2.6 Nicht funktionale Anforderungen<br />
Folgender Abschnitt definiert die Rahmenbedingungen der oben erwähnten<br />
Eigenschaften.<br />
• Benutzbarkeit<br />
NF 1.1 Die Plattform des Roboterarms muss an einer senkrechten<br />
stationäre Befestigung fixiert werden. Durch diese Befestigung<br />
ist der Roboterarm um 90 Grad, in die Waagerechte, gedreht.<br />
NF 1.2 Das System muss vor dem Einsatz für den jeweiligen Benutzer<br />
kalibriert werden.<br />
NF 1.3 Das System darf sich von einem zweiten Benutzerarm nicht<br />
in seiner Funktionalität beeinflussen lassen.<br />
NF 1.4 An den Gelenken des Benutzers müssen Punkte befestigt werden,<br />
damit dieser durch das System erkannt wird.<br />
NF 1.5 Zum Zeichnen der Skizze muss ein Schreibinstrument im Tool-<br />
Center-Point befestigt werden.<br />
NF 1.6 Das System muss eine zu skizzierende Person aufnehmen<br />
können, sofern sich diese nicht bewegt.<br />
NF 1.7 Um eine Skizze erstellen zu können muss der Roboterarm<br />
den Kontakt von Schreibinstrument und Oberfläche aufrecht<br />
erhalten.<br />
57
Kapitel 1. Lastenheft 10. Oktober 2013<br />
NF 1.8 Der Greifer des Roboterarms muss ein gegriffenes Objekt solange<br />
festhalten, bis der Benutzer das System auffordert das<br />
Objekt explizit abzulegen.<br />
• Zuverlässigkeit<br />
NF 2.1 Zwecks der Vermeidung von Selbstbeschädigung des Roboterarms,<br />
muss die Bewegungsfreiheit des Roboterarms auf einen<br />
Arbeitsbereich eingeschränkt werden.<br />
NF 2.2 Das System muss den Benutzer ab einer ausreichenden Beleuchtung<br />
erkennen.<br />
NF 2.3 Das System muss nach einem Absturz durch einen Neustart<br />
des Systems wieder in einen einsatzbereiten Zustand überführt<br />
werden können.<br />
NF 2.4 Das System muss auf eindeutige, d.h. in ihrer Form und Bewegung<br />
unterschiedliche, Gesten reagieren.<br />
NF 2.5 Das System muss weitere Arme oder Personen von dem Steuerarm<br />
bzw. der Steuerperson differenzieren können.<br />
NF 2.6 Das System muss die Bewegung des Benutzers mit einer maximalen<br />
Winkelabweichung von 10 Grad imitieren.<br />
• Effizienz<br />
NF 3.1 Das System muss Objekte mit einem Gewicht von maximal<br />
20 g, welche eine Mindestgröße von 5 mm × 5 mm × 5 mm und<br />
eine Maximalgröße von 40 mm × 40 mm × 40 mm haben, greifen<br />
können.<br />
NF 3.2 Die Latenz des Systems muss unterhalb von 500 ms liegen.<br />
NF 3.3 Die Bildverarbeitung und -vorverarbeitung muss, für die Anwendungsfälle<br />
1.2.3.2, 1.2.3.3 und 1.2.3.1, ausschließlich durch<br />
eine Implementierung in Hardware realisiert werden.<br />
NF 3.4 Die Berechnung der Bilder für die Skizze werden extern durch<br />
einen PC durchgeführt.<br />
NF 3.5 Die Erfolgsrate bei der Kalibrierung des Systems muss bei<br />
mindestens 75% liegen.<br />
NF 3.6 Das System muss den Roboterarm innerhalb von maximal<br />
fünf Sekunden initialisiert haben.<br />
• Änderbarkeit<br />
58
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Abbildung 1.17: Greifen eines Objekts, Anwendungsfall 1.2.3.2<br />
NF 4.1 Das System muss Systemupdates in Form von Änderungen<br />
der Bildverarbeitungskette zulassen. Somit ist es möglich das<br />
System, im Rahmen seiner technischen Möglichkeiten, auf<br />
ähnliche Anwendungsfälle anzupassen.<br />
NF 4.2 Durch die Verwendung von Schnittstellen muss es möglich<br />
sein die verschiedenen Hardwarekomponenten des Systems<br />
auszutauschen. Diese Schnittstellen müssen zwischen dem<br />
Roboterarm, der 3D-Kamera sowie der Steuerungslogik implementiert<br />
werden.<br />
NF 4.3 Der Greifer des Roboterarms muss ebenfalls austauschbar sein.<br />
Hierbei darf jedoch ein entsprechendes Gewicht von 100 g<br />
nicht überschritten werden. Soll dieser vom Roboterarm aktuiert<br />
werden, so muss dieser entsprechend mit dem Servo<br />
des Roboterarms verbunden werden.<br />
NF 4.4 Das System muss erlauben die Servos, durch alternative Motoren<br />
mit den selben Abmessungen, zu ersetzen. Hierzu muss<br />
jedoch auch die Regelungselektronik entsprechend angepasst<br />
werden.<br />
NF 4.5 Das System muss einen Austausch der Komponenten der Bildverarbeitungskette,<br />
welche für die Erkennung der Gesten verantwortlich<br />
sind, zulassen.<br />
• Übertragbarkeit<br />
NF 5.1 Durch Anpassungen der Algorithmen, zur Erkennung der<br />
59
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Gesten, lässt sich das System auf andere alternative Eingabeweisen<br />
übertragen, beispielsweise zur Erkennung von Schachfiguren<br />
statt eines Arms.<br />
NF 5.2 Der Roboterarm, die Steuerungselektronik und die 3D-Kamera<br />
sind durch einfache Kabelverbindungen miteinander verbunden,<br />
sodass diese leicht ausgetauscht werden können. Hierbei<br />
muss aber darauf geachtet werden, dass dieser mindestens<br />
die selben Anforderungen wie der im Original verwendete<br />
einhält.<br />
• Wartbarkeit<br />
NF 6.1 Struktur und Funktionalität des Quellcodes werden durch<br />
entsprechende Kommentare erläutert, sodass die Einarbeitung<br />
Dritter möglich ist.<br />
NF 6.2 Zur Wartbarkeit der Bildverarbeitungsketten werden für die<br />
Schritte der Bildverarbeitung und Vorverarbeitung einzelne<br />
Softwarebausteine geschrieben. Diese können dann einzeln<br />
verändert oder ausgetauscht werden.<br />
60
Kapitel 1. Lastenheft 10. Oktober 2013<br />
1.3 Risikoanalyse<br />
Da das Projekt in einem begrenzten Zeitraum realisiert werden muss, wird<br />
während der Planungsphase eine Risikoanalyse duchgeführt. In dieser Risikoanalyse<br />
werden bei der Projektdurchführung zu erwartende Probleme<br />
analysiert. Dabei werden speziell Probleme erfasst, welche zu einem Scheitern<br />
des Projekts führen können. Die ermittelten Probleme werden mit einer<br />
Wahrscheinlichkeit, einer Auswirkung und einer Risikobewertung versehen.<br />
Die Wahrscheinlichkeit bewertet, wie wahrscheinlich es ist, dass ein<br />
Problem auftritt. Die Auswirkung ist eine Skala, welche bewertet wie groß<br />
die Auswirkungen auf das gesamte Projekt sind. Das Risikobewertung erfolgt<br />
über die Risikoampel. Diese gibt ein Maß an, wie hoch das Risiko<br />
eingeschätz wird. Das Risiko wird dabei in Abhängigkeit von der Wahrscheinlichkeit<br />
und der Auswirkung abgeschätzt. Die Legende erläutert wie<br />
die Punkte im einzelnen notiert werden.<br />
Neben der Risikobewertung wird zusätzlich eine Gegenmaßnahme aufgeführt.<br />
Diese Gegenmaßnahme definiert, falls das entsprechende Problem<br />
aufgetreten ist, wie auf das Problem reagiert und welche Maßnahmen ergriffen<br />
werden müssen, um die Folgen zu minimieren. Als letztes wird das<br />
Restrisiko angegeben. Dieses definiert, wie hoch das Risiko eines Fehlschlagens<br />
der Gegenmaßnahme ist.<br />
1 Anzahl der für die Bildverarbeitungsketten<br />
verwendeten<br />
IP-Cores überschreitet das<br />
Maximum der auf dem FPGA<br />
vorhandenen Logikgatter.<br />
2 Disparitätskarte der 3D-<br />
Kamera ist nicht fein genug<br />
aufgelöst um Bewegungen des<br />
Benutzer korrekt zu erkennen.<br />
3 Die Genauigkeit des Roboterarms<br />
am Tool-Center-Point reicht<br />
nicht für eine qualitative<br />
Übertragung des digital<br />
vorverarbeiteten Bildes, in<br />
Form einer Skizze, auf eine<br />
Oberfläche.<br />
4 Das Verfahren für die alternative<br />
Gestensteuerung<br />
lässt sich aufgrund von<br />
nicht evaluierten vorhandenen<br />
Technologien, nicht<br />
realisieren.<br />
Nr. Risikobeschreibung Wahrsch. Auswirkung<br />
Risiko-<br />
Ampel<br />
Maßname<br />
3 3 6 Verwendung eines größeren<br />
FPGAs oder eines zweiten FP-<br />
GAs.<br />
2 4 6 Stärkere Bewegungen des Benutzers,<br />
Interpolation von Bewegungsabläufen.<br />
3 4 7 Zusätzliche Regelung und /<br />
oder mechanische Änderungen<br />
am Roboter. Präzisere Servomotoren<br />
kaufen. Roboterarm<br />
kürzen.<br />
2 4 6 Auswahl einer anderen Form<br />
der alternativen Gestensteuerung.<br />
Anbringung einer<br />
fixen Kamera am Benutzer.<br />
Restrisiko<br />
2<br />
4<br />
3<br />
4<br />
61
Kapitel 1. Lastenheft 10. Oktober 2013<br />
5 Kalibrierung des entsprechenden<br />
Anwendungsfalles<br />
schlägt zur mehr als 25 %<br />
fehl. Dies beinhaltet die Kalibrierung<br />
der Kamera und der<br />
entsprechenden Gesten des<br />
Anwendungsfalles.<br />
6 Gemessene Latenz liegt über<br />
500 Millisekunden. Diese<br />
beziehen sich auf die Zeit<br />
zwischen der initialen Bewegen<br />
des Benutzers und der<br />
Reaktion des Roboters.<br />
7 Die Initialisierung des Systems<br />
benötigt mehr als die<br />
in den nichtfunktionalen<br />
Anforderungen festgelegten<br />
5 Sekunden.<br />
8 Die gemessene Winkelabweichung<br />
zwischen dem<br />
Arm des Benutzers und des<br />
Roboterarms ist größer als<br />
die in den nichtfunktionalen<br />
Anforderungen festgelegten<br />
10 Grad.<br />
9 Qualität der Skizze des Portraits<br />
entspricht nicht den<br />
Mindestanforderungen. Diese<br />
können einer Beispielgrafik<br />
entnommen werden, siehe<br />
Abb. 1.7.<br />
10 Greifer kann spezifizierte Objekte,<br />
siehe Abschnitt 1.2.6,<br />
nicht greifen.<br />
3 4 7 Stabilisierung der Lichtverhältnisse,<br />
Änderung der<br />
Kalibrierungsgrundlage.<br />
3 3 6 Überarbeitung entsprechender<br />
Algorithmen, Anpassung<br />
der Regelung.<br />
2 4 6 Verwendung stärkerer Servomotoren<br />
oder Änderung des<br />
Initialisierungsvorgangs<br />
2 4 6 Verwendung genauerer Servomotoren,<br />
Verbesserung der<br />
Regelung und Anpassung der<br />
Algorithmen. Änderung des<br />
Verhältnissen zwischen Hintergrund<br />
und Extremitäten<br />
zur Besseren Extraktion von<br />
Vorder- und Hintergrund.<br />
3 4 7 Siehe Maßnahme Nr. 8. 3<br />
3 3 6 Änderung des Greifers, Änderung<br />
der Greiftechnik, zum<br />
Beispiel Formschluss 8 .<br />
3<br />
3<br />
2<br />
3<br />
3<br />
Tabelle 1.14: Risikoanalyse<br />
Skalierung Eintrittswahrscheinlichkeit<br />
1 extrem unwahrscheinlich ˆ= < 15%<br />
2 sehr unwahrscheinlich ˆ= < 30%<br />
3 unwahrscheinlich ˆ= < 45%<br />
4 wahrscheinlich ˆ= < 60%<br />
5 sehr wahrscheinlich ˆ= < 75%<br />
6 extrem wahrscheinlich ˆ= < 100%<br />
Skalierung Schadenswirkung Skalierung Risiko<br />
1 unbedeutend<br />
4 vernachlässigbar<br />
2 gering<br />
6 gering<br />
3 erheblich<br />
7 mittel<br />
4 katastrophal<br />
>8 hoch<br />
Tabelle 1.16: WirkungTabelle 1.17: Risiko<br />
Tabelle 1.15: Eintrittswahrscheinlichkeit<br />
8 Ein Objekt wird durch umschließendes Greifen mit verhältnismäßig wenig Kraft gefasst<br />
62
Kapitel 1. Lastenheft 10. Oktober 2013<br />
1.4 Entwicklungszyklus<br />
Die Entwicklung des Systems wird mittels Konzepten aus der Agilen Softwareentwicklung<br />
durchgeführt. Dies bedeutet insbesondere, dass das System<br />
in kleinere Komponenten geteilt wird, welche in ca. 2 Wochen langen<br />
Zeiträumen, so genannten Sprints, bearbeitet werden.<br />
Abgesehen von dem Sprint Konzept werden die folgenden Konzepte aus<br />
der Agilen Softwareentwicklung von uns als Entwicklungsbasis verwendet:<br />
• Funktionierende Software ist wichtiger als ausführliche Dokumentation.<br />
• Das Eingehen auf Änderungen ist wichtiger als das Verfolgen eines<br />
Plans.<br />
• Programmierung erfolgt durch jeweils zwei Programmierer an einem<br />
PC.<br />
• Vorhandene Ressourcen werden möglichst mehrfach verwendet.<br />
• Jede Programmiergruppe kann am gesamten Code arbeiten.<br />
• Die Entwicklung erfolgt Kundennah.<br />
• Der Quellcode wird möglichst kurz und einfach gehalten (KISS Prinzip).<br />
• Es erfolgt ausschließlich zweckmäßige Entwicklung.<br />
1.5 Systemarchitektur<br />
Das Hardwaresystem wird aus 3 interagierenden Komponenten bestehen,<br />
siehe Abb. 1.18. Zunächst werden alle Eingaben des Benutzers von der<br />
Kamera aufgezeichnet. Diese gibt die Informationen als Datenstrom an<br />
ein geschlossenes System weiter, welches die Daten verarbeitet und einen<br />
Roboterarm ansteuert. Dieser interagiert dann gegebenenfalls mit Objekten.<br />
Die nachfolgende Grafik veranschaulicht den Ablauf.<br />
63
Kapitel 1. Lastenheft 10. Oktober 2013<br />
Kamera<br />
geschlossenes System<br />
Arm<br />
Bildstream<br />
weiterreichen<br />
XILINX<br />
FPGA<br />
steuern<br />
interagieren<br />
bewegen<br />
Benutzer<br />
Objekt<br />
Abbildung 1.18: Systemarchitektur<br />
1.6 Lieferumfang<br />
Der Kunde erhält ein abgeschlossenes System, welches er über Mensch-<br />
Maschine Interaktionen steuern kann. Das System besteht aus einem Roboterarm,<br />
zwei digitalen Kameras und einer Schaltung, welche die Logik<br />
für die Bildverarbeitung und die Roboteransteuerung enthält. Die Logik<br />
wird in Form von Quelltext ausgeliefert.<br />
64
2 Implementation<br />
Dieses Kapitel beschreibt die Entwicklungs- und Implementierungsphase<br />
sowie die Machbarkeitsstudien einiger Ansätze für die im vorherigen Kapitel<br />
definierten Anwendungsfälle. Die Entwicklung erfolgt in Sprints 1 .<br />
Das Kapitel besteht aus den Sprintdokumentationen, die wie folgt aufgebaut<br />
sind:<br />
Beschreibung der<br />
Ziele sowie Teilziele<br />
des Sprints<br />
Sprintplanung mit<br />
Teilaufgaben,<br />
Zuständigkeiten und<br />
Fristen<br />
Dokumentation<br />
der Ergebnisse<br />
Fazit<br />
und<br />
Ausblick<br />
Abbildung 2.1: Struktur eines Sprints<br />
Am Anfang jedes Sprints folgt eine Einleitung, welche die zu erreichenden<br />
Zeile sowie Teilziele des Sprints vorstellt. Danach wird in jedem Sprint eine<br />
Planung der Tätigkeiten und Entwicklungsschritte sowie die Personenzuteilung<br />
mit den festgelegten Fristen als Deadlines ausführlich beschrieben.<br />
Die genaue Festlegung der Deadlines wird jedoch erst ab Sprint 3 (2.4)<br />
vorgenommen, da im Sprint 2 (2.2) mehrere zeitlich unvorhersehbare Tätigkeiten<br />
durchgeführt werden müssen. Diese werden im folgenden Abschnitt<br />
beschrieben. Nach der festgelegten Sprintplanung werden die Ergebnisse<br />
der Tätigkeiten dokumentiert und Evaluiert. Am Ende jedes Sprints folgt<br />
ein zusammenfassendes Fazit, das den Erfolg der gesetzten Ziele evaluiert<br />
und einen Ausblick der nachfolgenden Ziele eröffnet. In Abbildung 2.1 ist<br />
die Struktur eines Sprints veranschaulicht.<br />
Das vorherige Kapitel ist im Sinn dieser Struktur als der erste Sprint anzusehen.<br />
Dieses Kapitel fängt daher mit dem Sprint 2 an.<br />
1 http://www.viskonz.de/AgileSoftwareEntwicklung.pdf<br />
65
Kapitel 2. Implementation 10. Oktober 2013<br />
2.1 Sprintplanung Sprint 2<br />
Der Sprint 2 setzt den Schwerpunkt auf das Schaffen der grundlegenden<br />
Steuerungseinheiten für die gegebene Systemarchitektur (siehe 1.18). Hier<br />
wird eine Steuerung des Kameramoduls entwickelt und an den FPGA<br />
angebunden. Die Steuerung des Roboterarms wird entwickelt sowie die<br />
Schnittstellen für die Ansteuerung der einzelnen Servos und der Kinematik<br />
zur Verfügung gestellt. Außerdem wird ein Bildverarbeitungsmodul<br />
für die Objektverfolgung entwickelt und anschließend mit der fertigen<br />
Robotersteuerung zusammengeführt. Zusätzlich wird für den Anwendungsfall<br />
alternative Gestensteuerung die Machbarkeitsstudie für das Eye-<br />
Tracking durchgeführt. Dies geschieht, um über die Machbarkeit des Eye-<br />
Tracking mit den vorhandenen Mitteln eine Aussagen treffen zu können.<br />
Das Ergebnis dieser Studie muss der Entscheidung beitragen, ob die alternative<br />
Gestensteuerung mit Hilfe der Augenverfolgung oder mit der<br />
Erkennung von Kopfbewegungen realisiert wird.<br />
Alle genannten Aufgaben werden als Ergebnis Schnittstellen für die OFFIS-<br />
Automation-Toolbox zur Verfügung stellen. In diesem Sprint werden keine<br />
festen Deadlines gesetzt, sondern Zeiteinschätzungen für die jeweiligen Arbeitspakete<br />
vorgenommen. Zum Überblick des Arbeitsstandes wird vom<br />
Projektmanager ein Ganttdiagramm geführt, das am Ende des Sprints zu<br />
finden ist. Dieses wird der Gruppe helfen den Fortschritt jedes Arbeitspakets<br />
im Auge zu halten sowie bei den eventuell entstehenden kritischen Pfaden<br />
rechtzeitig zu reagieren.<br />
2.1.1 Machbarkeitsstudie Eye-Tracking<br />
Durch Einsatz eines PCs mit installierter OFFIS IDE sowie einer Webcam(2D)<br />
und einer Infrarotlichtquelle soll die Umsetzung einer automatisierten<br />
Augenverfolgung in Software implementiert werden. Das Arbeitspaket<br />
beinhaltet die Schritte der Erkennung, Verfolgung sowie Erfassung der<br />
Blickrichtung. Als Ergebnis des Sprints soll ein Bericht mit Evaluation und<br />
Fazit über die Machbarbeit des Eye-Trackings im Rahmen der PG RoboArm<br />
für die alternative Gestensteuerung vorliegen. Ausserdem existiert eine<br />
Software Implementierung des Verfahrens in der OFFIS IDE.<br />
Im ersten Schritt dieses Arbeitspakets soll die Erkennung der benötigten<br />
Augen- und Gesichtsmerkmale anhand eines von der Webcam aufgenommenen<br />
Bildes umgesetzt werden. Zu diesem Zweck muss eine Bildverarbeitungskette<br />
unter Verwendung der OFFIS IDE erstellt werden. Hierfür sind drei<br />
Wochen Zeit eingeplant.<br />
66
Kapitel 2. Implementation 10. Oktober 2013<br />
Im nächsten Schritt des Arbeitspakets wird die in 2.1.1 erstellte Verarbeitungskette<br />
für die Verwendung mit einem Videostream erweitert. Außerdem<br />
wird die Bewegungsverfolgung der erkannten Augen implementiert.<br />
Für diesen Schritt stehen zwei Wochen Zeit zur Verfügung.<br />
Im letzten Schritt soll anhand der gewonnenen Daten die Blickrichtung<br />
einer Testperson automatisiert berechnet und visualisiert werden. Hierfür<br />
stehen zwei Wochen zur Verfügung.<br />
Personen<br />
• Tobias Schüürhuis<br />
• Matthias Stasch<br />
67
Kapitel 2. Implementation 10. Oktober 2013<br />
2.1.2 Anbindung des Kameramoduls<br />
Das von Digilent stammende Kameramodul VmodCAM, welches von der<br />
Projektgruppe verwendet wird, benötigt eine spezielle Startsequenz für<br />
beide Kameras, welche von uns mit einem IP-Core implementiert wird.<br />
Sind die beiden Kameras initialisiert, müssen die Mikrocontroller noch<br />
zusätzlich über das I2C Protokoll aktiviert und konfiguriert werden. Diese<br />
Kommunikation wird von uns mittels eines I2C-Cores, welcher Teil der Xilinx<br />
Suite ist durchgeführt. Zur Vermittlung zwischen den beiden IP-Cores<br />
und zur Steuerung wird von uns ein Hardware Abstraction Layer (HAL)<br />
in C++ entwickelt, welcher auf dem MicroBlaze Core läuft. Diese Arbeiten<br />
sollen in den ersten 2 Wochen abgeschlossen sein.<br />
Zur weiteren Analyse am PC wird der bereitgestellte USB IP-Core und<br />
dessen HAL so angepasst, dass dieser Bildinformationen von dem Kamera<br />
Modul an den PC vermitteln kann. Für diese Aufgabe sind weitere 2,5<br />
Wochen vorgesehen.<br />
Auf dem PC wird, falls nötig, das Plugin der Offis Automation Toolbox<br />
angepasst, damit dieses die Bilder anzeigen kann. Um die gesamte Integration<br />
aller von uns bearbeiteten Komponenten zu gewährleisten sind weitere<br />
2,5 Wochen Arbeitszeit eingeplant.<br />
Ein Informationsfluss ist in folgender Grafik dargestellt, wobei die gelb<br />
markierten Elemente von uns erstellt oder bearbeitet werden müssen.<br />
Personen<br />
• Sebastian Reichel<br />
• Markus Müller<br />
68
Kapitel 2. Implementation 10. Oktober 2013<br />
VmodCam<br />
Boot-Core<br />
I²C-Core<br />
Data-Core<br />
HAL (in C++)<br />
FPGA<br />
USB Handler<br />
USBCam-Core<br />
USB<br />
Treiber<br />
PC<br />
HAL<br />
Offis Toolbox<br />
69
Kapitel 2. Implementation 10. Oktober 2013<br />
2.1.3 Roboter-Arm<br />
In der Automationsumgebung muss für jedes Gelenk des Roboters ein<br />
Winkel angegeben werden. Dabei wird von einem PC mit dem FPGA über<br />
einen Hardwareabstractionlayer (HAL) via USB kommuniziert. Die Demonstration<br />
der Roboteransteuerung erfolgt im Offis-Automationstool, indem<br />
für die Skriptsprache Python eine C++ Schnittstelle (HAL) zur Ansteuerung<br />
des Roboterarms bereitgestellt wird. Die Roboteransteuerung wird durch<br />
die Umsetzung von Vor- und Rückwärtskinematik realisiert.<br />
In einem ersten Arbeitsschritt soll die<br />
Basis geschaffen werden, um eine Kinematik<br />
welche den Roboterarm steuert auf<br />
dem PC in Python verwenden zu können.<br />
Dazu muss ein auf USB aufbauendes<br />
Protokoll entwickelt werden, welches<br />
das Kommunikationsformat zwischen<br />
PPM-IP-Core (FPGA) und PC definiert. Zu<br />
diesem Zweck soll ein bereits existenter<br />
USB IP-Core sowie ein HAL auf dem FP-<br />
GA eingesetzt werden. Der HAL muss eine<br />
Kalibrierung des Roboterarms erlauben.<br />
Es muss ein zweiter HAL geschrieben<br />
werden, der es ermöglicht die unten<br />
beschriebenen Kinematiken in Python zu<br />
programmieren und aus dieser Umgebung<br />
C++ Funktionen aufzurufen. Die zu erstelleneden<br />
Module sind in der nebenstehenden<br />
Abbildung 2.34 rot makiert, wobei<br />
die Kinematik Aufgabe nachfolgender Arbeitspakete<br />
ist. Es sind zwei Wochen hierzu<br />
geplant.<br />
Roboterarm<br />
IP − Core(PPM)<br />
HAL(C + +)<br />
USB − Handler(C + +)<br />
IP − Core(USB)<br />
Hardware<br />
Treiber<br />
HAL(C + +)<br />
Kinematik(Python)<br />
Abbildung 2.2: Steuerungsschichten<br />
FPGA<br />
PC<br />
Ziel des nächsten Arbeitsschrittes ist eine Realisierung der Vorwärtskinematik<br />
in Python. Die Koordinaten eines Endeffektors müssen abhängig von<br />
den Winkeln der Gelenke berechnet werden. Dabei werden die Winkel auf<br />
die Koordinaten abgebildet. Die Vorwärtskinematik muss anhand von selbst<br />
definierten Testfällen getestet werden. Auch hier werden zwei Wochen<br />
veranschlagt.<br />
70
Kapitel 2. Implementation 10. Oktober 2013<br />
Im Weiteren muss eine Rückwärtskinematik in Python umgesetzt werden.<br />
Die Koordinaten der Gelenke des Roboterarms müssen dabei in Winkel<br />
umgerechnet werden. Die von der Kinematik berechneten Werte müssen<br />
bei dem Roboterarm von dem PC (via USB) über den FPGA ankommen.<br />
Hierzu sind vier Wochen eingeplant.<br />
Personen<br />
• Peter Gewald<br />
• Vitaliy Beguchiy<br />
71
Kapitel 2. Implementation 10. Oktober 2013<br />
2.1.4 Objektverfolgung<br />
Das Ziel des Arbeitspaketes Objekt Tracking ist es einen Arm zu erkennen.<br />
Dabei sollen am Arm die Winkel der einzelnen Gelenke berechnet<br />
werden. Der zu erkennende Arm befindet sich dabei vor einem einfachen<br />
Hintergrund, um einen guten Kontrast zwischen Vorder- und Hintergrund<br />
zu erreichen. Zur Unterscheidung der einzelnen Gelenke des Arms dürfen<br />
Markierungen verwendet werden. Die Erkennung des Arms soll am Computer<br />
mit Hilfe der AMiR Toolbox durchgeführt werden. Zur Aufnahme<br />
der Szenerie wird eine Webcam verwendet. Die Erkennung der Winkel des<br />
Arms erfolgt dabei zweidimensional (Breite und Höhe). Ein erstes Teilziel<br />
ist es, eine Hand zu erkennen und eine entsprechende Bewegung dieser<br />
nachzuvollziehen. Hierbei wird eine Trajektorie der Hand erschaffen. Diese<br />
kann für eine Erkennung von Gesten verwendet werden. Die Winkel des<br />
Arms werden bestimmt, um diese später an den Roboterarm zu senden.<br />
Zunächst wird die Webcam mit der AMiR Toolbox verbunden. Danach<br />
wird das erhaltene Bild mit Hilfe entsprechender Filter derart bearbeitet,<br />
dass die Positionen der Hand innerhalb mehrerer Bilder erkannt werden.<br />
Aus den Unterschieden dieser verschiedenen Positionen wird dann der<br />
Bewegungsvektor der Hand berechnet. Hierfür stehen zwei Wochen zur<br />
Verfügung.<br />
Die entwickelten Algorithmen zur Erkennung der Hand werden derart verfeinert,<br />
dass ein Arm erkannt wird. Die Gelenkpositionen des erkannten<br />
Arms sollen dann in entsprechende Winkel umgerechnet werden. Es sind<br />
drei Wochen dazu eingeplant.<br />
Personen<br />
• Patrick Elfert<br />
• Fabian Diefenbach<br />
72
Kapitel 2. Implementation 10. Oktober 2013<br />
73
Kapitel 2. Implementation 10. Oktober 2013<br />
2.2 Sprint 2<br />
Im Folgenden werden die Ergebnisse der Planung sowie die Dokumentation<br />
der Umsetzung der einzelnen Arbeitspakete ausführlich beschrieben.<br />
2.2.1 Machbarkeitsstudie Eye-Tracking<br />
In den globalen Anwendungsfällen in Abschnitt 1.2.3 des Lastenhefts, wird<br />
in Abschnitt 1.2.3.3 der Anwendungsfall Roboter steuern durch alternative<br />
Gesten beschrieben. Dieser Anwendungsfall beschreibt eine alternative<br />
Eingabemethode um z. B. behinderten Menschen die Verwendung des<br />
Roboterarms zu ermöglichen. Es wurden zwei mögliche alternative Eingabemethoden<br />
vorgeschlagen. Zum einen die Steuerung des Roboters durch Bewegungen<br />
des Kopfes und zum anderen die Steuerung durch Bewegungen<br />
der Augen. Dieses Arbeitspaket beschäftigt sich mit der letzteren Methode<br />
der alternativen Eingaben, im Folgenden als Eye-Tracking bezeichnet. Bevor<br />
eine alternative Eingabe auf dem FPGA implementiert wird, soll zunächst<br />
eine Machbarkeitsstudie über die Umsetzbarkeit des Eye-Tracking mit den<br />
uns zur Verfügung stehenden Mitteln durchgeführt werden.<br />
Nach einer Einleitung in die Thematik des Eye-Tracking werden in Abschnitt<br />
2.2.1.1 einige aktuell existierende Ansätze vorgestellt. Dabei wird<br />
auch auf FPGA-basierte Ansätze eingegangen, gefolgt von einer konkreten<br />
Vorstellung der Aufgabenstellung.<br />
Weiter erfolgt in Abschnitt 2.2.1.2 die Beschreibung der zur Studiendurchführung<br />
verwendeten Hard- und Softwarekomponenten. Anschließend werden<br />
in Abschnitt 2.2.1.3 die ermittelten Systemparameter aufgeführt.<br />
Darauf aufbauend werden im Abschnitt 2.2.1.4 die von uns verfolgten Ansätze<br />
und deren Implementierungen erläutert. Abschnitt 2.2.1.5 enthält die<br />
Daten der Messungen, um eine Vergleichbarkeit der Ansätze zu gewährleisten.<br />
Daraufhin wird in 2.2.1.6 auf die Probleme beim Entwurf sowie auf<br />
Schwachstellen der Ansätze, welche sich im Laufe der Studie herausgestellt<br />
haben, eingegangen. Abschließend wird in Abschnitt 2.2.1.7 eine Evaluation<br />
anhand der Ergebnisse der implementierten Ansätze durchgeführt<br />
und in Abschnitt 2.2.1.8 ein abschließendes Fazit gegeben. Dabei wird<br />
auch die Umsetzbarkeit der Ansätze auf einem FPGA betrachtetet und eine<br />
definitive Aussage über die Machbarkeit des Eye-Tracking im Rahmen der<br />
Projektgruppe getroffen.<br />
74
Kapitel 2. Implementation 10. Oktober 2013<br />
2.2.1.1 Einleitung<br />
In der Einleitung erfolgt eine kurze Einführung in die Grundlagen des Eye-<br />
Tracking. Daraufhin werden im Unterabschnitt State of the Art einige Systeme<br />
vorgestellt, welche das Prinzip des Eye-Tracking in unterschiedlicher<br />
Form anwenden. Da die Umsetzung des Systems dieser Projektgruppe<br />
auf Basis eines FPGAs erfolgt, muss auch auf die spezifische Realisierung<br />
geachtet werden. Anschließend wird die Aufgabenstellung vorgestellt.<br />
Grundlagen Eye-Tracking<br />
Das Thema Eye-Tracking behandelt im Wesentlichen<br />
die Registrierung einer Blickbewegung bzw. eines Blickverlaufs einer Person<br />
während der Betrachtung eines Objekts. (z. B. ein Bild)<br />
Abbildung 2.3 zeigt die möglichen Bewegungsrichtungen des Auges 2 . Das<br />
Auge selbst ist in der Lage Horizontal- und Vertikalbewegungen durchzuführen<br />
und verfügt weiterhin über eine Drehachse.<br />
Abbildung 2.3: Bewegungsrichtungen des Auges<br />
Dabei kann zwischen zwei Arten von Blickbewegungen unterschieden werden,<br />
der Fixation und der Sakkade.<br />
Bei der Fixation wird ein bestimmter Punkt im Raum mit den Augen<br />
fokussiert. Dieser Vorgang enthält nie eine absolute Ruheposition sondern<br />
wird immer durch leichte Zitterbewegungen begleitet. Eine Sakkade beschreibt<br />
den Sprung von einer Fixation zur nächsten. Sakkaden können dabei nicht<br />
bewusst kontrolliert werden. Im Durchschnitt führt das menschliche Auge<br />
2-3 Sakkaden pro Sekunde durch [1]. Ein Blickverlauf setzt sich somit<br />
aus einer zeitlich aneinandergereihten Folge von Fixationen und Sakkaden<br />
zusammen. Diese Blickverläufe werden beim Eye-Tracking mit unterschiedlichen<br />
technischen Hilfsmitteln aufgezeichnet.<br />
2 http://de.wikipedia.org/wiki/Augenbewegung, letzter Zugriff: 22.02.2013<br />
75
Kapitel 2. Implementation 10. Oktober 2013<br />
Dabei kann zwischen zwei Hauptmethoden von Eye-Tracking-Systemen<br />
unterschieden werden. Zum einen den sogenannten Überkopfsystemen (head<br />
mounted), welche am Kopf einer Person befestigt werden und zum Anderen<br />
den ferngesteuerten Systemen (remote), bei welchen eine Person nicht direkt<br />
mit der Kamera eines Eye-Tracking-Systems verbunden ist.<br />
Oft werden in Zusammenarbeit mit Eye-Tracking-Systemen Infrarotlicht-<br />
Quellen in Verbindung mit entsprechenden Kameras genutzt, um ein zur<br />
Weiterverarbeitung taugliches Bild zu erhalten.<br />
Anwendung findet das Eye-Tracking in unterschiedlichsten Gebieten wie<br />
der Marktforschung, der Psychologie oder auch der Medizin 3 .<br />
State of the Art<br />
In diesem Unterabschnitt erfolgt eine kurze Beschreibung<br />
einiger Eye-Tracking Umsetzungen. Dabei werden jedoch nur Systeme<br />
mit Hardware- und Softwarevoraussetzungen vorgestellt, die mit den<br />
in dieser Machbarkeitstudie verwendeten Komponenten weitestgehend übereinstimmen.<br />
Damit werden z. B. alle Überkopfsysteme ausgeschlossen und<br />
die Betrachtung auf ferngesteuerte Systeme beschränkt.<br />
Zur Bildverarbeitung nutzen viele Softwarebasierte Ansätze die Bibliothek<br />
OpenCV 4 . Einige Beispiele für Webcam basierte Low-Cost Eye-Tracking<br />
Lösungen werden im Folgenden aufgeführt.<br />
Ein erstes Beispiel ist das in Abbildung 2.4 dargestellte TrackEye 5 Projekt,<br />
welches auf die OpenCV Bibliothek zurückgreift und die Kopf- und Augenerkennung<br />
mit Hilfe eines CAMSHIFT Algorithmus [10] sowie Template<br />
Matching umsetzt.<br />
Abbildung 2.4: TrackEye Projekt<br />
3 http://blickinteraktion.pgraesser.de/, letzter Zugriff: 22.02.2013<br />
4 http://opencv.willowgarage.com/wiki/, letzter Zugriff: 22.02.2013<br />
5 http://www.oocities.org/zafersavas/, letzter Zugriff: 22.02.2013<br />
76
Kapitel 2. Implementation 10. Oktober 2013<br />
Weitere Projekte sind die Software opengazer 6 oder auch der von der ITU 7<br />
vorgestellte GazeTracker 8 .<br />
In den meisten Fällen sind Eye-Tracking Projekte ohne die Verwendung<br />
zusätzlicher Hardware jedoch als verwaiste Projekte aufzufinden und kaum<br />
Gegenstand aktueller Studien.<br />
FPGA spezische Realisierung<br />
Da das endgültige System der Projektgruppe<br />
auf Basis eines FPGAs arbeiten soll, müssen einige Eigenschaften<br />
von FPGAs in Betracht gezogen werden. Für Informationen zur FPGA eigenen<br />
Architektur wird an dieser Stelle auf [15] verwiesen.<br />
Dies bedeutet in erster Linie, die Umsetzbarkeit von einem in Software<br />
verwendeten Algorithmus auf einen in Hardware lauffähigen Algorithmus<br />
in die Studie mit einzubeziehen. Daher können bereits einige Algorithmen<br />
der OpenCV Bibliothek ausgeschlossen werden, da diese nur mit hohem<br />
Aufwand bzw. in begrenztem Maße in Hardware umgesetzt werden können.<br />
Algorithmen mit einem hohen Bedarf an Speicherplatz sowie auch Algorithmen<br />
mit der Anwendung von Random Access zugriffen sollten daher<br />
gemieden werden, da die Verarbeitung auf einem FPGA möglichst streambasiert<br />
ablaufen soll. Rechenaufwendig sind daher auch alle Algorithmen,<br />
die ein gesamtes bzw. einen großen Teil eines Bildes für bestimmte Operationen<br />
benötigen. Operationen wie das Template Matching sind daher<br />
FPGA technisch durchaus umsetzbar, jedoch stark abhängig von der<br />
Größe eines Templates und der zur Verfügung stehenden Rechenleistung<br />
des FPGAs. Am vorteilhaftesten für die Umsetzung mittels FPGAs sind die<br />
Gruppe der Punktoperationen, da hier direkt auf einem Stream gearbeitet<br />
werden kann. Dies gilt auch für Nachbarschaftsoperationen, wobei hier auf<br />
die Größe der Nachbarschaft geachtet werden muss. Weitere Operationen<br />
wie der Median Filter, der Threshold oder morphologische Operationen<br />
sind weitestgehend problemlos in Hardware implementierbar.<br />
Die Probleme der Verwendung von Bildverarbeitungsalgorithmen auf einem<br />
PC wie eventuellen Timing Einschränkungen oder auch einer begrenzten<br />
Bandbreite durch unterschiedliche Schnittstellen fallen bei Nutzung eines<br />
FPGAs deutlich weniger ins Gewicht.<br />
In [14] wird eine FPGA basierte Umsetzung des Template Matching auf<br />
Basis von Distanztransformationen 9 vorgestellt.<br />
6 http://www.inference.phy.cam.ac.uk/opengazer/, letzter Zugriff: 22.02.2013<br />
7 IT University of Copenhagen, Denmark<br />
8 http://www.gazegroup.org/downloads/23-gazetracker, letzter Zugriff: 22.02.2013<br />
9 Jedem Pixel eines Segments wird sein kleinster Abstand zum Segmentrand zugewiesen<br />
77
Kapitel 2. Implementation 10. Oktober 2013<br />
An dieser Stelle soll zur genaueren Definition der Gruppe von FPGA umsetzbaren<br />
Bildverarbeitungsalgorithmen auf [3] sowie die erarbeiteten Reviewpaper<br />
[9] und [16] verwiesen werden.<br />
Aufgabenstellung<br />
Das Arbeitspaket wird in drei Teilziele aufgeteilt. Erstes<br />
Teilziel ist die Erkennung der Augen auf einem mit Hilfe der Webcam<br />
aufgenommenen Bild. Im zweiten Schritt soll die Verfolgung der Augen<br />
auf einem Videostream realisiert werden, um daraufhin im letzten Teilziel<br />
eine Blickrichtung bestimmen und visualisieren zu können.<br />
2.2.1.2 Systemdenition<br />
In diesem Abschnitt erfolgt die Beschreibung der verwendeten Hardware<br />
sowie der eingesetzten Software Tools.<br />
Hardware<br />
Zu Anfang der Studie wurde bereits festgestellt, dass eine Infrarotlicht-Quelle<br />
zur besseren Erkennung der Augen eingesetzt werden<br />
sollte. Da die zur Verfügung gestellte Webcam Logitech C270 jedoch mit<br />
einen Infrarot-Sperrfilter ausgestattet ist, wurde stattdessen das in Abbildung<br />
2.5 gezeigte Kameramodell DMK21F04 der Fa. The Imaging Source<br />
verwendet. Die Bildaufnahme erfolgt dabei Monochrom mit einer Auflösung<br />
von 640x480 Pixeln bei einer maximalen Bildwiederholrate von 30fps.<br />
Abbildung 2.5: Kamera DMK21F04<br />
Des Weiteren wurden zwei Infrarot-Scheinwerfer der Fa. Kemo Electronic<br />
sowie ein PC eingesetzt.<br />
Software<br />
Zur Entwicklung der Bildverarbeitungskette so wie einer zugehörigen<br />
Automatisierung wurde die OFFIS Automation Toolbox Software<br />
eingesetzt, die eine komfortables Testen und Entwickeln von Filterketten<br />
78
Kapitel 2. Implementation 10. Oktober 2013<br />
erlaubt. Die Erstellung einer Automatisierung wird unterstützt, indem durch<br />
die Skriptsprache Python auf Filterparameter zugegriffen und diese separat<br />
verarbeitet oder auch gesetzt werden können.<br />
Zur Konfiguration der Kamera wurde die mitgelieferte Software IC Capture<br />
2.2 10 genutzt.<br />
Aufbau<br />
Im Laufe der Studie wurden zwei Aufbauten zur Bildaquise genutzt.<br />
(a) mit einem Infrarot-<br />
Scheinwerfer<br />
(b) mit zwei Infrarot-<br />
Scheinwerfern<br />
Abbildung 2.6: Aufbauten<br />
Der erste Aufbau gestaltet sich wie in Abbildung 2.70(a) und basiert auf<br />
einem Infrarot-Scheinwerfer. Dabei wurde die Kamera an einem, vom Monitor<br />
unabhängigen, beweglichen Standfuß befestigt. Der Infrarot-Scheinwerfer<br />
wurde über die Kamera und in Richtung der Blickachse dieser montiert.<br />
Der zweite Aufbau gestaltet sich wie in Abbildung 2.70(b) und nutzt zwei<br />
Infrarot-Scheinwerfer. Dabei wurden die Kamera, sowie beide Infrarot-<br />
Quellen direkt am Monitor befestigt. Die Scheinwerfer befinden sich hier<br />
links und rechts neben der Kamera, liegen ebenfalls auf der gleichen<br />
Blickachse.<br />
2.2.1.3 Systemparameter<br />
Da ein kamerabasiertes System von einer Vielzahl an Umgebungsvariablen<br />
abhängig ist, werden in diesem Abschnitt die wichtigsten Systemparameter<br />
aufgeführt und die jeweiligen Einflüsse beschrieben.<br />
10 http://www.theimagingsource.com/de_DE/products/software/enduser/<br />
iccapturetis/<br />
79
Kapitel 2. Implementation 10. Oktober 2013<br />
(a) mit eingeschalteter Raumbeleuchtung<br />
(b) ohne eingeschaltete Raumbeleuchtung<br />
Lichtquellen:<br />
Abbildung 2.7: Raumbeleuchtung<br />
Einen starken Einfluss auf das resultierende Bild haben sämtliche<br />
Lichtquellen in der Umgebung. Wie in Abbildungen 2.7(a) und 2.7(b) zu<br />
erkennen, konnte tagsüber ein erheblicher Unterschied bei der Bildaquise<br />
festgestellt werden, der mit Ein- und Ausschalten der Raumbeleuchtung<br />
einher ging.<br />
(a) Kameraposition: frontal<br />
(b) Kameraposition: von unten<br />
Abbildung 2.8: Kameraposition<br />
80
Kapitel 2. Implementation 10. Oktober 2013<br />
Kameraposition:<br />
Der Winkel sowie der Abstand der Kamera zum Benutzer<br />
stellen einen weiteren wichtigen Faktor da. Je nach Kameraposition<br />
sind in Abbildungen unter 2.8 starke Unterschiede im Schattenwurf um<br />
die Augen erkennbar.<br />
(a) Mit Beleuchtung durch einen IR- (b) Mit Beleuchtung durch zwei IR-<br />
Scheinwerfer<br />
Scheinwerfer<br />
Abbildung 2.9: Infrarot-Scheinwerfer<br />
Infrarotscheinwerfer Position:<br />
Die Position der Infrarot-Lichtquellen sollte<br />
möglichst auf einer Achse mit der Blickrichtung der Kamera liegen, um<br />
eine maximale Ausleuchtung der Gewünschten Bereiche zu erlangen. Die<br />
Unterschiede sind deutliche in Abbildungen 2.9(a) und 2.9(b) zu erkennen.<br />
Kameraeinstellungen:<br />
In Bezug auf die Kameraeinstellung hat sich der<br />
automatische Weißabgleich 11 als sehr störend erwiesen, da dieser die Einstellungen<br />
der Kamera dynamisch ändert und damit das Erstellen einer<br />
stabilen Filterkette erschwert. Der Automatismus sollte daher ausgeschaltet<br />
werden.<br />
2.2.1.4 Ansätze<br />
Im Laufe der Machbarkeitsstudie wurden zwei Ansätze verfolgt, die im<br />
Folgenden schrittweise vorgestellt werden. Die Implementierung erfolgt<br />
über die Filter- sowie Automationsfunktion der OFFIS Toolbox und die<br />
Skriptsprache Python.<br />
11 gleicht das Gesamtbild auf die hellste erkannte Stelle an<br />
81
Kapitel 2. Implementation 10. Oktober 2013<br />
Erster Ansatz: Template Matching und Blob Tracking<br />
Im ersten Ansatz<br />
wird das Template Matching Verfahren in Kombination mit einem Blob<br />
Tracking eingesetzt. Den Ablauf regeln dabei drei, in Abbildung 2.10 dargestellte,<br />
Prozessoren.<br />
Abbildung 2.10: Reihenfolge und Prioritäten der Prozessoren<br />
82
Kapitel 2. Implementation 10. Oktober 2013<br />
Der Input Prozessor in Abbildung 2.11 dient lediglich zum einbinden der<br />
Kamera sowie zum Setzen einer ersten region of interest (ROI), welche das<br />
Bild auf den Bereich der Augen und des Referenzpunktes einschränkt, in<br />
dem sich ein Benutzer im weiteren Verlauf aufhalten muss.<br />
Abbildung 2.11: Input Processor<br />
Abbildung 2.12 zeigt den Eye-Tracking Prozessor.<br />
Das Template Matching wird für die Detektion der Augen verwendet. Dazu<br />
wird zu Beginn jedes Skript-Durchlaufs ein Template des rechten Auges<br />
erzeugt. Die Templateeigenschaften sollten dabei weitestgehend mit Abbildung<br />
2.13(a) übereinstimmen.<br />
83
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.12: Eye-Tracking Processor<br />
Die Abbildungen 2.13(b) und 2.13(c) zeigen andere Templates, welche aufgrund<br />
übermäßiger oder unzureichender Erkennungsmerkmale zu Problemen<br />
beim Template Matching führen. Das Template in Abbildung 2.13(b)<br />
zeigt ein sehr sauberes Template der Iris mit der Pupille. Dieses Template<br />
führt beim Template Matching zu Fehlern bei der Detektion, da z. B. dunkle<br />
Augenbrauen oder Augenringe als Augen erkannt werden, wie in Abbildung<br />
2.14(a) zu sehen ist. In Abbildung 2.13(c) wurde als Template zusätzlich<br />
eine größere Umgebung um die Iris mit aufgenommen.<br />
84
Kapitel 2. Implementation 10. Oktober 2013<br />
(a) Kompromisslösung<br />
mehrerer Augentemplates<br />
(b) Spezifische<br />
Lösung<br />
mit wenig<br />
Information<br />
(c) Spezifische<br />
Lösung mit<br />
viel Information<br />
Abbildung 2.13: Formen unterschiedlicher Augentemplates<br />
Diese führt zu einer besseren Erkennungsrate des Auges, von dem das<br />
Template erzeugt wurde. Es führt aber ebenfalls dazu, dass die Erkennungsrate<br />
des zweiten Auges sinkt. Weiterhin wird das Auge mit dem<br />
Template nicht gefunden, wenn die Iris zu weit von der zentralen Position<br />
abweicht, da das aktuelle Bild in dieser Situation wiederum stark vom<br />
aufgenommenen Template abweicht.<br />
(a) Mittelpunkte aller erkannten<br />
Regionen, inklusive der Augenbrauen<br />
(b) Ergebniskarte eines schlechten<br />
Templates (Hell bedeutet eine<br />
hohe Übereinstimmung)<br />
Abbildung 2.14: Probleme beim Template Matching<br />
Auf der vorgestellten Filterkette in Abbildung 2.12 arbeitet nun eine in<br />
Python geschriebene Automatisierung. Diese initialisiert zu Anfang alle<br />
wichtigen Filter mit manuell bestimmten default Werten. Daraufhin werden<br />
die zwei ROI’s für den Augenbereich sowie das rechte Auge gesetzt.<br />
Ein Benutzer wird nun aufgefordert, sein rechtes Auge in der angezeigten<br />
ROI zu positionieren und mit einem Klick auf Take Template zu bestätigen.<br />
Ist das aufgenommene Template ausreichend, so kann die Selection OK?<br />
Frage mit yes beantwortet werden. Dieser Vorgang sollte so oft wiederholt<br />
werden, bis ein brauchbares Template aufgenommen wurde.<br />
Sobald das Template erzeugt wurde darf die kleinere ROI wieder mit der<br />
85
Kapitel 2. Implementation 10. Oktober 2013<br />
Iris verlassen werden. Das Resultat des Template Matching stellt sich wie<br />
in Abbildung 2.14(b) dar. Aus dieser Ausgabe werden mit einem Threshold<br />
Objekte mit zu geringer Übereinstimmung entfernt und anschließend<br />
eine morphologische Operation (Dilatation) genutzt um zusammenhängende<br />
Flächen zu erzeugen. Auf das erhaltene Bild wird nun ein Blob Detection<br />
Filter gelegt, der einen Datensatz liefert, welcher mögliche Kandidaten<br />
für Augen enthält. Dieser Datensatz wird im Anschluss gefiltert, um das<br />
gewünschte Augenpaar zu extrahieren.<br />
Um nun die Positionen der Augen zu verfolgen wird mit dem Moments<br />
Filter das Center of Gravity (CoG) der Blobs berechnet.<br />
Filtern des Augenpaares<br />
Interessant ist die Filterung des Blob Datensatzes<br />
auf ein Augenpaar. Die Filterung arbeitet direkt auf den erhaltenen<br />
CoG’s des Eye-Tracking Blob Datensatzes. Im ersten Filterschritt wird überprüft,<br />
ob mindestens zwei Objekte gefunden wurden. Daraufhin werden<br />
Augenpaare behalten, die bis auf ein festgelegtes y-Offset auf einer Linie<br />
liegen. Die nun gefilterten, möglichen Augenpaare werden im folgenden<br />
Schritt auf eine minimale Distanz zwischen den ermittelten Augen in x-<br />
Richtung überprüft. Die übrig gebliebenen Objekte werden als Augenpaar<br />
übergeben.<br />
Der Referenz Prozessor ist in 2.15 abgebildet und arbeitet auf der gleichen<br />
ROI wie der Eye-Tracking Prozessor. Die Verarbeitungskette beschränkt<br />
sich jedoch auf ein Thresholding, gefolgt von einer morphologischen Operation<br />
(Opening) und einer Blob Detektion. Wiederum wird das CoG der<br />
erkannten Blobs berechnet und ein Datensatz möglicher gefundener Referenzpunkte<br />
erstellt.<br />
Im nächsten Schritt muss ein Koordinatensystem erstellt werden, um die<br />
Blickrichtung zu erhalten. Hierzu wird eine Kalibrierung durchgeführt. Da<br />
in den Anforderungen festgelegt wurde, das kein Überkopfsystem eingesetzt<br />
wird, muss ein zusätzlicher Referenzpunkt eingeführt werden. Dieser<br />
ist notwendig, da zu erwarten ist, dass der Benutzer seinen Kopf während<br />
der Arbeit mit dem System nicht immer Still in derselben Position hält.<br />
Diese Bewegungen des Kopfes führen zu einer ständigen Bewegung der<br />
Augen, welche die Bestimmung der Blickrichtung der Augen ohne einen<br />
Referenzpunkt mit unseren Mitteln nicht möglich macht. Dieser Referenzpunkt<br />
muss sich dabei gleich zu den Kopfbewegungen verhalten, dabei<br />
aber in einer fixen Position zu den Augen befinden. Für die Machbarkeitsstudie<br />
wird eine schwarze Markierung auf der Stirn angebracht, siehe 2.16(a).<br />
Der Referenzpunkt wird mit einer eigenen Filterkette identifiziert, welche<br />
parallel zur ersten Filterkette läuft, die zur Abwicklung der Augenerken-<br />
86
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.15: Reference Processor<br />
nung genutzt wird. Es werden hierbei ein Threshold und eine morphologische<br />
Operation (Opening) auf dem Bild angewendet.<br />
87
Kapitel 2. Implementation 10. Oktober 2013<br />
Diese vorverarbeiteten Daten werden anschließend invertiert und durch<br />
eine Blob Detektion geführt, sodass ein Datensatz möglicher Referenzpunkte<br />
bestimmt werden kann. Um nun den exakten Referenzpunkt aus dem<br />
vorliegenden Datensatz zu gewinnen wird ein Pythonskript eingesetzt.<br />
Dabei werden die zur Verfügung stehenden Informationen über den Bereich<br />
in dem sich der Referenzpunkt befinden muss genutzt.<br />
(a) Anbringung des Referenzpunktes<br />
(b) Identifizierung des<br />
Referenzpunktes<br />
Abbildung 2.16: Referenzpunktes<br />
In Abbildung 2.16(a) ist der am Benutzer angebrachte Referenzpunkt zu sehen<br />
und in Abbildung 2.16(b) der eingeschränkte Suchbereich, in welchem<br />
der Referenzpunkt gesucht wird.<br />
Filtern des Referenzpunktes<br />
Interessant ist die Filterung des Blob Datensatzes<br />
auf den Referenzpunkt. Diese Filterung arbeitet ebenfalls direkt auf<br />
den erhaltenen CoG’s des Referenz Blob Datensatzes und erfolgt im gleichen<br />
Schritt wie die Ermittlung eines Augenpaares, da der Referenzpunkt<br />
zu jedem Zeitpunkt fest an der Stirn des Benutzers angebracht wurde.<br />
Der Blob Datensatz wird daher zuerst auf die Region zwischen und über<br />
dem ermittelten Augenpaar eingeschränkt. Aufgrund von Problemen durch<br />
z. B. erkannte dunkle Augenbrauen wird nun der höchste gefundene Referenzpunkt<br />
ausgewählt und übergeben. Ab diesem Punkt wird im Ansatz<br />
davon ausgegangen, dass stabil beide Augen und der Referenzpunkt gefunden<br />
werden.<br />
Zweiter Ansatz: Blob Tracking<br />
Im zweiten Ansatz wird die Erkennung<br />
der Augen sowie des Referenzpunktes über ein gemeinsames Blob Tracking<br />
realisiert. Abbildung 2.17 zeigt die zugehörige Filterkette, welche wesentlich<br />
kürzer ist als die des ersten Ansatzes und daher in einem Prozessor untergebracht<br />
ist.<br />
88
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.17: Blob Tracking Processor<br />
Im ersten Schritt wird eine ROI auf das Bild gelegt, in der sich im folgenden<br />
Verlauf der Kopf des Benutzers befinden muss. Nach einer Bildvorver-<br />
89
Kapitel 2. Implementation 10. Oktober 2013<br />
arbeitung durch einen Threshold sowie morphologischer Operationen (Dilatation<br />
und Opening) kann ebenfalls auf dem ermittelten Blob Datensatz<br />
gearbeitet werden. Hier kommt, wie auch im ersten Ansatz, die Automatisierung<br />
zum Einsatz. Zur Ermittlung der Augen und des Referenzpunktes<br />
wird in diesem Fall auf Rechtecken sowie auch CoG’s gearbeitet.<br />
Aufgrund der Position die durch die ROI gefordert wird, kann davon ausgegangen<br />
werden, dass sich das Augenpaar nicht im obersten oder unterstem<br />
Viertel der ROI befindet. Daher werden diese Bereiche bei der<br />
Suche nach den Augen ausgeschlossen. Die ROI ermöglicht außerdem Einschränkungen<br />
in Bezug auf die minimale und maximale Distanz der Augen<br />
festzulegen. Zu diesem Zeitpunkt liegt nur eine eingeschränkte Menge an<br />
Blobs vor, die potentiell Augen sein können.<br />
Filtern des Augenpaares<br />
Die Filterung der Augen sowie des Referenzpunktes<br />
erfolgt in diesem Fall auf dem gleichen Blob Datensatz. Dieser<br />
wird im ersten Schritt auf ein mögliches Augenpaar durchsucht. Nach einer<br />
manuellen Einschränkung des y-Suchraums wird jedes überbleibende,<br />
mögliche Auge mit jedem anderen verglichen. Dabei werden nur Objekte<br />
in der Liste behalten, die einen Partner mit einem Offset auf der Y-Ebene<br />
um max. 5% besitzen. Paare, die einen, durch Tests ermittelten, zu großen<br />
oder zu kleinen Abstand in der X-Ebene besitzen werden ebenfalls gefiltert.<br />
Bleiben im Anschluss an diese Filteroperationen noch genug Daten erhalten,<br />
werden diese sortiert und als valides Augenpaar übergeben.<br />
Um ein Augenpaar zu identifizieren werden alle Blobs, welche die bisherige<br />
Filterung bestanden haben, ausgewertet. Aufbauend auf einem validen<br />
Augenpaar wird, wie schon im Template Matching Ansatz, der Refenzpunkt<br />
gesucht.<br />
Filtern des Referenzpunktes<br />
Wurde ein Augenpaar identifiziert, wird<br />
im nächsten Schritt der Blob Datensatz auf einen validen Referenzpunkt<br />
durchsucht. Dazu werden, wie auch im ersten Ansatz nur Objekte betrachtet,<br />
welche in der Region über und zwischen dem zuvor identifizierten<br />
Augenpaar liegen. Dies ist durch den Anbringungspunkt des Referenzpunktes<br />
mittig zwischen den Augen möglich, siehe Abbildung 2.16(a). Aufgrund<br />
der bekannten Maße des Referenzobjekts werden im Folgeschritt nur die<br />
Objekte behalten, deren Höhe größer als die Breite ist. Sobald ein Referenzpunkt<br />
identifiziert wurde, wird die Suche unterbrochen und der gefundene<br />
Referenzpunkt übergeben. Nachdem nun valide Augenpaare und der<br />
Referenzpunkt erfasst werden können, erfolgt eine Kalibrierung.<br />
90
Kapitel 2. Implementation 10. Oktober 2013<br />
Diese erfolgt analog zum ersten Ansatz, über drei Punkte auf der Arbeitsfläche.<br />
Der weitere Ablauf erfolgt ebenfalls wie im Template Matching<br />
Ansatz. Die drei Datensätze der Kalibrierung werden auf ein gemeinsames<br />
Koordinatensystem umgerechnet, welches sich am Referenzpunkt<br />
des ersten Kalibrierungspunktes orientiert. Somit kann ab diesem Punkt<br />
die Blickrichtung, wie bereits beim Template Matching Ansatz, auf der Arbeitsfläche<br />
verfolgt werden.<br />
Kalibrierung<br />
Als nächster Schritt folgt eine Kalibrierung. Dabei muss der<br />
Benutzer nacheinander drei Punkte auf dem Bildschirm fokussieren. Hierzu<br />
müssen nacheinander die Mitte, die obere Rechte sowie die untere<br />
Linke Ecke der Arbeitsfläche mit beiden Augen fixiert und mit einem Klick<br />
auf den entsprechenden Button bestätigt werden. An allen drei Punkten<br />
wird jeweils die Position beider Augen und des Referenzpunktes aufgenommen.<br />
Aufbauend auf diesen drei Positionen wird ein Koordinatensystem<br />
aufgebaut. An dieser Stelle ist zu erwähnen, dass das Ziel nicht die Umsetzung<br />
mit Hilfe von Tiefeninformationen beinhaltet. Es wird der Blickpunkt<br />
auf der Arbeitsfläche bestimmt, heißt eine reine Position in der X-<br />
/Y-Ebene. Als Arbeitsfläche wird hier der Bildschirm verwendet. Dieser<br />
wird in Quadranten unterteilt in denen sich der Blickpunkt des Benutzers<br />
befindet. Die Quadrantenunterteilung erfolgt in einem 3x3 Raster, zu sehen<br />
in Abbildung 2.20. Um den Blickpunkt zu bestimmen muss zunächst<br />
eine Kalibrierung durchgeführt werden. Dabei muss der Blickpunkt auf die<br />
äußeren Ränder des Arbeitsbereichs gemappt werden. Da in der Studie der<br />
Bildschirm der Arbeitsbereich ist wird ein Kalibrierungsbild 2.18 verwendet.<br />
Abbildung 2.18: Kalibrierungsbild um die Ecken des Anzeigefläche zu<br />
erkennen<br />
91
Kapitel 2. Implementation 10. Oktober 2013<br />
Kalibrieren des Augenpaares auf den Referenzpunkt<br />
Um dem System<br />
eine gewisse Stabilität gegenüber Kopfbewegungen zu verschaffen, wird<br />
in jedem Durchlauf das ermittelte Augenpaar auf den ermittelten Referenzpunkt<br />
kalibriert. Eine Darstellung dieses Vorgangs erfolgt in Abbildung<br />
2.19. Dabei wird die Position des Referenzpunktes bei der Aufnahme des<br />
Blickpunkts im Mittelpunkt der Arbeitsfläche als Basis verwendet, dargestellt<br />
in Abbbildung 2.19. Anschließend wird die Abweichung der Position des<br />
Referenzpunktes der beiden anderen Kalibrierungspunkte zum Referenzpunkt<br />
der Basis berechnet. Diese Abweichung wird auf die beiden anderen<br />
Referenzpunkte und die Blickpunkte angerechnet. Nach diesem Schritt<br />
sind die Kalibrierungspunkte<br />
1.<br />
alle auf einen Refenzpunkt geeicht. Weiterhin<br />
ist die Blickrichtung der Augen in Referenz zum Referenzpunkt auf<br />
die Arbeitsfläche gemappt. Nachdem die Kalibrierung auf einen Referenzpunkt<br />
erfolgt ist, kann der aktuelle Blickpunkt 2. der Augen auf der Arbeitsfläche<br />
bestimmt werden. Der Schritt der Kalibrierung der Position der<br />
Augen und<br />
1.<br />
des Referenzpunktes auf die Position des Referenzpunktes der<br />
Kalibrierung muss bei jeder Aquise der Positionen erfolgen.<br />
1.<br />
2. 3.<br />
2.<br />
Abbildung 2.19: Bewegung der CoGs zwischen zwei Kalibrierungspunkten<br />
Ist die Kalibrierung erfolgt, kann der eigentliche Ablauf beginnen. In jedem<br />
Durchlauf werden nun die Augen sowie<br />
3.<br />
der Referenzpunkt ermittelt, um<br />
die aktuelle Augenposition zu bestimmen. Diese wird auf einem in neun<br />
Quadranten eingeteilten Bild auf dem Monitor dargestellt.<br />
Abbildung 2.20 zeigt die genutzte neun Quadranten Einteilung.<br />
2.2.1.5 Messungen<br />
Um die Ergebnisse beider Ansätze zu analysieren sowie Vergleiche ziehen<br />
zu können, wurden zwei unterschiedliche Messungen durch zwei Testpersonen<br />
vorgenommen. Zur Aufnahme der Messdaten wurden die Python<br />
Skripte jeweils um ein Statistik-Panel erweitert.<br />
Erkennungsrate<br />
3.<br />
Die erste Messung dient zur Einstufung der Erkennungsraten<br />
beider Ansätze. Eine erfolgreiche Erkennung beinhaltet dabei die Fil-<br />
92
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.20: Quadrantenaufteilung zur Visualisierung<br />
terung eines validen Augenpaares sowie eines validen Referenzpunktes.<br />
Die Daten basieren dabei auf Messungen zweier Testpersonen. In den folgenden<br />
Tabellen 2.1 und 2.2 sind die Ergebnisse aufgeführt. Wichtig ist der<br />
Vergleich zwischen der Anzahl aller Filteraufrufe und der Anzahl aller erfolgreichen<br />
Filteraufrufe, in welchen Augenpaar und Referenzpunkt erkannt<br />
wurden.<br />
Abbildung 2.21 zeigt die zur Messung gehörende Aufnahme der Testpersonen<br />
in der bereits eingeschränkten ROI.<br />
(a) Testperson 1 (b) Testperson 2<br />
Abbildung 2.21: Aufnahme des Eingangsbildes der ersten Messung<br />
93
Kapitel 2. Implementation 10. Oktober 2013<br />
Die Messungen erfolgen dabei mit optimalen Filtereinstellungen für die<br />
jeweilige Testperson, welche nach der Kalibrierungsphase den in Abbildung<br />
2.22 dargestellten Weg mit den Augen verfolgt.<br />
Abbildung 2.22: Festgelegter Blickweg der ersten Messung<br />
94
Kapitel 2. Implementation 10. Oktober 2013<br />
Erster Ansatz: Template Matching und Blob Tracking<br />
Tabelle 2.1 enthält<br />
die Werte der Messungen für den ersten Ansatz.<br />
Messung<br />
Filteraufrufe<br />
Augenpaare<br />
Erkannte<br />
Augenpaare<br />
Filteraufrufe<br />
Referenzpunkt<br />
Erkannte<br />
Referenzpunkte<br />
1 450 404 404 404<br />
2 450 350 350 350<br />
3 480 330 330 330<br />
1 419 252 252 252<br />
2 501 327 327 326<br />
3 431 283 283 283<br />
Tabelle 2.1: Messwerte der Erkennungsrate des ersten Ansatzes<br />
Aus den gewonnenen Messwerten errechnet sich eine mittlere Erkennungsrate<br />
der Augenpaare von 71, 2%. Nach einem erkannten Augenpaar wird in<br />
diesem Ansatz die Suche nach einem Referenzpunkt gestartet. Die mittlere<br />
Erkennungsrate des Referenzpunktes nach bereits erkanntem Augenpaar<br />
liegt bei 99, 9%.<br />
Das endgültige Ergebnis ist daher hauptsächlich von der Erkennung der<br />
Augen abhängig und es ergibt sich eine mittlere gesamte Erkennungsrate<br />
von 71, 19% für den ersten Ansatz.<br />
Zweiter Ansatz: Blob Tracking<br />
Tabelle 2.2 enthält die Werte der Messungen<br />
für den zweiten Ansatz.<br />
Messung Filteraufrufe<br />
gesamt<br />
Erkannte<br />
Augenpaare<br />
Erkannte<br />
Referenzpunkte<br />
1 1223 1215 1215<br />
2 1250 1203 1203<br />
3 1265 1239 1239<br />
1 1223 1134 1134<br />
2 1255 874 874<br />
3 1210 1057 1057<br />
Tabelle 2.2: Messwerte der Erkennungsrate des zweiten Ansatzes<br />
In diesem Ansatz werden Augenpaar und Referenzpunkt aus dem gleichen<br />
Blob Datensatz gewonnen. Aus den aufgenommenen Messwerten ergibt<br />
95
Kapitel 2. Implementation 10. Oktober 2013<br />
sich eine mittlere gesamte Erkennungsrate der Augenpaare und Referenzpunkte<br />
von 90, 5%.<br />
Quadrantenstabilität<br />
Die zweite Messung dient zur Einstufung der stabilen<br />
Erkennung eines in Abbildung 2.20 dargestellten Quadranten. Dabei<br />
fixiert eine Testperson direkt nach der Kalibrierung einen vorher definierten<br />
Quadranten. Während der Messung wird nun geprüft, wie oft der ermittelte<br />
Blickpunkt im richtigen, heißt von der Testperson fest fixierten, Quadranten<br />
liegt. In den folgenden Tabellen 2.3 und 2.4 sind die Ergebnisse<br />
aufgeführt. Wichtig ist der Vergleich zwischen der Anzahl aller während<br />
der Messung erfassten Quadranten und der Anzahl aller stabilen Quadranten.<br />
Abbildung 2.23 zeigt die zur Messung gehörende Aufnahme der Testpersonen<br />
in der bereits eingeschränkten ROI.<br />
(a) Testperson 1 (b) Testperson 2<br />
Abbildung 2.23: Aufnahme des Eingangsbildes der zweiten Messung<br />
Erster Ansatz: Template Matching und Blob Tracking<br />
Tabelle 2.3 enthält<br />
die Werte der Messungen für den ersten Ansatz.<br />
Messung Quadrantenaufrufe<br />
gesamt<br />
stabile<br />
Quadrantenaufrufe<br />
1 428 156<br />
2 425 217<br />
3 386 124<br />
1 432 103<br />
2 440 126<br />
3 412 133<br />
Tabelle 2.3: Messwerte der Quadrantenbestimmung des ersten Ansatzes<br />
96
Kapitel 2. Implementation 10. Oktober 2013<br />
Es errechnet sich eine gemittelte stabile Quadrantenstabilität von 34, 1% für<br />
den ersten Ansatz.<br />
Zweiter Ansatz<br />
Tabelle 2.4 enthält die Werte der Messungen für den ersten<br />
Ansatz.<br />
Messung Quadrantenaufrufe<br />
gesamt<br />
stabile<br />
Quadrantenaufrufe<br />
1 996 846<br />
2 1008 741<br />
3 920 741<br />
1 935 619<br />
2 620 515<br />
3 1077 570<br />
Tabelle 2.4: Messwerte der Quadrantenstabilität von Ansatz 2<br />
Es errechnet sich eine gemittelte stabile Quadrantenbestimmungsrate von<br />
73, 5% für den zweiten Ansatz.<br />
2.2.1.6 Probleme<br />
Dieser Abschnitt beschäftigt sich mit den bei der Implementierung aufgetretenen<br />
Probleme und Hindernisse. Es wird dabei sowohl auf allgemeine<br />
Probleme des Eye-Trackings als auch auf spezielle Probleme beider Ansätze<br />
eingegangen.<br />
Allgemein<br />
Hier werden die Probleme beschrieben, welche allgemein für<br />
beide aufgeführten Ansätze gelten.<br />
Diese allgemeinen Probleme beziehen sich auf die in Abschnitt 2.70(a)<br />
beschriebenen Aufbauten. Eine Problemgruppe, welche aus unterschiedlicher<br />
Kamera- bzw. Infrarot-Scheinwerfer-Position entsteht, ist die der Reflektion.<br />
Daraus resultiert, dass bei Benutzung des Systems eine definiert<br />
eingeschränkte Umgebung vorausgesetzt werden muss. Ein weiteres Problem<br />
ist der Schattenwurf aufgrund von unterschiedlichen Lichtverhältnissen.<br />
Dieser konnte im zweiten Ansatz durch Einsatz des zusätzlichen Infrarot-<br />
Scheinwerfers jedoch weitestgehend aufgehoben werden. Weiterhin sichern<br />
die durch den Referenzpunkt kompensierten Kopfbewegungen das System<br />
nicht gegen die in Abschnitt 2.2.1.1 beschriebenen Sakkaden ab, welche daher<br />
zu einer instabilen Zuordnung der Blickrichtung und daraus folgender,<br />
schwankender Präzision führen.<br />
97
Kapitel 2. Implementation 10. Oktober 2013<br />
(a) keine Spiegelung<br />
(b) starke Spiegelung<br />
Abbildung 2.24: Probleme die durch das Tragen einer Brille entstehen<br />
Auch hat sich das Tragen einer Brille als negativ bei der Erkennung herausgestellt,<br />
zu sehen in Abbildungen 2.24. Spiegelungen der Gläser sowie ein<br />
dunkles Brillengestell führten zu Problemen bei der Erkennung.<br />
Erster Ansatz: Template Matching und Blob Tracking<br />
traten weiterhin die folgenden Probleme auf:<br />
Im ersten Ansatz<br />
Durch das Template Matching können zwar gute Ergebnisse bei der Augenerkennung<br />
erreicht werden, jedoch ist die Aufnahme eines brauchbaren<br />
Templates für ein benutzbares System schwer umsetzbar, was in einer starken<br />
Templatebhängigkeit resultiert. Dies begründet sich darin, dass das Template<br />
aufgenommen wird während der Benutzer frontal in die Kamera schaut.<br />
Dadurch kann es in Folge dazu kommen, dass das Template nicht ausreicht,<br />
um die Augen bei der Kalibrierung korrekt zu erkennen. Zusätzlichen<br />
Einfluss nehmen die Lichtverhältnisse zum Aufnahmezeitpunkt des Templates.<br />
Mit dem gewählten Aufbau als ferngesteuertes System und dem<br />
somit festgelegten Aufenthaltsbereich des Benutzers geht ebenfalls eine<br />
maximale Auflösung der erhaltenen Bilder einher. Dies führt zu einer mangelhaften<br />
Qualität des Templates, welche auch die Qualität der Erkennung<br />
durch das Template Matching negativ beeinflusst. Es führt z. B. zu einer<br />
fehlerhaften Erkennung bei dunklen Augenbrauen, Wimpern oder auch<br />
am Haaransatz und ist daher stark von persönlichen Merkmalen eines<br />
Benutzers abhängig. Die Arbeit mit einem Referenzpunkt hat zur Folge,<br />
dass in diesem Ansatz eine zusätzliche Verarbeitungskette zur Erkennung<br />
aufgebaut werden musste.<br />
Auf einem FPGA wäre der im ersten Ansatz vorgestellte Algorithmus zwar<br />
umsetzbar, siehe 2.2.1.1, da jedoch mit einer Vielzahl von Filtern gearbeitet<br />
wird sehr aufwendig zu implementieren.<br />
98
Kapitel 2. Implementation 10. Oktober 2013<br />
Zweiter Ansatz: Blob Tracking<br />
Nachdem festgestellt wurde, dass der<br />
erste Ansatz keine ausreichende Stabilität gewährleistet und sich weiter<br />
nicht für ein Mehrbenutzersystem eignet, wurde mit der Ausarbeitung<br />
des zweiten Ansatzes begonnen. Dieser Ansatz bringt auf den ersten Blick<br />
weniger spezielle Probleme mit sich, die im ersten Teil dieses Abschnitts erläuterten,<br />
allgemeinen Probleme bleiben jedoch weiterhin bestehen. Dazu<br />
zählen die Probleme der Reflektion ebenso wie die Probleme von Spiegelung<br />
und Schattenwurf. Da bis zum Ende der Studie keine speziellen Probleme<br />
auf den Ansatz zurückzuführen zu sind, entfällt eine Aufzählung.<br />
Verbesserungsvorschläge<br />
Aufgrund der begrenzten Zeit der Studie konnten<br />
nicht sämtliche Ideen und Ansätze vollständig umgesetzt werden. Daher<br />
werden im Folgenden einige dieser Ideen aufgelistet.<br />
• Testen weiterer Aufbauten, Infrarot-Scheinwerfer, z. B. seitlich vom<br />
Benutzer<br />
• Verwendung einer Kamera mit höherer Auflösung. (Wurde in der<br />
Studie nicht durchgeführt, da bereits von der laut Sprintbeschreibung<br />
zu verwendenden Kamera abgewichen wurde)<br />
• Erweiterung der Blob Filterketten<br />
– Verbesserte Einordnung in Quadranten durch Mittelwertbildung<br />
– Verbesserte Einordnung in Quadranten durch Einführung von<br />
virtuellen Abständen zwischen einzelnen Quadranten, siehe Abbildungen<br />
2.25(a) und 2.25(b)<br />
• weitere Ausführung des zweiten Ansatzes<br />
2.2.1.7 Evaluation<br />
Basierend auf den Ergebnissen der Messungen in Abschnitt 2.2.1.5 wird<br />
nun die Leistungsfähigkeit beider Ansätze evaluiert. Dabei kann nur begrenzt<br />
ein Vergleich zu bestehenden Ansätzen gezogen werden, da diese<br />
Projekte meist nur Ansätze, nicht gepflegt oder nicht mehr verfügbar sind.<br />
Das Projekt mit dem besten Bezug zum Inhalt dieser Studie ist das Projekt<br />
GazeTracker 12 , welches sowohl mit Überkopf-, als auch mit ferngesteuerten<br />
Kameras arbeitet. Bei der Nutzung als ferngesteuertes System<br />
12 http://www.gazegroup.org/downloads/23-gazetracker, letzter Zugriff: 22.02.2013<br />
99
Kapitel 2. Implementation 10. Oktober 2013<br />
Q1 Q2 Q3<br />
Q1 Q2 Q3<br />
The application is intended to run on a Microsoft platform. The main<br />
Q4 Q5 Q6<br />
Q4<br />
Q6<br />
Q5<br />
initial release was Windows XP SP3 using the latest Microsoft .Net 3<br />
downloaded at http://www.microsoft.com/NET/.<br />
Q7 Q8 Q9<br />
Make sure that you have installed the drivers for your camera and tu<br />
(a) Quadratisch<br />
(b) Parabol<br />
(nightmode). In some cameras this can be achieved through software se<br />
Abbildung 2.25: the weitere light mögliche sensor, possibly Einteilungen with nonopaque zur Quadrantenbestimmung<br />
into a folder of your choice and double click the GazeTracker.ex<br />
plastic tape. After downlo<br />
archive<br />
From here on the ITU Gaze Tracker v1.0 will be referred to as the GT.<br />
wird empfohlen mit einer HD-Kamera und eventuell einem zusätzlichem<br />
Zoom-Objektiv zu Configuration<br />
arbeiten. Dies führt dazu, dass die Kamera eine ähnliche<br />
Ausgabe wie eine Überkopf-Kamera erzeugt, siehe Abbildung 2.26. Ähnlich<br />
unserem zweiten Ansatz werden beim Projekt GazeTracker ebefalls<br />
zwei Infrarotlicht-Quellen eingesetzt.<br />
Main application screen<br />
Q7<br />
Q8<br />
Q9<br />
When launching the GT the o<br />
Setup button. This is where yo<br />
calibration options and proc<br />
mouse etc.<br />
The Calibrate button starts th<br />
values specific during the Setup<br />
After accepting a calibration th<br />
Abbildung 2.26: Kamerabild vom GazeTracker<br />
Activating the Setup button w<br />
access to all configurable param<br />
Erster Ansatz: Template Matching und Blob Tracking Der there erstewill Ansatz be saved every t<br />
ist technisch umsetzbar. Die Implementierung erfordert dabei minimized. allerdings,<br />
wie bereits in Abschnitt 2.2.1.4 erläutert, einen hohen Aufwand. Dieser<br />
hohe Aufwand und die Fig Notwendigkeit, 1. The ITU GazeTracker größere Bildausschnitte für das<br />
Template Matching zwischenspeichern zu müssen, machen den Ansatz in<br />
der FPGA-Umsetzung unattraktiv. Die Leistung des Ansatzes, welche in<br />
Abschnitt 2.2.1.5Setup analysiert Pupil wurde, Tracking ist nur mangelhaft. Die Zuverlässigkeit<br />
Click the Setup button. The first step is to adjust the Pupil Detector slider<br />
switches mode into a processed view helpful for adjusting the tracker set<br />
slider until the color 100of<br />
the pupil is green. Try to find a position where<br />
parts of the eye. You may click the icon just underneath the image to de<br />
window. This will display the video in its native resolution, making it ea<br />
settings. If no video is displayed click the Options tab and follow ins<br />
selecting camera. Notice that the infrared light sources must be turne
Kapitel 2. Implementation 10. Oktober 2013<br />
der Erkennung von Augen und Referenzpunkt mit 71, 19% unter optimalen<br />
Bedingungen wird als ausreichend angesehen. Die Qualität der stabilen<br />
Quadrantenerkennung unter optimalen Bedingungen ist jedoch mit einer<br />
mittleren Erkennungsrate von 34, 1% nur mangelhaft. Neben den Ergebnissen<br />
muss der Aufwand in Betracht gezogen werden, welcher notwendig ist,<br />
um die Messungen zu erzeugen. Um verwertbare Ergebnisse zu erhalten ist<br />
eine aufwendige Kalibrierung notwendig. Dazu mussten die Parameter des<br />
Threshold Filters sowie der morphologischen Operationen sehr speziell auf<br />
die jeweilige Testperson angepasst werden. Auf Basis der Messungen und<br />
der Auswertung des Aufwands wird der Ansatz somit als nicht praktikabel<br />
angesehen. Eine Implementierung wird mit entsprechend hohen Aufwand<br />
als theoretisch umsetzbar eingeschätzt.<br />
Zweiter Ansatz: Blob Tracking<br />
Der zweite Ansatz verwendet eine vollständig<br />
FPGA-Implementierbare Filterkette, welche nur wenige Filter verwendet.<br />
Wie die Messungen in Abschnitt 2.2.1.5 ergeben haben, ist die mittlere<br />
Erkennungsrate und somit die Qualität der Erkennung von Augen<br />
und Referenzpunkt mit 90, 5% deutlich besser als im ersten Ansatz. Die<br />
stabile Erkennung von Quadranten ist 73, 5% Prozent ebenfalls deutlich<br />
besser als im ersten Ansatz. Eine Umsetzung ist damit in erster Linie theoretisch<br />
und praktisch machbar. Ob eine praktische Umsetzung sinnvoll<br />
ist, muss mit Ausblick auf die notwendigen Anforderungen an das System<br />
getroffen werden. Hierbei ist die Qualität der in der Studie verwendeten<br />
Kamera mit in Betracht zu ziehen. Sollte die Kamera, welche vom Zielsystem<br />
verwendet wird, bessere Spezifikation in Hinsicht auf Auflösung und<br />
Bildwiederholrate besitzen, kann sich die Leistung des Systems verbessern.<br />
2.2.1.8 Fazit<br />
In der Studie wurden in Abschnitt 2.2.1.4 zwei unterschiedliche Ansätze<br />
ausgearbeitet und implementiert. Diese Ansätze implementieren die Erkennung<br />
und Verfolgung der Augen. Dabei erfolgt eine Abbildung der Blickrichtung<br />
der Augen auf eine in Quadranten eingeteilte Arbeitsfläche. Diese<br />
Quadranten stellen eine Abstraktion der Bewegungsmöglichkeiten des Roboters<br />
auf 9 Basisrichtungen dar. Beide Ansätze wurde auf die mittleren Erkennungsraten<br />
der Augen und die mittlere Stabilität der Zuordnung zu den 9<br />
Quadranten analysiert. Die Ergebnisse wurden in Abschnitt 2.2.1.5 aufgeführt<br />
und daraufhin in in Evaluation bewertet, siehe 2.2.1.7. Das Ziel dieser<br />
Studie ist es, eine Aussage über die Machbarkeit eines Eye-Tracking-Verfahrens<br />
im Rahmen der Projektgruppe, zu machen. Daher muss zwischen theoretis-<br />
101
Kapitel 2. Implementation 10. Oktober 2013<br />
cher und praktischer Machbarkeit unterschieden werden. Die theoretische<br />
Machbarkeit beider Ansätze wurde in der Evaluation für beide Ansätze<br />
festgestellt. Diese ist jedoch nicht hinreichend um eine Empfehlung für die<br />
Umsetzung zu geben. Die praktische Machbarkeit wurde für den zweiten<br />
Ansatz festgestellt. Die kurze Filterkette, welche nur aus wenigen Basisoperationen,<br />
einem Threshold und morphologischen Operationen besteht,<br />
macht eine FPGA-Implementierung umsetzbar. Zudem steht eine Implementierung<br />
des benötigten Blob-Tracking Filters bereits zur Verfügung.<br />
In Kombination mit den Ergebnissen der Messungen zur Stabilität und<br />
Qualität des Ansatzes wird festgestellt, dass der Ansatz, mit wenigen Erweiterungen<br />
und Optimierungen in der Analyselogik, machbar ist. Dennoch<br />
wird der Ansatz nicht umgesetzt, da das Erkennen der Blickrichtung<br />
zu ungenau ist für unsere Fälle.<br />
2.2.1.9 Datenstruktur<br />
Die Datenstruktur ergibt sich wie folgt:<br />
sprint2/eye_tracking/eyeV1/eye.oap : OFFIS Automation Framework Projektdatei<br />
sprint2/eye_tracking/eyeV1/eye_v1.ogr : Bildverarbeitungskette für die<br />
Erkennung der Augen und der Darstellung der ermittelten Position<br />
/ Trajektorie.<br />
sprint2/eye_tracking/eyeV1/eye_v1.py : Automation zum Erhalt und Verarbeitung<br />
der Augenposition.<br />
sprint2/eye_tracking/eyeV2/eye_v2.oap : OFFIS Automation Framework<br />
Projektdatei<br />
sprint2/eye_tracking/eyeV2/eye_v2.ogr : Bildverarbeitungskette für die<br />
Erkennung der Augen und der Darstellung der ermittelten Position<br />
/ Trajektorie.<br />
sprint2/eye_tracking/eyeV2/eye_v2.py : Automation zum Erhalt und Verarbeitung<br />
der Augenposition<br />
102
Kapitel 2. Implementation 10. Oktober 2013<br />
2.2.2 Anbindung des Kameramoduls<br />
Das Ziel dieses Arbeitspaketes ist die Ansteuerung des Kameramoduls<br />
VmodCam von Digilent. Am Ende des Paketes soll die OFFIS-Automation-<br />
Toolbox die Daten von einer der beiden Kameras über USB von dem FPGA<br />
empfangen und anschließend anzeigen können.<br />
Eine Visualisierung des implementierten Aufbaus ist in Abbildung 2.27<br />
dargestellt. Dieser realisiert den Hardwareteil der Kameraanbindung. Zusätzlich<br />
wurde noch ein Treiber für den simple_i2c IP-Core auf dem Microblaze<br />
implementiert, welcher Methoden zur Konfiguration der Kamera bereitstellt.<br />
Als Teil des Arbeitspaketes wurde zudem ein Interrupthandler für<br />
den Microblaze implementiert, welcher USB Messages behandelt. Außerdem<br />
wurde auch ein Plugin für die OFFIS-Automation-Toolbox erstellt,<br />
welches Daten vom FPGA entgegennimmt und in der OFFIS-Automation-<br />
Toolbox anzeigt.<br />
Im folgenden werden die involvierten IP-Core, der Treiber zur Kamera<br />
Konfiguration und das Plugin für die OFFIS-Automation-Toolbox näher<br />
beschrieben.<br />
simple_i2c<br />
cam_bootloader<br />
cam_rgb565_to_rgb888<br />
VmodCam<br />
cam_usb<br />
cam_data<br />
usb_driver<br />
cam_deserialzer<br />
PC<br />
Abbildung 2.27: Aufbau der Kameraansteuerung<br />
103
Kapitel 2. Implementation 10. Oktober 2013<br />
VDD-EN<br />
t 1 t 2 t 3<br />
MCLK<br />
SDA<br />
Power-Up Sequence<br />
MCLK<br />
t 4<br />
t 5<br />
t 4 t 6<br />
RST<br />
SDA<br />
Reset Sequence<br />
Abbildung 2.28: Signal Sequenz zur initialen Ansteuerung der Kamera<br />
cam_bootloader 1.00.a<br />
Die VmodCam verlangt eine bestimmte Signalabfolge<br />
bevor sie Befehle über das I 2 C Protokoll verarbeitet und auf diese<br />
reagiert. Die Signalsequenz ist in Abbildung 2.28 dargestellt. Die Sequenz<br />
ist in zwei Teile unterteilt, eine Power-Up- und eine Resetsequenz die hintereinander<br />
ausgeführt werden. Die einzelnen Teilabschnitte (t 1 bis t 6 ) wurden<br />
von uns mit Hilfe eines endlichen Automaten umgesetzt.<br />
Dieser IP-Core reicht die Signalabfolge an beide Kameras der VmodCam<br />
weiter, so das diese vom IP-Core initialisiert werden. Der Core meldet über<br />
ein Register dem Microblaze das die Sequenz abgeschlossen ist und die<br />
Kameras für das Protokoll ansprechbar sind. Weiterhin stellt dieser Core<br />
den Referenztakt für die Kameras dauerhaft bereit.<br />
104
Kapitel 2. Implementation 10. Oktober 2013<br />
simple_i2c 2.00.a<br />
Der von den Projektbetreuern bereitgestellte IP-Core<br />
zur Übertragung von I 2 C Kommandos wurde von uns unverändert in das<br />
Projekt aufgenommen. Jedoch wurde ein Treiber geschrieben, der den bereitgestellten<br />
nutzt und für unsere speziellen Aufgaben erweitert. So wurden<br />
von uns die Werte der genutzten Register- und Variablenadressen im<br />
Treiber hinterlegt. Auch wurden Funktionen dem Treiber hinzugefügt, die<br />
16 Bit Werte versenden und lesen.<br />
Der Treiber bietet die folgenden Methoden zur Konfiguration der Kamera<br />
an:<br />
void reset ( u8 N , u8 M);<br />
Die Methode muss vor Benutzung der Kamera aufgerufen werden. Die<br />
Parameter N und M dienen dabei zur Beschreibung des Takts mit dem<br />
Pixel auf den Datenbus gelegt werden. Die Berechnung erfolgt wie folgt:<br />
PCLK =<br />
MCLK∗M<br />
N+1<br />
8<br />
Dabei steht PCLK für Pixel Clock, also dem Takt mit dem Pixeldaten aus<br />
der Kamera geschoben werden. MCLK ist der Referenztakt, den der Kamerachip<br />
bekommt. cam_bootloader gibt als MCLK ein viertel der Bus Taktung<br />
an die Kamera.<br />
Bei der Wahl von N und M müssen desweiteren die folgenden Beschränkungen<br />
beachtet werden:<br />
• 0 < M < 256<br />
• 0 < N < 64<br />
• 6 Mhz
Kapitel 2. Implementation 10. Oktober 2013<br />
Zusätzlich zu den Registern gibt es auch Variablen. Diese können mit den<br />
oben genannten Methoden ausgelesen und beschrieben werden.<br />
Für alle Register und Variablen, die in der Digilent Dokumentation enthalten<br />
sind, existieren zudem Definitionen in dem Treiber. So kann z.B. die<br />
Auflösung mittels des folgenden Codes eingestellt werden:<br />
camA . variable_write ( CAM_B_OUTPUT_WIDTH , SIZE_X );<br />
camA . variable_write ( CAM_B_OUTPUT_HEIGHT , SIZE_Y );<br />
Für das korrekte Setup der Kamera ist zusätzlich zu dem Treiber detailliertes<br />
Wissen über den verwendeten Kamera-Chip nötig. Eine weitere Vereinfachung<br />
des Treibers durch hinzufügen von Methoden die bestimmte<br />
Optionen setzten wird für den nächsten Sprint vorgeschlagen.<br />
cam_data 1.00.a<br />
Der IP-Core Cam Data wurde ebenfalls von den Projekbetreuern<br />
bereitgestellt, jedoch von uns modifiziert, da er wesentlich<br />
mehr Funktionalität bereitstellte als von uns benötigt. Im wesentlichen<br />
nimmt dieser IP-Core den Datenstrom einer Kamera entgegen und stellt<br />
diese weiteren IP-Cores bereit. Dabei nimmt der Core die Daten mit der<br />
Kamerataktung, das entsprechende Signal heißt cam_clk, entgegen und<br />
gibt diese mit dem FPGA Takt weiter. Das Taktsignal des FPGA heißt pixel_clk.<br />
Die weiteren Datensignale sind in der Abbildung 2.29 dargestellt.<br />
pixel_clk<br />
cam_clk<br />
frame_valid<br />
line_valid<br />
data_valid<br />
data_in [7:0]<br />
cam_data<br />
frame_valid_out<br />
line_valid_out<br />
data_valid_out<br />
data_out [7:0]<br />
Abbildung 2.29: Blockschaltbild des cam_data IP-Core<br />
cam_deserializer 1.00.a<br />
Die Kamera überträgt pro Pixel zweimal 8 Bit<br />
Daten, die zusammengehören. Diese Daten werden in diesem IP-Core zu<br />
jeweils einmal 16 Bit zusammengesetzt, sodass in unserem Fall ein vollständiges<br />
RGB565 Signal ausgegeben wird. Dabei lässt sich dieser Core<br />
flexibel konfigurieren, wie in der Abbildung 2.30 dargestellt.<br />
Es gibt die Möglichkeit die Eingangsdatenbreite einzustellen, wobei die<br />
Ausgangsdatenbreite immer das Doppelte der Eingangsdatenbreite ist. Außerdem<br />
gibt es die Option die Byte- Reihenfolge umzustellen, bei Bedarf auf<br />
106
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.30: Konfigurationmenü des cam_deserializer IP-Cores<br />
107
Kapitel 2. Implementation 10. Oktober 2013<br />
Little-Endian oder Big-Endian. Die Ein- und Ausgangssignale welche dieser<br />
Core erfordert sind in Abbildung 2.31 dargestellt.<br />
pixel_clk<br />
frame_valid_in<br />
line_valid_in<br />
data_valid_in<br />
data_in [7:0]<br />
cam_deserializer<br />
frame_valid_out<br />
line_valid_out<br />
data_valid_out<br />
data_out [15:0]<br />
Abbildung 2.31: Blockschaltbild des cam_deserializer IP-Cores<br />
cam_RGB565_to_RGB888 1.00.a<br />
Von diesem IP-Core wird ein 16 Bit<br />
breites Signal entgegen genommen welches aus 5 Bit Rot, 6 Bit Grün und<br />
5 Bit Blau besteht. Die Farbanteile werden in jeweils gleichbreite 8 Bit Anteile<br />
umgerechnet und als 24 Bit Datenstrom ausgegeben. So kommt es zustande,<br />
das der in Abbildung 2.32 dargestellte IP-Core aus den 16 Bit Eingangssignal<br />
ein 24 Bit breites Ausgangssignal erstellt. Die restlichen Eingangssignale<br />
werden lediglich unverändert an den Ausgang weiter gegeben.<br />
frame_valid_in<br />
line_valid_in<br />
data_valid_in<br />
data_in [15:0]<br />
cam_rgb565_to_rgb888<br />
frame_valid_out<br />
line_valid_out<br />
data_valid_out<br />
data_out [23:0]<br />
Abbildung 2.32: Blockschaltbild des RGB565 zu RGB888 IP-Cores<br />
cam_usb 2.00.a<br />
Dieser IP-Core dient dazu die Daten vom ImageBus<br />
in den Cache des USB IP-Core zu laden. Der IP-Core wurde uns ebenfalls<br />
von den Projektbetreuern bereitgestellt, musste von uns jedoch so erweitert<br />
werden, dass das DataValid Signal ausgewertet wird.<br />
usb_driver 2.00.a<br />
Dieser IP-Core stellt eine USB Verbindung zum PC<br />
her. Der IP-Core wurde unverändert von den Projektbetreuern übernommen.<br />
Der Teil zum Empfang von Bulkdaten enthaltende Teil des IP-Core<br />
wird von dem Projekt jedoch nicht benutzt. Zusammen mit dem IP-Core<br />
108
Kapitel 2. Implementation 10. Oktober 2013<br />
PLB<br />
pixel_clk<br />
frame_valid<br />
line_valid<br />
data_valid<br />
data_out [23:0]<br />
cam_usb<br />
direct_wrClk<br />
direct_wrReq<br />
direct_wrData [31:0]<br />
Abbildung 2.33: Blockschaltbild des Cam-USB IP-Cores<br />
kommt ein Treiber für den Microblaze, welcher ebenfalls unverändert übernommen<br />
wurde.<br />
image_bus 1.00.a<br />
Auch dieser IP-Core kommt unverändert von den<br />
Projektbetreuern. Der Core beschreibt einen Bus, auf dem die Bilddaten<br />
zusammen mit Steuerinformationen zwischen den Cores weitergereicht<br />
werden können. Zusätzlich zu den normalen Steuerdaten berechnet er die<br />
Position des gerade weitergereichten Pixels und reicht diese Information<br />
weiter. Die zu verarbeitende Datenbreite ist frei konfigurierbar.<br />
2.2.2.1 Toolbox Plugin<br />
Damit die OFFIS-Automation-Toolbox Daten von dem FPGA empfangen<br />
kann, wird ein neues Plugin benötigt. Das Plugin schickt dem FPGA über<br />
USB zunächst ein Steuersignal, dass es bereit ist ein Bild zu empfangen.<br />
Danach wird zunächst auf ein Steuersignal vom FPGA gewartet, welches<br />
dem Plugin die Auflösung von dem nächsten Bild mitteilt. Dann wird das<br />
Bild über die USB Bulkdaten Schnittstelle entgegengenommen. Die empfangenen<br />
Daten werden dann in ein OpenCV RGB-Bild umgewandelt.<br />
2.2.2.2 Aufgetretene Probleme<br />
Während des Sprints sind unter anderem die folgenden Probleme aufgetreten:<br />
• Die Kommunikation mit der Kamera erwies sich als schwieriger als<br />
erwartet. Für die Beschreibung der Pinbelegung zwischen Kamera<br />
und FPGA wurde das Demo Projekt von Digilent als Beispiel genommen,<br />
bei welchem jedoch keine Pull-up Widerstands benutzt wurden.<br />
Bei dem von uns genutzten IP-Core sind jedoch Pull-up Widerstands<br />
nötig um eine Kommunikation zu ermöglichen.<br />
109
Kapitel 2. Implementation 10. Oktober 2013<br />
• Die von uns eingesetzte FPGA Platine (Atlys) hat nicht ausreichend<br />
Ein-/Ausgabe Pins, um ein Debugging der Kamera Daten zu ermöglichen.<br />
Um dieses Problem zu umgehen wurde von uns ein neues<br />
Projekt für die Genesys Platine von Digilent angelegt und der Code<br />
so angepasst, dass er auf dieser lauffähig ist.<br />
• Bei der Entwicklung des cam_deserialzer IP-Cores wurde für das<br />
DataValid Signal kein Grundzustand gesetzt. Dies führte zu 200 MByte/s<br />
Datenmüll die an den USB-Core weitergereicht wurden.<br />
• Die VmodCam Dokumentation von Digilent [8], ist sehr spärlich.<br />
Während des Sprints wurden noch zwei verschiedene Datenblätter<br />
von Micron [11] und Aptina [2] gefunden, welche beide den, von der<br />
VmodCam benutzten, Chip produzieren. Außerdem wurde von uns<br />
der Quellcode des Treibers im Linux-Kernel [7] zu Hilfe genommen.<br />
• Die, in der Dokumentation von Digilent beschriebene, Resetsequenz<br />
des Microcontrollers auf Kamera lässt sich nur einmalig ausführen.<br />
Abhilfe verschaffte hier der Quellcode des Linux Kernels, welcher<br />
eine korrekte Resetsequenz enthält.<br />
2.2.2.3 Ausblick<br />
Während des Arbeitspaketes sind mehrere mögliche neue Aufgaben gefunden<br />
worden:<br />
• Der Treiber, der zur Kamera-Konfiguration dient soll noch verbessert<br />
werden. Zur Zeit sind viele Funktionen der Kamera nur durch Auslesen<br />
und Beschreiben der Kameraregister verfügbar. Stattdessen sollten<br />
Methoden angeboten werden.<br />
• Der Treiber zur Kamera Konfiguration benötigt ein sleep(). Hierfür<br />
sollte ein Timer IP-Core zum Projekt hinzugefügt und ein passender<br />
Treiber geschrieben werden.<br />
• Zur Berechnung der Tiefenkarte werden Bilder von beiden Kameras<br />
benötigt. Um zu ermöglichen, dass Bilder von beiden Kameras an den<br />
PC gelangen können soll ein Processor Local Bus (PLB) gesteuerter<br />
Muxer geschrieben werden. Dieser soll 2 ImageBus Eingänge und<br />
einen ImageBus Ausgang haben.<br />
110
Kapitel 2. Implementation 10. Oktober 2013<br />
• Das Übertragen von Bilddaten über die USB Schnittstelle konnte in<br />
diesem Sprint nur durch wählen einer sehr geringen Taktung der<br />
Kamera erreicht werden. Um die Übertragung über USB bei hoher<br />
Kamerataktrate zu gewährleisten soll ein ImageCache IP-Core angelegt<br />
werden.<br />
• Um späteres Debugging zu erleichtern soll eventuell ein HDMI IP-<br />
Core angelegt werden, so dass die Kamerabilder bei maximaler Bildwiederholungsrate<br />
und voller Auflösung ausgegeben werden können.<br />
Hierzu sollte zunächst das Testprojekt der VmodCam betrachtet<br />
werden, um den Arbeitsumfang einschätzen zu können.<br />
111
Kapitel 2. Implementation 10. Oktober 2013<br />
2.2.3 Roboter-Arm<br />
In der Automationsumgebung muss für jedes Gelenk des Roboters ein<br />
Winkel angegeben werden. Dabei wird von einem PC mit dem FPGA über<br />
einen Hardwareabstractionlayer (HAL) via USB kommuniziert. Die Demonstration<br />
der Roboteransteuerung erfolgt im Offis-Automationstool, indem<br />
für die Skriptsprache Python eine C++ Schnittstelle (HAL) zur Ansteuerung<br />
des Roboterarms bereitgestellt wird. Die Roboteransteuerung wird durch<br />
die Umsetzung von Vor- und Rückwärtskinematik realisiert.<br />
2.2.3.1 Ziel<br />
Ziel dieses Sprints ist eine Ansteuerung des Roboterarms in Form von einfacher<br />
Funktionsaufrufe in dem Offis-Automationstool. Unter Ansteuerung<br />
wird zum Einen die direkte Steuerung über Winkel und zum Anderen<br />
die Steuerung über Koordinaten des TCPs verstanden. Die dazu benötigte<br />
Kinematik wird auf dem PC in C++ realisiert. Das in dem Dokument zur<br />
Sprintplanung angekündigte Vorgehen, die Kinematik in Python zu realisieren,<br />
wurde zugunsten der Erschaffung eines Plugins in C++ für die<br />
Offis-Toolbox verworfen. Die spätere Portierung der Kinematik auf den<br />
FPGA ist ebenfalls ein Grund für eine Umsetzung in C++, da auf dem Microblazecore<br />
ebenfalls C++ verwendet wird.<br />
Zu diesem Zweck muss eine Kommunikation der kinematischen bzw. ansteuernden<br />
Algorithmen von dem PC mit dem FPGA realisiert werden (siehe<br />
Abbildung 2.34). Diese Kommunikation verläuft über die USB-Schnittstelle,<br />
wobei ein entsprechender USB-IP-Core bereits existiert. Sowohl auf dem<br />
PC als auch auf dem FPGA muss jedoch ein auf USB aufsetzendes Protokoll<br />
realisiert werden, welches die Kommunikationsmöglichkeiten zwischen<br />
Ansteuerungskommandos auf dem PC und dem FPGA als Befehlsempfänger<br />
definiert. Die fehlenden Elemente der Kommandokette sind in Abbildung 2.34<br />
in Form von rot markierten Schichten dargestellt.<br />
Unter Kinematik wird dabei sowohl die Vorwärts- als auch die Rückwärtskinematik<br />
verstanden, welche das Umrechnen von Winkelstellungen in<br />
Koordinaten Tool-Center-Point (Vorwärtskinematik) bzw. das Umrechnen<br />
von TCP Koordinaten in Winkelstellungen (Rückwärtskinematik) beinhaltet.<br />
Protokoll zwischen FPGA und PC<br />
Aufbauend auf dem USB-Protokoll existiert ein Protokoll (USB-Handler),<br />
über welches die Ansteuerung des FPGAs bzw. des Roboterarms mit dem<br />
112
Kapitel 2. Implementation 10. Oktober 2013<br />
Ansteuerung(Python)<br />
Kinematik(C + +)<br />
HAL(C + +)<br />
PC<br />
Treiber<br />
Hardware<br />
IP − Core(USB)<br />
USB − Handler(C + +)<br />
HAL(C + +)<br />
FPGA<br />
IP − Core(PPM)<br />
Roboterarm<br />
Abbildung 2.34: Steuerungsschichten des Roboterarms (rot markiert = In<br />
diesem Sprint entwickelt)<br />
PC ermöglicht. Die Implementierung des USB-Handlers ist dabei in C++<br />
erfolgt. Die allgemeine Paketstruktur des entwickelten Protokolls hat folgende<br />
Struktur:<br />
type usertype flags servo1 servo2 servo3 servo4 servo5 servo6<br />
1 Byte 1 Byte 1 Byte 2 Byte 2 Byte 2 Byte 2 Byte 2 Byte 2 Byte<br />
servo1_fine servo2_fine servo3_fine servo4_fine servo5_fine servo6_fine<br />
1 Byte 1 Byte 1 Byte 1 Byte 1 Byte 1 Byte<br />
min max padding<br />
2 Byte 2 Byte 4 Byte<br />
Diese fest definierte Paketstruktur wird in folgenden Anwendungsfällen<br />
genutzt:<br />
Kalibrieren<br />
113
Kapitel 2. Implementation 10. Oktober 2013<br />
Sende zu FPGA:<br />
type usertype flags<br />
Calibrate ServoId {left, right, min, max, ranges, fpga}<br />
Erhalte von FPGA:<br />
type usertype flags min max<br />
Calibrate ServoId {min, max, ranges} Max-Grenze Min-Grenze<br />
Setze Millisekunden<br />
Sende zu FPGA:<br />
type servo1 servo2 servo3 servo4 servo5 servo6<br />
SetMs ms ms ms ms ms ms<br />
Setze einen Winkel<br />
Sende zu FPGA:<br />
type usertype servo1 servo1_fine<br />
SetAngle ServoId Winkel<br />
1<br />
19<br />
Winkel<br />
Setze alle Winkel<br />
Sende zu FPGA:<br />
type servo1 servo2 servo3 servo4 servo5 servo6<br />
SetAngles Winkel Winkel Winkel Winkel Winkel Winkel<br />
servo1_fine servo2_fine servo3_fine servo4_fine servo5_fine servo6_fine<br />
1<br />
19 Winkel 1<br />
19<br />
Winkel<br />
1<br />
19<br />
Winkel<br />
1<br />
19<br />
Winkel<br />
1<br />
19<br />
Winkel<br />
1<br />
19<br />
Winkel<br />
Setze Range<br />
Sende zu FPGA:<br />
type usertype min max<br />
SetRange ServoId Min-Grenze Max-Grenze<br />
114
Kapitel 2. Implementation 10. Oktober 2013<br />
Reset<br />
Dateien<br />
Sende zu FPGA:<br />
type<br />
Reset<br />
Die C++ Umgebung, welche mit den QT-Creator erstellt und<br />
bearbeitet wurde umfasst folgende Dateien:<br />
os-toolbox/plugins/automation/RoboArm/RoboArm.cpp<br />
Datei implementiert sämtliche Schnittstellen sowie die Kommunikation<br />
mit dem FPGA über USB. Des Weiteren werden die Kinematiken<br />
von dieser Klasse instanziiert.<br />
os-toolbox/plugins/automation/RoboArm/RoboArm.h<br />
Interface der o.g. Klasse, welche u.a. die Protokollheader als enum<br />
sowie die Schnittstellen zur Offis-Automation als public slot definiert.<br />
os-toolbox/plugins/automation/RoboArm/RoboArmGui.cpp<br />
Teil des Frameworks, welches Teilaufgaben für die Initialisierung der<br />
Schnittstellen übernimmt.<br />
os-toolbox/plugins/automation/RoboArm/RoboArmGui.h<br />
Interface des o.g. Frameworks.<br />
os-toolbox/plugins/automation/RoboArm/RoboArmGui.ui<br />
XML-Datei, welche der Klasse RoboArmGui angehört und der Konfiguration<br />
dient.<br />
os-toolbox/plugins/automation/RoboArm/RoboArmInterface.cpp<br />
In dieser Klasse werden die Namen und Beschreibungen der Methoden<br />
hinzugefügt, welche der Offis-Automation zur Verfügung gestellt<br />
werden soll. Neben den Methoden werden auch Konstanten für die<br />
Kalibrierung bekannt gegeben. Diese Klasse instantiiert die Klasse<br />
RoboArm als sog. lolec mit einer Konfigurationsdatei als Parameter.<br />
os-toolbox/plugins/automation/RoboArm/RoboArmInterface.h<br />
Interface zur o.g. Klasse.<br />
os-toolbox/plugins/automation/RoboArm/RoboArm.pro<br />
Projektdatei, welche den Pfad zur Offis-Automation enthält, sowie<br />
den Dateinamen aller in diesem Abschnitt genannten Klassen.<br />
115
Kapitel 2. Implementation 10. Oktober 2013<br />
os-toolbox/plugins/automation/RoboArm/usb/*<br />
Bereitgestellte Cypress USB-API.<br />
os-toolbox/projects/KinematikTest/cong/robo.ini<br />
Konfigurationsdatei, welche die Ranges der Servos, die Parameter für<br />
die Kinematik, die Anzahl der Links (Bezugssysteme) sowie die relativen<br />
Koordinaten des Tool-Center-Point im letzen Bezugssystem enthält.<br />
Die Offis-Automation, welche eine Python Umgebung bereit stellt, umfasst<br />
folgende Dateien:<br />
os-toolbox/projects/KinematikTest/robocrtl.py<br />
Testumgebung in Python, mit welcher der Roboterarm inklusive Kinematik<br />
über die in 2.2.3.2 und 2.2.3.3 definierten Schnittstellen gesteuert<br />
werden kann.<br />
os-toolbox/projects/KinematikTest/roboArm.pro<br />
Projektdatei, welche u.a. den Pfad zur Konfigurationsdatei enthält.<br />
os-toolbox/projects/KinematikTest/roboArm.oap<br />
Versionierungsdatei, ähnlich der Projektdatei<br />
os-toolbox/projects/KinematikTest/roboArm.ogr<br />
XML-Datei, welche zur Konfiguration der Olvis-Automation dient.<br />
Kongurationsdatei<br />
Die Kalibrierungswerte für die Servos sowie Parameter<br />
der Kinematik können in einer Konfigurationsdatei auf dem PC gespeichert<br />
und später wieder auf den FPGA geladen werden. Im Detail können<br />
folgende Werte gespeichert werden:<br />
• Für jeden Servo werden die Bewegungsbereiche (min und max) gespeichert,<br />
sowie die Denavit Hartenberg-Parameter.<br />
• Die Anzahl der Servos (Links) in dem Modell der Kinematik<br />
• Die relativen Koordinaten des Tool-Center-Point vom letzten Link<br />
Kalibrierung auf dem FPGA<br />
Um die Kalibrierung auf dem FPGA zu<br />
starten wird aus der Python-Umgebung die Funktion cal mit dem Servo<br />
und dem Modus FPGA als Parameter aufgerufen. Anschließend kann die<br />
Kalibrierung über die Buttons des FPGAs vorgenommen werden, wobei<br />
erst das Minimum und danach das Maximum eingestellt und mit dem<br />
116
Kapitel 2. Implementation 10. Oktober 2013<br />
mittleren Button des Tastenkreuzes bestätigt wird Genaueres ist im Abschnitt<br />
Schnittstellen unter dem Punkt FPGA beschrieben (siehe dazu Abbildung<br />
2.36).<br />
2.2.3.2 Vorwärtskinematik<br />
Die Vorwärtskinematik realisiert das Abbilden eines Winkelvektors des<br />
Roboarms auf den Koordinatenvektor des TCP [6] im Inertialsystem 13 . Die<br />
Anzahl der Komponenten im Winkelvektor entspricht dem Freiheitsgrad<br />
eines seriellen Roboters. Jeder Winkelwert entspricht einer Stellung des<br />
entsprechenden rotatorischen Gelenks.<br />
Kinematische Modell<br />
Das kinematische Modell des Roboterarms ist in<br />
Abbildung 2.35 gezeigt. Der Roboterarm besteht aus sechs Festkörpergliedern<br />
und vier Drehgelenke. Da die Drehung des letzten (in Abbildung 2.35 des<br />
obersten) Gelenks keine Auswirkung auf die Koordinate des Tool-Center-<br />
Point im Inertialsystem hat, wird dieses Gelenk im Modell vernachlässigt.<br />
Somit wird das vorletzte sowie das letzte Glied der kinematischen Kette<br />
als ein Glied am Ende der kinematischen Kette betrachtet. Die Längenund<br />
Winkelparameter (s i ), (d i ), (ϕ i ) sowie (ϑ i ) sind nach Denavit Hartenberg-Konvention<br />
[6] wie folgt gegeben:<br />
Kettenglied s i d i ϕ i ϑ i<br />
0 0.0 0.0 0.0 0.0<br />
1 20.0 0.0 0.0 90.0<br />
2 0.0 79.0 90.0 0.0<br />
3 0.0 78.5 0.0 0.0<br />
4 0.0 70.0 0.0 0.0<br />
5 0.0 0.0 0.0 0.0<br />
Die Zeile der Denavit Hartenberg-Tabelle entspricht dem ortsfesten unbeweglichen<br />
Anfangsglied der kinematischen Kette. Dieses steht in keiner<br />
Beziehung zu einem vorherigen Glied, weil es dieses nicht gibt. Darüber<br />
hinaus ist die erste Zeile der Tabelle mit Nullen gefüllt. Das letzte Festkörperglied<br />
wird mit dem Vorletzten wie ein Ganzes betrachtet. Darüber<br />
hinaus ist die letzte (fünfte) Zeile der DH-Tabelle wie die Erste mit Nullen<br />
gefüllt.<br />
13 Inertialsystem, auch das Weltkoordinatensystem genannt, ist das ortsfeste Koordinatensystem<br />
(Bezugssystem), in dem der Roboter beschrieben sowie identifiziert wird. Das<br />
Inertialsystem wird als Basiskoordinatensystem (Basisbezugssystem) dem ersten nicht<br />
beweglichen Teil des seriellen Roboter zugeordnet.<br />
117
Kapitel 2. Implementation 10. Oktober 2013<br />
•<br />
x 3<br />
180°<br />
0°<br />
y 3 z 3<br />
x 2<br />
0° 180°<br />
z y<br />
2<br />
2<br />
180°<br />
y 1<br />
0°<br />
z 1<br />
x 1<br />
y 0<br />
180° z 0 0°<br />
x 0<br />
O 0<br />
Abbildung 2.35: Kinematisches Modell des Roboarms<br />
Datenstruktur (extern)<br />
Für die Modellierung des Roboters wurde die<br />
Datenstruktur angelegt, die den kinematischen Aufbau eines seriellen Roboters<br />
repräsentiert. Die Klasse link repräsentiert einen starren Körper der<br />
kinematischen Kette, Klasse KinematicChain repräsentiert die starren Körper<br />
der kinematischen Kette und ihre räumliche Relationen. Die Initial-<br />
118
Kapitel 2. Implementation 10. Oktober 2013<br />
isierung eines seriellen Roboters mit einer kinematischen Kette erfolgt in<br />
der Klasse Roboarm, die zur Ansteuerung der Hardware über die USB-<br />
Schnittstelle mit FPGA kommuniziert. Die Roboterhardware ist direkt an<br />
das FPGA angeschlossen.<br />
Diese Parameter können gesetzt und gelesen werden. Folgende Dateien<br />
realisieren die Vorwärtskinematik:<br />
os-toolbox/plugins/automation/RoboArm/Link.h<br />
Interface des Modell eines Gliedes der kinematischen Kette.<br />
os-toolbox/plugins/automation/RoboArm/Link.cpp<br />
Implementierung des Modell eines Gliedes der kinematischen Kette.<br />
os-toolbox/plugins/automation/RoboArm/KinematicChain.h<br />
Interface der Vorwärtskinematik.<br />
os-toolbox/plugins/automation/RoboArm/KinematicChain.cpp<br />
Implementierung der Vorwärtskinematik.<br />
Datenstruktur (intern)<br />
Die Klasse Link beinhaltet folgenden Parameter:<br />
• Koordinatenvektor coord eines starren Körpers der kinematischen Kette<br />
im Inertialsystem<br />
• Koordinatenvektor des Tool-Center-Point (TCP), der innerhalb Festkörper<br />
eigenen Bezugssystem liegen kann.<br />
• DH-Parameter als Relationen zwischen Festkörper eigenen Bezugssysteme:<br />
s i (Abstand zwischen Ursprung des Festkörper eigenen Bezugssystem<br />
zur Verbindungsnormalren des nachfolgenden festen Körper), d i<br />
(Länge des festen Körper), ϕ (Winkel zwischen x-Achsen der Festkörper<br />
eigenen Bezugssysteme) sowie ϑ (Winkel zwischen den Drehachsen<br />
der Gelenke).<br />
Die Klasse KinematicChain beinhaltet als Parameter allgemeine parametrisierbare<br />
Transformationsmatrix und ein Feld von Links. Die Methoden dieser<br />
Klasse realisieren den Algorithmus zu Berechnung des Koordinatenvektors<br />
des Tool-Center-Point.<br />
119
Kapitel 2. Implementation 10. Oktober 2013<br />
Algorithmus<br />
Die Vorgehensweise zur Bestimmung der Koordinaten des<br />
Tool-Center-Point im Inertialsystem basiert auf der Umrechnung des Ortsvektor<br />
des Tool-Center-Point im Festkörpersystem des letzten Gliedes der kinematischen<br />
Kette in den Ortsvektor des Inertialsystems [13].<br />
Abbildung 2.35 zeigt die Bezugssysteme jedes einzelnen Festkörpergliedes<br />
der kinematischen Kette. Ein Ortsvektor ⃗r wird im Allgemeinen in einem<br />
anderen Bezugssystem identifiziert, in dem der Ortsvektor mit Hilfe einer<br />
Multiplikation mit Transformationsmatrix T aus seinem Koordinatensystem<br />
i in das Andere i ′ umgerechnet wird. Die allgemeine Formel hierzu<br />
lautet [13]<br />
⃗r i = T i ·⃗r i−1 (2.1)<br />
Die algorithmische Umrechnung in der Klasse KinematicChain erfolgt durch<br />
die sequentielle Umrechnung des Ortsvektors aus dem Koordinatensystem<br />
i + 1 in das i, mit 0 ≤ i ≤ 3 und i ∈ N. Hierbei ist das Bezugssystem mit<br />
Index i = 0 das Inertialsystem.<br />
Für jede Transformation muss es eine bestimmte Transformationsmatrix T i<br />
geben. In dem Fall mit Roboarm wird die allgemeine Tranfsformationstatrix<br />
T i aus Gleichung 2.2 eingesetzt. Die Werte aus der Denavit-Hartenberg<br />
Tabelle werden für die jeweilige Transformation (aus i + 1 in das i) in<br />
die Matrix eingesetzt. Folgende Matrix ist das allgemeine Matrix für die<br />
Drehungen und Verschiebungen nach DH-Konvention [13]:<br />
⎛<br />
⎞<br />
1 0 0 0<br />
T i = ⎜d i · cos(ϕ i ) cos(ϕ i ) − sin(ϕ i ) cos(ϑ i ) sin(ϕ i ) sin(ϑ i )<br />
⎟<br />
⎝d i · sin(ϕ i ) sin(ϕ i ) cos(ϕ i ) cos(ϑ i ) − cos(ϕ i ) sin(ϑ i ) ⎠ (2.2)<br />
s i 0 sin(ϑ i ) cos(ϑ i )<br />
Durch das Einsetzen von Werten aus Denavit Hartenberg-Tabelle wird die<br />
allgemeine Transformationsmatrix T i für jede Transformation parametrisiert.<br />
Durch die Parametrisierung dieser Matrix entsteht für jedes Paar der Bezugssysteme<br />
der kinematischen Kette (i, i + 1) die entsprechende Transformationsmatrix<br />
für die jeweilige Vektortransformation. Der Vektor r i+1 ⃗ wird durch<br />
Ausführung der in der Gleichung 2.1 definierten Operation zum Vektor<br />
⃗r i transformiert und auf dem Koordinatensystem i identifiziert. Der neu<br />
identifizierter Vektor ⃗r i wird in der entsprechenden Instanz von Link abgespeichert<br />
und für die weitere Transformation benutzt. Die Winkel ϑ 0 bis<br />
ϑ 3 werden einmalig ausgerechnet und für die gegebene Hardwarekonfiguration<br />
stets festgehalten. Die Winkel ϕ 0 bis ϕ 3 sind dagegen variabel. [13]<br />
Diese geben zu einer Stellung des Roboterarms einen Winkelvektor an.<br />
120
Kapitel 2. Implementation 10. Oktober 2013<br />
Einschränkungen der Hardware<br />
Durch die Einschränkungen der Hardware<br />
entspricht das kinematische Modell, das durch die DH-Tabelle beschrieben<br />
ist, nicht direkt der echten kinematischen Kette des Roboters. Um trotzt<br />
dieser Diskrepanz dennoch den richtigen Ortsvektor aus den Winkelvektoren<br />
anzugeben, werden die Winkel ϕ i , die für die Hardware gelten, auf<br />
die Winkel des Modells abgebildet. Die fett markierten Kurven in Abbildung<br />
2.35 bezeichnen die Drehrichtung der Servos. Daraus wird deutlich,<br />
dass beispielhaft ein Winkel von 90 ◦ um die Achse z 3 des Modells nicht<br />
dem Winkel von 90 ◦ des Servomotors entspricht, der die Drehung um die<br />
Achse z 3 realisiert.<br />
Die Diskrepanz kommt dadurch zustande, dass die Hardware von dem<br />
Kunden/Benutzer fertig vorgegeben und nicht zuvor modelliert wurde.<br />
Der konventionelle Maschinenbau vor allen der Maschinenbau der seriellen<br />
Roboter erfolgt angefangen mit einem Modell [6]. Im Fall mit Roboarm<br />
musste die gegebene Hardware nach modelliert werden. Dies ist mit Hilfe<br />
von DH-Konventionen und der Abbildung von realen Winkel auf die vom<br />
Modell gelungen. Der Koordinatorvektor des Tool-Center-Point wird durch<br />
den oben geschriebenen Algorithmus zu jedem zulässigen Winkelvektor<br />
angegeben.<br />
Schnittstellen<br />
In dem C++ Hostsystem werden diverse Methoden als<br />
Schnittstelle zu Python bereitgestellt, mit denen der Roboterarm gesteuert<br />
werden kann. Diese Methoden sind in der oben beschriebenen Datei RoboArmInterface<br />
als Schnittstelle angegeben und im folgenden erläutert.<br />
void acquireHardware () ;<br />
Stellt eine Verbindung zur Hardware her und setzt die Denavit Hartenberg-Parameter<br />
sowie den Tool-Center-Point. Der Aufruf dieser Methode<br />
zu Beginn der Steuerung des Roboterarms ist zwingend erforderlich.<br />
void releaseHardware () ;<br />
Schließt die Verbindung zur Hardware. Nach dem Aufruf dieser Methode<br />
werden keine anderen Kommandos außer acquireHardware akzeptiert.<br />
void setServoMs ( RcRepeatable < int , 1, 6> list );<br />
Setzt die Servoposition in Mikrosekunden. Wenig erfahrende Benutzer sollen<br />
statt dessen die Methode setAngel(s) verwenden.<br />
121
Kapitel 2. Implementation 10. Oktober 2013<br />
void calibrate ( int servoId , int mode );<br />
Kalibriert einen einzigen Servo. Diese Methode benötigt eine spezielle Markierung,<br />
welche den Kalibrierungsmodus codiert (siehe Kalibrierungsmarkierung<br />
später im Text).<br />
void setAngle ( int servoId , double angle );<br />
Setzt den Winkel eines einzelnen Servos in Grad. Der Wertebereich eines<br />
Winkels geht von 0 bis 195 Grad und die feinen Winkel von 0.0 bis 0.99<br />
Grad.<br />
void setAngles ( RcRepeatable < double , 1, 6> angles );<br />
Setzt die Winkel von jedem Servo in Grad. Der Wertebereich ist der gleiche<br />
wie bei der Methode setAngle.<br />
void reset () ;<br />
Sendet ein Reset für alle Servo-IP-Cores an den FPGA.<br />
void setRange ( int servoId , int min , int max );<br />
Setzt den minimalen und maximalen Bewegungsbereich von einem Servo.<br />
Der Bereich wird in Mikrosekunden angegeben.<br />
void loadRanges () ;<br />
Lädt die Bewegungsbereiche von allen Servos von der Datei robi.ini und<br />
sendet diese an den FPGA. Die Methode acquireHardware führt loadRanges<br />
aus und lädt die Bewegungsbereiche bereits zur Startzeit.<br />
void saveRange ( int servoID , int min , int max );<br />
Schreibt den Bewegungsbereich (min bis max) eines Servos in die Konfigurationsdatei<br />
robo.ini.<br />
void saveRangesFromFPGA () ;<br />
Fragt den Bewegungsbereich aller Servos vom FPGA ab und schreibt diese<br />
in die Konfigurationsdatei robo.ini<br />
void setDHParameters ( int index , double si , double di ,<br />
double phi , double theta );<br />
122
Kapitel 2. Implementation 10. Oktober 2013<br />
Setzt die Denavit Hartenberg-Parameter für die Kinematik. Zu setzen sind<br />
der Index des Links, der Gelenkabstand, die Länge eines Links, die Rotation<br />
der x-Achse (Gelenkwinkel) und die Rotation der Z-Achse (Verwindung).<br />
void setLastLinkTCP ( double x , double y , double z);<br />
Setzt den Tool-Center-Point des letzten Links. Der TCP ist der relative Vektor<br />
des letzten Bezugssystems.<br />
QVector3D getTCP () ;<br />
Gibt die Koordinaten des TCPs als Vektor (x, y, z) im Intertialsystem zurück.<br />
Darüber hinaus sind folgende Kalibrierungsmarkierungen als Konstanten<br />
im Python benutzbar:<br />
Min Bestätigt Minimalwert eines Servos. Entspricht Ok-Button für linksseitige<br />
Kalibrierung.<br />
Max Bestätigt Maximalwert eines Servos. Entspricht Ok-Button für rechtsseitige<br />
Kalibrierung.<br />
Left Fährt den Servo um 50µs nach links (Addiert µs).<br />
Right Fährt den Servo um 50µs nach rechts (Subtrahiert µs).<br />
Initpos Fährt den Servo auf eine Initialposition (approximierte Mitte)<br />
Fpga Ermöglicht eine Kalibrierung über die Tasten des FPGAs (erst links,<br />
dann rechts kalibrieren). Abbildung 2.36.<br />
Mit der Markierung Fpga wird der Kalibrierungsmodus auf dem FPGA<br />
aktiviert. Die obere und unteren Tasten des Tastenkreuzes auf dem FPGA-<br />
Board stehen jeweils für eine Erhöhung und Verringerung des PPM-Signals<br />
um 100µs, was einer approximierten, empirisch festgestellten Drehung des<br />
Gelenks um einem Grad (+/- 10 ◦ ) entspricht. Die linke und rechte Tasten<br />
bewirken jeweils eine Erhöhung und Verringerung des PPM-Signals<br />
um 10µs, was einer approximierten, empirisch festgestellten Drehung des<br />
Gelenks um ein zwanzigstel eines Grades (+/- 1 ◦ ) entspricht. Die mittlere<br />
Taste (OK) steht für Bestätigung des PPM-Signals.<br />
Das Protokoll für diese Kalibrierung sieht wie folgt aus: Durch die USB-<br />
Message wird die Nummer des zu kalibrierenden Servo und der Markierung<br />
123
Kapitel 2. Implementation 10. Oktober 2013<br />
y 3<br />
x 3<br />
•<br />
z 3<br />
x2<br />
z2<br />
y2<br />
FPGA<br />
y 1<br />
z 1<br />
x 1<br />
y 0<br />
OK<br />
Atlys-Board<br />
- 100µS ( -10°)<br />
-10µS ( -1°)<br />
+ 100µS ( +10°)<br />
+10µS ( +1°)<br />
z 0<br />
O 0<br />
x 0<br />
Abbildung 2.36: Kalibrierung der Drehwinkel der Gelenke mit den Tasten<br />
auf dem FPGA-Board.<br />
Fpga zum USB-Chip des FPGA-Boards geschickt. Durch das Betätigen der<br />
Tasten wird das PPM-signal für den Servo angepasst. Der Servo stellt sich<br />
entsprechend dem PPM-Signal in eine bestimmte Winkelstellung hin. Nach<br />
dem ersten Betätigen der Taste OK wird das aktuelle PPM-Signal und für<br />
die Stellung von 0 ◦ auf dem FPGA festgehalten. Nach dem zweiten Betätigen<br />
der Taste OK wird das aktuelle PPM-Signal für die Stellung von 190 ◦<br />
festgehalten.<br />
2.2.3.3 Rückwärtskinematik<br />
Ziel der Rückwärtskinematik ist eine Umrechnung eines gegebenen TCPs<br />
in Winkelstellungen der Gelenke des Roboterarms. Dabei muss über die<br />
Pythonumgebung der Offis-Toolbox auf die errechneten Winkel zugegriffen<br />
werden können. Im Folgenden werden unter anderem das Funktionsprinzip,<br />
der Algorithmus, verwendete Datenstrukturen sowie aufgetretene<br />
Probleme erläutert.<br />
124
Kapitel 2. Implementation 10. Oktober 2013<br />
Funktionsprinzip<br />
Die Winkel der Gelenke werden in der aufsteigenden Reihenfolge (von 0<br />
bis 3) durch die Buchstaben α, β, γ sowie δ bezeichnet. Jede Drehachse Z<br />
in Abbildung 2.35 entspricht einem Gelenkwinkel. Denn die Drehung im<br />
Roboarm erfolgt stets um die Z-Achsen.<br />
Die Rückwärtskinematik wird in der Regel durch die algebraische Methode<br />
realisiert. Hier wird durch die Rücktransformation des Ortsvektor und der<br />
Lage des Tool-Center-Point aus dem Inertialsystem in die nachfolgenden<br />
Koordinatensysteme i, i + 1, · · · n auf den Winkelvektor abgebildet.<br />
Der Roboarm besitzt höchstens fünf Freiheitsgrade. die Abbildung 2.35<br />
zeigt jedoch, dass der fünfte Freiheitsgrad keinen Einfluss auf die Position<br />
des TCP hat. Dadurch ist der Roboarm als serieller Roboter ein 4<br />
Freiheitsgrade degradierter Roboter. Aufgrund dieser Tatsache lässt sich<br />
die Lage des TCP für die Rückwärtskinematik nicht festlegen, was bei der<br />
Berechnung der Rückwärtskinematik der Fall ist. Die Recherche und die<br />
Rechnerische Bestimmung der möglichen Lage ist aufgrund des großen<br />
Zeitaufwandes innerhalb der Sprintregelzeit nicht machbar. Außerdem zeigte<br />
die Berechnung der ersten Transformationsmatrizen, dass nicht einmal die<br />
doppelte Zeit dafür ausreichen wird. Zusätzlich existiert die Gefahr, dass<br />
eine algebraische Lösung eine sehr eingeschränkte Anfangslage des TCP<br />
zulässt, sodass die zu Verfügung stehenden Freiheitsgrade nicht im vollen<br />
Umfang benutzt werden können.<br />
Aufgrund der o. g. Tatsachen wird zu der geometrischen Lösung gegriffen.<br />
Die geometrische Lösung liefert im Falle mit dem Roboarm sofort aus<br />
der TCP den ersten Winkel α der kinematischen Kette. Da die restlichen<br />
Drehachsen bis auf die Drehachse des TCP zueinander parallel sind, wird<br />
die Bestimmung der Winkel β, γ sowie δ auf ein planares Problem reduziert.<br />
Abbildung 2.37 zeigt den Drehwinkel α des ersten Gelenks des Roboters.<br />
Der Tool-Center-Point ist im Raum durch den Koordinatenvektor/seinen<br />
Ortsvektor (X, Y, Z) identifiziert. Um das Problem der Winkelbestimmung<br />
auf ein planares Problem zu reduzieren, wird der ganze Roboarm um die<br />
z-Achse des Inertialsystems virtuell gedreht. Die Drehung erfolgt immer in<br />
eine Richtung (im Uhrzeiger Sinn).<br />
Dabei erfolgt die Drehung um genau den Winkel, so dass der Tool-Center-<br />
Point sich genau über der x-Achse nach der Drehung befindet. Wenn die<br />
y-Koordinate des TCP positiv ist, dann wird die Drehung um den Winkel α<br />
ausgeführt. Falls die y-Koordinate des TCP negativ ist, die Drehung wird<br />
125
Kapitel 2. Implementation 10. Oktober 2013<br />
z 0<br />
x 0<br />
.<br />
y 0<br />
•<br />
.<br />
.<br />
⍺<br />
Abbildung 2.37: Der TCP befindet sich im 3D-Raum. Der Winkel α wird<br />
geometrisch bestimmt.<br />
z 0<br />
x 0<br />
135°<br />
45°<br />
225° ≡ 45°<br />
315° ≡ 135°<br />
Abbildung 2.38: Winkeläquivalenz für die virtuelle Drehung.<br />
um den Winkel (180 ◦ − α) ausgeführt. In Abbildung 2.38 ist die Äquivalenz<br />
der der Winkel in unterschiedlichen Quadranten gezeigt. Der Winkel<br />
zwischen TCP-Lot und x-Achse muss für die zueinander diagonal liegenden<br />
Quadranten stets gleich sein. Denn die Hardware des Roboarm nur in<br />
oberen beiden Quadranten agiert.<br />
Nach der Drehung um die z-Achse sieht der Roboarm beispielhaft wie in<br />
Abbildung 2.39 aus. Wegen der Parallelität aller Drehachsen der Gelenke<br />
kann der Winkel α des Roboarms nach der Drehung vernachlässigt werden.<br />
Durch die Drehung um die z-Achse wurde es erreicht, dass ausschließlich<br />
126
Kapitel 2. Implementation 10. Oktober 2013<br />
z 0<br />
x 0<br />
γ<br />
δ<br />
•<br />
β<br />
Abbildung 2.39: Nach der Drehung um die z-Achse befindet sich der TCP<br />
genau über der x-Achse. Der TCP ist im 2D-Raum<br />
die Winkel β, γ sowie δ die Position des Tool-Center-Point beeinflussen.<br />
Die y-Koordinate des TCP ist damit stets gleich Null. Die Bestimmung<br />
der Winkel β, γ sowie δ für die gegebene Position des TCP ist jetzt ein<br />
zweidimensionales Problem auf der planaren Ebene, die durch die Achsen<br />
x und z aufgespannt wird.<br />
Algorithmus<br />
1. Sobald die inverse Kinematik mit einem Configfile initialisiert ist,<br />
kann über die Methode getAnglesFromTCP ein Tool-Center-Point übergeben<br />
werden. Dieser wird zunächst bezüglich seiner Gültigkeit geprüft.<br />
Befindet sich der TCP außerhalb der Reichweite oder zu nahe an dem<br />
Roboterarm, ist der TCP als ungültig zu bewerten und der Algorithmus<br />
bricht mit einer Fehlermeldung und der Übergabe von Nullwerten<br />
für alle Winkel ab. Die Nullwinkel sind eine valide Winkelstellung<br />
an denen ein Fehler auch ohne Debug-Ausgabe erkannt werden<br />
kann.<br />
2. Ist der TCP valide, wird zunächst der unterste Drehwinkel α (vgl.<br />
Abbildung 2.37) berechnet und global gespeichert. Die Berechnung<br />
erfolgt anhand einer Sicht von oben auf den Roboterarm, sodass sich<br />
aus der Ursprungspunkt und der TCP mit Hilfe eines weiteren Punktes<br />
auf der x-Achse ein rechtwinkliges Dreieck konstruieren lässt. Al-<br />
127
Kapitel 2. Implementation 10. Oktober 2013<br />
pha ergibt sich also aus:<br />
α = cos −1 Ankathete<br />
(<br />
Hypothenuse ) (2.3)<br />
Die Hypothenuse ist die Strecke vom TCP zum Basispunkt, während<br />
die Ankathete die Strecke vom TCP zur x-Achse darstellt. Bei der<br />
Berechnung von α tritt eine Besonderheit auf, wenn der TCP im negativen<br />
y-Bereich liegt. Ist dies der Fall wird der Winkel anhand eines<br />
negierten X-Wertes berechnet. Damit ist sichergestellt, dass sich der<br />
Roboterarm von den zwei Drehmöglichkeiten die kürzeste aussucht,<br />
wobei die kürteste aufgrund der eingeschränten Servos (maximal ca.<br />
180°) gleichzeitig die einzig mögliche ist. Ein Winkel von nicht erreichbaren<br />
315°wird beispeisweise auf einen Winkel von 135°umgerechnet.<br />
Die Abbildung 2.38 verdeutlicht die Äquivalenz zwischen den beiden<br />
unterschiedlichen Winkelstellungen, in Anbetracht der Tatsache, dass<br />
sich der Roboterarm in beide Richtungen bewegen bzw. beugen (vgl.<br />
Abbildung 2.39) kann.<br />
3. Ist der Drehwinkel α bestimmt, wird der dreidimensionale TCP um<br />
den negierten Winkel α mit Hilfe einer Rotationsmatrix gedreht, sodass<br />
seine y-Koordinate Null ergibt. Ab sofort kann der TCP als<br />
zweidimensionaler Punkt (x, z) aufgefasst werden. Aus der Abbildung<br />
2.39 geht hervor, dass zur Bestimmung der Winkel β, γ, δ eine<br />
planaren Ebene ausreicht. Das gesamte dreidimensionale Problem<br />
wird in ein planares, zweidimensionales Problem transformiert.<br />
4. Ausgehend von dem planaren System werden zwei Kreise gebildet,<br />
wobei sich ein Kreis K TCP um den TCP mit dem Radius (Abstand<br />
TCP zum Mittelpunt des vierten Gelenks) befindet. Der zweite Kreis<br />
K Base liegt um den Mittelpunkt des zweiten Gelenks.<br />
5. Anschließend wird die kürzeste Strecke zwischen den beiden Kreisen<br />
anhand der Schnittpunkte einer Geraden durch die Kreismittelpunkte<br />
berechnet.<br />
Die Formel ergibt sich aus dem Gleichsetzen der Geradengleichung<br />
sowie der Kreisgleichung<br />
y = mx + b (2.4)<br />
r 2 = (x − x m ) 2 + (y − y m ) 2 (2.5)<br />
128
Kapitel 2. Implementation 10. Oktober 2013<br />
Kreis K TCP<br />
thirdframeRadius<br />
•<br />
TCP<br />
•<br />
P inters2<br />
•<br />
P δ1<br />
P δ3<br />
secondFrameOrigin<br />
•<br />
P γ2<br />
••<br />
•<br />
•<br />
•<br />
P γ1<br />
P inters1<br />
P δ2<br />
Abstand d s<br />
zw.<br />
Kreisen<br />
• P δ4<br />
thirdframeRadius<br />
baseRadius<br />
Kreis K Base<br />
Abbildung 2.40: Fall 1: Kreis um TCP (grün) und Basis (schwarz) überlappen<br />
sich nicht<br />
, wobei (x m /y m ) den Kreismittelpunkt definiert. Durch das Gleichsetzen<br />
ergibt sich nach Umstellung folgende Gleichung für x-Koordinaten<br />
beider Schnittpunkte:<br />
x 1,2 = ±√ −b 2 −2bmx m +2by m −m 2 x 2 m+m 2 r 2 +2mx m y m −y 2 m+r 2 −bm+my m +x m<br />
m 2 +1<br />
Die y-Koordinaten dieser Schnittpunkte werden durch Einsetzen in<br />
2.4 ermittelt. Dadurch werden zwei Schnittpunkte vom Kreis und<br />
Gerade eindeutig bestimmt, welche im nächsten Schritt Verwendung<br />
finden. Da die Gerade durch die Mittelpunkte zweier Kreise verläuft,<br />
hat die Gleichung immer zwei Lösungen. Sollte die Gerade vertikal<br />
verlaufen, wäre sie nicht durch die Gleichung y = mx + b beschreibbar,<br />
da ein x-Wert auf unendlich viele y-Werte abbildet. Um dieses<br />
Problem zu lösen, werden in diesem Fall die x- und y-Werte der beiden<br />
Kreismittelpunkte vertauscht und später für die Schnittpunkte<br />
wieder zurückgetauscht.<br />
6. Danach wird eine Fallunterscheidung durchgeführt. Die Abbildung 2.40<br />
(Fall 1) und Abbildung 2.41 (Fall 2) verdeutlichen die beiden Fälle.<br />
Im ersten Fall haben die beiden Kreise K Base und K TCP keinen oder<br />
129
Kapitel 2. Implementation 10. Oktober 2013<br />
einen Schnittpunkt, währen sich die Kreise in dem zweiten Fall in<br />
zwei Punkte schneiden, der TCP also nahe an der Basis liegt. Die<br />
Schnittpunkte zweier Kreise werden bestimmt durch:<br />
dx = KreisB x − KreisA x (2.6)<br />
dy = KreisB y − KreisA y (2.7)<br />
Damit kann die Entfernung d der Kreismittelpunkte berechnet werden:<br />
d = √ dx · dx + dy · dy (2.8)<br />
Der Pythagoras zwischen beiden Radien der Kreise und Abstand<br />
zwischen den Kreismittelpunkten:<br />
a = radius A · radius A − radius B · radius B + d · d<br />
2 · d<br />
(2.9)<br />
Die Hordale h, welche eine Gerade darstellt, die über die Schnittpunkte<br />
der Kreise verläuft.<br />
h = √ radius A · radius A − a · a (2.10)<br />
Die zwei Schnittpunkte ergeben sich dann aus:<br />
• X-Wert: S 1,2 = KreisA x + a d · dx ± h d · dy<br />
• Y-Wert: S 1,2 = KreisA y + a d · dy ± h d · dx)<br />
Fall 1 (Kreise überlappen sich nicht)<br />
• Um die obigen Schnittpunkte aus der Formel werden in<br />
diesem Schritt Kreise mit dem Radius thirdFrameRadius (Länge<br />
des Verbindungsstücks zwischen dritten und viertem Link)<br />
gelegt.<br />
Diese Kreise werden mit dem Kreis K Base geschnitten und<br />
man erhält zwei Lösungen für den Punkt des dritten Links<br />
(Gamma) P γ<br />
• Um die beiden Gammapunkte P γ1 und P γ2 werden wiederum<br />
Kreise mit dem Radius thirdFrameRadius (Länge des Verbindungsstücks<br />
zwischen dem zweiten und dritten Link) gelegt. Diese beiden<br />
Kreise werden mit dem Kreis um den TCP K TCP geschnitten.<br />
Insgesamt ergeben sich daraus vier Schnittpunkte, welche<br />
130
Kapitel 2. Implementation 10. Oktober 2013<br />
mögliche Lösungen für den Punkt des vierten Links (Delta)<br />
P δ ergeben.<br />
thirdframeRadius<br />
•<br />
Kreis K TCP<br />
•<br />
•<br />
•<br />
•<br />
TCP<br />
secondFrameOrigin<br />
•<br />
•<br />
•<br />
thirdframeRadius<br />
baseRadius<br />
•<br />
Kreis K Base<br />
„Notbremsekreis“<br />
Abbildung 2.41: Fall2: Kreis um TCP (grün) und Basis (schwarz) überlappen<br />
sich<br />
Fall 2 (Kreise überlappen sich)<br />
• Zuerst wird zu der Verbindungsgeraden zwischen den Kreismittelpunkten<br />
von K Base und K TCP eine orthogonale Gerade<br />
berechnet.<br />
• Es folgt eine Berechnung der Schnittpunkte zwischen der orthogonalen<br />
Gerade und dem Kreis K TCP . Die Schnittpunkte<br />
ergeben die beiden möglichen Punkte des vierten Links P δ .<br />
• Um die beiden Punkte P delta1 und P delta2 wird jeweils ein<br />
Kreis mit dem Radius thirdFrameRadius (Länge des Verbindungsstücks<br />
zwischen dritten und viertem Link) gelegt.<br />
Anschließend werden die Schnittpunkte der beiden Kreise<br />
mit dem Kreis K Base berechnet.<br />
• Sollte es keine Schnittpunkte geben wird die Orthogonale<br />
so lange in Richtung des Basispunkts (secondFrameOrigin)<br />
131
Kapitel 2. Implementation 10. Oktober 2013<br />
bewegt, bis es entweder Schnittpunukte gibt oder die Gerade,<br />
btw der TCP zu naha an den Basispunkt herankommt<br />
(Notbremse), vgl. Abbildung 2.41. Daraus resultieren die vier<br />
möglichen Lösungen für die Punkte des dritten Links<br />
(Gamma) P γ .<br />
7. Aus den soeben berechneten Punkten können im Anschluss Lösungen<br />
für die Winkel berechnet werden. Abbildung 2.42 zeigt die resultierenden<br />
Punkte aus dem Schneiden der Kreise.<br />
P γ2<br />
•<br />
γ<br />
P δ2<br />
P δ3<br />
P δ1<br />
•<br />
δ<br />
•<br />
δ‘<br />
P<br />
• δ4<br />
•<br />
β<br />
•<br />
β‘<br />
P γ1<br />
• γ‘<br />
Abbildung 2.42: Winkelberechnung aus den Ergebnispunkten<br />
Anhand der Abbildung 2.42 wird das Hauptproblem der Rückwärtskinematik<br />
verdeutlicht: Es gibt mehrere Möglichkeiten die Links des<br />
Roboters anzuordnen um den vorgegebene Position des Tool-Center-<br />
Point zu erreichen. Die unterschiedlichen Varianten sind mit den unterschiedlichen<br />
Farben dargestellt. Aus den Punkten werden die Winkel<br />
berechnet. Zu jeder Variante existiert dann ein Winkelvektor. Maximal<br />
gibt es bei der oben beschriebenen Lösung vier Winkelvektoren. Die<br />
unzulässigen Winkelvektoren werden mit Kostenfunktion verworfen<br />
sowie aus den zulässigen der beste Winkelvektor ausgewählt. Die<br />
Kostenfunktion wird später ausführlicher beschrieben.<br />
Die Berechnung der Winkel erfolgt mit Hilfe einer trigonometrischen<br />
Funktion. Dabei muss berücksichtigt werden, wie die Punkte liegen,<br />
sodass ggf. 360°- Winkel gerechnet werden muss. Abbildung 2.42<br />
zeigt z. B. die Winkel λ und λ ′ . Dabei wird der Winkel stets gegen<br />
132
Kapitel 2. Implementation 10. Oktober 2013<br />
den Uhrzeiger Sinn gemessen. Es ist nicht leicht zu unterscheiden, ob<br />
der innere oder der äußere Winkel genommen wird.<br />
Die Berechnung des Winkels durch die unten beschrieben Funktion<br />
liefert stets den kleinsten (inneren) Winkel zwischen zwei Links (Kettenglieder).<br />
Dieses Problem ist in der Sektion Probleme 2.2.3.3 (dritter<br />
Punkt) erläutert. Die Formel zum Berechnen der Winkel ist der Kosinussatz,<br />
der sich bei drei bekannten Punkten (jedoch drei unbekannten<br />
Winkeln) eines Dreiecks anbietet. Die Seiten a, b, c ergeben sich<br />
aus dem Abstand der Punkte zueinander:<br />
Winkel = cos −1 ( a2 + b 2 − c 2<br />
) (2.11)<br />
2ab<br />
8. Die verschiedenen Lösungswinkel werden, bevor die günstigste Lösung<br />
herausgefiltert wird, vom Modell auf die Hardware (Servos)<br />
umgerechnet. Dabei wird die Drehrichtung der einzelnen Servos gemäß<br />
Abbildung 2.35 berücksichtigt, sodass ein Wertebereich von 0°bis 180°entsteht.<br />
9. Um die günstigste Lösung für Menge an Lösungswinkeln für β, γ, δ<br />
zu finden, werden zunächst im Rahmen einer Kostenfunktion alle von<br />
den Servos nicht erreichbare Winkel aussortiert. Anschließend wird<br />
die Summe der ursprünglichen und der möglichen neuen Winkel<br />
berechnet und verglichen. Das Tupel von Winkel, welches den niedrigsten<br />
Abstand aufweisen bleibt zusammen mit dem bereits verwendeten<br />
Winkel α als finale Lösung übrig.<br />
Der errechnete Winkelvektor kann anschließend über die Schnittstelle zum<br />
setzen der Winkel an den RoboterArm übergegeben werden.<br />
Datenstruktur (extern)<br />
os-toolbox/plugins/automation/RoboArm/InverseKinematic.h<br />
Interface der Rückwärtskinematik.<br />
os-toolbox/plugins/automation/RoboArm/InverseKinematic.cpp<br />
Implementierung der Rückwärtskinematik.<br />
Datenstruktur (intern)<br />
Die Rückwärtskinematik rechnet mit diversen geometrischen Objekten, dessen<br />
Datenstruktur im Folgenden erläutert wird. Die planare y-Koordinate entspricht<br />
der z-Koordinate des Intertialsystems gemäß Abbildung 2.35. Sämtliche in<br />
unten genannter Datenstruktur gespeicherten Werte sind vom Typ double.<br />
133
Kapitel 2. Implementation 10. Oktober 2013<br />
Kreis<br />
Kreise werden als QVector3D in der Form (x, y, r) gespeichert, wobei<br />
x, y die planaren Koordinaten des Kreismittelpunktes sind und r den<br />
Radius des Kreises darstellt.<br />
Punkt<br />
Punkte werden als QVector2D in der Form (x, y) dargestellt, wobei<br />
es sich dabei um planare Koordinaten handelt. Globale Punkte sind<br />
beispielsweise secondFrameOrigin, thirdFrameOrigin sowie f ourthFrame-<br />
Origin, welche den Ursprung der Bezugssysteme für das zweite, dritte<br />
bzw. vierte Gelenk bilden.<br />
Winkel<br />
Winkel werden als QVector3D bzw. QVector4D in der Reihenfolge<br />
α, β, γ, δ dargestellt, wobei der Winkel α lediglich in dem QVector4D<br />
kodiert ist. Da für α lediglich eine Lösung berechnet wird, befindet<br />
sich in der globalen Variable QVector < QVector3D > solutions eine<br />
Sammlung möglicher Lösungen für die Winkel β, γ, δ (siehe Abbildung<br />
2.39).<br />
Schnittstelle<br />
QVector4D getAngleVector ( double x , double y , double z);<br />
Diese Schnittstelle zur Rückwärtskinematik erlaubt die Übergabe eines Tool-<br />
Center-Point in Form von dreidimensionalen Koordinaten. Die Reihenfolge<br />
der Koordinaten ist in Abbildung 2.35 festgelegt und bezieht sich<br />
auf das Intertialsystem. Zurückgegeben wird ein QVector4D, in welchem<br />
die Winkel mit der Reihenfolge α, β, γ, δ kodiert sind, wobei in Bezug auf<br />
den Roboterarm von unten nach oben gezählt wird, sodass α den untersten<br />
Drehwinkel des Roboterarms repräsentiert.<br />
Probleme<br />
Im Rahmen dieses Arbeitspakets ergaben sich folgende Problematiken für<br />
die Vorwärtskinematik:<br />
• Die Einarbeitung in das Qt-Framework, welches via USB mit dem<br />
FPGA kommuniziert stellte sich als zeitaufwändig heraus<br />
• Die Aufstellung der Transformationsmatrix wurde in der Fachliteratur<br />
unterschiedlich dargestellt<br />
134
Kapitel 2. Implementation 10. Oktober 2013<br />
Bei der Entwicklung der Rückwärtskinematik sind folgende Probleme aufgetreten:<br />
Im Allgemeinen hat es lange gedauert, bis das Konzept der Rückwärtsrechnung<br />
vollständig geklärt war und ein algebraisches Realisierunskonzept<br />
erarbeitet wurde. Hierfür sind folgende Schritte notwendig:<br />
1. Die Matrizen für Rückwärtsrechnung für jeden Winkel aufstellen.<br />
2. Diese Matrizen multiplizieren und daraus die allgemeine inversen<br />
Matrix T bestimmen.<br />
3. Matrizen der Vorwärtsrechnung miteinander multiplizieren zur allgemeinen<br />
Matrix T.<br />
4. Den Ortsvektor des Tool-Center-Point mit der allgemeinen inversen<br />
Matrix T multiplizieren.<br />
5. Die Lage des TCP bestimmen und als Zahlenmatrix angeben.<br />
Die obigen Schritte kosten sehr viel Zeit, weil sie manuell berechnet werden<br />
mussten. Durch die Fehleranfälligkeit der Berechnung großer Matrizen<br />
mussten einige Rechnungen verworfen und neu angefangen werden. Da<br />
die Rechenschritte sehr stark voneinander abhängen ist kein einziger Fehler<br />
zulässig. Um den mathematischen Zeitaufwand zu reduzieren wurden elektronischen<br />
Hilfsmittel hinzugezogen. Als erste Hilfsmittel hat der Internetdienst<br />
www.wolframalpha.com fungiert, was unglücklicherweise durch<br />
maximale Zeichen in der Eingabe beschränkt war. Daraufhin wurde eine<br />
Testversion des mathematischen Tools Matlab installiert, welches die dynamische<br />
Berechnung der Matrizen erheblich beschleunigt hat. Weitere<br />
Schritten sind:<br />
6. Die allgemeine Matrix T mit dem Lagevektor und mit dem TCP multiplizieren<br />
und rechnerisch als Zahlenmatrix angeben.<br />
7. Das Ergebnis der Multiplikation mit T (−1) · TCP gleichsetzen<br />
Schritte 5. und 6. waren aufgrund der sehr oberflächlichen Beschreibungen<br />
aus der Fachliteratur kaum ersichtlich. Dieser Schritt wurde erst klar, nachdem<br />
zur Verifizierung der bis zum genannten Schritte eine akademisch<br />
ausgebildete Fachperson zur Hilfe gerufen wurde. Bis zu diesem Zeitpunkt<br />
wurde versucht die Gleichung gemäß der Fachliteratur zu lösen. Die letzten<br />
Schritte:<br />
135
Kapitel 2. Implementation 10. Oktober 2013<br />
8. Das Gleichsetzen ergibt ein nichtlineares Gleichungssystem mit mehreren<br />
Additiven Terme, die sich mit Kosinus- und Sinusfunktionen der zu<br />
bestimmenden Winkel in nicht trivialen Zusammenhängen befinden.<br />
9. Dieses Gleichungssystem muss nach den Kosinusse und Sinusse der<br />
gesuchten Winkel aufgelöst werden.<br />
10. Nachdem die Sinusse und Kosinusse bestimmt sind, sind die Winkel<br />
mit Hilfe der Funktion Atan2 zu berechnen.<br />
Schritt 8 lässt sich laut verschiedenen Fachliteraturquellen auf keine konventionelle<br />
Art und Weise realisieren. Diese Operation ist dem mathematischen<br />
Wissen des Entwicklers überlassen. Bei der Ausführung von<br />
Schritt 8 hat es sich herausgestellt, dass aufgrund der Degradiertheit des<br />
Roboters die Lage des TCP nicht beliebig gewählt werden darf, wie es bei<br />
den Robotern mit 6 Freiheitsgraden der Fall wäre. Laut fachlichen Literaturquellen<br />
ist es nicht auszuschließen, dass ein serieller Roboter durch<br />
seine Konstruktion oder degradierten Freiheitsgarde keine Lösungen im algebraischen<br />
Verfahren haben kann. Anschließend wurde die Kinematik des<br />
Roboters erneut (ohne Fachliteratur) untersucht und festgestellt, dass das<br />
Problem der Rückwärtskinematik durch eine komplett geometrische Lösung<br />
lösbar ist. Der Algorithmus wurde hierfür entworfen und begonnen<br />
diesen mit ersten Teilerfolgen zu implementieren. Auch diese Lösung musste<br />
im Anschluss noch einmal komplett umgestellt werden, wobei die Methoden,<br />
wie z.B. Kreisschnittpunkte beibehalten wurden, jedoch im Rahmen<br />
eines neuen Algorithmus.<br />
Bei der finalen Lösung waren hauptsächlich folgende Probleme zu lösen:<br />
• Abhängig von der Lage des TCPs wurden zwei Fälle identifiziert, die<br />
einer unterschiedlichen Strategie bedürfen (siehe Abbildung 2.40 und<br />
Abbildung 2.41). Zu diesem Zweck wird ein Kreis um den Basispunkt<br />
(Ursprung des zweiten Gelenks) mit dem Radius der Länge zwischen<br />
Basispunkt und dem Ursprung das nächsten Bezugssystems gelegt<br />
und ein weiterer Kreis um den Tool-Center-Point mit dem Radius der<br />
Länge zwischen TCP und dem letzten Gelenk bzw. Bezugssystems.<br />
Sollten sich die Kreise nicht schneiden, liegt Fall 1 vor, scheiden sich<br />
die Kreisen in zwei Punkten, liegt Fall 2 vor. Zuvor wurde versucht<br />
den zweiten Fall mit den Methoden des ersten Falles zu lösen, was<br />
nicht gelang und aus der die oben beschriebene Fallunterscheidung<br />
resultierte.<br />
136
Kapitel 2. Implementation 10. Oktober 2013<br />
• Bei dem zweiten Fall (Kreisüberlappung) existiert ein Spezialfall, welcher<br />
durch das Testen von Randfällen ermittelt wurde. Dieser Fall muss<br />
im Rahmen des 2. Falls gesondert berücksichtigt werden, um ein korrektes<br />
Ergebnis zu gewährleisten. Er tritt genau dann auf, wenn sich<br />
die Kreise (um die Basis und den TCP) zwar überlappen, aber die<br />
Hilfskreise welche um die Schnittpunkte der Orthogonalen mit dem<br />
TCP-Kreis gelegt werden sich nicht mit dem Basiskreis schneiden.<br />
Diesen Sonderfall tritt auf wenn sich der TCP nicht nahe genug an<br />
dem Basisradius befindet, aber auch nicht zu weit entfernt ist, um in<br />
Fall 1 behandelt zu werden. Um dieses Problem zu lösen wird die orthogonale<br />
Gerade, welche den TCP schneidet immer weiter zu dem<br />
Mittelpunkt das Basiskreises verschoben, solange bis die Hilfskreise<br />
einen Schnittpunkt mit dem Basiskreis haben oder der TCP zu nahe<br />
an der Basis liegt um erreicht zu werden.<br />
• Ein weiteres Problem ist bei der Implementierung der Funktion, welche<br />
aus drei Punkten einen Winkel bestimmen sollte aufgetreten. Da das<br />
Modell auch Winkel über 180°zulässt, muss bei einer Winkelberechnung<br />
entschieden werden, ob der Winkel über oder unter 180°um<br />
einem Punkt berechnet werden soll (siehe Abbildung 2.43). Dieses<br />
Problem entsteht bei der Berechnung der Winkel γ und δ, da dort<br />
die Lage des Dreiecks (aus drei Bezugspunkten entstanden) sehr dynamisch<br />
ist. Um dieses Problem zu lösen, wurden zwei Hilfswinkel<br />
(virtuell und real) eingeführt (siehe Abbildung 2.44). Beide Winkel<br />
beginnen bei einem festen Punkt des Dreiecks, welcher der Punkt des<br />
untersten Gelenks des Roboterarms ist. An diesem Punkt wird eine<br />
virtuelle x-Achse gelegt, welche die 0°Line der beiden Hilfswinkel<br />
angibt. Der virtuelle Winkel bildet die Drehung von der (virtuellen)<br />
x-Achse zur Verdindungsline der beiden Punkte, welche nicht an dem<br />
zu bestimmenden Winkel liegen. Der reale Winkel bildet die Drehung<br />
zu der Verbindungsline zwischen dem Punkt auf der (virtuellen) x-<br />
Achse und dem Punkt an welchem der zu bestimmende Winkel liegt.<br />
Abhängig von der Lage der Punkte zueinander (Fallunterscheidung)<br />
müssen diese Hilfswinkel umgerechnet bzw. von 360°abgezogen werden.<br />
In Anschluss wird geprüft, ob der virtuelle Winkel größer ist als<br />
der reale Winkel und ggf. der zu bestimmende Winkel von 360°abgezogen.<br />
Dieses Problem wurde zunächst versucht vektoriell zu lösen, hatte<br />
aber auch hier das Problem, das nicht eindeutig war, ob der ausgerechnete<br />
Winkel oder der (360°-Winkel) berechnet werden musste.<br />
137
Kapitel 2. Implementation 10. Oktober 2013<br />
C‘<br />
•<br />
C‘<br />
•<br />
•<br />
γ‘‘<br />
⍺ R ‘<br />
γ‘<br />
B<br />
•<br />
γ<br />
•<br />
B<br />
•<br />
C<br />
•<br />
•<br />
⍺ V ‘<br />
A<br />
•<br />
A<br />
⍺ V<br />
Abbildung 2.43: Problem der Auswahl der korrekten Winkels<br />
C‘<br />
•<br />
γ‘‘<br />
⍺ R ‘<br />
C<br />
•<br />
B<br />
•<br />
γ<br />
C<br />
•<br />
•<br />
•<br />
B<br />
•<br />
⍺ R<br />
P TCP2<br />
A<br />
⍺ V ‘<br />
P base2<br />
β<br />
γ<br />
⍺ V<br />
P base1<br />
•<br />
x β‘ 0<br />
Abbildung 2.44: Lösung der Auswahl der korrekten Winkels mittels Hilfswinkel<br />
(real r/virtuell v)<br />
γ‘<br />
β<br />
Testen<br />
Der Algorithmus der Vorwärtskinematik hat bei den geometrischen Lösungen<br />
als Test zum Überprüfen des Tool-Center-Point fungiert. Dabei werden<br />
die von der Rückwärtskinematik (anhand eines frei gewählten TCP)<br />
berechneten Winkel in die Vorwärtskinematik weitergegeben und der dort<br />
γ<br />
138<br />
•<br />
δ‘ P<br />
• TCP4<br />
P TCP2<br />
P TCP1<br />
δ<br />
P base1<br />
• γ‘<br />
• •<br />
• •
Kapitel 2. Implementation 10. Oktober 2013<br />
errechnete TCP mit dem ursprünglichen TCP verglichen, der als Parameter<br />
für die Rückwärtskinematik fungiert hat. Der beschriebene Testfall wird in<br />
Python wie folgt umgesetzt:<br />
1 # TCP uebergeben und Winkel zurueck bekommen<br />
2 angles = robi . getAngleVector (TCP [ 0 ] , TCP [ 1 ] , TCP [ 2 ] )<br />
3<br />
4 # Zurueckbekommende Winkel setzen<br />
5 robi . setAngles ( [ angles . x , angles . y , angles . z , angles .w, 0 . 0 ,<br />
0 . 0 ] )<br />
6<br />
7 # TCP anhand a k t u e l l e r Winkel e r m i t t e l n<br />
8 p r i n t robi . getTCP ( )<br />
Ausblick<br />
Aus diesem Arbeitspaket resultieren weitere Aufgaben:<br />
• Der Roboterarm soll zum Nachzeichnen eines Gesichts eine Linie abfahren.<br />
Dafür müssen die Punkte zwischen dem Start- und Zielpunkt<br />
approximiert bzw. interpoliert werden.<br />
139
Kapitel 2. Implementation 10. Oktober 2013<br />
2.2.4 Objektverfolgung<br />
Das Ziel des Arbeitspaketes Objektverfolgung ist einen Arm zu erkennen.<br />
Dabei sollen am Arm die Winkel der einzelnen Gelenke berechnet<br />
werden. Der zu erkennende Arm befindet sich dabei vor einem Hintergrund,<br />
der einen guten Kontrast zum Akteur bietet. Zur Unterscheidung<br />
der einzelnen Gelenke des Arms dürfen Markierungen verwendet werden.<br />
Die Erkennung des Arms soll am Computer mit Hilfe des OFFIS Automation<br />
Framework durchgeführt werden. Zur Aufnahme der Szenerie wurde<br />
eine Webcam 14 , sowie eine Industriekamera 15 verwendet. Die Erkennung<br />
der Winkel des Arms sowie des Arms selber erfolgt dabei zweidimensional.<br />
Die zwei Dimensionen prägen sich in Breite und Höhe aus.<br />
Ein erstes Teilziel ist es, die Hand des Akteurs zu erkennen und eine<br />
entsprechende Bewegung dieser nachzuvollziehen, dieses wird im nächsten<br />
Unterabschnitt beschrieben. Danach wird die Erkennung des Arms<br />
und die Berechnung der Winkel erläutert.<br />
2.2.4.1 Bewegungsrichtungserkennung der Hand<br />
Ein erster Schritt zur Realisierung eines Verfahrens zur Objektverfolgung<br />
ist die Erkennung der Bewegungsrichtung der Hand. Zu diesem Zweck<br />
wurden diverse Videos mit Hilfe der unterschiedlichen Kameras aufgenommen.<br />
Hierbei wurde darauf geachtet, dass verschiedene Entfernungen und<br />
Hintergründe untersucht wurden. Ebenfalls wurden unterschiedliche Belichtungsverhältnisse<br />
und Materialien zur Markierung untersucht. Auf diesen<br />
Videos bewegt ein entsprechender Akteur seinen Arm und damit auch<br />
seine Hand.<br />
Zunächst wurde mit Hilfe von QT 16 ein Filter geschrieben, welcher den<br />
Hintergrund aus dem Video subtrahieren kann. Dies geschieht indem die<br />
Szenerie, das erste Bild im Video, als Hintergrund angenommen wird.<br />
Diese Herangehensweise hat jedoch folgende Nachteile:<br />
• Farben des Hintergrundes werden auch vom Akteur abgezogen. Ist<br />
Rot im Hintergrund, so wird dieses auch anteilig vom Akteur abgezogen.<br />
• Durch die automatische Helligkeitsanpassung und / oder Schwankungen<br />
bei der Belichtung entstehen Artefakte im Hintergrund.<br />
14 Logitech c270: http://www.logitech.com/de-de/product/hd-webcam-c270?crid=34<br />
15 FireWire CCD Color Camera: http://www.theimagingsource.com/en_US/products/<br />
cameras/firewire-ccd-color/dfk31af03/<br />
16 C++ Klassenbibliothek: http://de.wikipedia.org/wiki/Qt_Bibliothek<br />
140
Kapitel 2. Implementation 10. Oktober 2013<br />
Aus diesen Gründen wird eine Extrahierung von zum Beispiel einer Farbe<br />
schwierig, siehe Abb. 2.45. Der Ansatz über die Subtraktion des Hintergrundes<br />
musste daher verworfen werden. Sobald die Tiefeninformationen<br />
durch die 3D-Kamera hinzukommt, ist das Extrahieren des Hintergrundes<br />
einfacher zu realisieren, z.B. mit Hilfe eines Schwellwertes über die Tiefeninformationen.<br />
Abbildung 2.45: Beispielbild: Probleme durch Extraktion des Hintergrundes<br />
Über die Extrahierung der Farbe Rot wurde versucht die Haut des Akteurs<br />
zu detektieren. Die Farbe Rot wurde ausgewählt, da sie sich gut detektieren<br />
lässt. Dieses hat sich jedoch ebenfalls durch sich ändernde Lichtverhältnisse<br />
als schwierig erwiesen. Ebenfalls ist die Erkennung von zum Beispiel<br />
Köpfen nicht zu vermeiden. Dies ist hinderlich bei der definierten Erkennung<br />
der Hand. Um dieses Problem zu lösen wurde dazu übergegangen<br />
141
Kapitel 2. Implementation 10. Oktober 2013<br />
einen roten Handschuh als Markierung für die Hand zu verwenden, siehe<br />
Abb. 2.46.<br />
Abbildung 2.46: Beispielbild: Verfolgung der Hand mit Hilfe von Schwerpunkten<br />
innerhalb einer Kontur.<br />
Mit Hilfe einer Bildverarbeitungskette, siehe Abb. 2.47, konnte die Position<br />
der Hand ermittelt werden. Dazu wurde die Extraktion des roten<br />
Farbkanals durchgeführt. Diese überführt gleichzeitig das RGB-Bild in ein<br />
Graustufenbild. Um nun Bereiche mit hohen Rotwerten zu isolieren, wurde<br />
das Bild über einen Schwellwertfilter binarisiert. Artefakte ließen sich durch<br />
entsprechende morphologische Operationen nach dem Schwellwertfilter<br />
herausfiltern. Als Punkt, welcher verfolgt wird, wurde für die Trajektorie<br />
der Schwerpunkt der jeweiligen resultieren Flächen verwendet. Die Trajektorie<br />
beinhaltet eine geordnete Liste der über die Zeit bekannten Schwerpunkte.<br />
Hierbei wurde zwecks Speicherplatzbegrenzung nur dann ein<br />
142
Kapitel 2. Implementation 10. Oktober 2013<br />
Punkt hinzugefügt, wenn er eine minimale Distanz zu seinem Vorgänger<br />
hat. Ebenfalls existiert eine Methode in der zu definierten Zeitpunkten für<br />
jedes Gelenk ein Wert gespeichert wird, sodass es möglich ist aus diesen<br />
Werten Gesten zu rekonstruieren.<br />
Abbildung 2.47: Bildverarbeitungskette: Verfolgung der Hand mit Hilfe<br />
von Schwerpunkten innerhalb einer Kontur<br />
Datenstruktur<br />
sprint2/objekt_tracking/paket1/objekt_tracking_hand.pro : OFFIS Automation<br />
Framework Projektdatei<br />
sprint2/objekt_tracking/paket1/bildverarbeitungskette_hand.ogr : Bildverarbeitungskette<br />
für die Erkennung der Hand und der Darstellung<br />
der ermittelten Position / Trajektorie.<br />
sprint2/objekt_tracking/paket1/objekt_tracking_hand.py : Automationsprogramm<br />
zum Erhalt der Positions der Hand.<br />
sprint2/objekt_tracking/paket1/Handverfolgung mit Handschuh.avi : Beispielvideo<br />
für die Verfolgung der Hand.<br />
143
Kapitel 2. Implementation 10. Oktober 2013<br />
2.2.4.2 Arm mit Winkeln<br />
Aufbauend auf der vorher erstellten Lösung zur Verfolgung einer Hand<br />
wird nun die Erkennung des Arms erläutert. Beim Arm sollen die Winkel<br />
der Gelenke ausgegeben werden, so dass sie in einem weiteren Schritt,<br />
siehe Arbeitspaket 2.2.5, dem Roboterarm übergeben werden können. Der<br />
strukturelle Verlauf entspricht dabei der im folgenden aufgeführten Grafik.<br />
Ansteuerung(Python)<br />
Winkelberechnung(Python)<br />
Kalibrierung(Python)<br />
Bildverarbeitung(Python)<br />
Bildvorverarbeitung(OFFISAutomationToolbox)<br />
Bildaquise(Webcam)<br />
Abbildung 2.48: Aufbau des resultierenden Ergebnisses<br />
Zunächst wurde hierzu eine Methode geschrieben, welche eine Kalibrierung<br />
auf dem Akteur in der Szene und dem Algorithmus zur Erkennung der<br />
Gelenke vornimmt, siehe Abb. 2.49. Dieser erwartet einen horizontal ausgestreckten<br />
Arm mit den entsprechenden Markierungen und weist je nach<br />
Entfernung zur Y-Achse dem Schwerpunkt ein Gelenk zu. Wie in Abschnitt<br />
2.2.4.1, werden rote Markierungen verwendet, da sich diese stabil<br />
extrahieren lassen.<br />
144
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.49: Beispielbild: Kalibrierung des Systems auf die Gelenke des<br />
Akteurs<br />
Auch hier wurde vorwiegend mit Videomaterial gearbeitet. Um den Arm<br />
zu erkennen, wurde ähnlich wie bei der Handerkennung mit Hilfsmitteln<br />
gearbeitet. Statt mit einem Handschuh zu arbeiten wurden die Gelenke<br />
des Akteurs mit roten Markierungen umwickelt. Rotes Klebeband stellte<br />
sich hierbei als unzureichend heraus, da es nur sehr schlecht erkannt wird.<br />
Dies liegt an der Reflektion der Lichtes durch das glatte Material. siehe<br />
Abb. 2.50.<br />
145
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.50: Beispielbild: Trennung der Kontur durch Reflekton des<br />
Lichtes am Klebeband<br />
Papierstreifen sind jedoch gut wahrnehmbar, haben jedoch das Problem,<br />
dass sie im Gelenk oft vom Arm zusammengedrückt werden, siehe Abb.<br />
2.50. Dies führt dazu, dass die Flächen verzerrt werden oder verschwinden.<br />
Daher wurde ein anderer Ansatz gewählt. Die Streifen wurden nun um<br />
den Arm jeweils vor und nach den Gelenken gewickelt. Lediglich an der<br />
Schulter wurde auf einen Streifen vor der Schulter verzichtet. Jedoch ist es<br />
auch hier möglich, dass sich diese Flächen verändern. Problematisch ist es,<br />
sobald sich die Flächen berühren und als eine Fläche erkannt werden. Nun<br />
kann nur noch schwer ermittelt werden, welche Fläche zu welchem Gelenk<br />
führt, siehe Abb. 2.51.<br />
146
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.51: Beispielbild: Zusammenfließen der Konturen durch<br />
Berührung<br />
147
Kapitel 2. Implementation 10. Oktober 2013<br />
Diese fünf Markierungen wurden zunächst auch mit der selben Bildverarbeitungskette<br />
bearbeitet und ihre Schwerpunkte für die Berechnungen<br />
herangezogen. Um die Berechnungen zu vereinfachen wurde der Filter zur<br />
Erkennung von Konturen durch einen zur Erkennung von BLOBs, steht für<br />
Binary Large Objects, ausgetauscht siehe Abb. 2.52. Der Vorteil liegt darin,<br />
dass man hier eine Pose2D erhält. In dieser sind X- und Y-Koordinaten<br />
sowie der Winkel Phi enthalten. Dieser Winkel wird intern durch eine<br />
Hauptkomponentenanalyse errechnet, siehe Abb. 2.55.<br />
Abbildung 2.52: Bildverarbeitungskette: Verfolgung des Arms mit Hilfe<br />
von Posen<br />
Die hierbei gewonnen Punkte alleine reichten jedoch nicht aus, um die<br />
Winkel der Gelenke stabil zu bestimmen. Daher wurden nicht mehr die<br />
Schwerpunkte sondern Posen verwendet. Posen haben den Vorteil, das<br />
neben den Punktinformationen auch noch die Richtung der Hauptachse<br />
der Markierung angegeben wird. Da in unserem Fall Streifen verwendet<br />
werden liegt die Hauptachse immer orthogonal zur Achse des Ober- oder<br />
148
Kapitel 2. Implementation 10. Oktober 2013<br />
Unterarms. Dies ermöglicht sowohl die Koordinaten der Gelenke als Schnittpunkt<br />
der Geraden zu bestimmen als auch die Bestimmung des Winkels der Vektoren<br />
zueinander.<br />
Ein Problem bei der Verwendung von Posen ist die Richtung des Winkels.<br />
Dieser steht ja nach Stauchung des Papierstreifens in unterschiedliche Richtungen,<br />
siehe Abb. 2.50 und Abb. 2.53. Diese auf immer die selbe Richtung<br />
zu normieren gestaltete sich ebenfalls als schwierig. Aus diesem Grund<br />
wurde die Richtung aus den Berechnungen genommen.<br />
Abbildung 2.53: Beispielbild: Springen der Posen<br />
In einem Weiteren Schritt wurden die Markierungen auf drei Streifen in<br />
der Mitte von Oberarm, Unterarm und Hand reduziert. Dies reicht bei der<br />
vorhin betrachteten Vorgehensweise aus, um alle Gelenke zu bestimmen.<br />
Die endgültige Lösung bestimmt die Winkel indem zuerst die Orthogonalen<br />
(im Bild o1 und o2, siehe Abb. 2.54) der Posen bestimmt werden.<br />
Diese dürfen für eine Schnittpunktberechnung ungerichtet sein. Nach-<br />
149
Kapitel 2. Implementation 10. Oktober 2013<br />
dem der Schnittpunkt (im Bild das gelbe Kreuz, siehe Abb. 2.54) errechnet<br />
wurde, werden die gerichteten Vektoren aus den Punkten vor und nach<br />
dem Gelenk zusammen mit dem Schnittpunkt bestimmt (im Bild v1 und<br />
v2, siehe Abb. 2.54). Diese Vektoren haben einen Winkel untereinander,<br />
der durch Kreuzprodukt(v1, v2)/Norm(v1) ∗ Norm(v2) gefunden werden<br />
kann. Da der resultierende Winkel zwischen 0 Grad und 360 Grad liegen<br />
soll, wird der Winkel noch dahingehend bestimmt, ob der Kleinere (0 Grad<br />
+ alpha) oder der Größere (360 Grad - alpha) gesucht.<br />
Abbildung 2.54: Beispielbild: Berechnung der Winkel mit Hilfe des<br />
Schnittpunktes der Orthogonalen zu Phi<br />
Das sich aus der Bildvorverarbeitung, -verarbeitung und den Berechnungen<br />
ergebende Resultat kann im folgender Abbildung 2.55 betrachtet werden.<br />
150
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.55: Beispielbild: Verfolgung des Arms mit Hilfe von Posen<br />
151
Kapitel 2. Implementation 10. Oktober 2013<br />
Datenstruktur<br />
sprint2/objekt_tracking/paket2/object_tracking_arm.pro : OFFIS Automation<br />
Framework Projektdatei<br />
sprint2/objekt_tracking/paket2/bildverarbeitungskette_arm.oap : Bildverarbeitungskette<br />
für die Erkennung des Arms und der Berechnung<br />
der entsprechenden Winkel zwischen den Gelenken.<br />
sprint2/objekt_tracking/paket2/object_tracking_arm.py : Automationsprogramm<br />
zum Erhalt der Positions der Hand.<br />
sprint2/objekt_tracking/paket2/Armverfolgung 5 Markierungen.avi : Beispielvideo<br />
für die Verfolgung des Arms und die Berechnung der Winkel.<br />
152
Kapitel 2. Implementation 10. Oktober 2013<br />
2.2.5 Zusammenführung von Objektverfolgung und<br />
Roboterarmsteuerung<br />
Ziel dieses Arbeitspaketes ist es die Ansteuerung des Roboterarms, siehe<br />
Abschnitt 2.2.3, mit Hilfe der in der Objektverfolgung, siehe Abschnitt 2.2.4,<br />
gewonnenen Daten durchzuführen. Am Ende des Paketes soll es einer beliebigen<br />
Person mit Hilfe seines Arms und entsprechender Markierungen<br />
möglich sein, den Roboterarm zu bewegen.<br />
Vorausgesetzt wird dabei die selbe, definierte Umgebung wie in den entsprechenden<br />
Arbeitspaketen. Wichtig ist hierbei, dass sich keine zu roten Gegenstände<br />
im Wahrnehmungsbereich der Kamera befinden. Gegenstände sind<br />
zu rot, sobald sie sich zu Nahe am Rotwert der Markierung befinden oder<br />
diese diesen sogar überschreiten. Ebenfalls darf sich der Akteur nicht zu<br />
weit von der Kamera entfernen, da die dann erkannten Regionen für die<br />
Einstellungen der Bildverarbeitungskette zu klein sind.<br />
2.2.5.1 Integration von Objektverfolgung und Roboterarmsteuerung<br />
Um die Integration von Objektverfolgung und Ansteuerung des Roboterarms<br />
durchführen zu können, muss zunächst eine entsprechende Schnittstelle<br />
existieren. Diese Schnittstelle existiert in Form eines Treibers, welcher als<br />
RCUnit eingebunden wird.<br />
Dieser musste jedoch zunächst auf die aktuelle Version der OFFIS Automation<br />
Toolbox angepasst werden. Ebenfalls mussten entsprechende Treiber<br />
für die Verwendung des FPGAS’s installiert werden. Danach ermöglicht<br />
der Treiber die direkte Übermittlung der Winkel an die Ansteuerung des<br />
Arms. Die Übergabe Dieser erfolgt hierbei in Form von Angaben in Grad.<br />
Es besteht zwar die Möglichkeit alle Motoren des Roboters anzusprechen,<br />
jedoch werden nur die Winkel verwendet, welche durch das zweidimensionale<br />
Verfahren erkannt werden können.<br />
Nach der Integration der bestehenden Arbeitspakete haben sich verschiedene<br />
Probleme ergeben. Das größte Problem ergab sich durch die Reaktionszeit<br />
des Roboterarms. Dies wurde behoben durch die direkte Verwendung des<br />
Treibers, der RCUnit. Ebenfalls wurde eine Debug-Ausgabe, welche über<br />
die Hardware lief, entfernt. Diese Änderungen führt zu einer signifikanten<br />
Verbesserung der Performanz des Systems.<br />
2.2.5.2 Erstellung eines stabilen Demonstators<br />
Das letzte Teilziel dieses Arbeitspakets ist ein stabiler Demonstrator. Hier<br />
soll dafür gesorgt werden, dass eine möglichst beliebige Person, mit Hilfe<br />
153
Kapitel 2. Implementation 10. Oktober 2013<br />
entsprechender Markierungen, den Roboterarm bewegen kann.<br />
Zur Verbesserung der Bedienung wurde eine zusätzliche grafische Oberfläche<br />
erstellt, mit welcher es möglich ist die Skripte für die Steuerung des<br />
Roboterarms zu steuern. Hier wurde die Möglichkeit gegeben zu wählen<br />
ob der Akteur den Roboterarm mit seinem linken oder rechten Arm steuern<br />
möchte. Ebenfalls wird dem Akteur die Zeit gegeben sich nach dem Start in<br />
die entsprechenden Position zur Steuerung des Roboterarms zu begeben,<br />
siehe Abb. 2.56.<br />
Abbildung 2.56: Grafische Oberfläche für die Interaktion mit dem Skript<br />
Da die WebCam jedoch nur eine Wiederholrate von maximal 15 Bildern pro<br />
Sekunde erreicht, sind schnelle Bewegungen durch die Bildverarbeitung<br />
nicht zu erkennen. Dies liegt daran, dass das Bild verschwimmt und sich<br />
die entsprechenden Rotwerte über einen breiteren Bereich verteilen und<br />
somit unterhalb des Schwellwertfilters liegen, siehe Abb. 2.57.<br />
2.2.5.3 Ausblick<br />
Während der Integration von der Ansteuerung des Roboterarms und der<br />
Objektverfolgung haben sich verschiedene Schwachpunkte des Systems offenbart.<br />
Diese sind zum Einen die relativ geringe Geschwindigkeit der<br />
Kamera und die daraus resultierenden Verwischungseffekte, zum Anderen<br />
die geringe Anzahl an Bildern pro Sekunde. Dies ist gerade für die Bildverarbeitung<br />
ein entscheidender Faktor, da bei vielen Bildern bessere Mittelwerte<br />
gebildet werden können. Ebenfalls können bei vielen Bildern Ausreißer<br />
aus der Berechnung ausgenommen werden, zum Beispiel durch die<br />
Verwendung eines Medians.<br />
Ein weiterer Schwachpunkt ist die Hardware des Roboterarms. Dieser verfügt<br />
über ein hohes Maß an Spiel innerhalb der verschiedene Gelenke, was<br />
sich gerade über die Länge des Arms zum Ende hin stark auswirkt. Zudem<br />
bieten auch die vorhandenen Servos eine eingeschränkte Genauigkeit, sodass<br />
sich auch dies auf die Länge des Arms zum Ende hin stark auswirkt.<br />
154
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.57: Verwischungseffekt bei schnellen Bewegungen durch die<br />
geringe Geschwindigkeit der WebCam<br />
Die Montage neuer Servomotoren, sowie die Montage stabilerer Teile am<br />
Roboterarm innerhalb der Gelenke, sollte zu einer signifikanten Verbesserung<br />
der Bewegungspräzision führen.<br />
2.2.6 Fazit und Ausblick<br />
Die im Sprint 2 gesetzten Ziele wurden erfolgreich umgesetzt. Es erfolgten<br />
sowohl Anbindung des Kameramoduls sowie die USB-basierte Anbindung<br />
an die OFFIS-Automation-Toolbox. Die Objektverfolgung ergab<br />
eine Bildvor- und Bild-verarbeitungskette von Filtern sowie einen Algorithmus<br />
zur Verfolgung der Objekte. Dieser Algorithmus wurde in der Skriptsprache<br />
Python umgesetzt. Die Entwicklung der Vorwärtskinematik wurde<br />
als OFFIS-Automation-Toolbox-Plugin fertiggestellt, so dass die Objektverfolgung<br />
mit der Vorwärtskinematik zusammengeführt werden konnte. Die<br />
Entwicklung der Rückwärtskinematik dagegen ergab sich zum kritischen<br />
Pfad, da für diesen am meisten Zeit aufgewendet wurde. Nach dem die<br />
Entwicklung der Rückwärtskinematik durch den klassischen Ansatz über<br />
algebraische Lösung zeitlich nicht umsetzbar war, wurde eine geometrische<br />
Lösung entwickelt und implementiert.<br />
Das Ergebnis der Machbarkeitsstudie für das Eye-Tracking zeigt, dass eine<br />
155
Kapitel 2. Implementation 10. Oktober 2013<br />
praktische Umsetzung auf dem FPGA möglich ist, jedoch die Genauigkeit<br />
der Erkennung der Blickrichtung nicht ausreichend für das Projekt ist. Aus<br />
diesem Grund wird von der Verwendung dieser Technologie im Projekt<br />
RoboArm abgesehen.<br />
Des Weiteren wird ein neuer Sprint geplant, der als Schwerpunkt die Bildvorverarbeitung<br />
sowie die Evaluation und Umsetzung der Ausgabemöglichkeiten<br />
hat.<br />
156
Kapitel 2. Implementation 10. Oktober 2013<br />
2.3 Sprintplanung Sprint 3<br />
In diesem Sprint wird der Schwerpunkt auf Bildvorverarbeitung gelegt.<br />
Die Entwicklung und Integration der Filterketten, des ImageBusSwitches<br />
sowie des Histogramms soll eine Grundlage zur anschließenden Bildverarbeitung<br />
und Extraktion der Umgebungsinformationen aus dem Bild darstellen.<br />
Der ImageBusSwitch sowie der HDMI sind zur Demonstration und dem<br />
Darstellen von Debug-Informationen. Das Umschalten zwischen dem Bildstrom<br />
ohne Verarbeitung (Urbild) und dem Bildstrom, der bearbeitet wurde,<br />
stellt eine hervorragende Möglichkeit dar, die Unterschiede dieser Bildströme<br />
zu vergleichen und über die Qualität sowie Erfolg der Bildverarbeitungskette<br />
Aussagen zu treffen.<br />
Die HDMI-Ausgabe erlaubt darüber hinaus diverse Kontrollausgaben sowie<br />
Benutzerinformationen auszugeben.<br />
2.3.1 Image Bus Switch<br />
Ein Ziel dieses Arbeitspaketes ist es, einen ImageBusSwitch zu realisieren,<br />
welcher zwischen den zwei Signalen der Kameras umschalten kann.<br />
Hierzu muss ein IP-Core erstellt werden, welcher auf dem FPGA entscheiden<br />
kann, welches der Signale über die USB-Schnittstelle versendet wird.<br />
Weiterhin muss dieser IP-Core Softwareseitig steuerbar sein, daher wird<br />
ein Treiber implementiert.<br />
Weiteres Ziel des Arbeitspaketes ist eine Erweiterung des bereits vorhandenen<br />
Kameratreibers.<br />
Die erweiterte Funktionalität umfasst dabei Konfigurationsmöglichkeiten<br />
des Treibers zur Laufzeit sowie die Implementierung einer Sleep Funktion,<br />
welche die bis dahin Verwendete ersetzt.<br />
In der ersten Woche soll der IP-Core inklusive Treiber fertiggestellt werden.<br />
Außerdem soll ein Timer IP-Core zum Projekt hinzugefügt werden, sowie<br />
ein Treiber für diesen, der eine sleep Methode bereit stellt.<br />
In der zweiten Woche soll der Kamera Treiber aus dem letzten Sprint so<br />
erweitert werden, dass die Konfiguration über den Aufruf von dokumentierten<br />
Methoden erfolgen kann.<br />
In der dritten Woche sollen die einzelnen Komponenten integriert werden.<br />
Ziel ist es, dass die OFFIS-Automation-Toolbox Bilder abwechselnd von der<br />
linken und rechten Kamera empfängt.<br />
157
Kapitel 2. Implementation 10. Oktober 2013<br />
2.3.2 Filter Cores<br />
Im vorherigen Sprint 2 haben die Arbeitspakete Eye-Tracking und Objektverfolgung<br />
Filterketten in der AMiR Automation Toolbox erzeugt. Diese<br />
Filterketten waren dabei Softwarekomponenten. Da die Objekterkennung<br />
später auf dem FPGA durchgeführt werden muss, müssen diese Filterketten<br />
auf den FPGA übertragen werden. Hierzu müssen IP-Cores erstellt werden,<br />
die die unterschiedlichen Komponenten der Filterketten umsetzten. Es<br />
wurden dabei vier Filter identifiziert, die für die Filterketten unerlässlich<br />
sind: Es handelt sich um einen Rot-Grün-Blau zu Grau, einen Schwellwertfilter<br />
und zwei Morphologie Filter.<br />
Im ersten Teil des Arbeitspakets sollen der RGB2Grey- sowie der Schwellwertfilter<br />
als IP-Core implementiert werden. Hierzu steht eine Arbeitswoche<br />
zur Verfügung.<br />
Der RGB2Grey Filter soll einen 24-Bit breites RGB888 Farbsignal als Eingabe<br />
entgegennehmen sowie dieses in ein 8-Bit breites Graustufensignal umwandeln<br />
und anschließend ausgeben.<br />
Der Schwellwertfilter soll hingegen ein 8-Bit breites Graustufensignal und<br />
einen 8-Bit breiten Schwellwert als Eingaben erhalten und ein 1-Bit breites<br />
Signal ausgeben. Dabei wird der Ausgang auf 0 gezogen, sollte das<br />
Graustufensignal kleiner als der Schwellwert sein, und auf 1 gezogen, sollte<br />
das Graustufensignal größer oder gleich dem Schwellwert sein.<br />
Im zweiten Teil des Arbeitspakets soll ein Morphologiefilter als IP-Cores erstellt<br />
werden. Diese bestehen aus zwei unterschiedlichen Filtern und werden<br />
in zwei gesonderten IP-Cores implementiert. Der eine IP-Core wird<br />
eineDilatationsoperation implementieren, welcher auf einer 3x3 Nachbarschaft<br />
arbeitet. Der andere IP-Core wird eine Erosionsoperation implementieren,<br />
welcher ebenfalls auf einer 3x3 Nachbarschaft arbeitet. Für diesen Teil des<br />
Arbeitspakets steht eine Wochen zur Verfügung.<br />
Für die Integration des Arbeitspaketes ist eine Arbeitswoche geplant. In<br />
dieser sollen die erstellten Filter in das bestehende System integriert werden.<br />
Um dies zu erreichen, werden die erstellen IP-Cores in ein bestehendes<br />
Projekt für den entsprechenden FPGA eingebettet. Mit Hilfe der Kamera<br />
bzw. der Simulationsumgebung können die Filter nun verifiziert werden.<br />
Dies geschieht anhand definierter Referenzbilder, welche dem System<br />
über die virtuelle Kamera übergeben werden sowie über die OFFIS-<br />
Automation-Toolbox wieder ausgegeben werden.<br />
158
Kapitel 2. Implementation 10. Oktober 2013<br />
2.3.3 HDMI Analyse<br />
Ziel dieses Arbeitspaketes ist eine Machbarkeitsstudie im Sinne einer Zeiteinschätzung<br />
für eine Bildausgabe eines Image Busses via HDMI. Da für<br />
die Ausgabe über HDMI ein Framebuffer nötig ist wird ausserdem eine<br />
Zeiteinschätzung für die Realisierung eines Image-Cache IP-Core durchgeführt.<br />
Dazu sollte sich das Projekt atlys_hdmi_plb_demo von Digilent angeschaut<br />
werden.<br />
Nach der ersten Woche muss dieses Arbeitspaket beendet sein und eine<br />
Analyse vorliegen.<br />
159
Kapitel 2. Implementation 10. Oktober 2013<br />
2.3.4 Histogramm<br />
Dieses Arbeitspaket hat zum Ziel, ein Histogramm dynamisch von einem<br />
Bildstream zu erstellen. Das erstellte Histogramm soll ausgewertet werden<br />
um Informationen für einen Schwellenwertfilter bereitzustellen, damit<br />
dieser unter anderem besser auf Helligkeitsänderungen reagieren kann.<br />
Das erstellen des Histogramms sowie das Auswerten der erzeugten Informationen<br />
wird mit zwei IP-Cores realisiert, so dass die Möglichkeit besteht,<br />
weitere verarbeitende Schaltungen zu entwickeln, die auf das erstellte Histogramm<br />
zurückgreifen. Für die Lösung dieser Aufgaben stehen insgesamt<br />
3 Wochen zur Verfügung.<br />
Der erste Abschnitt des Arbeitspakets besteht darin, das Design und die<br />
Implementierung des Histogramms umzusetzen, wobei das Histogramm<br />
als eigenständiger IP-Core geplant ist. Hierzu ist eine Woche Zeit gegeben.<br />
Die für den dynamischen Schwellenwert benötigte Berechnung basierend<br />
auf den Daten des Histogramms wird separat in einem eigenen IP-Core<br />
untergebracht. Die erstellten Daten werden dem Schwellenwertfilter bereitgestellt<br />
um eine dynamische Filterung zu ermöglichen. Dies sollte nach<br />
der zweiten Woche geschehen sein.<br />
Die dritte Woche wird zur Integration und zur eventuellen Anpassung der<br />
einzelnen Komponenten genutzt.<br />
160
Kapitel 2. Implementation 10. Oktober 2013<br />
2.3.5 Notwendigkeit eines Histogramms<br />
Dieses Arbeitspaket hat zum Ziel, die Notewendigkeit eines Histogramms<br />
zur dynamischen Helligkeitsanpassung des Bildstreams zu evaluieren. Da<br />
die eingesetzte Kamera bereits über eine histogrammbasierte Helligkeitsanpassung<br />
verfügt, werden für diesen Zweck Vergleichsmessungen bei<br />
unterschiedlichen Umgebungsparametern durchgeführt. Somit kann ermittelt<br />
werden, ob der Einsatz eines zusätzlichen Histogrammfilters für eine<br />
stabiliere Filterkette sorgen kann. Für die Messungen wird in erster Linie<br />
der Histogrammfilter der OFFIS IDE eingesetzt. Für die Lösung dieser<br />
Aufgaben stehen insgesamt 2 Wochen zur Verfügung.<br />
Der erste Abschnitt des Arbeitspakets besteht darin, das Design auf dem<br />
Atlys Board anzupassen und eine definierte Arbeitsumgebung zu schaffen.<br />
Weiter wird ein Messaufbau umgesetzt, mit dem die benötigten Messwerte<br />
ermittelt werden. Dabei werden Werte mit ein- / ausgeschalteter Autokorrekturfunktion<br />
der Kamera in Kombination mit der in VHDL implementierten<br />
sowie der OFFIS IDE Filterkette aus dem zweiten Sprint gesammelt.<br />
Auf Basis der gesammelten Messwerte erfolgt ein Vergleich des Bildstreams<br />
mit und ohne zusätzlichem Histogrammfilter. Als Ergbnis liefert das Arbeitspaket<br />
eine Aussage über die Vor- / Nachteile eines möglichen (zusätzlichen)<br />
Histogramms in der Filterkette.<br />
161
Kapitel 2. Implementation 10. Oktober 2013<br />
2.4 Sprint 3<br />
Im Folgenden werden die ausführlichen Ziele sowie Erfolge und Probleme<br />
der einzelnen Arbeitspakete vorgestellt.<br />
2.4.1 Image Bus Switch<br />
cam_bootloader<br />
simple_i2c<br />
simple_i2c<br />
VmodCam Cam A<br />
VmodCam Cam B<br />
cam_data<br />
cam_data<br />
cam_deserialzer<br />
cam_deserialzer<br />
cam_rgb565_to_rgb888<br />
cam_rgb565_to_rgb888<br />
image_bus_switch<br />
cam_usb<br />
usb_driver<br />
PC<br />
Abbildung 2.58: Aufbau mit ImageBus Schalter IP-Core<br />
Das Ziel dieses Arbeitspaketes ist es, Daten von beiden Kameras über die<br />
162
Kapitel 2. Implementation 10. Oktober 2013<br />
USB Schnittstelle schicken zu können, ohne eine Synthese durchführen zu<br />
müssen. Hierzu soll ein IP-Core entwickelt werden, welcher zwei ImageBus<br />
Eingänge, jedoch nur einen ImageBus Ausgang hat. Dieser IP-Core soll<br />
über den PLB so konfiguriert werden können, dass er je einen der beiden<br />
Eingänge auf den Ausgang weiterleitet. Abbildung 2.58 stellt den geplanten<br />
Aufbau dar.<br />
Desweiteren soll ein Timer IP-Core zum Design hinzugefügt werden und<br />
für diesen ein Treiber, welcher eine Funktion zum warten einer bestimmten<br />
Zeit zur Verfügung stellt.<br />
Diese Funktion soll dann im Kamera-Treiber verwendet werden. An dieser<br />
Stelle soll auch der Treiber verbessert werden, so dass dieser stabiler läuft<br />
und abstraktere Methoden zur Konfiguration der Kamera bereitstellt.<br />
2.4.1.1 image_bus_switch 1.00.a<br />
PLB<br />
ImageBus In 1<br />
image_bus_switch<br />
ImageBus Out<br />
ImageBus In 2<br />
Abbildung 2.59: Blockschaltbild des ImageBusSwitch IP-Cores<br />
Dieser IP-Core dient zum Umschalten zwischen zwei ImageBus Signalen.<br />
Das Umschalten erfolgt über ein, über den PLB erreichbares, Register. Der<br />
IP-Core soll hauptsächlich dazu dienen um die Bildquelle, welche an den<br />
Rechner weitergeleitet wird, ändern zu können, ohne eine erneute Synthese<br />
zu benötigen. Er kann z.B. genutzt werden um sowohl ein Bild von der<br />
linken, als auch ein Bild von der rechten Kamera (mit kleinem zeitlichen<br />
Versatz) zum PC zu übertragen. Er kann aber ebenfalls benutzt werden,<br />
um die Bildendaten vor und nach einem Filter IP-Core am PC miteinander<br />
zu vergleichen. Abbildung 2.59 stellt ein Blockschaltbild für den IP-Core<br />
dar.<br />
Der Treiber stellt eine C++ Klasse zur Steuerung dieses IP-Cores zur Verfügung.<br />
Dieser besteht aus dem Konstruktur, welchem die Basisadresse<br />
des IP-Cores übergeben werden muss, sowie einer weiteren Methode, mit<br />
welcher der Schalter eingestellt werden kann:<br />
163
Kapitel 2. Implementation 10. Oktober 2013<br />
1 void set ( enum CAM cam );<br />
2.4.1.2 xps_timer 1.02.a<br />
CaptureTrig0<br />
GenerateOut0<br />
CaptureTrig1<br />
Freeze<br />
xps_timer<br />
GenerateOut1<br />
PWM0<br />
PLB<br />
Interrupt<br />
Abbildung 2.60: Blockschaltbild des xps_timer IP-Cores<br />
Bei xps_timer handelt es sich um einen von Xilinx bereitgestellten IP-Core,<br />
welcher zwei Timer unabhängig voneinander hoch & runterzählen kann,<br />
ein PWM Signal generieren und auf externe Ereignisse reagieren kann. Als<br />
Schnittstelle zum Microblaze dienen zum einen der PLB und zum anderen<br />
ein Interrupt-Pin. In Abbildung 2.60 ist ein Blockschaltbild des IP-Cores<br />
dargestellt.<br />
Für unser Design wurde nur der PLB und der Interrupt-Pin verbunden<br />
(im Blockschaltbild in fetter Schrift). Die PWM Funktionalität, sowie die<br />
Möglichkeit auf externe Ereignisse zu reagieren werden nicht genutzt.<br />
Der neu erstellte Treiber greift auf den von Xilinx bereitgestellten Treiber<br />
zurück, stellt jedoch eine abstraktere API bereit:<br />
1 Timer :: Timer ( u32 baseaddr );<br />
Der Konstruktor muss die Basisadresse des IP-Cores übergeben bekommen.<br />
Bevor das Objekt benutzt werden kann, muss dann setup_interrupts<br />
aufgerufen werden.<br />
1 void Timer :: setup_interrupts ( XIntc * interruptController , u32<br />
interrupt_pin );<br />
Diese Methode erwartet ein initialisierte XIntc Struktur als Parameter, sowie<br />
den Interrupt-Pin des xps_timer IP-Cores. Die Methode aktiviert dann den<br />
Interrupt im Interrupt-Controller und setzt eine klasseninterne Funktion<br />
als Interrupthandler. Zusätzlich wird der IP-Core initialisiert.<br />
1 void Timer :: usleep ( u32 microseconds );<br />
164
Kapitel 2. Implementation 10. Oktober 2013<br />
Nachdem die Klasse initialisiert ist und das Interrupt-Setup durchgeführt<br />
wurde, kann die usleep Methode benutzt werden. Diese blockiert den Prozessor<br />
die übergebene Anzahl an Mikrosekunden. Dabei kann die maximale<br />
Wartezeit wie folgt berechnet werden:<br />
max = 4294967296000000 µs<br />
BUS_TAKT<br />
Bei einer Taktung von 100 MHz entspricht die maximale Wartezeit z.B.:<br />
4294967296000000<br />
µs = 42.95s<br />
100000000<br />
Wird ein zu großer Wert angegeben, gibt es einen Überlauf und es wird<br />
weniger Zeit gewartet!<br />
Außerdem stellt der Treiber die Definition für eine usleep Methode außerhalb<br />
irgendeiner Klasse bereit. Diese Methode ist jedoch nicht Teil des<br />
Treibers. Stattdessen sollte bei verwendung des Treibers wie folgt vorgegangen<br />
werden:<br />
1 /* Benutzung vom ersten xps_timer IP - Core im System */<br />
2 Timer t (0) ;<br />
3<br />
4 /* Bereitstellung einer globalen usleep Methode */<br />
5 void usleep ( u32 microseconds ) {<br />
6 t. usleep ( microseconds );<br />
7 }<br />
8<br />
10<br />
9 // ...<br />
11 int main () {<br />
12 /* setup interrupt controller */<br />
13 // ...<br />
14<br />
15 /* setup timer interrupts */<br />
16 t. setup_interrupts (& interruptController ,<br />
XPAR_XPS_INTC_0_XPS_TIMER_0_INTERRUPT_INTR );<br />
17<br />
18 // ... ( ab hier kann einfach usleep aufgerufen werden )<br />
19 }<br />
2.4.1.3 simple_i2c 2.00.a<br />
Der IP-Core wird in diesem Arbeitspaket unverändert übernommen, der<br />
Treiber zur Konfiguration der Kamera wird jedoch um folgende Funktionen<br />
erweitert:<br />
165
Kapitel 2. Implementation 10. Oktober 2013<br />
1 void reset ( u8 N , u8 M);<br />
Reset führt die Reset-Sequenz für die Kamera aus. Hierbei wird eine Verzögerung<br />
von mindestens 15ms genutzt. Die Parameter N und M werden genutzt, um<br />
anhand der Formel<br />
PCLK = MCLK ∗ M/(N + 1)/8<br />
die Pixelclock (PCLK) zu berechnen. MCLK ist hierbei in unserem System<br />
durch ein Virtel der Busclock gegeben.<br />
Es muss darauf geachtet werden, dass PCLK zwischen 6Mhz und 80 Mhz<br />
liegt. M muss kleiner als 256 und N kleiner als 64 sein.<br />
Die Bestimmung von M & N kann z.B. mittels der Formel aus Codeausschnitt<br />
2.1 durchgeführt werden (MCLK und PCLK müssen entsprechend<br />
eingesetzt werden).<br />
1 solve (PCLK = (MCLK/4) * M / (N+1) / 8) with 0 < M < 256<br />
2 and 0 < N < 64 over the i n t e g e r s<br />
Codeausschnitt 2.1: Formel zur Bestimmung von M & N für WolframAlpha<br />
1 bool identify () ;<br />
Diese Methode liefert einen Wert, der angibt ob die Kamera angeschlossen<br />
ist.<br />
1 void setup_defaults () ;<br />
Diese Methode setzt die Kameras auf eine vordefinierte Konfiguration.<br />
Dabei ist das Ausgabeformat für beide Kameras RGB565: Es sind histogrammbasierter<br />
Weißabgleich, aktivierte automatische Belichtung sowie der deaktivierte<br />
Autofokus. In Kontext A wird eine hohe Auflösung (1600x1200)<br />
ausgegeben, in Kontext B eine niedrigere (800x600). Standardmäßig ist<br />
Kontext B aktiviert.<br />
1 void set_capture_params ( bool hg , bool awb , bool ae , bool af );<br />
Diese Methode stellt Automatismen der Kamera an oder aus. hg steht für<br />
Histogramm, damit wird bestimmt, ob beim Weißabgleich ein Histogramm<br />
oder ein Beleuchtungsverhältnis verwendet werden soll. awb steht für den<br />
automatischen Weißabgleich, er kann aktiviert oder deaktiviert werden. ae<br />
bezeichnet die automatische Einstellung der Belichtungszeit. Bei niedriger<br />
oder sehr hoher Umgebungshelligkeit kann dies erwünscht sein. af stellt<br />
den Autofokus ein oder aus.<br />
1 void set_resolution ( enum CONTEXT , u16 x , u16 y);<br />
166
Kapitel 2. Implementation 10. Oktober 2013<br />
Diese Methode darf nur einmal beim Systemstart aufgerufen werden. Weitere<br />
Aufrufe bleiben ohne Wirkung, lassen potentiell die Kamera abstürzen.<br />
In dieser Methode wird die Auflösung eines Kontextes konfiguriert.<br />
1 void set_mode ( enum sequencer_command cmd );<br />
Diese Methode wird verwendet, um dem internen Sequencer der Kamera<br />
bestimmte Befehle zu geben. Hierbei kann man dem Sequencer die Befehle<br />
erteilen, um die Kamera in den Modus preview, capture oder standby zu<br />
versetzen. Es sollte darauf verzichtet werden, den Standby aufzurufen, da<br />
dieser nicht konfiguriert ist. Dieser ist im Rahmen der Projektgruppe auch<br />
nicht relevant. Weitere Befehle, die ausgeführt werden können, sind refresh<br />
und refresh mode. Beide dienen dazu, verschiedene Änderungen ins Kamerasystem<br />
zu übernehmen. Der Befehl do lock verhindert Veränderungen<br />
an der Kameralinse durch z.B. den Autofokus. Es gibt auch den Befehl run,<br />
welcher die normale Ausführungsroutine der Kamera übernimmt. Nach<br />
Ausführung eines beliebigen anderen Befehls versetzt sich die Kamera selbstständig<br />
in diesen Modus.<br />
1 void refresh () ;<br />
In dieser Methode werden refresh und refresh mode ausgeführt, um Änderungen<br />
in die Kamera zu übernehmen.<br />
1 void set_context ( enum CONTEXT context );<br />
Diese Methode soll den genutzten Kontext vorgeben, indem ein entsprechendes<br />
Register gesetzt wird. Dies bleibt jedoch ohne Wirkung, daher hat auch<br />
die Methode keinen Nutzen.<br />
1 void set_special_effects ( enum CONTEXT , u8<br />
solarization_threshold , enum DITHER_LUMA_ONLY dither , u8<br />
bit_width_of_dither , enum SPECIAL_EFFECT_SELECTION selection<br />
);<br />
In dieser Methode können besondere Effekte auf die Ausgabe der Kamera<br />
angewendet werden. Die verschiedenen Parameter werden nur für einzelne,<br />
bestimmte Effekte verwendet. selection bestimmt dabei den Effekt. Eingestellt<br />
werden können Deaktiviert(disabled), Monochrom, Sepia, Negativ und Solarization<br />
(mit positivem oder negativem UV-Einfluss).<br />
1 u16 get_frame_counter () ;<br />
Diese Methode liefert die Anzahl der Frames, welche die Kamera bereits<br />
gesendet hat. Achtung: Dieser Wert läuft bei 2 1 6 Frames über.<br />
1 u16 get_line_counter () ;<br />
Diese Methode liefert die Anzahl der Zeilen, welche die Kamera bereits<br />
gesendet hat. Achtung: Dieser Wert läuft bei 2 1 6 Zeilen über.<br />
167
Kapitel 2. Implementation 10. Oktober 2013<br />
1 void set_read_mode ( enum CONTEXT , bool xbinEnable , bool<br />
xybinEnable , u8 xoddIncrement , u8 yoddIncrement , bool<br />
verticalFlip , bool horizontalFlip );<br />
Die Methode bestimmt, auf welche Weise die Kamera ausgelesen werden<br />
soll. Hierbei gibt xbinEnable an, ob die Kamera analoges binning in X Richtung<br />
ausführen soll. xybinEnable gibt an, ob analoges binning in X und<br />
Y Richtung ausgeführt werden soll. Binning ist das Zusammenfassen von<br />
Pixeln auf Sensorebene. xoddIncrement ermöglicht das Überspringen von<br />
Pixelreihen in X Richtung. yoddIncrement ermöglicht das Überspringen von<br />
Pixelreihen in Y Richtung. Hierbei sind nur Werte von 1, also alle Reihen<br />
werden gelesen, und 3, nur jede zweite Zeile wird gelesen. Es ist möglich,<br />
das Ausgegebene Bild horizontal und vertikal zu spiegeln, dies geht durch<br />
verticalFlip und horizontalFlip.<br />
1 void set_output_format ( enum CONTEXT , bool processedBayerMode ,<br />
RGBOutFormat format , RGBYUV rgbORyuv , bool useCCIR656 , bool<br />
monochromeOut , bool progressiveBayer , bool swap2 , bool swap1<br />
);<br />
Diese Methode bestimmt das Ausgabeformat für einen Kontext. Hierbei<br />
wird durch processedBayerMode festgelegt, ob bereits ein De-Bayer aussgeführt<br />
wird. Weiterhin wird das Ausgabeformat (RGB565, RGB555, RGB444x,<br />
RGBx444) festgelegt. Der Parameter rgbORyuv bestimmt ob RGB oder YUV<br />
verwendet wird. Durch den Parameter useCCIR656 wird bestimmt, ob analoge<br />
Hilfssignale nicht digitalisiert übertragen werden sollen (für uns nicht notwendig).<br />
Die nächsten zwei Parameter (monochromeOut und progressiveBayer) bestimmen,<br />
ob schwarz/weiß übertragen werden soll und ob ein progressiver<br />
Bayer verwendet wird. swap1 bestimmt, ob bestimmte Bytes getauscht werden<br />
sollen. Im RGB-Modus sind dies gerade und ungerade Bytes, im YUV-<br />
Modus sind dies die Bytes für Farbwert und Helligkeit (engl. chrominance,<br />
luminance). swap2 bestimmt, ob bestimmte Farbkanäle getauscht werden<br />
sollen. Im RGB-Modus werden der Rote und der Blaue Kanal getauscht,<br />
im YUV-Modus werden die Kanäle für Rot- und Blaudifferenz getauscht.<br />
2.4.1.4 Toolbox Plugin<br />
Das VmodCam Plugin für die OFFIS-Automation-Toolbox aus dem letzten<br />
Sprint wurde modifiziert, so dass es jetzt eine weitere Eingabe hat, mit der<br />
die Kamera ausgewählt werden kann.<br />
168
Kapitel 2. Implementation 10. Oktober 2013<br />
2.4.1.5 Dateistruktur<br />
• pcores/image_bus_switch_v1_00_a: ImageBusSwitch IP-Core.<br />
• pcores/image_bus_switch_v1_00_a/hdl/vhdl/image_bus_switch.vhd:<br />
Äußeres Modul vom ImageBusSwitch IP-Core. Automatisch generiert<br />
vom Xilinx Peripheral Wizard.<br />
• pcores/image_bus_switch_v1_00_a/hdl/vhdl/user_logic.vhd: User Logic<br />
Modul vom ImageBusSwitch IP-Core. Automatisch generiert vom<br />
Xilinx Peripheral Wizard. Enthält die Logik für das PLB Register.<br />
• pcores/image_bus_switch_v1_00_a/hdl/vhdl/switch.vhd: Hauptmodul<br />
vom ImageBusSwitch IP-Core. Diese Datei stellt die eigentliche<br />
Funktionalität zur Verfügung.<br />
• drivers/image_bus_switch_v1_00_a: Treiber für ImageBusSwitch IP-<br />
Core.<br />
• drivers/image_bus_switch_v1_00_a/src/image_bus_switch.h: C++ Header<br />
Datei des Treibers.<br />
• drivers/image_bus_switch_v1_00_a/src/image_bus_switch.cpp: C++<br />
Datei mit der Implementation des Treibers.<br />
• drivers/sleep_v1_00_a: Treiber für xps_timer IP-Core.<br />
• drivers/sleep_v1_00_a/src/sleep.h: C Header Datei des Treibers.<br />
• drivers/sleep_v1_00_a/src/sleep.c: C Datei mit der Implementation<br />
des Treibers.<br />
2.4.1.6 Aufgetretene Probleme<br />
Während des Sprints sind unter anderem die folgenden Probleme aufgetreten:<br />
• Beim Schreiben für die usleep() Methode im Treiber des Timers wird<br />
eine Variable durch einen Interrupt-Handler modifiziert. Der Compiler<br />
hat hiervon keine Kenntnis und deshalb eine Schleife, die auf die<br />
Modifikation durch den Interrupt wartet in eine Endlosschleife “optimiert”.<br />
Abhilfe schaffte das C-Schlüsselwort volatile, welches dem<br />
C-Compiler mitteilt, dass sich eine Variable durch externe Ereignisse<br />
ändern kann.<br />
169
Kapitel 2. Implementation 10. Oktober 2013<br />
• Beim letzten Arbeitspaket VmodCam wurde ein Pin des cam_bootloader<br />
IP-Cores auf dem Genesys-Board nicht richtig mit der Kamera verbunden.<br />
Dies führte zu einem unvollständigem Resetsequenz.<br />
2.4.1.7 Ergebnis<br />
Die folgenden Bilder von der linken und rechten Kamera wurden über<br />
die OFFIS-Automation-Toolbox empfangen. Zu sehen ist, dass die Kameras<br />
nicht nur ein leicht versetztes Bild, sondern auch ein leicht verdrehtes Bild<br />
liefern. Zudem sind die automatische Farbkorrektur und der automatische<br />
Weißabgleich beider Kameras komplett unabhängig voneinander, was zu<br />
leicht unterschiedlichen Farben führt.<br />
Abbildung 2.61: Bilder von linker und rechter Kamera<br />
170
Kapitel 2. Implementation 10. Oktober 2013<br />
2.4.2 Filter Cores<br />
Ziel dieses Arbeitspaketes ist die Umsetzung der Algorithmen, welche<br />
zur Erkennung des Arms notwendig sind, dazu wurden drei IP-Cores erstellt.<br />
Diese setzen vier verschiedene Bildoperationen um, welche für die<br />
Erkennung des Arms bzw. der entsprechenden Markierungen zur Erkennung<br />
des Arms notwendig sind. Es wurden dabei ein Schwellwertfilter, ein<br />
RGB888 zu Graustufen Konverter und zwei morphologische Filter erstellt.<br />
Bei den morphologischen Filtern sollten die Erosion und die Dilatation<br />
umgesetzt werden.<br />
2.4.2.1 schwellwertlter_v1_00_a<br />
Der Schwellwertfilter verwendet ein 8Bit breites Signal, in welchem ein<br />
Graustufenbild codiert ist. Die Größe des Schwellwertes wird dabei durch<br />
einen Generic nach Außen geführt und kann somit bei der Verknüpfung<br />
der IP-Cores eingestellt werden.<br />
Hierbei wurde absichtlich auf die Verwendung eines PLB verzichtet. Es<br />
wurden verschiedene Versuche durchgeführt, welche gezeigt haben, dass<br />
eine dynamische Anpassung des Schwellwertes zur Laufzeit nicht notwendig<br />
ist. Dabei wird weder ein über Software einstellbarer Schwellwert noch<br />
ein dynamischer Schwellwert über einen anderen IP-Core-Core benötigt.<br />
Die automatische Korrektur der Helligkeit der verwendeten Kamera sorgt<br />
dafür, dass das Histogramm sich in Richtung des eingestellten Schwellwertes<br />
verschiebt. Zur initialen Einstellung des Schwellwertes kann es später<br />
von Nutzen sein, diesen dennoch mit dem PLB zu verbinden.<br />
Am Ausgang des Filters wird ein binäres Signal ausgegeben. Dabei werden<br />
alle Werte des eingehenden 8Bit Signals des Graustufenbildes mit dem<br />
Schwellwert verglichen. Sollten die 8Bit des Graustufenbildes größer oder<br />
gleich dem Schwellwert sein, so wird am Ausgang einen ’1’ angelegt. Andernfalls<br />
wird eine ’0’ angelegt. Somit kann eine Segmentierung durchgeführt<br />
werden. Im Folgenden wird das Blockschaltbild des Filters dargestellt,<br />
siehe Abb. 2.62.<br />
171
Kapitel 2. Implementation 10. Oktober 2013<br />
pixel_clk<br />
frameValid<br />
lineValid<br />
dataValid<br />
data[7:0]<br />
schwellwertfilter_v1_00_a<br />
frameValid<br />
lineValid<br />
dataValid<br />
data_out<br />
Abbildung 2.62: Blockschaltbild des Schwellwertfilters<br />
Dateistruktur<br />
• pcores/schwellwertfilter_v1_00_a: Schwellwertfilter IP-Core<br />
2.4.2.2 rgb2grey_v1_00_a<br />
Für die Umsetzung der Armerkennung, welche für die Steuerung des Roboters<br />
notwendig ist, wird unter Anderem ein Filter benötigt, welcher aus<br />
einem Farbbild ein Graustufenbild berechnet. Diese Graustufenbilder sollen<br />
jedoch nicht die Helligkeiten im Bild repräsentieren, sondern das Rot im<br />
Bild. Dies ist wichtig aufgrund der roten Markierungen, welche für die<br />
Erkennung des Arms verwendet werden. Darum wird ein gewichteter Graustufenfilter<br />
verwendet, siehe Abb. 2.63.<br />
Das von der Kamera gelieferte Farbbild, welches durch die IP-Cores der<br />
Arbeitsgruppe VModCam bereits aufbereitet wurde, steht für die Implementation<br />
des RGB2Grey-Filters als RGB888 Signal zur Verfügung. Der<br />
RGB888 zu Graustufenwandler nimmt dieses 24Bit breite Signal entgegen<br />
und wandelt es in ein 8Bit breites Signal um. Der IP-Core verwendete für<br />
die Umwandlung des RGB888 in ein gewichtetes Graustufenbild zunächst<br />
folgende Formel:<br />
R − B 2 − G di f f (B − G)<br />
− (2.12)<br />
2 2<br />
R, G und B stehen dabei für die Farbkanäle rot, grün und blau. Die Diff-<br />
Operation ist dabei eine Subtraktion, welche einen Absolutwert liefert.<br />
Während der Testphase des Filters mit der Referenzsoftware, Filter der<br />
OFFIS-Automation-Toolbox, hat sich herausgestellt, dass diese nicht die<br />
oben beschriebene Formel umsetzen, obwohl diese vom Filter angezeigt<br />
wird, siehe Abb. 2.64. Durch Sichtung des Programmquelltextes der Filter<br />
der OFFIS-Automation-Toolbox hat sich ergeben, dass hier folgende<br />
Formel umgesetzt wurde:<br />
R − B 2 − G 2<br />
− di f f (B − G) (2.13)<br />
172
Kapitel 2. Implementation 10. Oktober 2013<br />
Da sich die Tests der Armerkennung mit Hilfe des Software-Prototypen auf<br />
diese Formel beziehen, wurde der IP-Core nun ebenfalls umgeschrieben,<br />
sodass er dem Filter in der zur Armerkennung verwendeten Bildverarbeitungskette<br />
passt.<br />
Der Vorteil dieser Implementierung des gewichteten RGB2Grey-Filters ist,<br />
dass zum Beispiel die Farbe Orange, siehe Abb. 2.64 nicht mehr als helles<br />
Grau auftaucht. Bei der Anwendung des Filters in der Kette zur Erkennung<br />
des Arms, hat dies den Vorteil, dass weniger Objekte im Hintergrund<br />
erkannt werden, welche einen geringeren Anteil an Rot haben.<br />
pixel_clk<br />
frame_Valid_in<br />
line_Valid_in<br />
data_Valid_in<br />
pixel_data_in[23:0]<br />
rgb2grey_v1_00_a<br />
frame_Valid_out<br />
line_Valid_out<br />
data_Valid_out<br />
pixel_data_out[7:0]<br />
Abbildung 2.63: Blockschaltbild des RGB888 zu Graustufenwandler<br />
Ein weiteres Problem, welches sich während der Implementierung ergeben<br />
hat, war die Testumgebung. Der zur Verfügung gestellte Image-HIL hatte<br />
diverse Fehler. Zum einen konnte dieser zu Beginn keine Bilder mit<br />
aufgeben, wenn die Bitbreite der eingehenden Daten nicht zur Bitbreite<br />
der ausgehenden Daten passte. Ebenfalls gab es Probleme mit der Wahl<br />
der Farbkanäle. Hier wurde kein RGB888-Signal übertragen, sondern ein<br />
BGR888-Signal.<br />
173
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.64: Testbilder rgb2grey_v1_00_a in AMiR Automation Toolbox,<br />
Quellbild (link oben), Ergebnis Toolbox (rechts oben),<br />
Ergebnis Hardware (links unten), Ergebnis modifizierter<br />
Toolbox Filter (rechts unten)<br />
Dateistruktur<br />
• pcores/rgb2grey_v1_00_a: RGB888 zu Graustufenwandler IP-Core<br />
174
Kapitel 2. Implementation 10. Oktober 2013<br />
2.4.2.3 morphology_v1_00_a<br />
Bei der Morphologie wurden zwei Operationen umgesetzt, die Erosion<br />
und die Dilatation. Da beide Operationen auf einer Nachbarschaft arbeiten<br />
und sich invers zueinander verhalten, wurden sie in einem IP-Core zusammengefasst.<br />
Um die Operation, welche der IP-Core ausführt, auswählen zu<br />
können, wurde diese Option über einen Generic nach außen geführt. Hier<br />
kann somit ausgewählt werden, ob eine Dilatation oder Erosion durchgeführt<br />
werden soll, siehe Abb. 2.66.<br />
Der Filter arbeitet dabei auf Graustufen und führt eine sogenannte Graustufenmorphologie<br />
durch. Dies hat den Vorteil, dass auch ohne einen Schwellwertfilter<br />
gearbeitet werden kann. Hier werden je nach Wahl der Operation<br />
das Maximum der gefundenen Grauwerte erweitert oder das Minimum.<br />
Da beide Operationen eine Nachbarschaft benötigen, verfügt der IP-Core<br />
über einen Linienspeicher der entsprechend der Größe der Nachbarschaft<br />
angelegt ist. Der entsprechende IP-Core nimmt am Eingang ein beliebig<br />
breites Signal an, welches ein Graustufenbild repräsentiert. Der Ausgang<br />
ist ein dem Eingang entsprechend breites Signal, auf dem das verarbeitete<br />
Signal ausgegeben wird, siehe Abb. 2.65.<br />
pixel_clk<br />
frame_valid_in<br />
line_valid_in<br />
data_valid_in<br />
data_in[7:0]<br />
morphphology_v1_00_a<br />
frame_valid_out<br />
line_valid_out<br />
data_valid_out<br />
data_out[7:0]<br />
Abbildung 2.65: Blockschaltbild des Morphologiefilter<br />
Bei der Erstellung des IP-Cores für die morphologischen Operationen ergaben<br />
sich verschiedene Probleme. Zunächst sollte der Random Access<br />
Memory (RAM) aus einem existierenden IP-Core übernommen werden.<br />
Diese Herangehensweise ergab sich jedoch als wenig erfolgreich, sodass ein<br />
neuer RAM generiert werden musste. Da es zu diesem Zeitpunkt keine Testumgebung<br />
gab, wurde dies innerhalb der Integrationsumgebung durchgeführt.<br />
Hier kam ein stärkerer FPGA zum Einsatz als innerhalb der Testumgebung.<br />
Dies führte dazu, dass für die Testumgebung der RAM erneut<br />
erstellt werden müsste.<br />
Danach wurde mit Hilfe einer Simulation der Hardwarekomponente festgestellt,<br />
dass die Ansteuerung des RAM, welche ebenfalls aus einem existierenden<br />
Modul entnommen werden sollte, nicht korrekt funktioniert.<br />
175
Kapitel 2. Implementation 10. Oktober 2013<br />
Sodass eine Umstellung von den generierten RAM-Modulen auf die Language<br />
Templates erfolgte.<br />
Abbildung 2.66: Konfigurationsoberfläche des Morphologiefilter<br />
Dateistruktur<br />
• pcores/morphology_v1_00_a: Morphologiefilter IP-Core<br />
176
Kapitel 2. Implementation 10. Oktober 2013<br />
2.4.3 HDMI Analyse<br />
Ziel dieses Arbeitspaketes ist eine Machbarkeitsstudie im Sinne einer Zeiteinschätzung<br />
für eine Bildausgabe eines ImageBuses via HDMI. Da für die<br />
Ausgabe über HDMI ein Bildpuffer nötig ist, wird ausserdem eine Zeiteinschätzung<br />
für die Realisierung eines ImageCache IP-Core durchgeführt.<br />
Dazu wurde sich das Projekt atlys_hdmi_plb_demo von Digilent angeschaut.<br />
Dieses Projekt besteht aus einem Microblaze, via Multi-Port Memory Controller<br />
(MPMC) angebundenen RAM und dem eigentlichen HDMI Teil. Der<br />
HDMI Teil besteht aus einem IP-Core hdmi_in, welcher über VFBC 2D Bilddaten<br />
in dem RAM schreibt, sowie einem IP-Core hdmi_out welcher diese<br />
Bilddaten liest und an einer HDMI-Schnittstelle ausgibt.<br />
2.4.3.1 hdmi_out<br />
PXLCLK_I<br />
PXLCLK_2X_I<br />
PXLCLK_10X_I<br />
LOCKED_I<br />
VFBC_OUT<br />
hdmi_out<br />
TMDS[3:0]<br />
TMDSB[3:0]<br />
Abbildung 2.67: Blockdiagramm vom IP-Core hdmi_out<br />
In diesem Teilpaket sollte sich der IP-Core hdmi_out angesehen werden, da<br />
dieser die Ausgabe von Daten aus dem Speicher an die HDMI-Schnittstelle<br />
übernimmt.<br />
Die hierfür verwendete HDMI-Schnittstelle auf dem ATLYS hat den Bezeichner<br />
J2. An den im Diagramm 2.67 mit TMDS[3:0] und TMDSB[3:0] bezeichneten<br />
Ausgaben ist dieser HDMI-Ausgang angeschlossen.<br />
Das Beispielprojekt ist für ein ATLYS ausgelegt, wo ein berechnetes HDMI<br />
Signal direkt an den HDMI Anschluss gegeben werden kann. Dieses HDMI<br />
Signal wird vom hdmi_out berechnet.<br />
Bei einer Überführung auf ein GENESYS müsste der IP-Core um- oder<br />
neugeschrieben werden, da beim GENESYS die HDMI-Schnittstelle nicht<br />
direkt am FPGA angeschlossen ist, sondern über ein Chrontel CH7301C DVI<br />
transmitter device.<br />
177
Kapitel 2. Implementation 10. Oktober 2013<br />
An die drei Eingaben PXLCLK_I, PXLCLK_2X_I und PXLCLK_10X_I kann<br />
man einen pll_module IP-Core anschliessen, so dass die Geschwindigkeiten<br />
korrekt sind.<br />
Die Eingabe LOCKED_I ist letztendlich ein Zurücksetzen, welches dafür<br />
sorgt, dass ein schwarzes Bild ausgegeben wird. An VFBC_OUT ist der<br />
VFBC angeschlossen.<br />
Der IP-Core hdmi_out benutzt den VFBC, um Frames aus dem RAM zu<br />
lesen. Dabei benötigt er eine Basis Adresse, die Auflösung sowie die Breite<br />
einer Zeile im Speicher. Alle drei notwendigen Einstellungen werden durch<br />
Generic zur Designzeit festgelegt.<br />
Die möglichen Auflösungen sind im IP-Core hdmi_out fest konfiguriert,<br />
wobei nur 640x480 und 1280x720 benutzbar sind.<br />
Um weitere Auflösungen zu unterstützen, müsste der hdmi_out IP-Core<br />
angepasst werden, welcher größtenteils in Verilog implementiert ist. Nur<br />
die Schnittstelle zum Xilinx Platform Studio (XPS) ist in VHDL implementiert.<br />
Der IP-Core kommt aufgrund der Generics ohne einen Treiber aus. Zudem<br />
benutzt der IP-Core den PLB nicht.<br />
Die Frames, welche ausgegeben werden, werden im Demo Projekt durch<br />
den IP-Core hdmi_in in den RAM geschrieben. Der hdmi_in verwendet<br />
ebenfalls einen zweiten VFBC Port.<br />
In unserem Projekt müssen die Frames mit Hilfe eines eigenen IP-Core<br />
ebenfalls über VFBC in den RAM geschrieben werden.<br />
2.4.3.2 VFBC<br />
Der hdmi_out IP-Core verwendet Arbeitsspeicher als Framebuffer. Zur Anbindung<br />
an den Speicher wird der MPMC IP-Core benutzt, welcher auch<br />
die Speicheranbindung des PLB zur Verfügung stellt. Die Dokumentation<br />
dieses IP-Cores befindet sich in [18].<br />
Der MPMC IP-Core stellt insgesamt bis zu acht unabhängige Schnittstellen<br />
zur Verfügung, von denen, in Microblaze basierten Designs, einer für den<br />
PLB belegt ist. Der MPMC IP-Core hat für jede Schnittstelle einen Controller<br />
definiert, der für diese Schnittstelle verwendet werden soll. Diese<br />
heißen Personality Interface Modules (PIM).<br />
Zum Beispiel wird standardmäßig der erste Port für den PLB, welcher ein<br />
spezieller PLB PIM ist. Andere verfügbare PIMs sind:<br />
• Xilinx Cache PIM<br />
• Soft Direct Memory Access Controller PIM<br />
178
X-Ref Target - Figure 38<br />
Kapitel 2. Implementation 10. Oktober 2013<br />
• PLB PIM<br />
• PowerPC 440 Processor Memory Controller PIM<br />
• VFBC PIM<br />
• Native Port Interface PIM<br />
• MCB PIM<br />
NPI<br />
VFBC<br />
Command<br />
Fetch<br />
Command<br />
FIFO<br />
Interface<br />
Command<br />
Signals<br />
NPI<br />
Signals<br />
NPI<br />
Formatter<br />
Read Data<br />
FIFO<br />
Interface<br />
Read Data<br />
Signals<br />
Burst Controller<br />
Write Data<br />
FIFO<br />
Interface<br />
Write Data<br />
Signals<br />
Abbildung 2.68: Blockdiagramm vom VFBC<br />
Der hdmi_out IP-Core benutzt die VFBC Schnittstelle des MPMC. Diese ist<br />
ein PIM, welcher explizit für das Zwischenspeichern von 2D Daten gedacht<br />
ist. Eine einzelne VFBC Schnittstelle hat insgesamt drei verschiedene FI-<br />
FOs. Eine für Kommandos, eine Lese-Queue und eine Schreib-Queue. Das<br />
Blockdiagramm in Abbildung 2.68 beschreibt den Aufbau des VFBC.<br />
Der VFBC sieht vor, dass mit einem Bild mit definierter Größe in einem 2D<br />
Speicherbereich gearbeitet wird. In Abbildung 2.69 ist ein Beispiel für ein<br />
Bild der Größe 640x480 Pixel, welches in einem Speicherbereich der Größe<br />
1920x1080 Pixel liegt.<br />
In diesem Beispiel verwendet der VFBC den Speicher ab der Adresse 0x10000000.<br />
Es existieren 2 Bildausschnitte. Für das größere 1920x1080 Bild wird die X<br />
Size auf 1920 multipliziert mit der Anzahl an Bytes pro Pixel gesetzt. Für<br />
179
X-Ref Target - Figure 42<br />
Kapitel 2. Implementation 10. Oktober 2013<br />
1920<br />
Origin Byte<br />
Address<br />
0x1000_0000<br />
120<br />
1080p Video Frame Stored in External Memory<br />
640<br />
360<br />
VGA Read Transfer Region<br />
480<br />
1080<br />
Abbildung 2.69: VFBC: VGA Fenster in 1080p Frame<br />
die Y Size wird die Bildhöhe minus 1 gesetzt, also 1079. Die Stride ist in<br />
diesem Fall identisch zur X Size.<br />
Für das kleinere Bild wird X Size auf 640 multipliziert mit der Anzahl an<br />
Bytes pro Pixel und Y Size=479 gesetzt. Die Stride wird auf die X Size vom<br />
1920x1080 Bild gesetzt.<br />
Dies ermöglicht es ein kleineres Bild aus dem größeren Bild herauszuschneiden.<br />
Für die Einstellung der Parameter wird die Kommando-Queue benutzt.<br />
Das Format für die Steuerpakete ist in Tabelle 2.5 dargestellt.<br />
Kommando Steuerpaket<br />
Wort 0 Wort 1 Wort 2 Wort 3<br />
31:15 14:0 31 30:0 31:24 23:0 31:24 23:0<br />
Reserved X Size Write_NotRead Start Address Reserved Y Size Reserved Stride<br />
Tabelle 2.5: VFBC Steuerpaket<br />
2.4.3.3 Ergebnis HDMI<br />
Um es zu Ermöglichen einen ImageBus über HDMI auszugeben, kann der<br />
existierende hdmi_out IP-Core benutzt werden. Dieser liest ein 1280x720<br />
Pixel Bild über einer VFBC Schnittstelle aus dem Arbeitsspeicher. Für die<br />
Ausgabe eines ImageBus Signals muss also dieses in den Arbeitsspeicher<br />
geschrieben werden. Hierfür kann z.B. eine zweite VFBC Schnittstelle<br />
benutzt werden.<br />
180
Kapitel 2. Implementation 10. Oktober 2013<br />
Für ein Arbeitsmodul, welches das ImageBus Signal über HDMI ausgeben<br />
soll wären also die folgenden Arbeitsschritte nötig:<br />
1. hdmi_out IP-Core in das Design einbauen<br />
• Hängt vom pll_module ab, welches ebenfalls hinzugefügt werden<br />
muss<br />
• Verknüpfung mit einem der HDMI Ports in der User Constraint<br />
File (UCF) Datei<br />
2. Implementation eines neuen IP-Cores, welcher ein ImageBus Signal<br />
mittels eines VFBC Ports in den Speicher schreibt<br />
Auf Grund dieser Ausgangslage schätzen wir, dass ein Arbeitspaket, welches<br />
zum Ziel hat das ImageBus Signal via HDMI auszugeben, ca. 60 Arbeitsstunden<br />
benötigt. Davon 20 Arbeitsstunden für die Integration des existierenden<br />
hdmi_out IP-Cores, sowie 40 Arbeitsstunden für die Implementation<br />
des IP-Cores zum Speichern des ImageBus Signals in den Speicher.<br />
Diese Abschätzung bezieht sich auf eine Implementierung, welche ausschliesslich<br />
auf dem ATLYS laufen muss. Für das GENESYS würde aufgrund<br />
des in Abschnitt 2.4.3.1 erwähnten Zusatzchips weiterer Aufwand<br />
nötig.<br />
2.4.3.4 Ergebnis ImageCache<br />
Für ein ImageCache IP-Core eignet sich die VFBC nicht für den allgemeinen<br />
Fall. Die VFBC Schnittstelle arbeitet auf ganzen Bildern und nicht<br />
auf einzelnen Pixeln, deshalb ist ein Zugriff auf zufällige Pixel im Bild nicht<br />
einfach möglich.<br />
Ein ImageCache, der nur als Zwischenspeicher dienen soll, ließe sich jedoch<br />
verhältnismäßig einfach mittels der VFBC-Schnittstelle realisieren.<br />
Ein solcher wäre z.B. für die Übertragung von Daten über die langsame<br />
USB-Schnittstelle nützlich.<br />
Für einen ImageCache, der randomisierten Zugriff auf den Speicher ermöglichen<br />
soll, wäre ein Zugriff über den PLB, oder, alternativ, ein Zugriff<br />
über die NPI Schnittstelle vom MPMC nötig. Dies ist jedoch deutlich<br />
aufwendiger.<br />
181
Kapitel 2. Implementation 10. Oktober 2013<br />
2.4.4 Histogramm<br />
Ergebnis dieses Arbeitspakets sollte die Implementierung eines Histogramm<br />
IP-Cores sein, um eine Weiterverarbeitung der erhobenen Daten zu ermöglichen<br />
sowie damit dynamisch auf Änderungen in der Umgebung<br />
reagieren zu können.<br />
2.4.4.1 Umsetzung<br />
Der erste Teil dieses Arbeitspakets beinhaltet die Implementierung des Histogramms<br />
als IP-Core. Dazu wurde versucht eine Teststrecke den zur Verfügung<br />
gestellten Hilfsmitteln aufzubauen, wie sie in der Einführungsphase<br />
der Projektgruppe bereits genutzt wurde. Dazu wurden folgende Hilfsmittel<br />
eingesetzt.<br />
• Cosynth-Plugin für die OFFIS-Automation-Toolbox<br />
• XPS Template Projekt für das Nexys Board<br />
Hier stießen wir auf das Problem, das die Nutzung der gegebenen Werkzeuge<br />
nicht ohne Anpassung in unserer Konfiguration funktionierte. Es wurden<br />
mehrere Stunden in die Problemanalyse investiert, welche Ergebnislos<br />
blieb.<br />
Es wurde der Entschluss gefasst, eine Teststrecke mit bereits von der Projektgruppe<br />
entwickelten IP-Cores und dem für Projekt RoboArm angepassten<br />
OFFIS-Automation-Toolboxplugin umzusetzen, da diese Elemente leichter<br />
angepasst werden können und nötige Dokumentation existiert. Dazu wurde<br />
das Atlysboard von Digilent als alternative Zielplattform ausgewählt. Hierfür<br />
musste das XPS- Projekt zum auslesen von Kamerabildern auf das<br />
ATLYS-Board portiert werden, da dieses nur auf dem Genesysboard entwickelt<br />
und getestet wurde. Dabei stießen wir erneut auf zusätzliche Aufgaben,<br />
die nicht mit in die Aufgabenplanung einbezogen wurden. Dazu<br />
zählt das Anpassen der einzelnen IP-Cores, da diese mit speziell für das<br />
Genesys-Board erstellem RAM arbeiten, der vom Atlys-Board nicht unterstützt<br />
wird.<br />
Bei der tieferen Betrachtung der nötigen Arbeitsschritte für die Umsetzung<br />
des Histogramms sind mehrere Fragen aufgetreten. Es wurde das Versäumnis<br />
festgestellt, das der Wert für den dynamischen Schwellenwertfilter<br />
182
Kapitel 2. Implementation 10. Oktober 2013<br />
nicht spezifiziert und keine Anforderungen formuliert wurden. Des Weiteren<br />
stellte sich die Frage nach der generellen Notwendigkeit eines Histogramms,<br />
da die im zweiten Sprint erstellten Filterketten ohne ein solches<br />
auskamen. Ebenso ist die Kamera selber in der Lage, das erzeugte Kamerabild<br />
dynamisch den Umgebungsverhältnissen anzupassen, basierend<br />
auf einer Histogramm Auswertung die vom Kameramodul durchgeführt<br />
wird. Aufgrund dieser Überlegungen wurde die Implementierung des Histogramms<br />
ausgesetzt. Weitere Arbeitsstunden wurden aufgewandt um der<br />
Arbeitsgruppe "Filter Cores" bei der Integration ihres Systems zu helfen.<br />
Die ausstehenden Arbeitsziele wurden neu geplant, da die Notwendigkeit<br />
eines Histgrogramms zu diesem Zeitpunkt noch nicht ausreichend diskutiert<br />
wurde. Dieser Umstand folgt aus einer ungenügenden Arbeitspaket-<br />
Beschreibung während der Sprintplanung. Die Arbeitsplanung wurde daher<br />
überarbeitet um die Notwendigkeit eines Histogramm IP-Core zu evaluieren.<br />
183
Kapitel 2. Implementation 10. Oktober 2013<br />
2.4.5 Notwendigkeit eines Histogramms<br />
Dieses Arbeitspaket hat zum Ziel, die Notwendigkeit eines Histogramms<br />
zur dynamischen Helligkeitsanpassung des Bildstreams zu evaluieren. Da<br />
die eingesetzte Kamera bereits über eine histogrammbasierte Helligkeitsanpassung<br />
verfügt, werden für diesen Zweck Vergleichsmessungen bei<br />
unterschiedlichen Umgebungsparametern durchgeführt. Somit kann ermittelt<br />
werden, ob der Einsatz eines zusätzlichen Histogrammfilters für eine<br />
stabilere Filterkette sorgen kann. Für die Messungen wird in erster Linie<br />
der Histogrammfilter der OFFIS IDE eingesetzt. Für die Lösung dieser<br />
Aufgaben stehen insgesamt 2 Wochen zur Verfügung.<br />
2.4.5.1 Evaluation<br />
Die Evaluation wurde mit Hilfe des Atlys Boards umgesetzt und eine<br />
definierte Arbeitsumgebung eingerichtet. Weiter wurde ein Messaufbau<br />
umgesetzt, mit dem die benötigten Messwerte ermittelt wurden. Dabei<br />
wurden die Werte mit ein- / ausgeschalteten Autokorrekturfunktionen der<br />
Kamera in Kombination mit der OFFIS IDE Filterkette gesammelt. Die Filterkette<br />
entspricht der des Arbeitspakets Öbjekterkennung". Als Ergebnis<br />
liefert das Arbeitspaket eine Aussage über die Vor- / Nachteile der Autokorrekturfunktionen<br />
der Kamera und eine Empfehlung über die Notwendigkeit<br />
eines zusätzlichen Histogramms in der Filterkette.<br />
2.4.5.2 Beschreibung Der Arbeitsumgebung<br />
Zur Bildaufnahme wurde die VModCam in zwei unterschiedlichen Konfigurationen<br />
genutzt. Zu den Autokorrekturfunktionen zählen dabei die<br />
Belichtungszeit in Form von Helligkeitsanpassung sowie ein automatischer<br />
Weißabgleich. Die Übertragung der Kamerabilder an den PC erfolgte mit<br />
Hilfe des Atlys-Boards, wobei ein Bild ohne weitere Änderungen übertragen<br />
und von der OFFIS-Automation-Toolbox entgegengenommen wurde.<br />
Auf diesem Bildstream wurde daraufhin die im vorherigen Sprint erarbeitete<br />
Filterkette zur Objekterkennung eingesetzt und deren Ergebnisse bei<br />
unterschiedlichen Lichtverhältnissen aufgenommen. Die Filterkette selbst<br />
besteht aus der Extraktion des gewichteten Rotwertes sowie darauffolgendem<br />
Schwellenwert, einer Opening und Closing Operation. Auf dem<br />
Ergebnis wird im Folgenden eine BLOB-Detektion durchgeführt.<br />
Im Weiteren werden die Unterschiede der Kamerabilder bei ein- und ausgeschalteten<br />
Autokorrekturfunktionen in Bezug auf die unterschiedlichen<br />
184
Kapitel 2. Implementation 10. Oktober 2013<br />
Lichtverhältnisse Hell, Mittel und Dunkel dargestellt.<br />
2.4.5.3 Aufnahmen und Ergebnisanalyse<br />
Im Weiteren werden die Bilder, welche mit der VModCam aufgenommen<br />
wurden, miteinander verglichen. Diese Bilder wurden aufgenommen, während<br />
die Helligkeit variiert und die Kamera mit und ohne Autokorrekturfunktionen<br />
eingesetzt wurde.<br />
Dunkle Umgebung mit und ohne Autokorrekturfunktionen<br />
In den Abbildungen<br />
2.70(a) und 2.70(b) ist auf der linken Seite die Aufnahme dargestellt,<br />
die bei dunkler Umgebung und mit eingeschalteten Autokorrekturfunktionen<br />
gemacht wurde. Aus dieser Aufnahme konnten mit der gegebenen<br />
Filterstrecke zuverlässig die gesuchten Objekte erkannt sowie als Polygone<br />
dargestellt werden. Rechts ist das zugehörige Histogramm dargestellt, in<br />
dem die Farbintensitäten dargestellt sind.<br />
(a) Ergebnispolygone<br />
(b) Histogramm<br />
Abbildung 2.70: Aufname mit Autokorrekturfunktionen bei dunklen<br />
Lichtverhältnissen<br />
In den Abbildungen 2.71(a) und 2.71(b) ist im linken Bild die Aufhame<br />
dargestellt, die bei einer dunklen Umgebung und ausgeschalteten Autokorrekturfunktionen<br />
gemacht wurde. Diese Aufnahme zeigt, das bei der gegebenen<br />
Filterstrecke keine Flächen erkannt werden konnten. Auch aus dem<br />
zugehörigen Histogramm lässt sich ablesen, dass es eine starke Verschiebung<br />
der Intensitäten im Vergleich zur Abbildung 2.70(b) gibt.<br />
185
Kapitel 2. Implementation 10. Oktober 2013<br />
(a) Ergebnispolygone<br />
(b) Histogramm<br />
Abbildung 2.71: Aufname ohne Autokorrekturfunktionen bei dunklen<br />
Lichtverhältnissen<br />
Helle Umgebung mit und ohne Autokorrekturfunktionen<br />
Das Bild 2.72(a)<br />
zeigt eine Aufnahme bei heller Umgebung und eingeschalteten Autokorrekturfunktionen.<br />
Es wurden deutlich drei Flächen erkannt und in der<br />
Darstellung kenntlich gemacht. Das Histogramm in Abbildung 2.72(b) zeigt<br />
für ein Intensitätsintervall ein hohes aufkommen der Farbe Rot.<br />
(a) Ergebnispolygone<br />
(b) Histogramm<br />
Abbildung 2.72: Aufname ohne Autokorrekturfunktionen bei durchschnittlichen<br />
Lichtverhältnissen<br />
Für die Aufnahme in Abbildung 2.73(a) wurden die Autokorrekturfunktionen<br />
der Kamera deaktiviert und die Aufnahme erfolgte bei gleicher Umgebungshelligkeit<br />
wie in Abbildung 2.72(a). Im Vergleich zur Aufnahme mit<br />
Autokorrekturfunktionen ist deutlich zu sehen, dass die Erkennung der<br />
186
Kapitel 2. Implementation 10. Oktober 2013<br />
roten Flächen deutlich unzuverlässiger ist. Neben den erwarteten Flächen<br />
wurden auch weitere unerwünschte Polygone als Ergebnis ausgegeben.<br />
Dies lässt sich durch den fehlenden Weißabgleich in dem Bild 2.73(a) erklären,<br />
da hierdurch Flächen eine falsche Farbzusammensetzung und damit<br />
unter anderem einen zu hohen Rotanteil besitzen. Das Histogramm in Abbildung<br />
2.73(b) zeigt im Vergleich mit 2.72(b) eine deutliche Verschiebung<br />
der Intensitätskurven von allen Farben.<br />
(a) Ergebnispolygone<br />
(b) Histogramm<br />
Abbildung 2.73: Aufname ohne Autokorrekturfunktionen bei durchschnittlichen<br />
Lichtverhältnissen<br />
Durch die oben dargestellten Vergleiche wird deutlich, dass die Autokorrekturfunktionen<br />
der VModCam einen wesentlichen Vorteil für die Erkennung<br />
der roten Objekte im Bild liefert. Aufgrund dieser Erkenntnisse wird<br />
empfohlen, vorerst von einer Implementierung eines Histogramms in Form<br />
eines IP-Core abzusehen, da die eingesetzte Filterkette mit den Autokorrekturfunktionen<br />
der Kamera bereits stabile Ergebnisse erzeugt.<br />
2.4.6 Fazit und Ausblick<br />
In diesem Sprint wurden die Bildvorverarbeitungsketten getestet und als<br />
IP-Cores umgesetzt. Das Histogramm wurde nicht als IP-Core implementiert,<br />
da die vorhandenen Mittel eine dynamische Anpassung an das Umgebungslicht<br />
nicht erfordern. Die Machbarkeitsstudie der Umsetzung von<br />
Ausgaben über eine HDMI-Schnittstelle wurde durchgeführt und die Zeit<br />
für eine solche Umsetzung wurde eingeschätzt.<br />
Das Hauptziel des Sprints, eine Grundlage für die nachfolgende Bildverarbeitung<br />
als Bildvorverarbeitung umzusetzen, wurde erreicht.<br />
Des Weiteren wird ein neuer Sprint geplant, in dem die Algorithmen zur<br />
Auswertung der Bildinformationen entwickelt und umgesetzt werden. Diese<br />
187
Kapitel 2. Implementation 10. Oktober 2013<br />
werden auf dem Bildstrom aus der Bildvorverarbeitung aufsetzen.<br />
188
Kapitel 2. Implementation 10. Oktober 2013<br />
2.5 Sprintplanung Sprint 4<br />
Der Sprint 4 verfolgt weitere Ziele auf dem Weg zur Umsetzung der Anwendungsfälle<br />
Roboter steuern durch alternative Gesten und Armhaltung nachahmen.<br />
Für die alternative Gestensteuerung wird ein Softwareprototyp umgesetzt,<br />
der die Steuerung des Roboters durch Kopfbewegungen realisiert. Für<br />
Nachahmung der Armhaltung wird, aufbauend auf der im Sprint 2 umgesetzten<br />
Filterkette der Bildvorverarbeitung, die Tiefenerkennung als OFFIS-<br />
Automation-Toolbox-Plugin realisiert. Dieses soll die Tiefeninformationen<br />
der am menschlichen Arm erkannten Punkte liefern. Dadurch soll die Steuerung<br />
des Roboters im dreidimensionalen Räumen ermöglicht werden. Außerdem<br />
wird die Ausgabe auf HDMI umgesetzt. Damit wird eine Ausgabe<br />
direkt durch den FPGA, gesteuert über den Microblaze, ermöglicht. Diese<br />
Ausgabe ist schneller und direkter als die bisherige, über USB angesteuerte,<br />
Ausgabe.<br />
Um die Tiefenerkennung auf der Hardware umsetzen zu können, wird der<br />
zur Verfügung gestellte BLOB-IP-Core in das bisher erzeugte Hardwareprojekt<br />
eingebunden. Außerdem wird eine Interrupt-Routine auf dem Microblaze<br />
umgesetzt, welche die durch den BLOB-IP-Core erkannten Punkte<br />
zur Verfügung stellt. Diese Punkte werden mit ihren Koordinaten und<br />
ihren Schwerpunkt-Information am Microblaze für weitere Bildverarbeitung<br />
zur Verfügung gestellt. Auf der Microblazeebene sollen die Winkel zwischen<br />
den BLOBs bereitgestellt werden. In der OFFIS-Automation-Toolbox<br />
wird hierzu eine Visualisierung implementiert, welche die Schwerpunkte<br />
der erkannten Punkte darstellt.<br />
2.5.1 Softwareprototyp Kopfsteuerung<br />
Vorbedingungen<br />
• OFFIS-Automation-Toolbox<br />
• OFFIS-Automation-Toolbox-Plugin zur Ansteuerung des Roboterarms<br />
Arbeitspaketbeschreibung<br />
Ziel des Arbeitspaketes ist es den Roboterarm mittels einer alternativen<br />
Gestensteuerung anzusteuern. Diese alternative Gestensteuerung soll auf<br />
Kopfbewegungen reagieren (siehe Lastenheft).<br />
189
Kapitel 2. Implementation 10. Oktober 2013<br />
Die alternative Gestensteuerung soll in diesem Arbeitspaket als Bildverarbeitungskette<br />
in der OFFIS-Automation-Toolbox erstellt werden. Dabei soll<br />
jedoch darauf geachtet werden, dass sich die Bildverarbeitungskette auf<br />
das ATLYS-Board mit angemessenem Aufwand portieren lässt.<br />
Um dieses Ziel zu erreichen wird zunächst analysiert welche Kopfbewegungen<br />
zuverlässig erkannt werden. Für diese Arbeit werden ca. 2 Wochen<br />
veranschlagt. Am Ende dieser Unteraufgabe soll eine Bildverarbeitungskette<br />
für die OFFIS-Automation-Toolbox zuverlässig Kopfbewegungen erkennen,<br />
die später auf Roboterarmbewegungen abgebildet werden können.<br />
Die erkennbaren Kopfbewegungen sind dabei auf 2D-Bewegungen eingeschränkt.<br />
Aufbauend darauf wird eine Abbildung der Gesten auf die Gelenke des<br />
Roboterarms vorgenommen. Dies beinhaltet die Ansteuerung des Roboterarms<br />
über das bereits vorliegende OFFIS-Automation-Toolbox Plugin. Diese<br />
Abbildung soll als Python Skript implementiert werden. Am Ende dieser<br />
Teilaufgabe soll der Roboterarm mittels Kopfbewegungen gesteuert werden<br />
können.<br />
Deadlines<br />
• 17.04.2013 12:00 Analyse + OLVIS Bildverarbeitungskette<br />
• 01.05.2013 12:00 Ansteuerung durch Kinematik + Pythonskripte<br />
• 08.05.2013 12:00 Integration & Dokumentation<br />
Personen<br />
• Sebastian Reichel<br />
• Matthias Stasch<br />
Aufwand<br />
• 8 PT Analyse + OLVIS Bildverarbeitungskette<br />
• 8 PT Ansteuerung durch Kinematik + Pythonskripte<br />
• 4 PT Integration & Dokumentation<br />
190
Kapitel 2. Implementation 10. Oktober 2013<br />
Lieferumfang<br />
• OFFIS-Automation-Toolbox<br />
• OFFIS-Automation-Toolbox-Plugin zur Ansteuerung des Roboterarms<br />
• OLVIS-Bildverarbeitungskette inkl. Pythonskripte<br />
• Dokumentation für die Bildverarbeitungskette<br />
191
Kapitel 2. Implementation 10. Oktober 2013<br />
2.5.2 Tiefenerkennung<br />
Vorbedingungen<br />
• Filterkette der Objekterkennung (Sprint 2)<br />
• Bilder der linken u. rechten Kamera (Sprint 2 und 3)<br />
• Ansteuerung Roboterarm (Sprint 1 und 2)<br />
Arbeitspaketbeschreibung<br />
Ziel dieses Arbeitspaketes ist die Erkennung von Punkten und Winkeln im<br />
dreidimensionalen Raum anhand von 3D-Kameradaten. Zu diesem Zweck<br />
muss zunächst eine Methode ausgewählt werden, mit der Tiefeninformationen<br />
zuverlässig aus zwei stereoskopischen Kamerabildern extrahiert werden<br />
können. Diese Lösung muss anschließend in die OFFIS-Automation-<br />
Toolbox integriert werden. Dabei soll die vorhandene 2D-Verarbeitungskette<br />
für die Tiefenerkennung optimiert werden.<br />
Unter Tiefeninformation werden dabei dreidimensionale Koordinaten verstanden,<br />
welche die rote Markierungen an dem Arm der Testperson repräsentieren.<br />
Anders als bei der zweidimensionalen Armerkennung reichen hier<br />
drei Markierungen nicht aus. Eine vierte muss am Torso der Testperson<br />
hinzugefügt werden. Die Tiefe dieses Punktes im Raum repräsentiert den<br />
Ursprung. Aus diesen Raumpunkten müssen mit Hilfe der Python Automation<br />
die Gelenkpositionen der Testperson im Raum bestimmt werden.<br />
Anhand dieser können im Anschluss die Winkel der Gelenke berechnet<br />
werden, dies geschieht ebenfalls in der Python Automation.<br />
Am Ende des Arbeitspaketes steht somit ein Demonstrator, welcher einer<br />
beliebigen Testperson ermöglicht den Roboterarm, innerhalb seiner Freiheitsgrade,<br />
zu steuern. Diese muss dazu die entsprechenden roten Markierungen<br />
in Form von Armbinden verwenden. Eine entsprechende Evaluationsstrategie<br />
der Punkte und Winkel muss gefunden und umgesetzt werden.<br />
Bei der Umsetzung der Softwareprototypen für die dreidimensionale<br />
Steuerung des Roboterarms muss speziell darauf geachtet werden, dass die<br />
verwendeten Algorithmen auf in Hardware bzw. auf dem FPGA umsetzbar<br />
sind.<br />
Deadlines<br />
• 24.04.13 12:00 Analyse 3D Info + Punkte im 3D Raum<br />
192
Kapitel 2. Implementation 10. Oktober 2013<br />
• 08.05.13 12:00 Integration in die OFFIS-Automation-Toolbox + Winkelberechnung<br />
• 15:05.13 12:00 Dokumentation<br />
Personen<br />
• Patrick Elfert<br />
• Peter Gewald<br />
Aufwand<br />
• 12 PT - Analyse 3D Info + Punkte im 3D Raum<br />
• 8 PT - Integration in die OFFIS-Automation-Toolbox + Winkelberechnung<br />
• 4 PT - Dokumentation<br />
Lieferumfang<br />
• OFFIS-Automation-Toolbox-Projekt:<br />
– Verarbeitungskette zur Objekterkennung<br />
– Verarbeitungskette zur Tiefenerkennung<br />
– Automationsskript zur Winkelberechnung<br />
• Microblaze-Code zur Ansteuerung des Roboterarms<br />
• Algorithmen zur Erkennung von Punkten und Winkeln<br />
• Dokumentation für die Verarbeitungskette und Algorithmen<br />
193
Kapitel 2. Implementation 10. Oktober 2013<br />
2.5.3 Echtzeitbildausgabe auf HDMI<br />
Vorbedingungen<br />
• Atlys-Projekt aus Sprint 2<br />
• hdmi_out IP-Core der Fa. Digilent<br />
• Image-Switch IP-Core aus Sprint 3<br />
• MPMC IP-Core der Fa. Xilinx<br />
• ImageBus-IP-Core aus Sprint 2<br />
• Evaluation aus vorherigem Sprint<br />
Arbeitspaketbeschreibung<br />
Ziel des Arbeitspakets ist es eine Echtzeit-Ausgabe über den HDMI Port<br />
des ATLYS -Boards zu ermöglichen. Dies beinhaltet im ersten Schritt die<br />
Integration des hdmi_out IP-Cores in das Design des ATLYS-Boards, welches<br />
außerdem das Hinzufügen eines pll_modules beinhaltet. Im folgenden<br />
Schritt soll ein neuer IP-Core implementiert werden, welcher ein ImageBus-<br />
Signal über den VFBC in den RAM schreibt. Der Image Switch IP-Core wird<br />
durch zusätzlichen Microblaze-Code um eine HW-Ansteuerung erweitert,<br />
um bspw. durch Tastendruck auf dem ATLYS-Board zwischen gefiltertem<br />
und Originalbild umschalten zu können. Hierzu wird ein Push_Button IP-<br />
Core zum Projekt hinzugefuegt. Um ein Bild aus dem RAM über USB an<br />
einen PC schicken zu können soll weiterhin ein Memory-to-ImageBus IP-<br />
Core erstellt werden. Alle IP-Cores werden in VHDL implementiert. Für<br />
das Arbeitspaket stehen insgesamt 6 Wochen zur Verfügung.<br />
Deadlines<br />
• 17.04.2013 12:00 ImageBus-to-Memory<br />
• 24.04.2013 12:00 HW-Schalter Implementierung<br />
• 08.05.2013 12:00 Memory-to-ImageBus<br />
• 15.05.2013 12:00 Integration & Dokumentation<br />
194
Kapitel 2. Implementation 10. Oktober 2013<br />
Personen<br />
• Fabian Diefenbach<br />
• Tobias Schüürhuis<br />
Aufwand<br />
• 8PT - ImageBus-to-Memory<br />
• 4PT - HW-Schalter Implementierung<br />
• 8PT - Memory-to-ImageBus<br />
• 4PT - Integration & Dokumentation<br />
Lieferumfang<br />
• Image-Switch Microblaze-Code<br />
• Angepasstes Atlys-Projekt inkl. neuer IP-Cores<br />
– Push_Button IP-Core<br />
– ImageBus-to-Memory IP-Core<br />
– Memory-to-ImageBus IP-Core<br />
• Dokumentation<br />
195
Kapitel 2. Implementation 10. Oktober 2013<br />
2.5.4 Hardware Umsetzung der Bewegungserkennung<br />
Vorbedingungen<br />
• OFFIS-Toolbox<br />
• OLVIS Bildverarbeitungskette Armbewegung (Sprint 2)<br />
• Threshold-, RGB2Grey-, Morphologie- und Blob-IP-Core<br />
Arbeitspaketbeschreibung<br />
Ergebnis dieses Arbeitspakets soll es sein, die gesamte Bildverarbeitungskette,<br />
die zum Erkennen von roten Flächen eingesetzt wurde, auf einem<br />
FPGA zu realisieren. Die Bildverarbeitungskette wurde im zweiten Sprint<br />
evaluiert und umgesetzt.<br />
Die Hardwarebeschreibung wird mit VHDL in der XPS Umgebung von Xilinx<br />
realisiert und für das ATLYS-Board ausgerichtet werden. Hierfür wird<br />
uns ein Blob IP-Core bereitgestellt mit dem wir uns vertraut machen. Für<br />
die Auswertung der erkannten Flächen muss ein weiterer IP-Core designet<br />
werden, der die gegeben Informationen des Blob-IP-Core nutzt und sein<br />
Ergebnis an den PC weiterleitet.<br />
Im nächsten Schritt werden alle Komponenten zu einem Gesamtsystem auf<br />
dem ATLYS-Board integriert, so dass Bilder mit der VmodCAM aufgenommen<br />
werden und mit der erstellten Filterkette rote Flächen in diesen erkannt<br />
werden.<br />
Das Ergebnis soll an einen Computer mittels USB übertragen werden und<br />
von der OFFIS-Toolboox visualisiert werden. Hierfür wird ein Übertragungsprotokoll<br />
konzeptioniert und ein OLVIS Plugin erstellt. Das Plugin<br />
soll die durch die Filterkette erkannten roten Flächen in dem ebenfalls<br />
übertragenen Bild markieren und kenntlich machen. Das Übertragungsprotokoll<br />
soll die Kamerabilder und die Informationen über die erkannten<br />
Flächen übertragen, so dass sie Ausgewertet werden können.<br />
Deadlines<br />
• 10.04.2013 12:00 Einarbeitung in Blob-IP-Core<br />
• 17.04.2013 12:00 Schwerpunktberechnung mit Hilfe des Blob-IP-Core<br />
• 01.05.2013 12:00 Fertigstellung u. Integration der IP-Cores<br />
196
Kapitel 2. Implementation 10. Oktober 2013<br />
• 08.05.2013 12:00 Erstellen eines Übertragungsprotokoll & Anpassung<br />
des OLVIS Plugin<br />
• 14.05.2013 12:00 Gesamtintegration & Dokumentation<br />
Personen<br />
• Vitaliy Beguchiy<br />
• Markus Müller<br />
Aufwand<br />
• 4 PT Einarbeitung in Blob-IP-Core<br />
• 4 PT Schwerpunktberechnung mit Hilfe des Blob-IP-Core<br />
• 8 PT Fertigstellung u. Integration der IP-Cores<br />
• 4 PT Erstellen eines Übertragungsprotokoll & Anpassung des OLVIS<br />
Plugin<br />
• 4 PT Gesamtintegration & Dokumentation<br />
Lieferumfang<br />
• OFFIS-Toolbox<br />
• OFFIS-Toolbox-Plugin zum Empfangen der Filterinformationen<br />
• AtlysBoard inklusive XPS Projekt<br />
• Angepasster Blob-IP-Core, angepasste IP-Core, erstellte IP-Core<br />
197
Kapitel 2. Implementation 10. Oktober 2013<br />
2.6 Sprint 4<br />
Des Weiteren werden die Arbeitspakete ausführlich beschrieben. Die Ergebnisse<br />
sowie die bei der Umsetzung entstandenen Probleme werden vorgestellt.<br />
2.6.1 Softwareprototyp Kopfsteuerung<br />
Ziel dieses Arbeitspaketes ist es den Roboterarm mittels einer alternativen<br />
Gestensteuerung anzusteuern. Diese soll auf Kopfbewegungen reagieren<br />
(siehe 1.2.3.3).<br />
2.6.1.1 1. Ansatz: Kopfsteuerung ohne Markierungen<br />
Im ersten Kopf-Tracking Ansatz wird versucht den Kopf aus den Videodaten<br />
zu extrahieren. Dazu wird die Bildverarbeitungskette aus Abbildung<br />
2.74 verwendet.<br />
Zunächst wird eine Region of interest (ROI) auf das Bild angewendet, um<br />
den zu analysierenden Bildbereich einzuschränken und mögliche Störungen<br />
durch den Hintergrund zu minimieren. Die ROI wird dabei so konfiguriert,<br />
dass in ihr der Kopf, inklusive der Schultern, zu sehen ist.<br />
Um den Kopf aus den Bilddaten zu extrahieren, wird das Bild mit dem<br />
Equalizer-Histogramm-Filter der OFFIS-Toolbox in ein Graubild umgewandelt.<br />
Auf dem entstanden Graubild wird ein Schwellwertfilter (Threshold),<br />
angewendet. Dieser wird manuell auf die bedienende Person und die<br />
Lichtverhältnisse angepasst. Abschließend wird ein BLOB-Erkennungsfilter<br />
auf dem Bild angewendet, welche den Kopf identifiziert (siehe Abbildung<br />
2.75).<br />
Der Ansatz wurde mit verschiedenen Testpersonen und unter verschiedenen<br />
Lichtbedingungen getestet. Dabei wurde festgestellt, dass der Ansatz<br />
nicht stabil und robust genug ist. Zudem ist die Menge an extrahierbaren<br />
Daten für ein Mapping auf die Kinematik nicht ausreichend. Daher wurde<br />
dieser Ansatz verworfen und ein neuer Ansatz entwickelt, welcher in Abschnitt<br />
2.6.1.2 beschrieben wird.<br />
2.6.1.2 2. Ansatz: Kopfsteuerung mit Markierungen<br />
Da die roten Markierungen am Arm bereits gut funktioniert haben, werden<br />
von uns ähnliche Markierungen im Gesicht befestigt. Das Ziel ist es, diese<br />
Markierungen im Bild zu finden und nur mit diesen zu arbeiten.<br />
198
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.74: OLVIS-Bildverarbeitungskette zum Ansatz 1<br />
Da eine seitliche Kopfneigung festgestellt werden soll, werden oben und<br />
unten im Gesicht rote Punkte befestigt. Diese beiden Punkte sollen über<br />
die Kombination aus einem RGB2Grey-Filter, welcher einen gewichteten<br />
Rotkanal extrahiert und einem Threshold-Filter herausgestellt werden. Zum<br />
Schluss wird eine BLOB-Erkennungsfilter eingesetzt um Koordinaten für<br />
die Punkte zu erhalten.<br />
Moduswechsel mit Augenerkennung<br />
Da sich aus den zur Verfügung stehenden Daten keine Tiefeninformation<br />
gewinnen lässt, muss eine Möglichkeit entwickelt werden, um mehr Informationen<br />
zu erhalten. Dies ist notwendig, da die bisher erfasste Neigung<br />
nur ausreicht um eine Dimension zu kontrollieren. Zu diesem Zweck<br />
wird ein Modussystem implementiert. Dabei werden mehr Informationen<br />
199
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.75: Ergebnis der OLVIS-Bildverarbeitungskette zum Ansatz 1<br />
erzeugt um die Dimensionen zu kontrollieren, da eine Geste für mehrere<br />
Dimensionen verwendet werden kann.<br />
Um den Modus zu wechseln muss eine Geste erkannt werden. Hierzu wird<br />
eine Erkennung der Augen entwickelt. Es wird dabei lediglich überprüft,<br />
ob bei einer senkrechten Kopfhaltung die Augen geöffnet oder geschlossen<br />
sind. Die Augen werden dabei in einer ROI gesucht, welche anhand der<br />
roten Punkte, die zur Erkennung der Kopfhaltung verwendet werden, ausgerichtet<br />
wird.<br />
Die ROI ist dynamisch implementiert, sodass sich die Größe der ROI automatisch<br />
an den Abstand des Bedieners zur Kamera anpasst. Eine Reihe<br />
von Tests mit verschiedenen Testpersonen hat ergeben, dass die Erkennung<br />
des Zustandes der Augen ohne Infrarotbeleuchtung nicht praktikabel ist.<br />
Im Rahmen der Tests wurde zudem festgestellt, dass die für die FPGA-<br />
Implementation verwendete Kamera über einen Infrarot-Cutter verfügt.<br />
Dadurch ist die Verwendung von Infrarotbeleuchtung ausgeschlossen.<br />
Moduswechsel durch Drehung des Kopfes<br />
Da sich die Steuerung des Modus durch die Erkennung der Augen als<br />
200
Kapitel 2. Implementation 10. Oktober 2013<br />
nicht umsetzbar herausgestellt hat, wurde ein alternativer Ansatz verfolgt.<br />
Dabei soll eine Drehung des Kopfes erkannt werden. Hierzu wird von<br />
uns eine grüne Markierung in der Nähe der Ohren befestigt. Diese grüne<br />
Markierung ist nur sichtbar, wenn der Kopf gedreht ist. Zur Erkennung<br />
wird das Verfahren für die roten Markierungen benutzt. Um statt der roten<br />
Markierungen die grüne zu finden wird nur eine Änderung des RGB2Grey-<br />
Filters benötigt, welcher anstatt des gewichteten Rotkanals, einen gewichteten<br />
Grünkanal extrahiert.<br />
Abbildung 2.76: OLVIS-Bildverarbeitungskette zum Ansatz 2<br />
Die resultierende Bildverarbeitungskette, zu sehen in Abbildung 2.76, liefert<br />
als Ausgabe die Position von den roten und grünen Markierungen zur<br />
weiteren Analyse. Eine Beispielausgabe lässt sich in Abbildung 2.77 sehen.<br />
Um aus diesen die Kopfneigung zu bestimmen wird überprüft ob sich die<br />
obere rote Markierung links oder rechts von der unteren roten Markierung<br />
201
Kapitel 2. Implementation 10. Oktober 2013<br />
befindet. Wenn sich beide ungefähr übereinander befinden ist der Kopf<br />
gerade.<br />
Zur Bestimmung, ob der Kopf gedreht ist, wird überprüft ob eine grüne<br />
Markierung gefunden wird. Wenn dies der Fall ist, muss der Kopf gedreht<br />
sein. Im anderen Fall ist der Kopf nicht gedreht.<br />
(a) Bild ohne Kopfdrehung<br />
(b) Bild mit Kopfdrehung<br />
Abbildung 2.77: Ausgaben der OLVIS-Bildverarbeitungskette zum Ansatz<br />
2<br />
Dateistruktur<br />
• offis-toolbox/HeadTracking/HeadTracking/HeadTracking.oap: Toolbox<br />
Projektdatei<br />
• offis-toolbox/HeadTracking/HeadTracking/HeadTracking.ogr: Toolbox<br />
Projektdatei<br />
• offis-toolbox/HeadTracking/HeadTracking/magic.py: Python Code für<br />
Automation<br />
• offis-toolbox/HeadTracking/HeadTracking2/HeadTracking2.oap: Toolbox<br />
Projektdatei<br />
• offis-toolbox/HeadTracking/HeadTracking2/HeadTracking2.ogr: Toolbox<br />
Projektdatei<br />
• offis-toolbox/HeadTracking/HeadTracking2/magic2.py: Python Code<br />
für Automation<br />
202
Kapitel 2. Implementation 10. Oktober 2013<br />
• offis-toolbox/HeadTracking/HeadTracking2/roboarm.ini: Konfigurationsdatei<br />
für Kinematik<br />
2.6.1.3 Servo IP-Core<br />
Da für die Entwicklung der Rückwärtskinematik kein ATLYS-Board zur<br />
Verfügung stand, wurde stattdessen das GENESYS-Board verwendet. Hierzu<br />
musste zunächst der Servo IP-Core angepasst werden, um mit der<br />
geänderten Taktfrequenz zu funktionieren. Dies wurde zum Anlass genommen<br />
den IP-Core zu überarbeiten und zu dokumentieren.<br />
Blockschaltbild<br />
clk<br />
reset<br />
reg[0:31]<br />
servo_v1_00_a<br />
output<br />
Abbildung 2.78: Blockschaltbild des Servo IP-Core<br />
Beschreibung<br />
20ms<br />
1ms 1.5ms 2ms<br />
Abbildung 2.79: Servo Signal<br />
Der Servo-IP-Core ist zuständig für die Ansteuerung eines Servos. Dazu<br />
muss ein Pulspositionsmodulation-Signal, wie in Abbildung 2.79 zu sehen,<br />
203
Kapitel 2. Implementation 10. Oktober 2013<br />
generiert werden. Der IP-Core generiert alle 20 Millisekunden einen Puls,<br />
dessen Länge über den PLB vom Microblaze aus einstellbar ist. Der Servo<br />
stellt sich auf ca. 0 ◦ , wenn ein Puls von einer Millisekunde verwendet<br />
wird. Wenn ein Puls von zwei Millisekunden empfangen wird, stellt sich<br />
der Servo auf ca. 180 ◦ . Zwischen diesen Zeiten existiert eine lineare Abbildung<br />
von Zeiten auf Winkel. Zum Beispiel stellt eine Pulsdauer von 1, 5<br />
Millisekunden den Winkel auf 90 ◦ dar, also die Mitte.<br />
Für die Implementation wurde ein Zustandsautomat verwendet. Dieser ist<br />
in Abbildung 2.80 abgebildet. Dabei bezeichnet register den Wert aus dem<br />
PLB-Register, welcher die Pulslänge in µs enthält. Im Resetzustand wird<br />
das Register auf 1500µs gesetzt, so dass der Servo sich nach einem Reset<br />
ungefähr in einer mittleren Stellung befindet.<br />
Der Zustand st1_high setzt das Signal. Während dieses Zustands wird der<br />
Puls gesendet. Der folgende Zustand st2_low generiert die dazugehörige<br />
Pause.<br />
register µs<br />
40ms<br />
start st0_reset<br />
st1_high st0_low<br />
20ms − register µs<br />
Abbildung 2.80: Zustandsautomat im Servo IP-Core<br />
Die Servo IP-Core Implementation unterstützt eine Bustaktung von maximal<br />
1 GHz.<br />
Treiber<br />
Der Treiber des IP-Core verfügt über acht Methoden mit denen Werte gesetzt<br />
und gelesen werden können, sowie über drei Konstruktoren zur Initialisierung.<br />
Die unterschiedlichen Konstruktoren benötigen unterschiedliche<br />
Parameter bei der Initialisierung.<br />
Servo () ;<br />
Der erste Konstruktor verfügt über keine Parameter und setzt feste Werte<br />
für die Variablen min, max und base. Es werden dabei für min 0, für max<br />
3000 und als base 0 verwendet. min und max begrenzen die Range in denen<br />
204
Kapitel 2. Implementation 10. Oktober 2013<br />
der Servo angesteuert werden kann und base bezeichnet die Basisaddresse<br />
des Servo.<br />
Servo ( unsigned int base_address );<br />
Dem zweite Konstruktor wird die Basisaddresse als Parameter übergeben.<br />
Die Basisadresse ist dabei vom Typ unsigned integer.<br />
Servo ( unsigned int base_address , unsigned short minimum ,<br />
unsigned short maximum );<br />
Dem dritten Konstruktor wird die Basisaddresse, sowie Werte für die Range<br />
des Servo übergeben. Die Range wird als Typ unsigned short angegeben.<br />
Diese Methode setzt zusätzlich den Winkel des Servo auf 90 Grad.<br />
unsigned int getBase () ;<br />
Mit der parameterlosen Methode getBase kann die Basisaddresse ausgelesen<br />
werden. Diese wird dabei als Rückgabewert vom Typ unsigned integer<br />
zurückgegeben.<br />
void reset () ;<br />
Die Methode reset setzt auf XIo_Out32 den Wert base+0x100, 0x0a.<br />
unsigned short get () ;<br />
Die Methode get gibt die Basisaddresse auf XIo_In32 aus.<br />
void set_range ( unsigned short minimum , unsigned short maximum<br />
);<br />
Die Methode set_range kann verwendet werden um die Range des Servo<br />
einzustellen, in welcher sich die Werte bei der Ansteuerung des Servo bewegen<br />
dürfen. Wenn diese Methode nicht ausgeführt wird, werden für min<br />
und max die Werte aus dem Konstruktor verwendet.<br />
void set ( unsigned short microseconds );<br />
Die Methode set verfügt über einen Parameter microseconds vom Typ unsigned<br />
short. Es wird intern die Methode set(unsigned short ms, bool ignore_minmax)<br />
mit den Parametern microseconds und false aufgerufen. Mit dieser Methode<br />
kann ein Winkel in Mikrosekunden gesetzt werden.<br />
205
Kapitel 2. Implementation 10. Oktober 2013<br />
void set ( unsigned short microseconds , bool ignore_range );<br />
Eine zweite Methode set des Treibers wird mit zwei Parametern aufgerufen.<br />
Die Parameter sind von den Typen unsigned short und bool. Der Parameter<br />
vom Typ unsigned short ist identisch zu dem Parameter der vorherigen set-<br />
Methode. Der Parameter von Typ bool ersetzt den Parameter false, welcher<br />
in der vorherigen set-Methode übergeben wurde. Er bewirkt, dass die min<br />
und max Einstellungen der Range ignoriert werden.<br />
void set_angle ( unsigned short degree );<br />
Die Methode set_angle kann verwendet werden um den Servo einen Winkel<br />
anfahren zu lassen. Im Gegensatz zur set-Methode wird hierbei der Winkel<br />
in Grad angegeben.<br />
unsigned short get_angle () ;<br />
get_angle gibt den aktuellen Winkel des Servo, der im Treiber gespeichert<br />
ist, in Grad zurück.<br />
Dateistruktur<br />
• ip-cores/drivers/servo_v1_00_a/data/servo_v2_1_0.mdd: Generiert von<br />
Xilinx<br />
• ip-cores/drivers/servo_v1_00_a/data/servo_2_1_0.tcl: Generiert von Xilinx<br />
• ip-cores/drivers/servo_v1_00_a/data/src/servo.cpp: Cpp-Datei mit Implementierung<br />
• ip-cores/drivers/servo_v1_00_a/data/src/servo.h: Cpp-Datei mit Prototypendefinition<br />
Änderungen in diesem Sprint<br />
• Das Generic für die Taktfrequenz vom Clock-Pin wird jetzt verwendet.<br />
Zuvor musste der IP-Core angepasst werden, wenn die Taktfrequenz<br />
vom Bus geändert wird. Jetzt geschieht die Anpassung über<br />
das Generic, welches von der Xilinx Toolchain automatisch angepasst<br />
wird.<br />
206
Kapitel 2. Implementation 10. Oktober 2013<br />
• Der IP-Core wurde optimiert, so dass er statt einer 18-Bit Multiplikation<br />
zwei Zähler benutzt. Da der Servo IP-Core mehrfach instantiiert<br />
wird, werden sonst sehr viele, in ihrer Anzahl begrenzten, Multiplikationseinheiten<br />
benötigt.<br />
2.6.1.4 USB Driver IP-Core<br />
Der USB Driver IP-Core stellt eine Abstraktion der USB-Schnittstelle zur<br />
Verfügung. Der IP-Core wird über den PLB konfiguriert und liefert USB-<br />
Steuernachrichten ebenfalls an diesen. Für jede ankommende Steuernachricht<br />
löst der USB Driver einen Interrupt am Microblaze aus.<br />
Für größere Datenmengen existiert des weiteren eine Abstraktion für USB-<br />
Bulkdaten. Diese können in einen FIFO-Speicher geschrieben werden.<br />
Blockschaltbild<br />
debug[0:15]<br />
interrupt<br />
SPLB<br />
usb_driver<br />
bulk_in<br />
bulk_out<br />
ext_usb<br />
Abbildung 2.81: Blockschaltbild des USB Driver IP-Core<br />
Treiber<br />
Der USB-Driver Core Treiber stellt eine Wrapperklasse um die usb_driver.h<br />
dar. Die usb_driver.h wurde zur Verfügung gestellt und stellt Methoden für<br />
die Kommunikation über die USB-Verbindung zur Verfügung. Der Wrapper<br />
besitzt, neben einem Konstruktor, fünf Methoden um Interrupts über<br />
die USB-Verbindung zu senden und empfangen.<br />
USB ( u32 base_address , bool debug = false );<br />
Dem Konstruktor der Klasse muss beim Aufruf die Basisaddresse übergeben<br />
werden. Der zweite Parameter debug, ist standardmäßig auf false gesetzt.<br />
Dies bedeutet, dass der Interrupt-Handler keine seriellen Ausgaben generiert.<br />
Diese Ausgabe sollte nur verwendet werden, wenn garantiert werden<br />
207
Kapitel 2. Implementation 10. Oktober 2013<br />
kann, dass weniger als ein Interrupt pro Sekunde generiert wird.<br />
bool debug ;<br />
Um den Parameter debug auf true zu setzen, kann dieser direkt gesetzt werden,<br />
da es sich hier um eine public-Variable der Klasse handelt.<br />
void setup_interrupts ( XIntc * interruptController , u8 pin );<br />
Die Methode setup_interrupts erstellt den Interruptkontroler für die USB-<br />
Interrupts. Hierzu muss ein Zeiger auf den Interruptcontroller und der<br />
Interrupt-Pin übergeben werden.<br />
void register_handler ( UsbMessageType type , UsbHandler handler<br />
);<br />
Mit der Methode register_handler wird ein neuer Handler erzeugt. Es muss<br />
hierzu der UsbMessageType übergeben werden, auf welchen der Handler<br />
reagieren soll, sowie ein UsbHandler, der zuvor erzeugt wurde.<br />
void unregister_handler ( UsbMessageType type );<br />
Um einen Handler zu deaktivieren gibt es die Methode unregister_handler.<br />
Dieser wird der UsbMessageType übergeben. Nach Aufruf dieser Methode<br />
ist der Handler gelöscht.<br />
void send ( const UsbMessage & msg , int len = 8) ;<br />
Um Nachrichten über USB zu senden, wird die Methode send zur Verfügung<br />
gestellt. Dieser wird eine Referenz auf eine erstellte USB-Message<br />
übergeben. Der zweite Parameter der Methode ist fest eingestellt und wird<br />
intern von der Methode verwendet und braucht nicht angegeben zu werden.<br />
Intern leitet die Methode die Daten an eine Methode der<br />
usb_driver.h weiter.<br />
void interrupt_handler () ;<br />
Die Methode interrupt_handler wird aus technischen Gründen public zur<br />
Verfügung gestellt, wird aber ausschließlich intern verwendet und sollte<br />
NICHT verwendet werden.<br />
Dateistruktur<br />
• ip-cores/drivers/usb_driver_v2_00_a/src/usb.h: Cpp-Datei mit Prototypendefinition<br />
208
Kapitel 2. Implementation 10. Oktober 2013<br />
• ip-cores/drivers/usb_driver_v2_00_a/src/usb_message_type_decoder.cpp:<br />
Cpp-Datei mit Implementierung<br />
2.6.1.5 Cam-USB IP-Core<br />
Der Cam-USB IP-Core verbindet einen ImageBus mit dem USB-Driver IP-<br />
Core. Dies erfordert, dass mit geringer Taktung gearbeitet wird, da der<br />
IP-Core nicht überprüft, ob der FIFO-Speicher voll ist.<br />
Blockschaltbild<br />
pixel_clock<br />
direct_wrClk<br />
PLB<br />
IMAGE_BU<br />
S<br />
cam_usb<br />
direct_wrReq<br />
direct_wrData[31:0]<br />
Abbildung 2.82: Blockschaltbild des Cam USB IP-Core<br />
Treiber<br />
Der USB Cam Treiber implementiert die Aktivierung und Deaktivierung<br />
der Kameras. Der Treiber stellt hierzu einen Konstruktor und zwei Methoden<br />
zur Verfügung. Dem Konstruktor muss die Basisaddresse als Parameter<br />
übergeben werden.<br />
CamUSB ( u32 base_address );<br />
Mit der Methode enable kann die Kamera aktiviert werden. Diese Methode<br />
muss beim erzeugen des Handlers für den USB-Message-Type<br />
USB_TYPE_IMAGE_START aufgerufen werden. Durch den Aufruf wird<br />
der Wert 0xffffffff in das Register der Basisaddresse geschrieben.<br />
void enable () ;<br />
Die Methode disable deaktiviert die Kamera. Dabei wird der Wert 0x00000000<br />
in das Register der Basisaddresse geschrieben. Diese Methode muss vom<br />
Handler für den USB-Message-Type USB_TYPE_IMAGE_STOP aufgerufen<br />
werden.<br />
void disable () ;<br />
209
Kapitel 2. Implementation 10. Oktober 2013<br />
Dateistruktur<br />
• ip-cores/drivers/camusb_v1_00_a/src/cam_usb.cpp: Cpp-Datei mit Implementierung<br />
• ip-cores/drivers/camusb_v1_00_a/src/cam_usb.h: Cpp-Datei mit Prototypendefinition<br />
2.6.1.6 VmodCam<br />
Das VmodCamPlugin muss angepasst werden, um die Veränderungen am<br />
USB-Driver und die Einführung der neuen USB-Message-Types zu verwenden.<br />
Zum diesem Zweck wurde die usb_message_type.h erstellt. In dieser<br />
Datei werden die Datenstrukturen der Message-Types definiert. Es werden<br />
derzeit die folgenden Message-Types unterstützt:<br />
1 class SizePacket<br />
2 class StartPacket<br />
3 class StopPacket<br />
4 class ImageBusSwitchPacket<br />
Im Rahmen der Anpassung an die neuen Message-Types wurden die<br />
usb_message_type.h und die CypressUsb.h in der Dateistruktur in eine höhere<br />
Ebene verschoben. Hierbei wurden ebenfalls die Dateipfade in der QT-<br />
Projektdatei angepasst. Das Verschieben der Dateien wurde vorgenommen,<br />
da die betroffenen Dateien nicht projektgebunden sind, sondern für alle<br />
QT Projekte mit USB-Kommunikation benötigt werden. Hierdurch wird<br />
Dateiredundanz vermieden.<br />
Dateistruktur<br />
• plugins/vision/VmodCamPlugin/VmodCamPlugin.pro: QT-Projektdatei<br />
• offis-toolbox/plugins/CypressUsb.h: CypressUsb.h Cpp-Datei<br />
• offis-toolbox/plugins/usb_message_type.h: Cpp-Datei mit MessageType-<br />
Definition<br />
2.6.1.7 Kinematik<br />
An der Kinematik wurden eine Reihe von Änderungen durchgeführt. Zunächst<br />
wurde die USB-Kommunikation auf die neuen USB-Message-Typen umgestellt.<br />
210
Kapitel 2. Implementation 10. Oktober 2013<br />
Hierzu wurde die CypressUsb.h aus dem Projekt und der Dateistruktur<br />
gelöscht und die Pfade im QT-Projekt auf die neue Datei, welche außerhalb<br />
des Projekts angelegt wurde angepasst. Diese Anpassung ist notwendig<br />
aufgrund der Änderungen, welche bereits im VmodCam-Plugin begonnen<br />
wurden, siehe 2.6.1.6. In der usb_message_type.h wurden die folgenden Message-<br />
Types angelegt:<br />
class<br />
class<br />
ServoAnglePacket<br />
ServoAnglesPacket<br />
RoboArm.h<br />
Die Kinematik wurde im Rahmen der Einführung der neuen USB-Kommunikation<br />
unstrukturiert. Dabei wurden zunächst die alten Message-Type-Definitionen<br />
aus der RoboArm.h entfernt. Außerdem wurde das Interface der Kinematik<br />
aufgeräumt und einige Funktionen entfernt, welche von der neuen USB-<br />
Kommunikation nicht mehr berücksichtigt oder nicht mehr benötigt werden.<br />
Das Interface wurde dabei auf die folgenden Methoden reduziert:<br />
1 void acquireHardware () ;<br />
2 void releaseHardware () ;<br />
3 void setAngle ( int servoId , double angle );<br />
4 void setAngles ( RcRepeatable < double , 1, 6> angles );<br />
5 void createRoboter ( int links );<br />
6 void setLastLinkTCP ( double x , double y , double z);<br />
7 void setDHParameters ( int index , double si , double di , double<br />
phi , double theta );<br />
8 QVector3D getTCP () ;<br />
9 QVector4D getAngleVector ( double x , double y , double z);<br />
RoboArm.cpp<br />
Aus der RoboArm.cpp wurden die Teile der Implementierung entfernt, welche<br />
die alten Message-Types implementierten. Zudem wurden alle Bestandteile<br />
entfernt, die nicht mehr von der neuen USB-Kommunikation berücksichtigt<br />
oder nicht mehr benötigt werden. Es wird nur noch, dass in Abschnitt<br />
2.6.1.7 definierte Interface implementiert. Außerdem wurde in allen Methoden<br />
die USB-Kommunikation auf den neuen Standard umgestellt.<br />
Die Methode acquireHardware() wurde überarbeitet, und implementiert jetzt<br />
ausschließlich die Funktionen zur Erstellung der USB-Kommunikation<br />
und zur Initialisierung des Modells des Roboterarms.<br />
OFFIS-Toolbox Interface<br />
Das Interface der Kinematik wurde überarbeitet und aufgeräumt. Dabei<br />
211
Kapitel 2. Implementation 10. Oktober 2013<br />
wurden eine Reihe von Funktionen entfernt die nicht mehr von der Kinematik<br />
unterstützt werden. Die im Interface verbliebenen Methoden sind:<br />
Die Funktionen acquireHardware und releaseHardware werden benötigt um<br />
den Roboterarm und die USB-Kommunikation zu Initialisieren und zu<br />
beenden.<br />
acquireHardware<br />
releaseHardware<br />
Um den Winkel eines Servo in Grad einzustellen, wird die Methode setAngle<br />
zur Verfügung gestellt.<br />
setAngle<br />
Die Methode setAngles kann verwendet werden, um die Winkel aller Servos<br />
in Grad zu setzen.<br />
setAngles<br />
Zum setzen der Denavit Hartenberg-Parameter der Kinematik existiert nach<br />
wie vor die Methode setDHParameters. Zu setzen sind der Index des Links,<br />
der Gelenkabstand, die Länge eines Links, die Rotation der x-Achse (Gelenkwinkel)<br />
und die Rotation der Z-Achse (Verwindung).<br />
setDHParameters<br />
Mit der Methode getAngleVector wird die Rückwärtskinematik aufgerufen.<br />
Diese liefert für eine übergebene Tool-Center-Point-Position die Winkel für<br />
die Servo zurück.<br />
getAngleVector<br />
Dateistruktur<br />
• offis-toolbox/plugins/automation/RoboArm/RoboArmInterface.cpp:<br />
Interface der Kinematik für die OFFIS-Toolbox<br />
• offis-toolbox/plugins/automation/RoboArm/RoboArm.pro: QT-Projektdatei<br />
• offis-toolbox/plugins/usb_message_type.h: Cpp-Datei mit MessageType-<br />
Definition<br />
• offis-toolbox/plugins/automation/RoboArm/RoboArm.h: Cpp-Datai<br />
mit Prototypendefinition der Kinematik<br />
• offis-toolbox/plugins/automation/RoboArm/RoboArm.cpp: Cpp-Datei<br />
mit Implementierung der Kinematik<br />
212
Kapitel 2. Implementation 10. Oktober 2013<br />
2.6.1.8 Anbindung an die Rückwärtskinematik<br />
Für die Ansteuerung des Roboterarms wird die zuvor überarbeitete Kinematik<br />
verwendet. Dabei wird die Rückwärtskinematik, über das in Kapitel<br />
2.6.1.7 beschriebene Interface angesprochen.<br />
Die Rückwärtskinematik liefert zu dem übergebenen Tool-Center-Point die<br />
Winkel für den Roboterarm zurück. Diese Art der Steuerung des Tool-<br />
Center-Point ist dadurch möglich, da eine definierte Ausgangsposition des<br />
Roboters im Koordinatensystem besteht.<br />
Die Bewegungen des Kopfes verändern hierbei nur die Position des Tool-<br />
Center-Point bei jeder Messung mit einer konstanten Rate. Da zum Zeitpunkt<br />
der Erstellung des Algorithmus nur 2D Daten zur Verfügung standen,<br />
werden nur seitliche- und dreh-Bewegungen des Kopfes ausgewertet.<br />
Um den Tool-Center-Point in allen Dimensionen bewegen zu können, wird<br />
ein Modussystem verwendet. Dabei wird die Drehung des Kopfes durch<br />
die zusätzliche Markierung am Kopf erkannt. Es kann somit durch die<br />
verschiedenen Steuerungsmodi gewechselt werden.<br />
Die Implementierung sieht drei Modi vor. Dabei stellt ein Modus jeweils<br />
eine Bewegung des Tool-Center-Point in einer Dimension dar. Derzeit sind<br />
die Modi für die Steuerung der x- ,y- ,z-Achse vorgesehen.<br />
Für die Steuerung des Greifers müsste ein zusätzlicher Modus eingeführt<br />
werden. Dieser wurde nicht berücksichtigt, da die Implementierung äquivalent<br />
zu den Achsen erfolgen würde und der Greifer zum Zeitpunkt der<br />
Implementierung defekt war.<br />
213
Kapitel 2. Implementation 10. Oktober 2013<br />
2.6.2 Tiefenerkennung<br />
Ziel des Arbeitspaketes ist eine Extraktion von Tiefeninformationen. Dies<br />
geschieht in Form von Punkten aus einem Datenfluss von Stereobildern<br />
eines makierten menschlichen Arms. Anhand der extrahierten Punkte werden<br />
die Winkel der Gelenkstellungen des Arms im dreidimensionalen Raum<br />
berechnet. Die Tiefenerkennung dieses Arbeitspaketes wird unter der Voraussetzung<br />
durchgeführt, dass sich die Armbinden nicht überlagern. Trotzdem<br />
wird mit Hilfe unterschiedlicher Armbinden versucht Ansätze für ein<br />
Überlappungsproblem zu testen.<br />
2.6.2.1 Vorgehen<br />
• Ausgangspunkt sind die berechneten Schwerpunkte der erkannten<br />
roten Regionen der Armbinden. Diese Regionen werden auch als<br />
BLOBs bezeichnet. Wie im Arbeitspaket Objekterkennung 2.2.4, wird<br />
zunächst der Rotkanal des Bildes durch den gewichteten Farbfilter<br />
RGB2Grey der OFFIS-Automation-Toolbox gefiltert. Das resultierende<br />
Graustufenbild wird dann durch einen Schwellwertfilter geschickt.<br />
Dieses binäre Bild wird nun, wie oben beschrieben, durch die BLOB-<br />
Erkennung verarbeitet, sodass die Koordinaten der Schwerpunkte der<br />
erkannten Regionen vorliegen.<br />
• Entfernungstests werden mit Hilfe eines Versuchsaufbaus durchgeführt.<br />
Dieser beinhaltet eine (später mehrere) Armbinden, sowie die<br />
Stereokamera. Diese ist über den FPGA mit der OFFIS-Automation-<br />
Toolbox verbunden, siehe Abbildung 2.83.<br />
214
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.83: Testumgebung<br />
2.6.2.2 Planungsphase: identizierte Aufgaben<br />
Bei den vorangegangenen Überlegungen zur Tiefenerkennung ergaben sich<br />
folgende Aufgaben:<br />
• Um zu verhindern, dass sich überlappende Armbinden als nur eine<br />
erkannt werden, können unterschiedlich gefärbte Armbinden verwendet<br />
werden. Da nur drei Grundfarben existieren, aber vier Makierungen<br />
benötig werden, müssten zwei Makierung die gleiche Farbe verwenden.<br />
Dazu bietet sich die Makierung am Torso und an der Hand<br />
an, da sich der Torso kaum bewegt und weit von der Hand entfernt<br />
ist. Damit ist eine Überdeckung unwahrscheinlicher als an anderer<br />
Stelle.<br />
• Innerhalb der bisher durchgeführten Arbeitspakete hat sich ergeben,<br />
dass eine der beiden Kameras auf der Platine gedreht ist. Hier könnte<br />
sich ein Problem ergeben, da die Tiefenerkennung auf geringe Unterschiede<br />
der Distanz reagiert. OpenCV ermöglicht eine Berechnung<br />
215
Kapitel 2. Implementation 10. Oktober 2013<br />
der Drehung, jedoch wird ein Testbild zunächst manuell gedreht, um<br />
ein potentielle Verbesserung zu prüfen.<br />
• Die Bilder der Kameras kommen gleichzeitig auf den FPGA an. Die<br />
Bildwiederholungsrate ist jedoch mit 1,5 Bilder pro Sekunde (fps)<br />
sehr niedrig. Hinzu kommt, dass die beiden Kameras ihre jeweiligen<br />
Aufnahmen nicht synchron senden.<br />
– Zu diesem Zweck müsste ein IP-Core geschrieben werden, um<br />
die Kameras zu synchronisieren.<br />
– Alternativ kann der zu erkennende Arm auch langsam bewegt<br />
werden, um die geringe Bildwiederholungsrate auszugleichen.<br />
• Es muss eine definierte Testumgebung erstellt werden. Hierzu werden<br />
feste Abstände zwischen den gleichgroßen Armbinden eingestellt.<br />
Die Testumgebung muss so eingerichtet werden, dass je ein Bild von<br />
den beiden Kameras nacheinander aufgenommen wird. Zwischen<br />
den beiden Aufnahmen darf sich die Szene nicht ändern.<br />
• Die Pixel auf dem Sensor in einen Abstand in Millimeter in Abhängigkeit<br />
der aktuellen Tiefe und maximalen Auflösung umrechnen.<br />
2.6.2.3 Tiefenberechnung<br />
Folgende Konstanten der Kamera sind bei der Tiefenberechnung zu beachten:<br />
• Kameraabstand (Stereo baseline), b = 63 mm 17<br />
• Brennweite (Focal Length), f = 3.79 mm (+/-0.1 mm) 18<br />
Mit Hilfe dieser Werte lässt sich die Tiefe eines Punktes im Raum berechnen,<br />
siehe Abbildung 2.84, 2.85, 2.86 :<br />
Tie f enwert =<br />
f · b<br />
|∆x 1 − ∆x 2 |<br />
(2.14)<br />
∆x 1 und ∆x 2 sind dabei die Entfernungen von dem Bildpunkt auf dem<br />
Sensor zum Brennpunkt bzw. Mittelpunkt des Sensors:<br />
17 http://www.aptina.com/assets/downloadDocument.do?id=790<br />
18 http://www.datasheet.co.kr/datasheetdownload.php?id=638699<br />
216
Kapitel 2. Implementation 10. Oktober 2013<br />
x−Au f loesung y−Au f loesung<br />
M(<br />
2<br />
/<br />
2<br />
)<br />
Abbildung 2.84: Skizze zur Tiefenberechnung<br />
Abbildung 2.85: Skizze zur Tiefenberechnung<br />
217
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.86: Skizze zur Tiefenberechnung<br />
2.6.2.4 Tests<br />
Die Testbilder werden nacheinander aufgenommen und jeweils durch folgende<br />
Bildverarbeitungsketten in der OFFIS-Automation-Toolbox verarbeitet.<br />
Dabei wird eine Armbindenerkennung, sowohl mit als auch ohne Morphologiefilter,<br />
durchgeführt, siehe Abbildung 2.87 bzw. Abbildung 2.88.<br />
218
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.87: Bildverarbeitungskette mit BLOB-Erkennung (ohne Morphologiefilter)<br />
219
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.88: Bildverarbeitungskette mit Morphologiefilter<br />
220
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.89: Bildverarbeitungskette mit mehreren Morphologiefiltern<br />
Die folgenden Tests zeigen die Erkennung und damit die Benutzbarkeit<br />
der Armbinden.<br />
1. Der erste Test erfolgte mit geringer Entfernung: 39 cm Tiefe berechnet<br />
und 65 cm Tiefe in der Realität gemessen (Berechnung entspricht<br />
60% der Realität). Ein Tauschen der Kamerabilder (rechts/links) hat<br />
ein geändertes Vorzeichen zur Folge, welches im Quelltext mathe-<br />
221
Kapitel 2. Implementation 10. Oktober 2013<br />
matisch durch eine Betragsfunktion ausgeglichen wurde. Selbst nach<br />
manuellem Ausgleich (Bildbearbeitungsprogramm IrfanView 19 ) der<br />
Drehung zwischen den Bildern (siehe Abbildung 2.90) weicht die<br />
berechnete Entfernung um weniger als 3 cm vom alten berechneten<br />
Wert ab. Die Drehung kann daher als Hauptfehlerquelle ausgeschlossen<br />
werden. Damit bleibt die unterschiedliche automatische Anpassung<br />
der Helligkeit der Kameras als potentielle Fehlerquelle bestehen.<br />
Abbildung 2.90: Stereobildpaar der Armbinde (Bild manueller Drehung<br />
beider Bilder)<br />
2. Der zweite Test wurde mit größerer Entfernung durchgefürt: 111 cm<br />
Tiefe berechnet und 185 cm in der Realität gemessen (Berechnung<br />
entspricht 60% der Realität). Die minimale Größe, in Pixel, der zu<br />
erkennenden Regionen musste von 10000 auf 1000 heruntergesetzt<br />
werden, um korrekte Polygone zu erkennen.<br />
3. Der nächste Test besteht aus zwei roten Armbinden mit 50 cm Tiefenunterschied<br />
(siehe Abbildung 2.91). Ergebnis: Berechnet werden 139 cm<br />
und gemessen 240 cm (Berechnung entspricht 58% der Realität). Zweite<br />
Armbinde: Berechnet werden 125 cm und gemessen 190 cm (Berechnung<br />
entspricht 65% der Realität).<br />
19 http://www.irfanview.com/<br />
222
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.91: Zwei rote Armbinden mit unterschiedlicher Tiefe<br />
4. Folgender Testfall erfolgt mit einer roten und einer blauen Armbinde<br />
ohne automatische Korrekturfunktion, siehe Abbildung 2.92. Zu diesem<br />
Zweck muss es statt einer Bildverarbeitungskette pro Kamera zwei<br />
Verarbeitungsketten pro Kamera geben, eine für die blaue und eine<br />
für die rote Armbinde mit dem gewichteten Farbfilter RGB2Grey.<br />
Abbildung 2.92: Stereobilder mit blauer und roter Armbinde ohne automatische<br />
Helligkeitsanpassung<br />
Ergebnis: Die blaue Armbinde kann mit Hilfe des blau gewichteten<br />
Farbfilters nicht stabil erkannt werden. Insbesondere bei starker Belichtung<br />
kann die blaue Binde nicht mehr von dem weißen Hintergrund<br />
unterschieden werden. Der Einsatz eines Morphologiefilters<br />
mit Erosion und Dilatation bringt keine signifikante Verbesserung.<br />
5. Anschließender Testfall wird mit einer roten und einer blauen Armbinde<br />
mit automatische Korrekturfunktion durchgeführt, siehe Abbildung<br />
2.93. Obiger Testfall wurde mit der automatische Korrektur<br />
223
Kapitel 2. Implementation 10. Oktober 2013<br />
der Kamera wiederholt. Wie Abbildung 2.93 zu entnehmen ist, kann<br />
die blaue Armbinde mit Hilfe eines Morphologiefilters gut erkannt<br />
werden.<br />
Abbildung 2.93: Stereobilder mit blauer und roter Armbinde mit automatische<br />
Helligkeitsanpassung<br />
Die Parameter sind stark von den Lichtverhätnissen abhängig und<br />
sind wie folgt gesetzt:<br />
Schwellwert (Rotlter): 25<br />
Schwellwert (Blaulter): 30<br />
Morphologielter: 2 Iterationen (Erosion und Dilatation) 3 × 3<br />
6. Folgender Testfall wird mit einer grüner Armbinde (dargestellt durch<br />
ein eingefärbtes Papier) durchgeführt, siehe Abbildung 2.94. Bei der<br />
linken Kamera (gute Lichtverhälnisse) wird die grüne Armbinde ohne<br />
Morphologiefilter erkannt. Die rechte Kamera (schlechte Lichtverhältnisse)<br />
erkennt die Armbinde selbst mit Morphologiefilter nur fehlerhaft.<br />
224
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.94: Bildverarbeitungskette mit heller grüner Armbinde in<br />
Form eines angemalten Papiers<br />
7. Anschließend wird der vorherige Testfall leicht modifiziert, diesmal<br />
mit drei Morphologiefiltern und einem angepassten Schwellwertfilter<br />
durchgeführt. Die grüne Armbinde wird bei beiden Kameras erkannt,<br />
jedoch aufgrund unterschiedlicher Belichtung mit unterschiedlichem<br />
Schwellwert pro Kamera, siehe Abbildung 2.95.<br />
225
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.95: Bildverarbeitungskette mit grüner Armbinde und<br />
mehreren Morphologiefiltern<br />
8. Ein vielfacher Einsatz des Morphologiefilters bei einer großen Zahl<br />
von Iterationen ist in Bezug auf eine spätere Hardwareimplementierung<br />
nicht performant. Des Weiteren ist die vollständige Bewertung<br />
der Erkennung von farbigen Armbinden nicht Teil dieses Arbeitspaketes,<br />
weshalb mit der Optimierung der Erkennung von roten<br />
Armbinden aus dem dritten Test fortgefahren wird.<br />
Um die 60% Differenz zwischen dem gemessenen und dem berechneten<br />
Wert zu erklären, wurde die Formel zur Tiefenberechnung nochmals<br />
überarbeitet und Programmfehler (teilweises Rechnen mit Ganzzahlen<br />
statt mit Fließkommazahlen) korrigiert. Dabei ändern sich Testwerte<br />
226
Kapitel 2. Implementation 10. Oktober 2013<br />
wie folgt (BLOB-Erkennung mit dynamischen Schwellwert, Werte gerundet):<br />
Messwert Berechneter Wert %-Anteil mit Morph. %-Anteil<br />
50 cm 45 cm 94% 58 cm 116%<br />
75 cm 67 cm 89% 29 cm 39%<br />
100 cm 113 cm 113% 95 cm 95%<br />
125 cm 176 cm 140% 439 cm 351%<br />
150 cm 53110 cm 35406% 9575 cm 6383%<br />
175 cm 784 cm 448 % 775 cm 443%<br />
200 cm - - - -<br />
Bei 200 cm konnte auf einem Kamerabild kein Objekt erkannt werden.<br />
Die Berechnung der Schwerpunkte hängt stark vom Schwellwert<br />
ab, der sich zwischen 0 und 15 befindet. Die Fehler dieser Testreihe<br />
können auf schlechte Lichtverhältnisse (Licht von der Seite) zurückgeführt<br />
werden. Daher soll in der nächsten Testreihe die Kamera das<br />
Licht hinter sich haben, sodass beide Kamerabilder ein möglichst gleichwertigen<br />
Lichteinfall erhalten.<br />
9. Aufgrund der verbesserten Lichtverhältnisse kann der Schwellwert<br />
bei allen Messungen statisch auf den Wert Zehn gesetzt werden. Es<br />
bedarf demnach nicht zwingend eines Morphologiefilters. Abbildung 2.96<br />
zeigt eine Erkennung des BLOBs (Armbinde) mit dem Schwerpunkt<br />
auf 200 cm. Die Werte weichen im entfernteren Bereich nicht mehr so<br />
stark ab und es gibt eine lineare Abweichung von ca. 50%.<br />
Messwert Berechneter Wert %-Anteil Messwert<br />
50 cm 36 cm 72%<br />
75 cm 38 cm 51%<br />
100 cm 48 cm 48%<br />
125 cm 61 cm 49%<br />
150 cm 74 cm 49%<br />
175 cm 85 cm 49%<br />
200 cm 102 cm 51%<br />
Die Abweichung von ca. 50% ist nach Prüfung der Arbeitsweise der<br />
Stereokamera und den Umrechnungsschritten auf folgendes zurückzuführen:<br />
Wenn die Kamera mit weniger als der maximalen Auflösung<br />
betrieben wird, beschränkt sich die Kamera auf einen Bildauss-<br />
227
Kapitel 2. Implementation 10. Oktober 2013<br />
chnitt, nimmt also nicht jedes x-te Pixel. Das erklärt des Weiterten,<br />
warum die Szene bei einer Auflösung von 800x600 Pixel stets links<br />
oben anstatt direkt vor der Stereokamera zu plazieren ist. Abbildung 2.97<br />
zeigt ein Fehlerbild welches den gesamten Sichtbereich der Stereokamera<br />
bei voller Auflösung zeigt. Der Bildbereich oben links entspricht<br />
einem Bild der Auflösung von 800x600 Pixel. Daher muss bei der<br />
Berechung der Pixelgröße durch die gesamte Auflösung geteilt werden<br />
(nicht durch den Ausschnitt):<br />
Pixelgroesse = Sersorbreite<br />
Au f loesung = 3.56mm<br />
1600px<br />
= 0.002225<br />
mm<br />
px<br />
= 2.225<br />
µm<br />
px 20<br />
Nach der obigen Formel verdoppeln nun sämtliche Tiefenwerte der<br />
obigen Tabelle. Nun liegen die Werte sehr dicht an der realen Tiefe.<br />
20 Sensorbreite aus: http://www.aptina.com/assets/downloadDocument.do?id=790<br />
228
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.96: Testbilder mit rückwärtiger Beleuchtung und BLOB-<br />
Erkennung<br />
229
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.97: Fehlerbild mit voller Kameraauflösung<br />
10. Um den Abstand zweier Schwerpunkte zu berechnen werden von<br />
zwei Armbinden die Tiefenwerte bestimmt, um im Anschluss die<br />
Entfernung zwischen diesen Gelenken zu berechnen, siehe Abbildung<br />
2.98. Dies geschieht unter anderem mit der Formel zur Berechnung<br />
der realen Breite, siehe Abschnitt 2.6.2.7. Die Tiefenwerte weichen<br />
kaum von den gemessenen Werten ab:<br />
Armbinde Messwert Berechneter Wert %-Anteil Messwert<br />
1 212 cm 214 cm 99%<br />
2 220 cm 233 cm 95%<br />
Der Abstandsvektor (x, y, z) T beträgt in cm: (30.7, −0.5, −18.9) T . Daraus<br />
resultiert der Abstand zwischen den Armbinden in Form des<br />
Betrags dieses Vektors welcher ca. 36 cm beträgt. Der gemessene Abstand<br />
beträgt 32 cm, was etwa 90% des berechneten Wertes entspricht.<br />
Die Breitenwerte basieren dabei auf dem Bild der linken Kamera. Bei<br />
230
Kapitel 2. Implementation 10. Oktober 2013<br />
Verwendung des Bildes der rechten Kamera wird ein Abstand von<br />
36.7 cm, also eine Abweichung von 1.8% berechnet.<br />
Abbildung 2.98: Abstandsmessung bei zwei Armbinden<br />
2.6.2.5 Probleme in der Testphase<br />
Beim Testen der Aufnahme und Erkennung der Armbinden ergaben sich<br />
folgende Probleme:<br />
• Um die grüne Armbinde zu erkennen wurden drei Morphologiefilter<br />
mit insgesamt zwei mal Dilatation, drei mal Erosion und neun mal<br />
231
Kapitel 2. Implementation 10. Oktober 2013<br />
Dilatation benötigt, siehe Abbildung 2.89. Für die spätere Umsetzung<br />
auf dem FPGA müsste das Bild nach jeder Iteration der Filtern zwischengespeichert<br />
werden. Dazu werden ca. 210 Kilobyte benötigt. Da<br />
der Bildspeicher (ImageCache) Daten direkt auf dem FPGA speichert,<br />
kann dies zu einem Platzproblem führen.<br />
• Die Lichtwerte der zwei Kameras sind bei gleicher Szene unterschiedlich,<br />
was die Konfiguration der Filter für beide Kameras erschwert. Um<br />
überhaupt eine funktionierende Tiefenerkennung durchführen zu können<br />
wird eine äußerst gleichmäßige Beleuchtung benötigt. Während<br />
der Aufnahmen zu den verschiedenen Testläufen hat sich dieser Punkt<br />
als eine Hauptproblemquelle herausgestellt.<br />
• Zur Winkelberechnung wird die reale Breite einer Armbinde benötigt,<br />
welche in Abhängigkeit vom Abstand zu der Kamera jedoch eine unterschiedliche<br />
Pixelgröße aufweist. Daher muss eine Umrechnung gefunden<br />
werden, die aus der Tiefe und der Pixelbreite die reale Breite<br />
in Zentimeter berechnet.<br />
2.6.2.6 Vergleich mit OpenCV<br />
Zur Überprüfung der Tiefeninformation werden die aufgenommenden Bilder<br />
mit einem auf OpenCV basierenden Algorithmus getestet. 21 Der Algorithmus<br />
berechnet aus zwei Stereobildern eine Tiefenkarte.<br />
21 https://sites.google.com/site/elsamuko/c-cpp/opencv-depthmap<br />
232
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.99: Beispielstereobild. 22<br />
Abbildung 2.100: Beispieltiefenbild zu Abbildung 2.99. 23<br />
22 Quelle: http://farm4.static.flickr.com/3435/3875966714_b80886eac7.jpg<br />
23 Quelle: https://ae346056-a-62cb3a1a-s-sites.googlegroups.com/site/elsamuko/<br />
c-cpp/opencv-depthmap/depth_fruit.jpg<br />
233
Kapitel 2. Implementation 10. Oktober 2013<br />
Selbiger Algorithmus wird auf selbst aufgenommene Bilder der Armbinden<br />
angewendet. Um die Drehung als potentielle Fehlerquelle auszuschließen,<br />
werden beide um wenige Grad (links um 1 ◦ , rechts um ca. 2 ◦ ) gedreht bzw.<br />
einander angeglichen.<br />
Abbildung 2.101: Tiefenbild zu Abbildung 2.90<br />
2.6.2.7 Problemlösungen<br />
Drehung Da die Drehung nicht die Berechnung des Schwerpunktes und<br />
Tiefenwertes beeinflusst, siehe Abschnitt 2.6.2.4, kann diese für die<br />
weitere Betrachtung ignoriert werden.<br />
Verarbeitungskette Für die Erkennung von roten Armbinden bei guten<br />
Lichtverhätnissen reicht eine BLOB-Erkennung mit Schwellwertfilter<br />
aus. Als gute Lichtverhältnise wird eine sehr helle Tageslicheinstrahlung<br />
an einem sonnigen Tag betrachtet. Dabei sollte die Stereokamera<br />
so ausgerichtet sein, dass sich die Lichtquelle möglichst genau<br />
hinter der ihr befindet.<br />
Reale Breite Die Formel zur Umrechnung zwischen relativer Pixelbreite<br />
und realer Breite lautet:<br />
Breite real = Breite Pixel · Breite au f Sensor ·<br />
Tie f e<br />
Brennweite<br />
Diese Formel geht aus folgender Abbildung 2.102 hervor:<br />
(2.15)<br />
234
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.102: Aufnahme eines Bildes durch eine der beiden Kameras.<br />
Verhältnis von Breite auf dem Sensor zur Brennweite verhält<br />
sich wie das Verhältnis der realen Breite zur realen<br />
Tiefe im Raum.<br />
2.6.2.8 Implementierung<br />
Folgende Dateien sind bei der Implementierung entstanden:<br />
os-toolbox/projects/Tiefenerkennung/opencv/opencv-depthmap.cpp<br />
Externes C++-Testprogramm welches aus zwei Stereobildern eine Tiefenkarte<br />
erzeugt. 24<br />
os-toolbox/projects/Tiefenerkennung/3d/main.py Dieses Pythonskript<br />
startet die Olvis-Bildverarbeitungskette und übergibt diese an die neu<br />
erzeugte Stereoskopie und die Winkelberechnung. Anschließend werden<br />
die Schwerpunkte von den BLOB der beiden Kameras gespeichert,<br />
sortiert und der jeweilige Tiefenwert berechnet. Aus den entstandenen<br />
3D-Vektoren werden schließlich die Winkel im Raum berechnet<br />
und an die Ansteuerung des Roboterarms weitergeleitet.<br />
os-toolbox/projects/Tiefenerkennung/3d/Stereoscopy.py Diese Datei<br />
beinhaltet Algorithmen zur Tiefenberechnung und berechnet 3D-Vektoren<br />
der Schwerpunkte der Armbinden.<br />
os-toolbox/projects/Tiefenerkennung/3d/Stereoscopy.ogr XML-Datei,<br />
welche zur Konfiguration der OFFIS-Automation-Toolbox dient. In<br />
dieser Datei ist die Bildverarbeitungskette gespeicht.<br />
24 Quelle: https://sites.google.com/site/elsamuko/c-cpp/opencv-depthmap<br />
235
Kapitel 2. Implementation 10. Oktober 2013<br />
os-toolbox/projects/Tiefenerkennung/3d/Stereoscopy.oap Versionierungsdatei,<br />
welche der Projektdatei zugehörig ist.<br />
os-toolbox/projects/Tiefenerkennung/3d/AngleCalculation.py Diese Datei<br />
beinhaltet Funktionen zur Winkelberechnung. Die Schwerpunkte werden<br />
sortiert, in Dreiecken zusammengefasst und die Winkel berechnet.<br />
Stereoscopy<br />
Die Klasse Stereoscopy beinhaltet folgende Funktionen:<br />
def __init__ ( self , olvis ):<br />
Initialisierung globaler (innerhalb des Programmkontextes allgemeingültiger)<br />
Variablen, z.B. der globalen Kamerakonstanten.<br />
def calcHypothenuse ( self , pixelX , pixelY ):<br />
Berechnung der Hypothenuse mit Hilfe des Satzes des Pythagoras, welche<br />
zwei 2D-Vektoren zu einem Dreieck ergänzt.<br />
def calcDepthPoint ( self , left , right ):<br />
Berechnet die Tiefe eines Punktes anhand der stereoskopischen Tiefenformel.<br />
def getAllDepths ( self , cogListLeft , cogListRight ):<br />
Berechnet iterativ die Tiefe aller Schwerpunkte anhander der Funktion<br />
getAllDepths.<br />
def calcCogVectors ( self , coglist , depthlist ):<br />
Berechnet anhand einer gegebenen Tiefenliste eine 3D-Vektor aller Schwerpunkte<br />
in Millimeter. Dabei werden die Pixelangaben für die Höhe und<br />
Breite anhand der Tiefeninformation in Millimeter umgerechnet.<br />
def getPixelSize ( self ):<br />
Gibt die gespeicherte Konstante Pixelgröße (Sensorgröße geteilt druch die<br />
maximale Auflösung) zurück.<br />
def getFocallength ( self ):<br />
Gibt die Brennweite, welche durch eine Konstante repräsentiert wird, der<br />
Stereokamera zurück.<br />
236
Kapitel 2. Implementation 10. Oktober 2013<br />
Winkelberechnung<br />
Die Klasse Winkelberechnung beinhaltet folgende Funktionen:<br />
def __init__ ( self , olvis ):<br />
Initialisierung globaler (innerhalb des Programmkontextes allgemeingültiger)<br />
Variablen.<br />
def sortPoints ( self , cogList ):<br />
Sortierung der Listen der Schwerpunkte der Armbinden in X-Richtung.<br />
def getSortedPose2DList ( self , cogList ):<br />
Verfolgung der Schwerpunkte anhand der minimalen Distanz zum Schwerpunkt<br />
des letzten Bildes.<br />
def calcAngles ( self , depth ):<br />
Trigonometrische Berechnung der Winkel anhand von 3D-Vektoren.<br />
def convert ( self , angles ):<br />
Wenn mindestens drei Winkel berechnet wurden, also alle Winkel des Roboterarms<br />
vorhanden sind (der Drehwinkel darf fehlen), dann werden die berechneten<br />
Winkel auf die Servomotoren umgerechnet. Dies betrifft den letzten<br />
und vorletzten Winkel. Prüfe schließlich die Winkel anhand von minimalen<br />
und maximalen Werten.<br />
def calcAngleFromTriangle ( self , side ):<br />
Berechnung eines Winkels anhand eines Dreiecks, mit Hilfe des Cosinissatzes.<br />
def scalarProduct ( self , v1 , v2 ):<br />
Berechnung des Skalarproduktes zweier Vektoren.<br />
def crossProduct ( self , v1 , v2 ):<br />
Berechnung des Kreuzproduktes anhand zweier Vektoren.<br />
def deriveHyperPlaneNormalForm ( self , linkPosition , a , b<br />
):<br />
237
Kapitel 2. Implementation 10. Oktober 2013<br />
Berechnet eine Ebene im Raum und gibt diese in der Normalform zurück.<br />
def decideSide ( self , plane , x):<br />
Berechnet auf welcher Seite der Ebene der jeweilige Punkt x liegt. Diese<br />
Funktion ist notwendig, um zu sicherzustellen, dass alle Winkel von der<br />
selben Drehrichtung aus bestimmt werden. Ohne diese Funktion würde<br />
immer der kleinere Winkel (unter 180 Grad) berechnet werden. Ein Winkel<br />
über 180 Grad, der am Arm anliegt würde also seine Größe ändern (360<br />
Grad minus dem Winkel). Dies wird durch oben aufgeführte Funktionen<br />
verhindert bzw. herausgerechnet.<br />
238
Kapitel 2. Implementation 10. Oktober 2013<br />
2.6.3 Echtzeitbildausgabe auf HDMI<br />
Das Arbeitspaket gliedert sich in drei Teilziele. Im ersten Schritt wurde daher<br />
ein hdmi_out IP-Core 25 in das Projekt integriert, welcher ein im RAM<br />
abgelegtes 2D-Bild mit definierter Auflösung über den HDMI-Port ausgibt.<br />
Daraufhin wurde der image_bus_switch IP-Core und dessen Treiber<br />
dahingehend erweitert, dass nun ein Umschalten zwischen den Kameras<br />
über den Center-Button auf dem Board möglich ist. Um abgelegte Bilddaten<br />
aus dem RAM zu lesen und an den USB-Treiber weiterzuleiten wurde<br />
ein memory_to_usb IP-Core geschrieben, sodass eine Ausgabe des Bildes<br />
mit Hilfe der OFFIS Toolbox ermöglicht wird.<br />
image_bus_to_memory_v1_00_a<br />
Dieser in Abbildung 2.103 dargestellte<br />
IP-Core dient dem Schreiben von Daten eines image_bus IP-Cores in den<br />
RAM. Hierbei werden 8/16/24 Bit breite Daten von einem image_bus gelesen<br />
und im Format RGB565 im RAM abgelegt. Dazu wird das VFBC Interface<br />
des MPMC IP-Cores genutzt 26 .<br />
Blockschaltbild<br />
pixel_clk<br />
IMAGE_BUS<br />
image_bus_to_memory<br />
VFBC<br />
Abbildung 2.103: Blockschaltbild des imagebus_to_memory IP-Core<br />
Beschreibung<br />
Tabelle 2.6 zeigt alle Parameter, welche nach Hinzufügen des IP-Core zum<br />
Design zur Konfiguration des VFBC-Moduls angegeben werden können.<br />
Diese entscheiden in welchem Speicherbereich ein Bild entsprechender Auflösung<br />
abgelegt wird.<br />
Die implementierte Befehlsabfolge um ein Bild über den VFBC anzufordern<br />
basiert auf dem in Abbildung 2.104 dargestellten Zeitverhalten.<br />
25 Dokumentiert in Abschnitt 2.4.3.1<br />
26 siehe Sprint 3, Arbeitspaket HDMI-Analyse: 2.4.3.2<br />
239
Kapitel 2. Implementation 10. Oktober 2013<br />
GENERIC default<br />
FRAME_BASE_ADDR 0x00000000<br />
LINE_STRIDE 0x0000800<br />
IMAGE_WIDTH 0x0500<br />
IMAGE_HEIGHT 0x02D0<br />
IMAGE_BUS_WIDTH 16<br />
Tabelle 2.6: Parameter für eine Auflösung von 1280x720 im Speicherbereich<br />
0x00000000.<br />
Abbildung 2.104: VFBC Write Timing<br />
Quelle: MPMC Dokument V6.06<br />
Im write_stream Prozess wird die Write-FIFO des VFBC mit den entsprechenden<br />
Eingangsdaten des ImageBusses gefüllt. Trifft ein valides Pixel ein,<br />
wird der vorhandene Wert wie im folgenden Quelltextauszug zu sehen auf<br />
write_data gelegt.<br />
1 −− write data when incoming p i x e l i s valid<br />
2 w r i t e _ v a l i d
Kapitel 2. Implementation 10. Oktober 2013<br />
Probleme<br />
Der wd_reset Befehl leert nicht, wie in der Dokumentation des MPMC 27<br />
angegeben, die Write-FIFO und den Write-Befehl aus der Command-FIFO<br />
des VFBC. Um dies zu erreichen müssen zusätzlich der wd_flush und<br />
cmd_reset Befehl angelegt werden.<br />
Dateistruktur<br />
• pcores/image_bus_to_memory_v1_00_a/: ImageBusToMemory IP-Cores.<br />
• hdl/vhdl/image_bus_to_memory.vhd: Enthält den implementierten<br />
IPCore<br />
• hdl/vhdl/tb/test.vhd: Enthält die Testbench<br />
• devl/ImageBus2Memory/ImageBus2Memory.xise: ISE Projektdatei<br />
• data/image_bus_to_memory_v2_1_0.mpd: Enthält das PORT-Mapping<br />
• data/image_bus_to_memory_v2_1_0.pao: Enthält eingebundenen Bibliotheken<br />
image_bus_switch_v1_00_a<br />
Um ein Umschalten zwischen den Kameras<br />
ohne PC zu ermöglichen, wurde das Design um einen Hardware-<br />
Schalter erweitert. Dazu wurde dem Projekt ein Push_Buttons_5Bits IP-<br />
Core aus der Xilinx Bibliothek hinzugefügt, welcher dem Microblaze über<br />
eine Interruptleitung einen Tastendruck signalisiert. Um einen Tastendruck<br />
auszuwerten wurde der Treiber des image_bus_switch IP-Core erweitert.<br />
Mit Hilfe einer Maske wird der den Interrupt auslösende Button erkannt<br />
und die Kamera gewechselt. Dabei muss darauf geachtet werden, dass<br />
mehr als ein Interrupt gesendet wird, da die Taster hardwareseitig nicht<br />
entprellt sind.<br />
Weiterhin wurde der image_bus_switch IP-Core auf eine in Abbildung<br />
2.105 dargestellte State-Machine umgestellt, um einen Kamerawechsel zu<br />
garantieren, welcher nur bei vollständigen Bildern stattfindet.<br />
Ein Wechsel der Kameras erfolgt somit nur noch nach auf Basis des jeweiligen<br />
frame_valid Signals.<br />
27 Vergleich Dokumentation des MPMC 6.06 auf Seite 179<br />
241
Kapitel 2. Implementation 10. Oktober 2013<br />
switch<br />
Leave A<br />
frame_valid<br />
A low<br />
Enter B<br />
frame_valid<br />
B low<br />
Cam A<br />
Cam B<br />
frame_valid<br />
A low<br />
Enter A<br />
frame_valid<br />
B low<br />
Leave B<br />
switch<br />
Abbildung 2.105: Zustandsautomat des image_bus_switch IP-Cores<br />
Dateistruktur<br />
• pcores/image_bus_switch_v1_00_a: ImageBusSwitch IP-Core.<br />
• /hdl/vhdl/image_bus_switch.vhd: Äußeres Modul vom image_bus_switch<br />
IP-Core. Automatisch generiert vom Xilinx Peripheral Wizard.<br />
• /hdl/vhdl/user_logic.vhd: User Logic Modul vom image_bus_switch<br />
IP-Core. Automatisch generiert vom Xilinx Peripheral Wizard.<br />
• /vhdl/switch.vhd: Hauptmodul vom ImageBusSwitch IP-Core. Diese<br />
Datei stellt die eigentliche Funktionalität zur Verfügung.<br />
• /hdl/vhdl/sim/sim.vhd: Enthält die Testbench<br />
• /devl/projnav/image_bus_switch.xise: ISE Projektdatei<br />
• /data/image_bus_switch_v2_1_0.mpd: Enthält das PORT-Mapping<br />
• /data/image_bus_switch_v2_1_0.mpd: Enthält eingebundene libs<br />
• pcores/drivers/image_bus_switch_v1_00_a: image_bus_switch Treiber<br />
• /src/image_bus_switch.cpp: C++ Datei mit der Implementation des<br />
Treibers.<br />
• /src/image_bus_switch.h: C++ Header Datei des Treibers.<br />
memory_to_usb_v1_00_a Der memory_to_usb IP-Core liest ein 2D-<br />
Bild aus einem RAM und reicht es an einen usb_driver IP-Core 28 weiter.<br />
28 Siehe Abschnitt 2.2.2<br />
242
Kapitel 2. Implementation 10. Oktober 2013<br />
Dies ermöglicht eine Ausgabe des im Speicher vorhandenen Bildes mit<br />
Hilfe der OFFIS Toolbox und dem VmodCam Plugin 29 . Der folgende Abschnitt<br />
beschreibt den finalen IP-Core des Arbeitspakets.<br />
Blockschaltbild<br />
Der IP-Core stellt Eingänge für die Leseoperationen über einen VFBC sowie<br />
ein Signal über den Zustand der usb_driver IP-Core FIFO zur Verfügung.<br />
Um den IP-Core mit dem VmodCam Plugin zu synchronisieren, ist eine<br />
Anbindung an den PLB nötig. Die Ausgänge dienen dem Senden der Bilddaten<br />
an den usb_driver IP-Core.<br />
Zur Konfiguration des VFBC-Moduls können beim Hinzufügen des IP-<br />
Core die nötigen Parameter gesetzt werden.<br />
pixel_clk<br />
direct_wrAlmostFull<br />
PLB<br />
VFBC<br />
memory_to_usb<br />
direct_wrClk<br />
direct_wrReq<br />
direct_wrData[31:0]<br />
Abbildung 2.106: Blockschaltbild des memory_to_usb IP-Core<br />
Beschreibung<br />
Die Logik des IP-Core setzt sich im Wesentlichen aus einem data_decode<br />
Prozess sowie einem ungetakteten VFBC_RD_READ Signal zum VFBC<br />
zusammen. Dieser Aufbau wurde gewählt, um rechtzeitig auf eine volle FI-<br />
FO des usb_driver IP-Cores reagieren zu können und zusätzliche Verzögerungen<br />
zu vermeiden. Der Folgende Quelltextauszug zeigt die Implementierung<br />
des VFBC_RD_READ Signals.<br />
1 −− read data i f USB FIFO i s not almost f u l l ( and only i f VFBC i s<br />
not in setup stage )<br />
2 VFBC_RD_READ
Kapitel 2. Implementation 10. Oktober 2013<br />
Der data_decode Prozess setzt im ersten Schritt, wie bereits im hdmi_out<br />
IP-Core 30 , die nötigen Befehle für den VFBC auf, um ein Bild aus dem<br />
RAM zu lesen. Das zu verwendende Zeitverhalten zum Ansprechen des<br />
VFBC für eine Leseoperation wurde dem MPMC Dokument entnommen<br />
und ist in Abbildung 2.107 dargestellt.<br />
Abbildung 2.107: VFBC Read Timing<br />
Quelle: MPMC Dokument V6.06<br />
Daraufhin kann auf Anforderung des VmodCam Plugins ein Bild ausgelesen<br />
und an den usb_driver IP-Core weitergeleitet werden. Nach jedem<br />
übertragenem Bild wird auf eine erneute Anforderung, in Form eines<br />
definierten Registerwerts, seitens des Plugins gewartet. Gearbeitet wird<br />
dabei mit einem Zähler, der sich aus der zu lesenden Bildgröße berechnet.<br />
Bei einem Lesevorgang wird in jedem Takt ein Bildpixel vom VFBC<br />
angefordert und mit einem Takt Verzögerung in die usb_driver IP-Core FI-<br />
FO geschrieben. Da Daten wesentlich langsamer in die usb_driver IP-Core<br />
FIFO geschrieben, als aus dem RAM gelesen werden können, wird der Lesevorgang<br />
pausiert, sobald die FIFO des usb_driver IP-Cores vollständig<br />
gefüllt ist.<br />
Abbildung 2.108 veranschaulicht die Zusammenhänge zwischen dem ungetakteten<br />
RD_READ an den VFBC und dem direct_wr Signal zum Anlegen<br />
der gelesenen Daten an die FIFO des usb_driver IP-Cores.<br />
Unter Benutzunng des entwickelten IP-Cores wurde die Unterstützung folgender<br />
Auflösungen mit entsprechenden Bildwiederholraten verifiziert 31 :<br />
ca. 6 fps bei 1280x720 sowie ca. 3 fps bei 1600x1200.<br />
Treiber<br />
Die Implementierung des memory_to_usb Treibers konnte vom CAM_USB<br />
30 Beschrieben in Sprint 3, Arbeitspaket HDMI Analyse: 2.4.3.1<br />
31 entnommen aus den Bildinformationen der OFFIS Toolbox<br />
244
Kapitel 2. Implementation 10. Oktober 2013<br />
Clk<br />
cmd_idle<br />
direct_wrAlmostFull<br />
VFBC_RD_READ<br />
direct_wrReq<br />
Abbildung 2.108: Timing der Lese-/Schreiboperationen<br />
IP-Core v_2_00 32 übernommen werden. Damit kann zum Einen sichergestellt<br />
werden, dass die FIFO initial vom VModCam Plugin geleert werden kann<br />
und zum Anderen neue Bilder auf Anforderung des Plugins in die USB<br />
FIFO geschrieben werden.<br />
Probleme<br />
Vor der Realisierung des finalen IP-Cores wurde ein weiterer Ansatz verfolgt.<br />
Der IP-Core basierte dabei auf dem in Abbildung 2.109 dargestellten<br />
Zustandsautomat. Dieser Ansatz erwies sich jedoch als unnötig komplex<br />
zur Lösung der gestellten Aufgabe. Weiterhin ergaben sich zahlreiche<br />
Probleme aufgrund der eingebrachten Verzögerungen des Systems, welche<br />
durch die zeitliche Abstimmung der Lese-Operationen am VFBC sowie der<br />
Schreib- und Warte-Operationen am USB-Treiber entstanden. Aufgrund<br />
dessen wurde ein weiterer Ansatz erstellt, der den im vorherigen Abschnitt<br />
vorgestellten IP-Core als Endprodukt des Arbeitspakets liefert.<br />
Im Zuge dieser Umstellung erwies sich auch ein memory_to_imagebus IP-<br />
Core als nicht sinnvoll, da die Bilder nicht ohne Weiteres verifiziert werden<br />
können. Dies liegt an der eingeschränkten Anzahl von Schnittstellen, die<br />
der MPMC bereitstellt. Bei vier bereitgestellten Schnittstellen wird eines für<br />
den PLB, eines zum Schreiben in den RAM und eines zum Auslesen des<br />
RAMs benötigt. Die verbleibende Schnittstelle reicht nicht aus, um Daten<br />
des ImageBusses zu verifizieren. Daher fiel die Entscheidung auf einen IP-<br />
Core, welcher Bilder aus dem RAM direkt an den USB Treiber weiterleitet.<br />
Um Fehler leichter zu finden, wurde in einem ersten Schritt ein bestimmtes<br />
Testbild gesendet, in dem nur das erste Pixel Weiß ist und alle anderen<br />
32 Dokumentiert in Kapitel 2.2.2<br />
245
Kapitel 2. Implementation 10. Oktober 2013<br />
write<br />
CMDs<br />
cmds done<br />
&<br />
usb Packet done<br />
frame done<br />
read<br />
frame<br />
usb FIFO not full<br />
line done<br />
read<br />
line<br />
usb FIFO full<br />
suspend<br />
line<br />
usb FIFO full<br />
usb FIFO not full<br />
Abbildung 2.109: Zustandsautomat zum ersten Ansatz des IPCores<br />
Schwarz. Dies ist losgelöst vom VFBC und ermöglicht zuerst Fehler im<br />
Quelltext zu finden, ohne das potentiell das Protokoll des VFBC falsch<br />
genutzt wird. So ist bewusst, ob Zähler und Verzögerungen passen, bevor<br />
man mit den Daten aus dem RAM arbeitet. Im Anschluss wurde dann der<br />
VFBC angeschlossen und das Protokoll stetig angepasst, da viele ungenaue<br />
oder auch falsche Angaben zum VFBC im MPMC Dokument stehen.<br />
• Nach dem Lesen eines Bildes aus dem RAM muss ein länger als<br />
angegebenes Reset der Cmd und Read FIFOs durchgeführt werden<br />
(min. 3 Takte).<br />
• Um stabile Bilder aus dem RAM lesen zu können, müssen nach Schreiben<br />
der Befehle wesentlich mehr (aktuell 245) Takte gewartet werden, bis<br />
das erste Pixel gelesen werden kann, anders als in der Dokumentation<br />
angegeben.<br />
Dateistruktur<br />
• pcores/memory_to_usb_v1_00: Memory to USB IP-Core.<br />
• /hdl/vhdl/mem_to_usb.vhd: Enthält den implementierten IP-Core<br />
• /hdl/vhdl/memory_to_usb.vhd: Äußeres Modul vom memory_to_usb<br />
IP-Core. Automatisch generiert vom Xilinx Peripheral Wizard.<br />
246
Kapitel 2. Implementation 10. Oktober 2013<br />
• /hdl/vhdl/user_logic.vhd: User Logic Modul vom memory_to_usb IP-<br />
Core. Automatisch generiert vom Xilinx Peripheral Wizard.<br />
• /hdl/vhdl/sim/tb.vhd: Enthält die Testbench<br />
• /data/memory_to_usb_v2_1_0.mpd: Enthält das PORT-Mapping<br />
• /data/memory_to_usb_v2_1_0.pao: Enthält eingebundene libs<br />
247
Kapitel 2. Implementation 10. Oktober 2013<br />
2.6.4 Hardware Umsetzung der Bewegungserkennung<br />
Im Sprint 2 wurde eine Bildverarbeitungskette entworfen und mittels Software<br />
umgesetzt. Dieses Arbeitspaket beinhaltet die Umsetzung der Algorithmen,<br />
die während des Sprints in dem Arbeitspaket Objektverfolgung<br />
erarbeitet wurden. Für die Objektverfolgung wurden Bildverarbeitungsfilter<br />
in der OFFIS-Automation-Toolbox benutzt, sowie ein Verarbeitungsalgorithmus<br />
in Python entwickelt.<br />
Die Bildverarbeitungskette wird von uns aus mehreren hintereinander geschalteten<br />
IP-Cores realisiert, die bereits in vorherigen Sprints realisiert wurden.<br />
Die mit der Programmiersprache Python umgesetzte Verfolgung des Arms<br />
anhand der roten Binden wird in die Sprache C++ übersetzt, damit das<br />
ausführen des Algorithmus auf dem Microblaze möglich ist.<br />
Das Ergebnis der Objekterkennung auf dem FPGA soll in der OFFIS-Automation-<br />
Toolbox dargestellt werden. Dafür soll sowohl das Kamerabild als auch die<br />
Gelenke in der OFFIS-Automation-Toolbox sichtbar sein.<br />
2.6.4.1 Umsetzung der Bildverarbeitungskette auf dem FPGA<br />
Aufbauend auf das Arbeitspaket Ansteuerung der VmodCam von Digilent<br />
aus dem Abschnitt 2.2.2 wird die Bildverarbeitungskette mit der Vmod-<br />
Cam realisiert. Die Bildverarbeitungskette aus dem Abschnitt 2.2.4 Objektverfolgung,<br />
dargestellt in Abbildung 2.47 wurde von uns wie in Abbildung<br />
?? dargestellt umgesetzt.<br />
simple_i2c<br />
cam_bootloader<br />
VmodCam<br />
schwellwertfilter<br />
blob_detection<br />
cam_data<br />
cam_deserialzer<br />
busConverterToRGB888<br />
rgb2grey<br />
busConverterToRGB888<br />
cam_usb<br />
usb_driver<br />
VmodCam<br />
Abbildung 2.110: Auf dem FPGA realisierte Bildverarbeitungskette mit IP-<br />
Cores<br />
Es ist zu erwähnen, das die in der Softwarelösung benutzen Morphologiefilteroperationen<br />
hier nicht zum Einsatz kamen, da diese noch nicht<br />
248
Kapitel 2. Implementation 10. Oktober 2013<br />
vollständig als IP-Cores umgesetzt wurden. In den weiteren Versuchen hat<br />
sich gezeigt, das auch ohne diese Filter ein Ergebnis möglich ist.<br />
Die in Programmiersprache Python umgesetzte Verfolgung der Armgelenke<br />
und Berechnung der Winkel zwischen den Armgelenken wurde von<br />
uns in die Programmiersprache C++ übersetzt. Dafür wurde eine Klasse<br />
namens ArmDetection eingerichtet, welche die Algorithmen bereitstellt<br />
Die Gelenke werden initial von oben nach unten im Bild zugeordnet, so<br />
dass initial davon ausgegangen wird, das der Arm des Benutzers nach<br />
oben ausgerichtet im Bild vollständig zu sehen ist. Zwischen zwei aufgezeichneten<br />
Bildern werden die Abstände unter allen Punkten gebildet um<br />
daraus schließen zu können, welches Gelenk sich wohin im Bild bewegt<br />
hat. Die Zuordnung der Gelenk ist entscheidend für die Berechnung der<br />
Winkel zwischen den Armgelenken.<br />
α<br />
β<br />
Schultergelenk<br />
Handgelenk<br />
Ellenbogengelenk<br />
Abbildung 2.111: Schematische Darstellung des aufgezeichneten Arms<br />
und der berechneten Winkel<br />
Die Abbildung ?? zeigt die Punkte die zu ermitteln sind, sowie die zu<br />
berechnenden Winkel α und β. Die Winkel können dann im Weiteren benutzt<br />
werden um den Roboterarm zu steuern.<br />
Die Darstellung der Position der ermittelten Punkte zusammen mit dem<br />
Kamerabild erfolgt in der OFFIS-Automation-Toolbox mittels einer von<br />
uns erstellten Erweiterung VmodCamBlob. Diese Erweiterung empfängt<br />
die Kamerabilder und zusätzlich die vom FPGA gesendeten Positionen der<br />
Gelenke, die von der Bildverarbeitungskette ermittelt wurden. Das Ergebnis<br />
ist in Abbildung ?? dargestellt.<br />
Im weiteren werden die Komponenten näher beschrieben, die für die Umsetzung<br />
erstellt oder angepasst wurden. Es wird zu erst auf die IP-Cores<br />
249
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.112: Ergebnisaufnahme mit der VmodCamBlob Erweiterung<br />
für die OFFIS-Automation-Toolbox<br />
eingegangen die für die Bildverarbeitungskette benutzt wurden. Anschließend<br />
wird die Armerkennung vorgestellt und folgend die visuelle Darstellung<br />
mittels der OFFIS-Automation-Toolbox.<br />
2.6.4.2 Anpassung des Schwellwertlter IP-Core<br />
Der im vorherigen Sprint im Arbeitspaket Filter-Cores erstellte Schwellwertfilter<br />
wird von uns um Funktionalität erweitert. Für unseren Einsatz ist<br />
es nötig den Schwellwert dynamisch zu verändern, was eine Anbindung an<br />
den Microblaze des FPGA nötig macht. Dadurch wird es möglich mittels<br />
eines von uns geschriebenen Softwaretreibers den Schwellwert über den<br />
PLB zu setzen. Eine schematische Darstellung des überarbeiteten IP-Cores<br />
findet sich in Abbildung ??<br />
PLB<br />
pixel_clock<br />
framevalid_in<br />
linevalid_in<br />
datavalid_in<br />
data_in [mode]<br />
schwellwertfilter<br />
v2_00_a<br />
framevalid_out<br />
linevalid_out<br />
datavalid_out<br />
data_out [23:0]<br />
Abbildung 2.113: Schwellwertfilter mit Anbindung an den Microblaze<br />
Die entwickelte Treiberklasse Schwellwertfilter besitzt zwei Methoden, welche<br />
250
Kapitel 2. Implementation 10. Oktober 2013<br />
die wesentlichen Aufgaben übernehmen. Das Setzen des Schwellwertes erfolgt<br />
über die Funktion “set“.<br />
bool set ( Xuint8 schwelle );<br />
Der Schwellwert wird als Wert in der Treiberklasse gespeichert und kann<br />
bei Bedarf über die Funktion “get“ abgefragt werden.<br />
int get ( void );<br />
Dateistruktur<br />
• ipcores/pcores/schwellwertfilter_v2_00_a/hdl/vhdl/schwellwert.vhd:<br />
Hardwarebeschreibung des Buskonvertierers<br />
• ipcores/pcores/schwellwertfilter_v2_00_a/hdl/vhdl/...<br />
schwellwertfilter.vhd: Äußeres Modul vom Schwellwertfilter IP-Core.<br />
Automatisch generiert vom Xilinx Peripheral Wizard.<br />
• ipcores/pcores/schwellwertfilter_v2_00_a/hdl/vhdl/user_logic.vhd:<br />
User Logic Modul vom Schwellwertfilter IP-Core. Automatisch generiert<br />
vom Xilinx Peripheral Wizard. Enthält die Logik für das PLB Register.<br />
2.6.4.3 IP-Core ImageBusConverter<br />
Im Laufe des Aufbaus der Bildverarbeitungskette auf dem FPGA wurde<br />
schnell klar, das ein zusätzlicher IP-Core von benötigt wird. Dieser soll die<br />
Fähigkeit besitzen aus verschiedenen Eingangssignalen ein 24 Bit RGB Signal<br />
zu generieren. Als mögliche Eingangssignalformate sollen 1 Bit Schwarzweiß,<br />
8 Bit Grau und 16 Bit RGB 565 in ein 24 Bit RGB kompatibles Bildformat<br />
gebracht werden.<br />
Dieser IP-Core wird nötig, da der IP-Core welcher die Daten an den PC<br />
mittels USB überträgt ausschließlich Bildströme im 24 Bit RGB Format annimmt.<br />
Um jedoch das Bild visualisieren zu können, das von dem Schwellwertfilter<br />
erzeugt wurde, ist eine Konvertierung nötig. Dieser IP-Core stellt<br />
eine Erweiterung zu dem aus Sprint 2 bekannten IP-Core<br />
cam_rgb565_to_rgb888 dar.<br />
Das Eingangs- und Ausgangssignal sind Imagebus-Signale, welche die üblichen<br />
Signale Framevalid,Linevalid, Datavalid und die Bilddaten selbst data besitzen.<br />
Die Datenbreite des Eingangssignals wird durch einen Generic festgelegt.<br />
Ein Generic ist ein einstellbarer Parameter der bei erstmaliger Nutzung<br />
251
Kapitel 2. Implementation 10. Oktober 2013<br />
pixel_clock<br />
framevalid_in<br />
linevalid_in<br />
datavalid_in<br />
data_in [mode]<br />
busConverterToRGB888<br />
v1_00_a<br />
framevalid_out<br />
linevalid_out<br />
datavalid_out<br />
data_out [23:0]<br />
Abbildung 2.114: IP-Core ImageBusConverter mit 24 Bit RGB Ausgangssignal<br />
des IP-Cores gesetzt werden muss und damit angibt, welches Eingangssignal<br />
in das 24-Bit breite Ausgangssignal gewandelt wird.<br />
In der Abbildung ?? ist die zusätzliche Funktionalität des IP-Core dargestellt,<br />
die im Vergleich zum cam_rgb565_to_rgb888 IP-Core dazu gekommen ist.<br />
1 Bit Schwarzweiß<br />
Schwarzweiß Modus:<br />
S/W<br />
S/W S/W S/W S/W<br />
S/W S/W S/W S/W<br />
S/W S/W S/W S/W<br />
8Bit Rot<br />
8Bit Grün<br />
8Bit Blau<br />
8 Bit Grau<br />
Grau Modus:<br />
G7<br />
G6<br />
G5<br />
G4<br />
G3<br />
G2<br />
G1<br />
G0<br />
G7 G6 G1 G0<br />
G7 G6 G1 G0<br />
G7 G6 G1 G0<br />
8Bit Rot<br />
8Bit Grün<br />
8Bit Blau<br />
Abbildung 2.115: IP-Core ImageBusConverter Signalkonvertierung<br />
Dateistruktur<br />
• ipcores/pcores/busConverterToRGB888_v1_00_a/hdl/vhdl/...<br />
busConverterToRGB888.vhd: Hardwarebeschreibung des Buskonvertierers<br />
252
Kapitel 2. Implementation 10. Oktober 2013<br />
• ipcores/pcores/busConverterToRGB888_v1_00_a/devl/...<br />
busConverterToRGB888/busConverterToRGB888_tb.vhd: Definierte<br />
Testumgebung für den Buskonvertierer<br />
2.6.4.4 IP-Core Erkennung von Regionen in Bildern<br />
Für die Erkennung von Flächen beziehungsweise Regionen in Bildern wurde<br />
der Projektgruppe ein IP-Core inklusive Treiber bereitgestellte, der aus der<br />
Projektgruppe yaDAS “FPGA-basiertes Echtzeit-Kamerasystem für Fahrerassistenz“<br />
hervorgegangen ist. Dieser IP-Core ordnet Bildpunkte einer bestimmten<br />
Region zu, so dass zusammengehörige Flächen ausgegeben und<br />
weiterverarbeitet werden können. Die Funktionsweise, Aufbau sowie die<br />
Ansteuerung ist in der Projektgruppenarbeit zu finden [20].<br />
Abbildung 2.116: Erkannte Regionen in einem Bild mit ihren eingezeichneten<br />
Schwerpunkten<br />
Der Bereitgestellte IP-Core wertet das Bild nach dem Schwellwertfilter aus<br />
und liefert zu jeder gefunden Region Informationen. Die für uns Wichtigen<br />
ermöglichen uns, die mittleren Schwerpunkt zu bestimmen, so dass<br />
diese in einem Bild zugeordnet werden können. In Abbildung ?? ist das<br />
Bild nach dem Schwellwertfilter dargestellt inklusive der Schwerpunkte<br />
der einzelnen Regionen.<br />
253
Kapitel 2. Implementation 10. Oktober 2013<br />
2.6.4.5 Armerkennung und Verfolgungstreiber<br />
Die Armerkennung und Verfolgung der Armgelenke basiert auf Erkennung<br />
von roten Flächen in einem Bild. Die Erkennung erfolgt mit dem in<br />
Abschnitt 2.6.4.4 erwähnten IP-Core. Die von uns entwickelte Klasse stellt<br />
eine zusätzliche Abstraktionsschicht bereit.<br />
Das Zuordnen und Verfolgen der Armgelenke erfolgt ähnlich den vorherigen<br />
Sprints. Es musste jedoch bei der Umsetzung berücksichtigt werden<br />
das einige Informationen, die genutzt wurden auf unserer Plattform nicht<br />
zur Verfügung standen. Resultierend daraus haben wir uns auf drei Rote<br />
Armbinden beschränkt, statt der fünf. Diese wurden direkt über den jeweiligen<br />
drei Gelenke positioniert.<br />
Vorstellung des Armerkennungstreibers<br />
Für die Verfolgung und Berechnung<br />
der Position sowie Winkel des Arms wurden folgende Methoden<br />
angelegt, die im Einzelnen vorgestellt werden.<br />
ArmDetection ( u32 baseAddress );<br />
Der Konstruktor dieser Klasse muss die Basisadresse des blob_detection_v2_10_a<br />
IP-Cores übergeben bekommen. Bevor das Objekt benutzt werden kann,<br />
muss die setup_interrupts Methode in der Hauptfunktion aufgerufen werden.<br />
void setup_interrupt ( XIntc * interruptController , u8 pin );<br />
Mittelpunkte erhalten<br />
Zuordnung der Punkte<br />
zu Gelenken<br />
Reihenfolge sortieren<br />
Winkel der Armstellung<br />
berechnen<br />
für nächsten Vergleich<br />
speichern<br />
Abbildung 2.117: Vereinfachter Ablauf der Unterbrechungsroutine<br />
254
Kapitel 2. Implementation 10. Oktober 2013<br />
Durch den Aufruf der setup_interrupts Methode wird der Interrupt-Pin<br />
des blob_detection_v2_10_a IP-Cores mitgeteilt und der Interrupt zugelassen.<br />
void isr () ;<br />
Diese Methode wird bei einem Interrupt aufgerufen und liest die erkannten<br />
Regionen und ihre Parameter aus. Ebenfalls wird das Verfolgen der<br />
Regionen und die Berechnungen der Winkel veranlasst. Eine vereinfachte<br />
Darstellung der durchgeführten Operationen ist in Abbildung ?? zu sehen.<br />
usb_data_arm_blobset_points getCenterOfGravatie () ;<br />
Diese Funktion gibt die ermittelten Schwerpunkte der Region in der Form<br />
zurück, so dass sie von dem USB Protokoll direkt übertragen werden können.<br />
void setMinBlobSize ( u8 size );<br />
Der Aufruf dieser Funktion ermöglicht es die minimale Pixelmenge der zu<br />
sammelnden Regionen zu setzen, damit diese nur die Flächen der Armbinden<br />
erfasst.<br />
ArmAngleSet getArmPositionSet () ;<br />
Durch diese Funktion werden die berechneten Winkel abgefragt, sowie die<br />
X-Y-Position der Gelenke.<br />
~ ArmDetection () ;<br />
Der Dekonstruktor gibt die bereitgestellten Speicherstellen wieder frei.<br />
Die im weiteren Aufgeführten Methoden stehen nur innerhalb der Klasse<br />
bereit.<br />
void calcArmAngelSet ( CenterOfGravity * cog );<br />
Diese Funktion berechnet aus drei den gegebenen Gelenkpunkten die jeweiligen<br />
Winkel.<br />
void calcTracking ( CenterOfGravity * cogAct , CenterOfGravity<br />
* cogOld );<br />
Durch diese Funktion ist es möglich den neu ausgelesenen drei Mittelpunkten<br />
den jeweiligen Gelenken zuzuordnen.<br />
void sortCOG ( CenterOfGravity * cogAct );<br />
Es wird von anderen Funktionen erwartet das die Punkte der Gelenke in<br />
folgender Reihenfolge angelegt sind:<br />
1. Handgelenk<br />
255
Kapitel 2. Implementation 10. Oktober 2013<br />
2. Ellenbogen<br />
3. Schulter<br />
Um dies sicherzustellen wird die Funktion sortCOG aufgerufen, nach dem<br />
den Punkten durch die calcTracking() Funktion die jeweiligen Gelenke zugeordnet<br />
wurden.<br />
void saveCOG ( CenterOfGravity * cogAct , CenterOfGravity *<br />
cogOld , int length );<br />
Es werden immer die letzten empfangenen Mittelpunkte der Gelenke gespeichert<br />
um die Zuordnung der neuen Mittelpunkte zu ermöglichen.<br />
char getPointToLinePosition ( CenterOfGravity *a ,<br />
CenterOfGravity *b ,<br />
CenterOfGravity *c);<br />
Um die Position von drei Punkten in Relation zu einander auswerten zu<br />
können wird diese Funktion aufgerufen. Die Funktion gibt einen negativen<br />
Wert zurück, wenn sich der Punkt a links von der Linie befindet, welche<br />
durch die Punkte b und c verläuft, sowie der Punkt a 1 in der Abbildung<br />
??. Liegt der Punkt a auf der Linie ist der Rückgabe wert 0 und liegt der<br />
Punkt rechts der Linie wird eine positive Zahl zurück geliefert.<br />
a 2<br />
a 1<br />
a 3<br />
b<br />
c<br />
Abbildung 2.118: Mögliche Lage von drei Punkten zueinander<br />
Dateistruktur<br />
• microblazecode/camera/src/armDetection.h: C++ Header Datei der<br />
Armerkennung und Verfolgung.<br />
• /microblazecode/camera/src/armDetection.cpp: C++ Implementierung<br />
der Armerkennung und Verfolgung<br />
256
Kapitel 2. Implementation 10. Oktober 2013<br />
2.6.4.6 Übertragung und Darstellung der Armposition mit der<br />
OFFIS-Automation-Toolbox<br />
An den PC werden Informationen der Gelenkpositionen mittels USB übertragen<br />
und dort verarbeitet. Die Verarbeitung erfolgt mit einer Erweiterung<br />
für die OFFIS-Automation-Toolbox. Als Grundlage für die Erweiterung<br />
wurde das VmodPlugIn 2.2.2 benutzt und für unsere Aufgabe erweitert.<br />
Es wurde ein weiterer USB-Nachrichtentyp definiert, der für die Übertragung<br />
der Gelenkposition zuständig ist. Der Nachrichtentyp wird von uns<br />
als USB_TYPE_BLOB_ARMSET bezeichnet und beinhaltet folgende Struktur.<br />
1 int handx ;<br />
2 int handy ;<br />
3 int elbowx ;<br />
4 int elbowy ;<br />
5 int shoulderx ;<br />
6 int shouldery ;<br />
Die X-Y-Positionen der einzelnen Gelenke werden von der Erweiterung<br />
VmodCamBlob in der OFFIS-Automation-Toolbox dargestellt. Dafür wurde<br />
ein weiterer Ausgang definiert, der eine Liste von 2D-Punkten übergeben<br />
bekommt, welche über das empfangende Kamerabild gelegt werden. In<br />
der nächsten Abbildung ?? ist das Resultat des Schwellwertfilters zu sehen,<br />
über das die Gelenkpositionen, im Bild die grünen Punkte, gelegt wurden.<br />
Abbildung 2.119: Visualisierung der Gelenkpositionen durch die Vmod-<br />
CamBlob Erweiterung<br />
257
Kapitel 2. Implementation 10. Oktober 2013<br />
Dateistruktur<br />
• offis-toolbox/plugins/usb_message_type.h:<br />
Enthält die USB-Nachrichtentypen<br />
• offis-toolbox/plugins/vision/VmodCamBlob/src/VmodCamBlob.h: C++<br />
Header Datei der Erweiterung.<br />
• offis-toolbox/plugins/vision/VmodCamBlob/src/VmodCamBlob.cpp:<br />
C++ Datei mit der Implementation der Erweiterung.<br />
2.6.4.7 Schwierigkeiten<br />
Für dieses Arbeitspaket stellte sich besonders die Abhängigkeit zu bereits<br />
erstellten IP-Cores als Schwierigkeit heraus. Der Morphologiefilter war<br />
noch nicht auf der eigentlichen Zielplattform getestet worden. Es stellte<br />
sich heraus das dieser nicht benutzbar ist. Zusätzlich stellte die Regionserkennung,<br />
für Bilder mit Auflösungen die größer als 800x600 Pixel sind,<br />
ein Problem dar. Diese Hardwarekomponente wurde noch nicht für den<br />
Einsatz auf Bilder dieser Größe vorbereitet.<br />
2.6.4.8 Fazit<br />
Eine Armerkennung ist Teilweise auf dem FPGA umgesetzt worden. Allerdings<br />
fehlt noch die Bestimmung der Ausrichtung von der Hand um den<br />
Winkel für das Handgelenk zu bestimmen. Dies ist mit der drei Bindentechnik<br />
in der Form aktuell nicht möglich. Es muss dafür folglich noch ein<br />
stabiles Konzept erarbeitet werden um diese Informationen zu bestimmen.<br />
Die bereits errechneten Winkel lassen sich nun auf den Roboterarm übertragen<br />
und damit ist eine vom PC unabhängige Steuerung möglich.<br />
Diese Erkennung des menschlichen Arms ist aktuell auf den zweidimensionalen<br />
Raum beschränkt.<br />
258
Kapitel 2. Implementation 10. Oktober 2013<br />
2.6.5 Fazit und Ausblick<br />
Die im Sprint 4 gesetzten Ziele wurden erfolgreich umgesetzt. Die Kopfbewegungen<br />
werden erkannt und es wird deutlich zwischen den Zuständen<br />
Kopf grade halten, nach rechts und links Neigen des Kopfes deutlich unterschieden.<br />
Die erkannten Zustände werden in Signale umgewandelt und<br />
an den Roboterarm weiter geschickt. Die Bewegungen des Kopfes werden<br />
durch mehrere Markierungen am Kopf erkannt. Der Prototyp dient einer<br />
Grundlage für die Umsetzung des entsprechenden Anwendungsfalles in<br />
Hardware.<br />
Die Tiefeninformationen werden aus der Tiefenerkennung geliefert.<br />
Die Echtzeitausgabe über HDMI wurde ebenso umgesetzt.<br />
Der zur Verfügung gestellte BLOB-IP-Core wurde erfolgreich in das bestehende<br />
Projekt eingebunden sowie die hierzu benötigte Interruptroutine<br />
umgesetzt. Die Winkel zwischen den erkannten Punkten werden auf der<br />
Microblazeebene bereitgestellt. Die Bestimmung der Ausrichtung der Hand,<br />
um den Winkel für das Handgelenk zu bestimmen, fehlt allerdings noch.<br />
Diese soll bei der Anbindung der dreidimensionalen Erkennung des Arms<br />
berücksichtigt werden.<br />
Des Weiteren wird ein neuer Sprint geplant, der einen Softwareprototyp<br />
der Handsteuerung sowie eine Überarbeitung der Dokumentation vorsieht.<br />
259
Kapitel 2. Implementation 10. Oktober 2013<br />
2.7 Sprintplanung Sprint 5<br />
In dem Sprint 5 wird das Hauptziel auf die Umsetzung des Softwareprototyps<br />
der Handsteuerung gesetzt. Hierbei soll eine OFFIS-Automation-<br />
Toolbox-Bildverarbeitungskette erstellt werden, die das Öffnen und Schließen<br />
der menschlichen Hand erkennen soll.<br />
Des Weiteren wird eine Überarbeitung der Dokumentation vorgenommen,<br />
welche die Korrekturvorschläge des Auftragsgebers für das Lastenheft übernehmen<br />
soll. Außerdem werden die formalen Regeln für das Dokumentieren festgelegt.<br />
Die Leitpfade zu den formalen Regeln werden im PG-Wiki veröffentlicht<br />
und sollen zukünftig bei dem Dokumentieren beachtet werden.<br />
2.7.1 Softwareprototyp Handsteuerung<br />
Vorbedingungen<br />
• OFFIS-Automation-Toolbox<br />
Arbeitspaketbeschreibung<br />
Ziel des Arbeitspaketes ist es das Öffnen und Schließen einer menschlichen<br />
Hand mittels einer OLVIS-Bildverarbeitungskette zu erkennen. Dabei soll<br />
darauf geachtet werden, dass sich die Bildverarbeitungskette auf das ATLYS-<br />
Board mit angemessenem Aufwand portieren lässt.<br />
Deadlines<br />
• 22.05.2013 12:00 Bildverarbeitungskette inkl. Dokumentation<br />
Personen<br />
• Sebastian Reichel<br />
• Matthias Stasch<br />
Aufwand<br />
• 8 PT OLVIS Bildverarbeitungskette + Dokumentation<br />
260
Kapitel 2. Implementation 10. Oktober 2013<br />
Lieferumfang<br />
• OLVIS-Bildverarbeitungskette inkl. Pythonskripte<br />
• Dokumentation für die Bildverarbeitungskette<br />
261
Kapitel 2. Implementation 10. Oktober 2013<br />
2.7.2 Überarbeitung der Dokumentation<br />
Vorbedingungen<br />
• Lastenheft<br />
• Dokumentation<br />
Arbeitspaketbeschreibung<br />
Ziel des Arbeitspaketes ist eine Überarbeitung des Lastenheftes und der<br />
Dokumentation. Das Lastenheft muss gemäß den Korrekturvorschlägen<br />
des Kunden überarbeitet werden. Für die Dokumentation soll zunächst ein<br />
Leitfaden erarbeitet werden, der formale Regeln zum Dokumentieren festlegt.<br />
Dieser Leitfaden wird im PG-Wiki veröffentlicht und muss zukünftig<br />
beim Dokumentieren beachtet werden. Die bis zu Beginn des Arbeitspakets<br />
vorliegende Dokumentation muss anhand des Leitfadens überarbeitet werden.<br />
Deadlines<br />
• 29.05.2013 12:00 Überarbeitetes Lastenheft und Leitfaden für die Dokumentation<br />
• 12.06.2013 12:00 Dem Leitfaden entsprechend überarbeitete Dokumentation<br />
Personen<br />
• Patrick Elfert<br />
• Peter Gewald<br />
Aufwand<br />
• 4 PT Überarbeitung des Lastenheftes<br />
• 4 PT Entwicklung eines Leitfadens für die Dokumentation<br />
• 8 PT Überarbeitung der Dokumentation anhand des Leitfadens<br />
262
Kapitel 2. Implementation 10. Oktober 2013<br />
Lieferumfang<br />
• Korrigiertes Gesamtdokument, bestehend aus dem Lastenheft und<br />
der Dokumentation, mit dem Leitfaden im PG-Wiki<br />
263
Kapitel 2. Implementation 10. Oktober 2013<br />
2.8 Sprint 5<br />
In diesem Sprint werden die Ergebnisse der Umsetzung des Softwareprototyps<br />
für Handsteuerung sowie der Überarbeitung der Dokumentation<br />
vorgestellt.<br />
2.8.1 Softwareprototyp Handsteuerung<br />
In diesem Abschnitt wird die Erkennung der Gesten der menschlichen<br />
Hand behandelt. Diese Erkennung ist notwendig, da mittels Gesten der<br />
Hand die Steuerung des Greifers erfolgen soll. Zu diesem Zweck wird<br />
zunächst eine Recherche durchgeführt. Bei Dieser wird nach bestehenden<br />
Ansätzen für die Erkennung von Gesten der menschlichen Hand gesucht.<br />
Die gefundenen Ansätze werden im folgenden Unterkapitel kurz hinsichtlich<br />
ihrer Relevanz und Verwendbarkeit analysiert.<br />
Danach soll auf Basis der Recherche eine Implementierung als OLVIS-<br />
Bildverarbeitungskette erfolgen.<br />
2.8.1.1 State-of-the-Art<br />
Im Rahmen der durchgeführten Recherche wurden verschiedene Ansätze<br />
gefunden. Bei der Analyse dieser Ansätze werden zwei Aspekte betrachtet:<br />
Erstens wird die Menge an Informationen, welche der Ansatz liefert, untersucht.<br />
Diese ist entscheidend für ein mögliches Mapping von Gesten und<br />
der Qualität der Ansteuerung des Greifers.<br />
Abbildung 2.120: Hand in farbigem Handschuh. 33<br />
264
Kapitel 2. Implementation 10. Oktober 2013<br />
Der zweite Aspekt ist die technische Machbarkeit im Rahmen der Projektgruppe.<br />
Hierbei wurden die, von den Ansätzen verwendeten, Techniken<br />
untersucht. Der Hauptaspekt ist dabei die Umsetzbarkeit auf der FPGAbasierten<br />
Zielplattform.<br />
Der erste Ansatz, der untersucht wurde, ist ein Projekt vom MIT [17]. In<br />
diesem Projekt wird ein Handschuh verwendet, an welchem die einzelnen<br />
Bereiche und Gelenke der Hand mit unterschiedlichen Farben gekennzeichnet<br />
sind. Der Handschuh ist in Abbildung 2.120 zu sehen. Für die Erfassung<br />
des Handschuhs wird eine Kinect verwendet. Auf dem Kamerabild<br />
wird eine Bildverarbeitungskette angewendet, um die einzelnen, farblich<br />
markierten, Bereiche der Hand separieren. Zusätzlich wird die Tiefeninformation<br />
verwendet, welche die Kinect liefert. Aufbauend auf diesen Informationen<br />
wird die genaue Position und Haltung der Hand, sowie der<br />
Finger berechnet.<br />
Ein weiterer Ansatz, der betrachtet wurde, stammt von der <strong>Universität</strong> Kreta.<br />
Dieser verwendet, wie schon der erste Ansatz [17], eine Kinect für die<br />
Datenaquise. Dieser Ansatz wurde in die Untersuchung einbezogen, weil<br />
er keine weiteren Hilfmittel benötigt.<br />
Abbildung 2.121: Hand-Erkennung. 34<br />
33 Quelle: http://people.csail.mit.edu/rywang/hand/glove.png<br />
265
Kapitel 2. Implementation 10. Oktober 2013<br />
Um die genaue Haltung der Hand zu berechnen verwendet der Ansatz<br />
ein mathematischen Modell der Hand. Dieses Verfügt über 26 Freiheitsgrade<br />
und wird zusätzlich von einer Heuristik unterstützt. Die Heuristik<br />
wird verwendet um die Haltung der Hand zu berechnen, wenn diese durch<br />
Gegenstände teilweise verdeckt wird. Das Ergebnis der Berechnungen ist<br />
in Abbildung 2.121 zu sehen.<br />
Die Ansätze [12] und [17] sind weit vorgeschrittene Forschungsprojekte.<br />
Sie zeichnen sich beide durch einen sehr hohen Informationsgehalt aus,<br />
welcher es ermöglicht Handgesten und selbst die Haltung einzelner Finger<br />
zu erkennen. Der Ansatz [12] ist sogar in der Lage mittels Heuristiken die<br />
Stellung der Hand trotz starker Überdeckung durch Objekte korrekt zu<br />
berechnen.<br />
Ein Nachteil den beide Projekte teilen, ist der hohe Bedarf an Rechenleistung.<br />
Beide Systeme benötigen leistungsstarke Hardware, welche unsere<br />
Zielplattform nicht bereitstellen kann.<br />
Zudem benötigen beide Ansätz zusätzliche Sensorik. Der Ansatz [12] benötigt<br />
ein Array aus 8 Kameras um die Hand zu erkennen. Bei dem Ansatz [17]<br />
wird eine Kinect, sowie eine aufwendige Bildverarbeitungskette verwendet.<br />
2.8.1.2 Ansatz zur Handsteuerung<br />
Da die in Abschnitt 2.8.1.1 durchgeführte Recherche keinen verwertbaren<br />
Ansatz ergeben hat, wurde eine eigene Umsetzung entwickelt, welche eine<br />
vereinfachte Form des farbigen Handschuhs darstellt. Dieser Ansatz verwendet<br />
eine Bildverarbeitungskette, welche mit der OFFIS-Automation Toolbox<br />
implementiert wurde. Die Verarbeitung der Daten der Bildverarbeitungskette<br />
erfolgt durch ein Python Skript.<br />
Um die Hand zu erkennen, werden an dieser farbige Markierungen angebracht,<br />
welche mittels eines BLOB-Filters gefunden werden sollen. Zunächst<br />
wurde probiert eine einzelne Markierung an der Handinnenseite zu befestigen.<br />
Diese ist im geschlossenen Zustand nicht sichtbar. Dies schränkt die<br />
verwendbaren Perspektiven stark ein, da die Handinnenseite aus vielen<br />
Richtungen nicht deutlich zu erkennen ist.<br />
Abhilfe schafft eine zweite Variante, bei der jeweils eine Markierung an<br />
Daumen und Zeigefinger angebracht wird (siehe Abbildung 2.123). Ob die<br />
Hand als geöffnet oder geschlossen angesehen wird, hängt davon ab, wie<br />
34 Quelle: http://www.openni.org/files/3d-hand-tracking-library/<br />
266
Kapitel 2. Implementation 10. Oktober 2013<br />
nah Daumen und und Zeigefinger zueinander sind. Befinden sich die beiden<br />
erkannten BLOBs nah beieinander, oder wird gar nur ein großer BLOB<br />
erkannt, so wird die Hand als geschlossen betrachtet. Falls die BLOBs einen<br />
großen Abstand zu einander haben wird die Hand als geöffnet angesehen.<br />
Diese Methode setzt voraus, dass die beiden Finger sich nicht gegenseitig<br />
verdecken, da sonst nur ein BLOB erkannt wird (vergleiche Abbildung<br />
2.123).<br />
267
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.122: OLVIS Bildverarbeitungskette<br />
268
Kapitel 2. Implementation 10. Oktober 2013<br />
Bildverarbeitungskette<br />
Bei der Bildverarbeitungskette wurde darauf geachtet, dass alle verwendeten<br />
Filter in Hardware implementierbar sind. Darüber hinaus wurde versucht<br />
mit Filtern zu arbeiten, welche bereits als Hardwareimplementierung<br />
vorhanden sind.<br />
Auf Grundlage dieser Vorgaben, wurde die in Abbildung 2.122 dargestellte<br />
Filterkette entworfen. Es wird ein RGB-zu-Graustufen-Filter, welcher eine<br />
Gewichtung auf dem Grünkanal durchführt, verwendet. Auf dem entstandenen<br />
Graustufenbild wird ein Schwellwert-Filter angewendet, um binäre<br />
Daten zur weiteren Analyse per BLOB-Filter zu erhalten.<br />
Da die Farbe der Markierung, wie in Abbildung 2.123 zu sehen, grün ist,<br />
wird sie durch den gewichteten RGB-zu-Graustufen-Filter stark hervorgehoben.<br />
Dies macht eine Erkennung der Markierung durch die nachgeschaltete<br />
BLOB-Detektion möglich. Die Daten der BLOB-Detektion werden im<br />
Folgendem von einem Pythonskript weiter verarbeitet.<br />
Phython-Skript<br />
Im Abschnitt 2.8.1.2 wurde Bildverarbeitungskette beschrieben, welche mit<br />
Hilfe verschiedener Filter Objekte im Kamerabild erkennt. Da die, in der<br />
Bildverarbeitungskette verwendete, BLOB-Detektion lediglich Informationen<br />
zu allen im Bild gefunden Objekten ausgibt, müssen diese Daten in<br />
einem weiteren Schritt analysiert werden. Diese Analyse erfolgt durch ein<br />
Pythonskript.<br />
Im ersten Schritt wird die Anzahl der im Bild gefundenen Objekte untersucht.<br />
Dabei werden Datensätze, verworfen, welche keine oder mehr als<br />
zwei Objekte enthalten.<br />
Sollte sich nur ein Objekt im Bildbefinden befinden, wird eine 1 vom Skript<br />
zurückgeliefert. Dabei wird angenommen, dass in diesem Fall die beiden<br />
Objekte verschmolzen sind und die Hand folglich geschlossen ist.<br />
Wenn zwei Objekte gefunden werden, wird der euklidische Abstand der<br />
Schwerpunkte berechnet. Sollte dieser einen experimentell bestimmten Schwellwert<br />
übersteigen, so wird die Hand als geöffnet angesehen, andernfalls gilt<br />
sie als geschlossen.<br />
Der Schwellwert wurde experimentell erhoben, da zum Zeitpunkt der Erstellung<br />
des Skripts keine 3D-Daten zur Verfügung standen. Mit 3D-Informationen<br />
kann die Position der Objekte im Raum bestimmt werden, und die Geste<br />
genauer erkannt werden.<br />
269
Kapitel 2. Implementation 10. Oktober 2013<br />
(a) frontal, geöffnet<br />
(b) frontal, geschlossen<br />
(c) seitlich, geöffnet<br />
(d) seitlich, geschlossen<br />
(e) nicht erkennbar<br />
Abbildung 2.123: Erkennung des Schließzustandes der Hand mittels<br />
Markierungen an den Fingerkuppen von Zeigefinger und<br />
Daumen<br />
270
Kapitel 2. Implementation 10. Oktober 2013<br />
2.8.2 Fazit und Ausblick<br />
Die Ergebnisse des Sprint 5 erfüllten die gesetzten Ziele mit folgendem<br />
Erfolg: Die formalen Regeln für das Dokumentieren wurden erstellt und<br />
im PG-Wiki veröffentlicht. Die Dokumentation wurde gemäß den neuen<br />
Regeln überarbeitet. Die Korrekturvorschläge des Arbeitsgebers wurden<br />
für das Lastenheft übernommen.<br />
Für die Umsetzung des Softwareprototyps wurde zunächst eine State-of-<br />
The-Art Recherche vorgenommen. Der Ansatz der farbigen Markierung<br />
wurde auch im Projekt RoboArm verwendet. Die Umsetzung des Softwareprototyps<br />
erfolgte durch Einsatz der BLOB-Erkennung. Die Fingerspitzen<br />
des Daumens und des Zeigerfingers wurden mit grünen Markierungen<br />
versehen, so das der geschlossener Zustand entweder als ein BLOB oder<br />
als zwei sehr nah an einander befindenden BLOBs und der geöffneter<br />
Zustand als zwei deutlich voneinander entfernten BLOBs erkannt wird.<br />
Dieser Ansatz setzt allerdings voraus, dass die Fingerspitzen mit keinem<br />
anderen Teil des menschlichen Arms verdeckt sein dürfen. Ansonsten ist<br />
keine Erkennung der Fingerspitzen möglich. Dies schränkt die verwendbaren<br />
Perspektiven zwar ein, jedoch ermöglicht eine relativ einfache Umsetzung<br />
der Handsteuerung und muss bei der Bedienung des Roboters<br />
beachtet werden.<br />
Der nächste Sprint verfolgt viele Teilziele der Neuentwicklung, Implementierung<br />
sowie des Portierens der bestehenden Projekte auf Hardware.<br />
271
Kapitel 2. Implementation 10. Oktober 2013<br />
2.9 Sprintplanung Sprint 6<br />
In diesem Sprint ist die Erstellung und Anbindung mehrerer Hardwarekomponenten<br />
geplant. Der Aufbau der dreidimensionalen Bildverarbeitungskette<br />
muss umgesetzt werden. Da das Drehgelenk der menschlichen Schulter<br />
mehr Freiheitsgrade als der Roboterarm besitzt, muss ein Softwareprototyp<br />
zur Interpolation der erkannten Bewegungen am Drehgelenk erstellt<br />
werden. Außerdem sollen die Untersuchung und Verbesserungen der<br />
Schwächen von erstellten Prototypen sowie Portierungen der Softwareprototypen<br />
auf Microblaze vorgenommen werden. In diesem Sprint werden<br />
auch die Hardware-Komponente ImageBus-Overlay sowie der Softwareprototyp<br />
Trajektorienführung umgesetzt. Aufgrund der Ungenauigkeit der<br />
Roboterhardware wird ein neuer Roboterarm spezifiziert.<br />
2.9.1 ImageBus Overlay<br />
Vorbedingungen<br />
• Hardware-in-the-Loop (HIL)<br />
• Experte mit VFBC Kenntnissen<br />
Arbeitspaketbeschreibung<br />
In diesem Arbeitspaket soll ein IP-Core entwickelt werden, der ein im RAM<br />
gespeichertes Bild über den Datenstrom von einem ImageBus legt. Das im<br />
RAM gespeicherte Bild wird ab sofort als Overlay bezeichnet. In diesem<br />
werden pro Pixel 24-Bit Farbinformationen und 8-Bit Transparenzinformationen<br />
gespeichert. Der RAM wird per VFBC angebunden.<br />
Das Bild im RAM soll von dem Microblaze über die PLB-Schnittstelle<br />
verändert werden können. Dazu soll ein Treiber entwickelt werden, der<br />
Text darstellen können soll. Außerdem soll er die Informationen des BLOB-<br />
IP-Core hervorheben können.<br />
Aufwand<br />
• 12 PT IP-Core<br />
• 8 PT Microblaze-Code<br />
272
Kapitel 2. Implementation 10. Oktober 2013<br />
Lieferumfang<br />
• ATLYS-Design mit HIL<br />
273
Kapitel 2. Implementation 10. Oktober 2013<br />
2.9.2 3D Armerkennung - Portierung auf den Microblaze<br />
Vorbedingungen<br />
• OFFIS Implementierung der 3D-Erkennung<br />
• Hardwarebildkette (BLOB-Detection)<br />
• Roboteransteuerung (Servo-IP-Core + Treiber)<br />
Arbeitspaketbeschreibung<br />
Ziel des Arbeitspakets ist eine dreidimensionale Erkennung und Winkelberechnung<br />
eines menschlichen Arms von dem vorhandenen Pythonskript<br />
auf den Microblaze zu portieren. Die berechneten Winkel müssen auf den<br />
Roboterarm umgerechnet werden. Dies gilt insbesondere für den Drehwinkel<br />
des Roboterarms. Die Ausgangsdaten bestehen aus einer doppelte Bildverarbeitungskette<br />
der Stereokamera, welche synchronisiert werden müssen.<br />
Aufwand<br />
• 3W (12 PT) 3D Code von Peter & Patrick mit 2D Microblazecode von<br />
Markus & Vitaly zusammenführen<br />
• 2W (8 PT) Doppelte Bildverarbeitungsketten (Synchronisation)<br />
• 2W (8 PT) Mapping auf die Drehung von Schultergelenk zu Roboterarm<br />
• 1W (4 PT) Verbindung mit Servos (Integration)<br />
Lieferumfang<br />
• ATLYS-Projekt mit neuer Microblazesoftware (Handgelenk wird nicht<br />
unterstützt)<br />
274
Kapitel 2. Implementation 10. Oktober 2013<br />
2.9.3 Aufbau der dreidimensionalen<br />
Bildverarbeitungskette<br />
Vorbedingungen<br />
• Einzelkomponenten in Form von IP-Core für Hardware vorhanden<br />
Arbeitspaketbeschreibung<br />
Ziel dieses Arbeitspaketes ist es, eine doppelte Bildverarbeitungskette aufzubauen,<br />
so dass dreidimensionales Erkennen und Winkelberechnung eines menschlichen<br />
Arms ausschließlich auf dem Microblaze möglich wird. Die Bildverarbeitung<br />
findet mittels eines bereits erstellten IP-Core statt, wobei die<br />
Berechnung der Winkel und Armstellung in Software auf dem Microblaze<br />
berechnet werden soll.<br />
Für diesen Aufbau wird es nötig sein einen weiteren IP-Core zu entwickeln,<br />
der ein Bildstream in Höhe und Breite halbiert und somit die Anzahl der<br />
Pixel viertelt. Dies soll durch Zeilen- und Pixelsprünge realisiert werden.<br />
Aufwand<br />
• 1W (4 PT) Aufbau einer doppelte Bildverarbeitungskette<br />
• 1W (4 PT) Integration des dreidimensionalen Armerkennungssoftware<br />
Lieferumfang<br />
• ATLYS-Projekt mit dreidimensionaler Bildverarbeitungskette und Software<br />
zur Erkennung der Armstellung im dreidimensionalen Raum.<br />
275
Kapitel 2. Implementation 10. Oktober 2013<br />
2.9.4 Spezikation eines neuen Roboterarms<br />
Vorbedingungen<br />
• Kinematik aus Sprint 2<br />
• aktueller Roboterarm<br />
Arbeitspaketbeschreibung<br />
Ziel des Arbeitspakets ist die Erstellung eines neuen Roboterarms. Dabei<br />
sollen soweit wie möglich die am aktuellen Roboterarm festgestellten Mängel<br />
analysiert und bei der Konstruktion des neuen Arms mit einbezogen<br />
werden. Im ersten Abschnitt des Pakets erfolgt daher die Entwicklung<br />
möglicher Ansätze sowie eine darauffolgende Spezifikation des neuen<br />
Arms. Auf Basis der Spezifikation wird die Entscheidung über die Fortsetzung<br />
des gesamten Arbeitspakets getroffen.<br />
Der nächste Abschnitt behandelt die Erstellung eines CAD-Designs für den<br />
neuen Roboterarm. Dabei müssen die in der vorherigen Phase festgelegten<br />
Spezifikationen beachtet werden. Die Fertigung des CAD-Designs durch<br />
die CNC-Fräse erfolgt extern und nicht im Rahmen des Arbeitspakets.<br />
Um eine Rückkopplung von den Servos zu erhalten soll im nächsten Teilpaket<br />
eine Platine zur Strommessung entwickelt werden. Die Fertigung der<br />
Platine auf Basis des erstellten Layouts erfolgt dabei extern und nicht im<br />
Rahmen des Arbeitspakets.<br />
Endprodukt des Arbeitspakets ist der neue Roboterarm.<br />
Deadlines<br />
• 05.06.2013 12:00 Spezifikation<br />
• 19.06.2013 12:00 CAD-Design<br />
• 17.07.2013 12:00 Outsourced: Fertigung des CAD-Designs<br />
• 31.07.2013 12:00 Entwicklung einer Platine zur Strommessung<br />
• 28:08.2013 12:00 Outsourced: Lieferung der Platine<br />
Personen<br />
• Spezifikationsphase<br />
– Vitaliy Beguchiy<br />
276
Kapitel 2. Implementation 10. Oktober 2013<br />
– Tobias Schüürhuis<br />
• CAD-Design<br />
• Platinenentwurf<br />
Aufwand<br />
• 8PT - Spezifikationsphase<br />
• 8PT - CAD-Design<br />
• 0PT / 4W - Outsourced: Fertigung des CAD-Designs<br />
• 4PT - Entwicklung der Platine zur Strommessung<br />
• 0PT / 4W - Outsourced: Lieferung der Platine<br />
Lieferumfang<br />
• Spezifikation<br />
• CAD-Design<br />
• Gerber-Daten + Platine<br />
• Roboterarm<br />
277
Kapitel 2. Implementation 10. Oktober 2013<br />
2.9.5 Erweiterung des Servo-IP-Cores<br />
Vorbedingungen<br />
• Servo-IP-Core<br />
• Testbench für Servo-IP-Core<br />
• Rückwärtskinematik<br />
Arbeitspaketbeschreibung<br />
Ziel des Arbeitspakets ist die Erstellung eines erweiterten Servo-IP-Cores,<br />
sowie die Erweiterung der Rückwärtskinematik. Die Erweiterung des Servo-IP-Core<br />
soll die Bewegungen des Roboterarms weicher bzw. fließender<br />
gestaltet. Der vorhandene IP-Core soll für die Ansteuerung der Servos<br />
angepasst werden, sodass ruckartige Bewegungen vermeiden werden. Endprodukt<br />
soll ein neuer Servo-IP-Core sein.<br />
Die Erweiterung der Rückwärtskinematik soll die Drehachse des Roboterarms<br />
aus den Berechnungen ausschließen, sodass sich der Roboterarm<br />
lediglich in der x und y-Achse bewegt. Ausserdem soll die Kinematik ermöglichen<br />
in einer planaren Ebene einer Trajektorie zu folgen. Die Trajektorie<br />
soll dabei durch eine Liste von Punkten repräsentiert werden.<br />
Personen<br />
• Implementierungsphase Servo-IP-Core<br />
– Matthias Stasch<br />
– Patrick Elfert<br />
• Trajektoriensteuerung und Integration<br />
Aufwand<br />
• 8PT - Erweiterung Servo IP-Core mit Rampen<br />
• 12PT - Trajektoriensteuerung und Integration<br />
Lieferumfang<br />
• Erweiterter Servo-IP-Core<br />
• Erweiterte Rückwärtskinematik<br />
278
Kapitel 2. Implementation 10. Oktober 2013<br />
2.9.6 Entwicklung einer Trajektorienführung<br />
Vorbedingungen<br />
• OFFIS-Automation-Toolbox<br />
• Rückwärtskinematikplugin inkl. Python-Schnittstellen<br />
• Xilinx-Projekt(Genesys) inkl. Servo IP-Core<br />
• GENESYS FPGA-Board<br />
• Roboterarm<br />
Arbeitspaketbeschreibung<br />
Ziel dieses Arbeitspaketes ist die Entwicklung und Umsetzung eines Algorithmus<br />
zur Trajektorienführung auf einer Ebene, welche in erster Linie im<br />
Anwendungsfall „Skizze zeichnen“ eingesetzt werden soll. Dies ist nötig,<br />
da die entwickelte Rückwärtskinematik alleine zur Ansteuerung eines eingegebenen<br />
Punktes dient. Damit wird zu diesem Zeitpunkt jedoch noch nicht das<br />
Abfahren einer vorgegebenen Strecke, also einer Trajektorie, realisiert.<br />
Durch Eingabe einer Punktliste können somit auf einer Ebene geometrische<br />
Formen wie z. B. Geraden mit dem Roboterarm abgefahren werden. Dafür<br />
soll in diesem Arbeitspaket die in Sprint 2 Abschnitt 2.2.3.3 erarbeitete<br />
Rückwärtskinematik genutzt und falls nötig angepasst werden, sodass das<br />
Abfahren der Trajektorien keine unerwünschten Sprünge beinhaltet.<br />
Das Ergebnis dieses Arbeitspakets ist ein zusätzliches Plugin für die OFFIS-<br />
Automation-Toolbox, welches aus einer Menge von Punkten als Eingabe<br />
eine Trajektorie interpoliert. Als Demonstrator wird ein Python-Skript implementiert,<br />
welches Trajektorienführung und Rückwärtskinematik kombiniert,<br />
sodass die errechneten Steuerwinkel über die USB-Schnittstelle und<br />
den FPGA an die Servos des realen Roboterarms weitergeleitet werden<br />
können.<br />
Deadline<br />
03.07.2013 12:00<br />
Personen<br />
• Vitaliy Beguchiy<br />
• Tobias Schüürhuis<br />
279
Kapitel 2. Implementation 10. Oktober 2013<br />
Aufwand<br />
5 Persontage<br />
Lieferumfang<br />
• Plugin zur Trajektorienberechnung für die OFFIS-Automation-Toolbox<br />
• Python-Skript zur Verbindung von Trajektorienführung und Rückwärtskinematik<br />
– Vollständiger Aufbau zum Zeichnen planarer geometrischer Formen:<br />
Rechteck, Dreieck, Kreis<br />
280
Kapitel 2. Implementation 10. Oktober 2013<br />
2.9.7 Erweitern des Zeichenbereiches und Untersuchung<br />
des Zig-Zag Verhaltens<br />
Vorbedingungen<br />
• OFFIS-Automation-Toolbox<br />
• Rückwärtskinematikplugin inkl. Python-Schnittstellen<br />
• Trajektorienführungsplugin inkl. Python-Schnittstellen<br />
• Xilinx-Projekt(Genesys) inkl. Servo IP-Core<br />
• GENESYS FPGA-Board<br />
• Roboterarm<br />
Arbeitspaketbeschreibung<br />
Im Abschnitt 2.10.6 wurden die Probleme mit dem Zeichenbereich sowie<br />
mit dem Zig-Zag mäßigen (zitternden) Verhalten festgestellt. Das Ziel dieses<br />
Arbeitspaketes ist das Programm der Rückwärtskinematik insofern nachzubessern,<br />
dass der Wechsel der Strategie so spät wie möglich erfolgt. Die Idee dabei<br />
ist, für die Punkte im Arbeitsbereich, die von beiden Strategien erreichbar<br />
sind, weiterhin mit der ersten Strategie die Winkelstellungen zu berechnen.<br />
Außerdem muss in diesem Arbeitspaket festgestellt werden, woher<br />
das oben beschriebene Verhalten beim Abfahren der geradlinigen Trajektorien<br />
stammt. Zusätzlich soll das Verhalten des Roboterarms beim Abfahren<br />
der Trajektorie „Von Punkt zum Punkt“ ohne Interpolation getestet<br />
werden.<br />
Deadline<br />
10.07.2013 12:00<br />
Personen<br />
Vitaliy Beguchiy<br />
Aufwand<br />
3 Persontage<br />
281
Kapitel 2. Implementation 10. Oktober 2013<br />
Lieferumfang<br />
• Ein Demonstrator des verbesserten Arbeitsbereiches<br />
• Bericht über Grund des Zig-Zag mäßigen Verhalten des Roboterarms<br />
282
Kapitel 2. Implementation 10. Oktober 2013<br />
2.9.8 Drehgelenk<br />
Vorbedingungen<br />
• OFFIS-Automation-Toolbox<br />
• Roboterarm<br />
Arbeitspaketbeschreibung<br />
Ziel dieses Arbeitspaketes ist die Entwicklung und Umsetzung eines Algorithmus<br />
zur Abbildung des menschlichen Schultergelenks auf dem Roboterarm.<br />
Zu diesem Zweck muss anhand der Tiefeninformation die Drehung<br />
des menschlichen Armes auf zwei Servomotoren abgebildet werden. Mit<br />
Realisierung des Drehgelenks wird der Anwendungsfall „Armbewegung<br />
nachahmen“ funktional vervollständigt. Das Ergebnis dieses Arbeitspakets<br />
ist eine Implementierung in Python bzw. der OFFIS-Automation-Toolbox,<br />
welche im Anschluss auf den Microblaze poriert werden kann.<br />
Deadline<br />
26.06.2013 12:00<br />
Personen<br />
• Patrick Elfert<br />
• Peter Gewald<br />
Aufwand<br />
8 Personentage<br />
Lieferumfang<br />
• Python-Algorithmus für die OFFIS-Automation-Toolbox<br />
283
Kapitel 2. Implementation 10. Oktober 2013<br />
2.9.9 Referenztakt für den cam_bootloader<br />
Vorbedingungen<br />
• cam_bootloader IP-Core<br />
• Experte für den cam_bootloader<br />
Arbeitspaketbeschreibung<br />
In diesem Arbeitspaket soll der bestehende cam_bootloader IP-Core derart<br />
geändert werden, dass ein fest bestimmter Referenztakt angelegt werden<br />
muss. Dieser Takt soll ermöglichen, dass die Parameter N und M<br />
des Treibers camcfg fest gewählt werden können. Des Weiteren kann eine<br />
Lookup Tabelle hinterlegt werden, so dass die Parameter für verschiedene<br />
Kamerageschwindigkeiten nachgeschaut werden können.<br />
Aufwand<br />
• 4 PT Integration<br />
Lieferumfang<br />
• Der cam_bootloader IP-Core bekommt eine externe Referenz Clock<br />
für die Kamera<br />
• Der angepasste camcfg Treiber<br />
284
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10 Sprint6<br />
Im Folgenden werden die Ergebnisse der einzelnen Arbeitspakete sowie<br />
die dabei entstandenen Probleme ausführlich vorgestellt.<br />
2.10.1 ImageBus Overlay<br />
In diesem Arbeitspaket soll ein IP-Core entwickelt werden, der ein im RAM<br />
gespeichertes Bild über den Datenstrom von einem ImageBus legt. Das im<br />
RAM gespeicherte Bild wird ab sofort als Overlay bezeichnet. In diesem<br />
werden pro Pixel 24-Bit Farbinformationen und 8-Bit Transparenzinformationen<br />
gespeichert. Der RAM wird per VFBC angebunden.<br />
Das Bild im RAM soll von dem Microblaze über die PLB-Schnittstelle<br />
verändert werden können. Dazu soll ein Treiber entwickelt werden, der<br />
Text darstellen können soll. Außerdem soll er die Informationen des BLOB-<br />
IP-Core hervorheben können.<br />
Zunächst wird ein FIFO-Modul implementiert, welches im Overlay-IP-Core<br />
benutzt wird.<br />
2.10.1.1 FIFO-VHDL-Modul<br />
Für den Overlay-IP-Core wurde zunächst ein VHDL-Modul erstellt, welches<br />
eine FIFO bereitstellt. Dieses verwendet das Blockram VHDL-Modul,<br />
welches für den Morphologie-IP-Core erstellt wurde. Die Daten- und Addressbreite<br />
des FIFO-VHDL-Modul lässt sich über Generics anpassen. Außerdem<br />
existiert ein Port, welcher gesetzt wird, wenn die FIFO fast leer ist.<br />
Auch dieser Port lässt sich über ein Generic konfigurieren. Das VHDL-<br />
Modul verfügt über einen Reset-Eingang, welcher die FIFO zurücksetzt.<br />
Falls während der Resetphase gleichzeitig Daten in die FIFO geschrieben<br />
werden sollen, werden diese als erstes Element in der FIFO aufgenommen.<br />
Auf die Verwendung des von Xilinx bereitgestellten FIFO-IP-Core wurde<br />
verzichtet, da dieser nur als Netzliste verfügbar ist. Dies führt zu erhöhtem<br />
Aufwand beim Portieren zwischen den verschiedenen Boards (ATLYS, GENESYS).<br />
Blockschaltbild<br />
285
Kapitel 2. Implementation 10. Oktober 2013<br />
clk<br />
reset<br />
push<br />
pop<br />
in_data<br />
FIFO<br />
almost_empty<br />
empty<br />
full<br />
out_data<br />
Abbildung 2.124: Blockschaltbild des FIFO-VHDL-Modul<br />
Dateistruktur<br />
• ipcores.git/pcores/image_bus_overlay_v1_00_a/hdl/vhdl/blockram.vhd<br />
Blockram VHDL-Quelltext, welcher von dem FIFO-Modul benutzt<br />
wird. Dieses wurde aus dem Morphologie-Filter übernommen.<br />
• ipcores.git/pcores/image_bus_overlay_v1_00_a/hdl/vhdl/block_ram_tb.vhd<br />
Testbench für das Blockram-Modul. Diese wurde aus dem Morphologie-<br />
Filter übernommen.<br />
• ipcores.git/pcores/image_bus_overlay_v1_00_a/hdl/vhdl/fifo.vhd<br />
VHDL-Quelltext für das FIFO-Modul.<br />
• ipcores.git/pcores/image_bus_overlay_v1_00_a/hdl/vhdl/fifo_tb.vhd<br />
Testbench für das FIFO-Modul.<br />
2.10.1.2 image_bus_overlay_1_00_a<br />
Der Overlay-IP-Core soll auf einen ImageBus ein Overlay legen können.<br />
Er besteht also im Wesentlichen aus einem ImageBus Ein- und Ausgang,<br />
sowie einer Schnittstelle zum Speicher, in welchem sich das Overlay befindet.<br />
Dieser Speicherbereich kann dann vom Microblaze über den PLB modifiziert<br />
werden.<br />
Blockschaltbild<br />
286
Kapitel 2. Implementation 10. Oktober 2013<br />
clk<br />
reset<br />
vfbc<br />
img_bus_in<br />
PLB<br />
image_bus_overlay<br />
img_bus_out<br />
Abbildung 2.125: Blockschaltbild des ImageBus-Overlay-IP-Core<br />
Funktionsweise<br />
clk<br />
reset<br />
vfbc<br />
merge<br />
img_bus_out<br />
img_bus_in<br />
PLB<br />
FIFO<br />
Abbildung 2.126: Schematischer Aufbau des ImageBus-Overlay-IP-Core<br />
Der ImageBus-Overlay-IP-Core bekommt als Eingaben einen RGB565-ImageBus<br />
und eine VFBC-Schnittstelle, über die er aus einem Speicherbereich im<br />
RAM das Overlay als RGBA888 ausliest.<br />
Um dem IP-Core die Konfiguration der VFBC-Schnittstelle zu ermöglichen<br />
werden die ankommenden ImageBus-Daten zunächst in eine FIFO geschrieben.<br />
Dazu wird das VHDL-Modul aus Abschnitt 2.10.1.1 verwendet.<br />
Sobald auf dem ImageBus das frame_valid Signal auf ’1’ steht, wird die<br />
FIFO und die VFBC-Schnittstelle zurückgesetzt. Anschließend wird mit<br />
der Konfiguration der VFBC-Schnittstelle begonnen. Diese Konfiguration<br />
benötigt ca. 256 Takte. Während dieser Zeit werden alle ankommenden<br />
Daten des ImageBus in der FIFO gesammelt. Die Länge der Konfiguration<br />
ist kurz genug, so dass keine Daten verloren gehen. Dies liegt daran, dass<br />
die vorgeschaltete FIFO genug Daten speichern kann, bis die Konfiguration<br />
des VFBC geschehen ist. Danach kommen von der Kamera nur in jedem<br />
zweiten Takt Daten, so dass diese FIFO nach und nach geleert wird. Da<br />
287
Kapitel 2. Implementation 10. Oktober 2013<br />
ein vollständiges Bild wesentlich größer ist als 512 Pixel, wird dies nicht zu<br />
einem Problem führen.<br />
Nachdem die Konfiguration abgeschlossen ist werden jeweils zeitgleich<br />
Daten aus der FIFO und der VFBC-Schnittstelle abgefragt. Im folgenden<br />
Takt werden die Farbinformationen mittels der Alpha-Kanal-Information<br />
gewichtet zusammengerechnet.<br />
Dazu wird die folgende Formel jeweils auf dem roten, grünen und blauen<br />
Farbkanal ausgeführt:<br />
channel_out = channel_in · (255 − alpha) + channel_v f bc · alpha<br />
Der resultierende ImageBus-Datenstrom wird, ebenfalls RGB565 formartiert,<br />
auf dem image_bus_out Port ausgegeben.<br />
Eine schematische Darstellung des internen Aufbaus ist in Abbildung 2.126<br />
zu sehen.<br />
PLB Register<br />
Zur Konfiguration des IP-Cores existieren drei 32-Bit Register, welche mittels<br />
des Microblaze eingestellt werden müssen. Der Aufbau dieser Register<br />
ist in Tabelle 2.7 dargestellt.<br />
Register Bit 31 Bit 30-16 Bit 15-0<br />
Register 0x00 Base Address<br />
Register 0x04 Height Width<br />
Register 0x08 enable - Line Stride<br />
Tabelle 2.7: Image Bus Overlay PLB Register<br />
Der IP-Core verarbeitet keine Daten bis das “enable” Bit aktiviert wird. In<br />
diesem Fall wird auch der eingehende ImageBus-Datenstrom nicht weitergegeben.<br />
“Base Address” ist die Adresse im Arbeitsspeicher von der das Overlay<br />
gelesen werden soll. Das Register erwartet eine Hardwareadresse, es muss<br />
also von Microblazeadressen zunächst das PLB-Offset abgezogen werden.<br />
Auf dem ATLYS wird dieses als “XPAR_MCB_DDR2_MPMC_BASEADDR”<br />
in der xparameters.h definiert.<br />
Die “Height” und “Width” Angaben werden in Pixel gesetzt und müssen<br />
der Auflösung des anliegenden ImageBus-Datenstroms entsprechen.<br />
288
Kapitel 2. Implementation 10. Oktober 2013<br />
Das “Line Stride” Register muss mindestens der Breite des Bildes entsprechen.<br />
Falls das Register größer als die Breite des Bildes ist werden ggf. Pixel im<br />
Speicher übersprungen.<br />
Bei der Konfiguration muss beachtet werden, dass an der “Base Address”<br />
ausreichend Speicher zur Verfügung steht. Das Overlay arbeitet mit 32-Bit<br />
Pixeldaten. Damit entspricht die minimal benötigte Speichermenge:<br />
Probleme<br />
SIZE = Line_Stride · 4 · Height<br />
Um eine möglichst kleine Verarbeitungskette auf dem FPGA zu erhalten,<br />
wurde in einem ersten Schritt versucht den Image-HIL auf dem GENESYS<br />
zu nutzen. Da dieser aber leider nicht funktionierte wurde im Weiteren ein<br />
ATLYS-Projekt mit Kamera und USB-Ausgabe an die OFFIS-Automation-<br />
Toolbox verwendet.<br />
Ein weiteres Problem war das Zeitverhalten des ImageBus-Overlay-IP-Core.<br />
Es musste genau darauf geachtet werden, wann an den beiden FIFOs die<br />
pop-Signale anliegen, da die Daten beider FIFOs erst verzögert valide sind.<br />
Der Microblaze schreibt Daten mit einer anderen Byte-Reihenfolge in den<br />
RAM, als der VFBC den RAM ausliest. Dies führte zu verkehrten Alphaund<br />
Farbwerten, behoben wurde dies dadurch, dass die Lese-Reihenfolge<br />
im IP-Core angepasst wurde.<br />
Dateistruktur<br />
Das Basis-Verzeichnis für alle beschriebenen Dateien ist:<br />
ipcores.git/pcores/image_bus_overlay_v1_00_a.<br />
• ./hdl/vhdl/blockram.vhd<br />
Blockram VHDL-Quelltext, welcher von dem FIFO-Modul benutzt<br />
wird. Dieses wurde aus dem Morphologie-Filter übernommen.<br />
• ./hdl/vhdl/fifo.vhd<br />
VHDL-Quelltext für das FIFO-Modul.<br />
• ./hdl/vhdl/image_bus_overlay.vhd<br />
VHDL-Quelltext, welcher die Logik der Einblendung von Pixeln beinhaltet.<br />
289
Kapitel 2. Implementation 10. Oktober 2013<br />
• ./hdl/vhdl/overlay_tb.vhd<br />
Testbench für den image_bus_overlay-IP-Core.<br />
2.10.1.3 Overlay Microblaze Code<br />
Um dem ImageBus-Overlay-IP-Core Daten über den Microblaze zu geben,<br />
wird ein Treiber für diesen entwickelt. Dieser Treiber schreibt die benötigten<br />
RGBA888 Daten in einen Speicherbereich im RAM. Die Adresse dieses Speicherbereichs,<br />
zusammen mit der Auflösung und dem Line-Stride werden<br />
dem ImageBus-Overlay-IP-Core in Registern bereitgestellt. Der Treiber ist<br />
weiterhin in der Lage einfache geometrische Objekte und RGBA888-Bilder<br />
darzustellen. Des Weiteren soll der ImageBus-Overlay in der Lage sein Text<br />
darzustellen. Hierfür wird eine weitere Klasse erstellt und eine Basisschriftart<br />
zur Verfügung gestellt.<br />
Um die Erstellung von den benötigten Bitmap-Schriftarten zu vereinfachen<br />
wurde auf das Fontbuilder-Projekt von Andry Black [4] zurückgegriffen.<br />
Dieses Qt basierte Projekt generiert Bitmap-Schriftarten aus TrueType-Schriftarten.<br />
Zusätzlich zu der Bilddatei mit den Schriftzeichen werden außerdem Metadaten<br />
zu der Schrift und den enthaltenen Zeichen exportiert. Hier bietet die<br />
Software verschiedene XML-Exporter, sowie einen Lua-Exporter an. Von<br />
uns wird ein C-Exporter hinzugefügt.<br />
ImageBus-Overlay-API<br />
Im Folgenden werden zuerst alle erstellten Strukturen erklärt, dann die<br />
API des Overlay Treibers und im Anschluss die API des Text_Renderers.<br />
1 enum Direction {<br />
2 HORIZONTAL ,<br />
3 VERTICAL<br />
4 };<br />
Dieser Enum gibt eine Ausrichtung an. Wird z.B. in draw_line verwendet<br />
1 struct Position {<br />
2 unsigned int x;<br />
3 unsigned int y;<br />
4 };<br />
In dieser Struktur ist die Position eines Pixels gespeichert. Dabei wird i.d.R.<br />
die obere linke Ecke als 0, 0 interpretiert. Die Zeilennummer ist äquivalent<br />
zu y, die Spaltennummer zu x.<br />
290
Kapitel 2. Implementation 10. Oktober 2013<br />
1 struct Dimensions {<br />
2 unsigned int w;<br />
3 unsigned int h;<br />
4 };<br />
Diese Struktur gibt die Größe eines Objektes an. Für die Breite wird w, für<br />
die Höhe h verwendet.<br />
1 struct Color {<br />
2 unsigned char r;<br />
3 unsigned char g;<br />
4 unsigned char b;<br />
5 unsigned char a;<br />
6 };<br />
Mit dieser Struktur wird eine RGBA888 Farbe gekapselt.<br />
Overlay ( unsigned int base_addr , Dimensions d);<br />
Dies ist der Konstruktor der Klasse. Die Klasse interagiert mit dem ImageBus-Overlay-IP-Core.<br />
Sie ist in der Lage einfach geometrische Objekte<br />
zu rendern. Als Parameter sind die PLB-Basisadresse und die Größe<br />
anzugeben.<br />
~ Overlay () ;<br />
Da im Konstruktor ein Speicherbereich mittels calloc gesichert wird, muss<br />
dieser im Destruktor wieder freigegeben werden.<br />
void clear () ;<br />
Diese Methode macht den gesamten Overlay transparent. Hierbei gehen<br />
vorherige Daten verloren.<br />
bool copy ( Position p , Dimensions d , const unsigned char * data );<br />
Mithilfe dieser Methode können Bilddaten auf den Overlay kopiert werden.<br />
Data muss dabei aus RGBA888 Bilddaten bestehen. Diese können z.B.<br />
mithilfe von GIMP 35 als Header Datei exportiert werden. Als Parameter<br />
werden die Zielposition, Größe und Daten des Bildes benötigt. Die Zielposition<br />
ist dabei die obere linke Ecke des Bildes.<br />
35 http://www.gimp.org/<br />
291
Kapitel 2. Implementation 10. Oktober 2013<br />
inline bool is_valid ( Position p) {<br />
return !( p.x >= width || p.y >= height ) ? true : false ;<br />
}<br />
Damit nicht ausserhalb des validen Speicherbereichs geschrieben wird gibt<br />
diese Methode an, ob eine Position im validen Bereich des Bildes liegt.<br />
inline void draw_pixel ( Position p , Color c) {<br />
base_address [p.y * line_stride + p.x] = c;<br />
}<br />
Setzt einen Pixel an Position p auf die Farbe c.<br />
inline Color get_pixel ( Position p) {<br />
return base_address [p.y * line_stride + p.x ];<br />
}<br />
Gibt die Farbe eines Pixels an Position p zurück.<br />
1 inline Color merge_colors ( Color a , Color b , unsigned char alpha<br />
) {<br />
2 Color result ;<br />
3<br />
4 result .r = (a.r * (255 - b.a) + b.r * b.a) >> 8;<br />
5 result .g = (a.g * (255 - b.a) + b.g * b.a) >> 8;<br />
6 result .b = (a.b * (255 - b.a) + b.b * b.a) >> 8;<br />
7 result .a = alpha ;<br />
8<br />
9 return result ;<br />
10 }<br />
Diese Funktion verrechnet zwei Farbwerte zu einem Farbwert zusammen.<br />
Der Alpha Kanal beider Farben wird dabei berücksichtig, obwohl die resultierende<br />
Farbe das Alpha des Parameters hat.<br />
Dimensions get_resolution () ;<br />
Gibt die Auflösung des Overlay zurück.<br />
bool draw_line ( Position from , Position to , Color c);<br />
Mit dieser Funktion kann eine farbige Linie zwischen zwei beliebigen Punkten<br />
auf dem Overlay gezeichnet werden. Der Hierfür verwendete Algorithmus<br />
ist Bresenham’s Linien Algorithmus [5].<br />
292
Kapitel 2. Implementation 10. Oktober 2013<br />
bool draw_line ( Position p , int length , Direction d , Color c);<br />
Mit dieser Funktion können farbige Linien in horizontaler und vertikaler<br />
Richtung mit bestimmter Länge gezeichnet werden.<br />
bool draw_area ( Position p , Dimensions d , Color c);<br />
Diese Funktion füllt einen Bildbereich des Overlay ab einer Position p mit<br />
der Größe d in der Farbe c.<br />
bool draw_box ( Position p , Dimensions d , Color c);<br />
Mit dieser Funktion kann eine Box gezeichnet werden, deren Inhalt nicht<br />
weiter angepasst wird. Die Box wird ab einer Position p mit der Größe d<br />
in der Farbe c gezeichnet.<br />
bool draw_circle ( Position p , int radius , Color c);<br />
Diese Funktion zeichnet einen nicht gefüllten Kreis ab einer Position p mit<br />
dem Radius radius in der Farbe c. Der Hierfür verwendete Algorithmus ist<br />
Bresenham’s Kreis Algorithmus [5].<br />
void blt () ;<br />
Der Overlay füllt einen Speicherbereich, der nicht direkt auf den ImageBus<br />
geschrieben wird. Dies ist dazu da, lange Speicheroperationen dem Nutzer<br />
nicht sichtbar zu machen. Nachdem die Zeitaufwändige Operation beendet<br />
wurde, kann blt aufgerufen werden um diesen gerade beschriebenen<br />
Speicher sichtbar zu machen. blt steht für block line transfer.<br />
TextRenderer ( Overlay * ov );<br />
Diese Klasse ist in der Lage Text auf einen Overlay zu zeichnen. Hierbei<br />
muss der Overlay übergeben werden.<br />
struct Dimensions get_dimensions ( char * text );<br />
Diese Funktion gibt die Größe eines Textes an, dabei wird der Text nicht<br />
gezeichnet.<br />
void print ( struct Position p , char * text , struct Color c);<br />
Mit dieser Funktion wird farbiger Text auf dem Overlay gezeichnet. Dabei<br />
ist die Position die obere linke Ecke des Textes. Unterstützt werden dabei<br />
alle ASCII Zeichen sowie ein Zeilenumbruch (\n).<br />
293
Kapitel 2. Implementation 10. Oktober 2013<br />
void set_font ( const struct font_metadata * font , const unsigned<br />
char * data );<br />
Hiermit wird die zu verwendende Schriftart festgelegt. Standardmäßig ist<br />
bereits eine Schriftart ausgewählt.<br />
Font-API<br />
Die API eines Schriftzuges besteht aus zwei Teilen. Zum Einen den Metainformationen<br />
und zum Anderen den RGBA888 Daten der einzelnen Buchstaben.<br />
1 struct char_metadata {<br />
2 const char character ;<br />
3 const unsigned char advance ;<br />
4 const char ox ;<br />
5 const char oy ;<br />
6 const unsigned char x;<br />
7 const unsigned char y;<br />
8 const unsigned char w;<br />
9 const unsigned char h;<br />
10 };<br />
11<br />
12 struct font_metadata {<br />
13 const struct {<br />
14 const char * family ;<br />
15 const char * style ;<br />
16 const unsigned char size ;<br />
17 } font ;<br />
18<br />
19 const struct {<br />
20 const char ascender ;<br />
21 const char descender ;<br />
22 const unsigned char height ;<br />
23 } metric ;<br />
24<br />
25 const struct {<br />
26 const char * filename ;<br />
27 const unsigned char width ;<br />
28 const unsigned char height ;<br />
29 } file ;<br />
30<br />
31 const struct char_metadata * chars ;<br />
32 };<br />
Die Metainformationen geben Auskunft über die einzelnen Buchstaben in<br />
einer Schriftart, sowie der Schriftart selbst. Es werden Name, Typ und<br />
294
Kapitel 2. Implementation 10. Oktober 2013<br />
Schriftgröße der Schriftart gespeichert. Auch der Abstand einzelner Buchstaben<br />
untereinander ist hier abgelegt. Für jeden einzelnen Buchstaben<br />
wird zusätzlich noch gespeichert, an welchen Koordinaten er in den Daten<br />
zu finden ist, wie breit und hoch er ist, sowie Verschiebungen nach Unten,<br />
nach Oben und zur rechten Seite.<br />
1 static const struct {<br />
2 unsigned int width ;<br />
3 unsigned int height ;<br />
4 unsigned int bytes_per_pixel ; /* 2: RGB16 , 3: RGB , 4: RGBA */<br />
5 unsigned char pixel_data [152 * 147 * 4 + 1];<br />
6 }<br />
Die eigentlichen Daten der Schriftart sind in einem C-Struct gespeichert,<br />
welches z.B. durch GIMP 36 aus einem Bild generiert werden kann. Die Informationen<br />
hier beziehen sich auf die Größe des Bildes sowie der Anzahl<br />
an Bytes, die pro Pixel benötigt werden. Da wir ein RGBA888 Bild erwarten<br />
werden immer 4 Bytes pro Pixel angenommen. Die Schriftart wird dann im<br />
Text_Renderer mittels der Funktion set_font festgelegt.<br />
Generierung von kompatiblen Schriftdaten<br />
Die beschriebenen Schriftart-Metadaten können mittels des von uns geschriebenen<br />
C-Exporters im Fontbuilder-Projekt [4] erstellt werden. Dazu kann<br />
in dem Tool eine beliebige TrueType-Schriftart ausgewählt werden. Unter<br />
dem “Characters”-Tab sollten alle ASCII-Zeichen von Leerzeichen bis “~”<br />
in der korrekten Reihenfolge stehen. Schließlich kann im “Output”-Tab der<br />
C-Exporter gewählt werden. Der C-Exporter unterstützt alle Features der<br />
anderen Exporter mit Ausnahme der Unterschneidung-Informationen.<br />
Dateistruktur<br />
Das Basis-Verzeichnis für alle beschriebenen Dateien ist:<br />
ipcores.git/drivers/image_bus_overlay_v1_00_a.<br />
• ./data/image_bus_overlay_v2_1_0.mdd<br />
Eine von Xilinx generierte Datein, bedarf keiner Beschreibung.<br />
• ./data/image_bus_overlay_v2_1_0.tcl<br />
TCL-Skript zum Image Bus Overlay.<br />
36 http://www.gimp.org/<br />
295
Kapitel 2. Implementation 10. Oktober 2013<br />
• ./src/image_bus_overlay.h<br />
Die Headerdatei zum Overlay. Diese Klasse beinhaltet Funktionalität<br />
zum Zeichnen von geometrischen Objekten.<br />
• ./src/image_bus_overlay.cpp<br />
Die Quellcodedate zum Overlay. In dieser Datei wird die Programmlogik<br />
des Overlays beschrieben.<br />
• ./src/text_renderer.h<br />
Die Headerdatei zum Text-Overlay. Diese Klasse beinhaltet die Funktionalität<br />
zum Zeichnen von Texten und Buchstaben.<br />
• ./src/text_renderer.cpp<br />
Die Quellcodedatei zum Text-Overlay. Diese Datei beinhaltet die Programmlogik<br />
des Text-Overlays<br />
• ./src/font_info.h<br />
Beinhaltet die Meta-Informationen des Fonts. Dieses existiert, damit<br />
beliebige Fonts ausgewählt werden können, ohne das diese zur Laufzeit<br />
bekannt sein müssen.<br />
• ./src/dejavu_sans_mono_bold_16_data.h<br />
Dies ist eine konkrete Umsetzung einer Font.<br />
• ./src/dejavu_sans_mono_bold_16_info.h<br />
Zusätzlich zur konkreten Umsetzung benötigte Informationen sind<br />
hier enthalten.<br />
296
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10.2 3D Armerkennung - Portierung auf den<br />
Microblaze<br />
Ziel dieses Teilpaketes ist die Portierung des 3D-Armerkennungsalgorithmus<br />
aus dem Abschnitt 2.6.2 für den Microblaze des FPGA in die Programmiersprache<br />
C++. Genutzt wird dafür die bereits umgesetzte Armerkennung in<br />
zweidimensionalen Ebene aus dem Kapitel 2.6.4.<br />
2.10.2.1 Datenstrukturen der Armerkennung<br />
Für die Umsetzung waren mehrere Datenstrukturen nötig, die von uns<br />
angelegt wurden.<br />
Datenstrukturen der Klasse Stereoscopy<br />
In der Klasse Stereoscopy wurden<br />
folgende zusätzliche Datenstrukturen angelegt, die für die Umsetzung<br />
nötig waren.<br />
struct TwoDVector {<br />
float x;<br />
float y;<br />
};<br />
Dieses Konstrukt repräsentiert einen zweidimensionalen Vektor<br />
struct CenterOfGravityList {<br />
std :: vector < TwoDVector > cogVectors ;<br />
};<br />
Eine Liste von zweidimensionalen Vektoren, die Schwerpunkte beinhaltet.<br />
struct DepthList {<br />
std :: vector < float > values ;<br />
};<br />
Dieses Datenmodel wird im Weiteren benutzt um Tiefeninformationen abzubilden.<br />
Datenstrukturen der Klasse AngleCalculation<br />
Für die Implementierung<br />
der Klasse AngleCalculation wurden zu den bereits vorhandenen Datenstrukturen<br />
weitere angelegt.<br />
struct ArmAngleSet {<br />
std :: vector < float > angles ;<br />
};<br />
Die Winkel der Armgelenke werden in dieser Liste gespeichert.<br />
297
Kapitel 2. Implementation 10. Oktober 2013<br />
struct ThreeDVector {<br />
float x;<br />
float y;<br />
float z;<br />
};<br />
Die Abbildung von dreidimensionalen Vektoren wird mittels dieser Struktur<br />
vorgenommen.<br />
struct Plane {<br />
ThreeDVector a;<br />
ThreeDVector n;<br />
};<br />
Für die Berechnung der Tiefe und der Winkel sind Ebenenmodelle nötig,<br />
welche mit dieser Datenstruktur abgebildet werden.<br />
2.10.2.2 Klassen der Armerkennung<br />
Die Funktionalität wurde in zwei Klassen umgesetzt. Die Eine stellt Methoden<br />
zur Berechnung der Winkel bereit und die Andere berechnet die<br />
Tiefenwerte.<br />
Klasse der Stereoscopy<br />
Die Klasse Stereoscopy beinhaltet folgende Funktionen:<br />
Stereoscopy :: Stereoscopy ()<br />
Leerer Konstruktor.<br />
float Stereoscopy :: calcHypothenuse ( float pixelX , float<br />
pixelY )<br />
Berechnung der Hypothenuse mit Hilfe des Satzes des Pythagoras, welche<br />
zwei 2D-Vektoren zu einem Dreieck ergänzt.<br />
float Stereoscopy :: calcDepthPoint ( TwoDVector left ,<br />
TwoDVector right )<br />
Berechnet die Tiefe eines Punktes mit Hilfe der stereoskopischen Tiefenformel<br />
anhand zweier Center-of-Gravities.<br />
DepthList Stereoscopy :: getAllDepths ( CenterOfGravityList<br />
cogListLeft , CenterOfGravityList cogListRight )<br />
298
Kapitel 2. Implementation 10. Oktober 2013<br />
Berechnet iterativ die Tiefe aller Schwerpunkte an Hand der Funktion calcDepthPoint.<br />
CenterOfGravityList Stereoscopy :: calcCogVectors (<br />
CenterOfGravityList coglist , DepthList depthlist )<br />
Berechnet anhand der Center-of-Gravity-Liste einer Kamera und der dazugehörigen<br />
Tiefenliste eine 3D-Vektorliste aller Schwerpunkte in Millimeter.<br />
Dabei werden die Pixelangaben für die Höhe und Breite anhand der Tiefeninformation<br />
in Millimeter umgerechnet.<br />
Klasse der Winkelberechnung<br />
folgende Funktionen:<br />
Die Klasse Winkelberechnung beinhaltet<br />
AngleCalculation :: AngleCalculation ()<br />
Konstrukter, Initialisierung der Zustandsvariablen.<br />
CenterOfGravityList AngleCalculation :: sortPoints (<br />
CenterOfGravityList cogList )<br />
Sortierung der Listen der Schwerpunkte der Armbinden in Y-Richtung.<br />
CenterOfGravityList AngleCalculation :: getSortedPose2DList (<br />
CenterOfGravityList cogList )<br />
Verfolgung der übergebenen Schwerpunkte anhand der minimalen Distanz<br />
zum Schwerpunkt des letzten Bildes.<br />
ArmAngleSet AngleCalculation :: calcAngles ( FloatList<br />
depthlist )<br />
Diese Funktion ermittelt Winkel mit Hilfe von trigonometrischen Berechnungen<br />
und 3D-Vektoren.<br />
VectorListContainer prepareVectors ( FloatList depthlist );<br />
Für die Berechnung der Winkel ist eine Vorverarbeitung der Vektoren nötig.<br />
Dies wird mit dieser Funktion, welche als Hilfsfunktion von der calcAngles<br />
aufgerufen wird.<br />
std :: vector < ThreeDVector > calcTriangleList ( std :: vector <<br />
ThreeDVector > linkVectors );<br />
299
Kapitel 2. Implementation 10. Oktober 2013<br />
Die Tiefeninformationen werden mittels Dreiecken berechnet, die aus den<br />
3D-Vektoren gebildet werden.<br />
ArmAngleSet AngleCalculation :: convertAngles ( ArmAngleSet<br />
angleList )<br />
Wenn mindestens drei Winkel berechnet wurden, also alle Winkel des Roboterarms<br />
vorhanden sind (der Drehwinkel darf fehlen), dann werden die berechneten<br />
Winkel auf die Servomotoren umgerechnet. Dies betrifft den letzten<br />
und vorletzten Winkel. Die Winkel werden übergeprüft anhand von minimalen<br />
und maximalen Werten.<br />
float AngleCalculation :: calcAngleFromTriangle ( ThreeDVector<br />
side )<br />
Berechnung eines Winkels anhand eines Dreiecks, mit Hilfe des Kosinussatzes.<br />
Der Parameter side beinhaltet die drei Seitenlängen des Dreiecks.<br />
float AngleCalculation :: scalarProduct ( ThreeDVector v1 ,<br />
ThreeDVector v2 )<br />
Berechnung des Skalarproduktes zweier Vektoren.<br />
ThreeDVector AngleCalculation :: crossProduct ( ThreeDVector v1<br />
, ThreeDVector v2 )<br />
Berechnung des Kreuzproduktes anhand zweier Vektoren.<br />
Plane AngleCalculation :: deriveHyperPlaneNormalForm (<br />
ThreeDVector linkPosition , ThreeDVector a , ThreeDVector<br />
b)<br />
Berechnet eine Ebene im Raum und gibt diese in der Normalform zurück,<br />
welche den Normalenvektor und einen Stützvektor der Ebene beinhaltet.<br />
char AngleCalculation :: decideSide ( Plane plane , ThreeDVector<br />
x)<br />
Berechnet auf welcher Seite der Ebene der jeweilige Punkt x liegt. Diese<br />
Funktion ist notwendig, um sicherzustellen, dass alle Winkel von der selben<br />
Drehrichtung aus bestimmt werden. Ohne diese Funktion würde immer<br />
der kleinere Winkel (unter 180 Grad) berechnet werden. Ein Winkel<br />
über 180 Grad, der am Arm anliegt würde also seine Größe ändern (360<br />
Grad minus dem Winkel). Dies wird durch oben aufgeführte Funktionen<br />
300
Kapitel 2. Implementation 10. Oktober 2013<br />
verhindert bzw. herausgerechnet. Neben den Werten 0 und 1 (Punkt befindet<br />
sich rechts bzw. links von der Ebene) ist lediglich der Rückgabewert -1<br />
(Punkt liegt in der Ebene) valide.<br />
2.10.2.3 Dateistruktur<br />
Im Zuge dieses Arbeitspaketes wurden folgende Dateien angelegt.<br />
• microblazecode/camera/src/main.cc: Programmcode, der die erstellten<br />
Klassen funktional testet.<br />
• microblazecode/camera/src/Stereoscopy.h: C++ Header Datei der Tiefenerkennung.<br />
• microblazecode/camera/src/Stereoscopy.cpp: C++ Datei mit der Implementation<br />
der Tiefenerkennung.<br />
• microblazecode/camera/src/AngleCalculation.h: C++ Header Datei<br />
der Winkelberechnung.<br />
• microblazecode/camera/src/AngleCalculation.cpp: C++ Datei mit der<br />
Implementation der Winkelberechnung.<br />
• microblazecode/camera/src/lscript.ld: Anpassung der Heap- und Stackgröße<br />
301
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10.3 Aufbau der dreidimensionalen<br />
Bildverarbeitungskette<br />
Dieses Arbeitspaket sieht den Aufbau einer Bildverarbeitungskette vor,<br />
welche auf dem FGPA umgesetzt wird und zwei Bilddatenströme verarbeitet.<br />
Dieser Aufbau soll die Daten von der VModCam entgegennehmen.<br />
Der dafür nötige Aufbau wird aus dem Abschnitt 2.2.2 Ansteuerung der<br />
VModCam genutzt. Ebenso wurde die Bildverarbeitungskette aus dem Kapitel<br />
2.6.4 Hardware Umsetzung der Bewegungserkennung verwendet.<br />
2.10.3.1 Bildgröÿen Anpassung<br />
In der Bildverarbeitungskette werden Bilder von der Kamera verarbeitet,<br />
welche in der Breite 1600 Pixel und in der Höhe 1200 Pixel groß sind.<br />
Für die Objekterkennung reichen jedoch Bilder mit der Dimension von 800<br />
Pixel in der Höhe und 600 Pixel in der Breite in ihrer Genauigkeit aus,<br />
was bereits bei der Erstellung der Bildverarbeitungskette für die zweidimensionalen<br />
Armerkennung erkannt wurde. In dem Arbeitsabschnitt 2.6.4<br />
Hardware Umsetzung von Algorithmen wurde bereits mit kleineren Bildern<br />
gearbeitet und das Ergebnis der Armerkennung war für die gestellten Anforderungen<br />
ausreichend.<br />
1600 pixel<br />
800 pixel<br />
1200 pixel<br />
600 pixel<br />
Abbildung 2.127: Funktionsweise des pixelSkipping IP-Cores<br />
Durch das Beschränken auf kleinere Bilder für die Objekterkennung werden<br />
Ressourcen auf den FPGA eingespart, da weniger Information gespeichert<br />
werden müssen und somit die Speicher selber kleiner dimensioniert<br />
werden können.<br />
302
Kapitel 2. Implementation 10. Oktober 2013<br />
Für diesen Zweck wurde der pixelSkipping IP-Core erstellt. Dieser Verarbeitet<br />
einen Bildstrom, so dass dieser anschließend nur noch die halbe<br />
Höhe und die halbe Breite besitzt. Das wird erreicht in dem jedes zweite<br />
einkommende Pixel ignoriert wird und ebenfalls jede zweite Zeile. Beispielhaft<br />
ist das Vorgehen in der Abbildung 2.127 dargestellt. Es werden die<br />
dunkel markierten Zeilen und Spalten verworfen.<br />
Der entworfene IP-Core arbeitet auf Bildströmen mit variabler Datenbreit.<br />
Diese kann mittels des Generics mode gesetzt werden, dabei stehen folgende<br />
Datenbreiten zur Verfügung.<br />
• 1 Bit für Schwarzweißbilder<br />
• 8 Bit für Graubilder<br />
• 16 Bit für Farbbilder mit RGB555<br />
• 24 Bit für Farbbilder mit RGB888<br />
Das Blockschaltbild für den entwickelten IP-Core ist in folgender Abbildung<br />
2.128 zu sehen.<br />
pixel_clock<br />
framevalid_in<br />
linevalid_in<br />
datavalid_in<br />
data_in [mode]<br />
pixelSkipping_v1_00_a<br />
framevalid_out<br />
linevalid_out<br />
datavalid_out<br />
data_out [mode]<br />
Abbildung 2.128: Blockschaltbild des pixelSkipping IP-Cores<br />
2.10.3.2 Dreidimensionale Hardware Bildverarbeitungskette<br />
Die resultierende Bildverarbeitungskette, umgesetzt auf dem FPGA, ist<br />
schematisch in der Abbildung 2.129 dargestellt. Dabei ist zu sehen, dass der<br />
von uns für diesen Arbeitsschritt entwickelte IP-Core nach dem Schwellenwert<br />
IP-Core und vor dem Objekterkennungs IP-Core eingesetzt wird. Der<br />
Microblaze verarbeitet dann im weiteren die Information über Lage und<br />
Position der erkannten Objekte.<br />
303
Kapitel 2. Implementation 10. Oktober 2013<br />
simple_i2c<br />
cam_bootloader<br />
simple_i2c<br />
VmodCamA<br />
VmodCamB<br />
cam_data<br />
cam_data<br />
cam_deserialzer<br />
cam_deserialzer<br />
busConverterToRGB888<br />
busConverterToRGB888<br />
rgb2grey<br />
rgb2grey<br />
schwellwertfilter<br />
schwellwertfilter<br />
pixelSkipping<br />
pixelSkipping<br />
blob_detection<br />
blob_detection<br />
Interruptcontroller<br />
Microblaze Microcontroller<br />
Abbildung 2.129: Bildverarbeitungskette für zwei Kamerabildströme<br />
2.10.3.3 Dateistruktur<br />
Für die Umsetzung dieses Arbeitspaketes wurden folgende Dateien angelegt.<br />
• ip-cores/pcores/pixelSkipping_v1_00_a/hdl/vhdl/pixelSkipping.vhd:<br />
Bildverkleinerungs-IP-Core.<br />
• ip-cores/pcores/pixelSkipping_v1_00_a/hdl/vhdl/simulation/<br />
pixelSkipping_tb.vhd: Testbench für den erstellten Bildverkleinerungs-<br />
IP-Core.<br />
304
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10.4 Spezikation eines neuen Roboterarms<br />
In diesem Teil des Arbeitspakets soll die Spezifikation für einen neuen<br />
Roboterarm erarbeitet werden.<br />
Der Beweggrund für dieses Arbeitspaket ist der durch den vorhandenen<br />
Roboterarm stark eingeschränkte Arbeitsbereich, sodass der aktuelle Aufbau<br />
weitestgehend unbrauchbar für eine Pick & Place Operation ist. Ziel<br />
ist es einen Roboterarm zu spezifizieren, mit dem das System in der Lage<br />
ist, Figuren auf einem Schachbrett Kachel genau zu verstellen. Im Verlauf<br />
des Pakets werden daher mit Blick auf die Schwachstellen des aktuellen<br />
Roboterarms Änderungen sowie Verbesserungsvorschläge angegeben.<br />
Dafür werden in den ersten Abschnitten die nötigen Grundlagen zum Bau<br />
eines Roboterarms behandelt und im Anschluss auf eine konkrete Spezifikation<br />
hingearbeitet.<br />
Auf Basis der gesammelten Daten werden daraufhin mögliche neue Ansätze<br />
entwickelt und zuletzt die Spezifikation erstellt, welche ebenfalls der<br />
Entscheidung über die Umsetzung der Folgepakete dient.<br />
2.10.4.1 Schwachstellen der aktuellen Konguration<br />
Neben dem eingeschränkten Arbeitsbereich wurden noch weitere Schwachstellen<br />
ermittelt, welche die instabile Konstruktion und starke Ungenauigkeit<br />
des Roboterarms verursachen. Diese Schwachstellen sollen daher bei der<br />
Spezifikation eines neuen Roboterarms mit einbezogen werden.<br />
• Die Teilarme besitzen an vielen Stellen nicht den gewünschten Winkel<br />
von 90 Grad.<br />
• Es entsteht großes Spiel dadurch, dass das Gegenlager eines Teilarms<br />
einfach in das dünne Kunstoffgehäuse des Servos geschraubt ist, welches<br />
ebenfalls zu einer niedrigen Wiederholgenauigkeit führt.<br />
• Da jeder Servo eine eigene Leitung bis zum Hauptcontroller besitzt,<br />
entsteht eine unstrukturierte Verkabelung.<br />
• Der Greifer besitzt mehrere mm Spiel in alle Richtungen.<br />
• Es existiert keine Datenrückmeldung vom Servo des Greifers, sodass<br />
ein Objekt oder ein Servo im Greifprozess beschädigt werden könnte.<br />
305
Kapitel 2. Implementation 10. Oktober 2013<br />
• Der aktuelle kinematische Aufbau erschwert die Berechnung der Rückwärtskinematik.<br />
Aus diesem Grund wurde statt einer algebraischen<br />
eine alternative geometrische Lösung entwickelt. Diese bringt jedoch<br />
eine hohe Komplexität für die Umsetzung auf dem FPGA mit sich.<br />
Die Portierung der vorhandenen geometrischen Lösung ist daher wesentlich<br />
fehleranfälliger als eine Umsetzung der Rückwärtskinematik durch<br />
einen klassischen algebraischen Ansatz.<br />
2.10.4.2 State of the Art<br />
In diesem Unterabschnitt werden kurz einige Roboterarmkonfigurationen<br />
aus den ersten Recherchen vorgestellt, die in Bezug auf eine Pick & Place<br />
Anwendung interessant sind.<br />
Kuka<br />
Bei einem Kuka 37 , dargestellt in Abbildung 2.133, handelt es sich um einen<br />
Roboterarm mit sechs Freiheitsgraden 38 . Die Konfiguration der Gelenke ist<br />
bei diesem Roboter so gewählt, dass maximal zwei parallel aufeinanderfolgende<br />
Gelenkachsen vorhanden sind.<br />
Puma<br />
Der Aufbau des in Abbildung 2.131 Puma 39 Manipulators ähnelt dem des<br />
’Kuka’ und wird ebenso in der Industrie eingesetzt. Dieser besitzt ebenso<br />
sechs Freiheitsgrade und maximal zwei aufeinanderfolgende parallelen<br />
Drehgelenke.<br />
Anmerkung: Die starren Glieder der genannten Manipulatoren sind in der<br />
Regel wesentlich größer als die länge der Greiferkonstruktion.<br />
Die Wahl der Größen der Verbindungsstücke bezüglich des Greifers deutet<br />
auf die Optimierung des Arbeitsbereichs des Manipulators hin. Die Anordnung<br />
der parallelen Drehgelenke des Roboters vereinfachen im Regelfall<br />
die Berechnung einer Rückwärtskinematik.<br />
37 Quelle: OpenRave Model<br />
38 entspricht einem freien Objekt im Raum<br />
Quelle: http://curiosityintheclassroom.com/media/pdf/<br />
Calculating-Degrees-of-Freedom_HS.pdf<br />
39 Quelle: OpenRave Model<br />
306
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.130: Modell des Industrieroboterarms KUKA KR5<br />
Quelle: OpenRave Model<br />
Abbildung 2.131: Modell des Industrieroboterarms Puma<br />
307
Kapitel 2. Implementation 10. Oktober 2013<br />
Scara<br />
Der Manipulator von SCARA 40 ist ein kinematisch sehr einfach aufgebauter<br />
Roboter und eignet sich besonders für Pick & Place Anwendungen.<br />
Dieser Besitzt zwei parallelen Rotationsgelenke und ein lineares Gelenk.<br />
Abbildung 2.132 zeigt einen solchen Roboter.<br />
Abbildung 2.132: Pick & Place Roboter der Fa. SCARA<br />
Die Einfachheit dieses Roboters ist nicht nur durch Kinematik, sondern<br />
auch durch die Belastung der Motoren gegeben. Da die Rotationsachsen<br />
der Motoren parallel zur Gewichtskraft angeordnet sind, entsteht, bis auf<br />
die Zentrifugalkraft, keine zusätzliche Last beim Bewegen des Armes aus<br />
der Ruhelage.<br />
Oomlout Thingiverse Hobby Arm<br />
Ein Hobby Roboterarm der Manipulator von Thingiverse 41 mit vier Freiheitsgraden.<br />
Dieser besitzt im Gegenteil zu den vorgestellten Industrierobotern<br />
drei parallele Gelenkachsen.<br />
Eine solche Achsenparallelität erschwert in den meisten Fällen die Entwicklung<br />
einer kinematischen Rückwärtsrechnung und ist daher sehr rechenaufwendig<br />
und ggf. ohne einen geometrischen Ansatz gar nicht lösbar. Diese Probleme<br />
des aktuellen Roboterarms in Bezug auf die Kinematik wurden bereits in<br />
Sprint 2 im Abschnitt 2.2.3 beschrieben.<br />
40 Quelle: http://img.directindustry.de/images_di/photo-g/scara-roboter-12225-<br />
2810261.jpg<br />
41 Thingiverse: http://www.thingiverse.com/thing:387<br />
308
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.133: Modell des Hobby Roboterarms Oomlout Thingiverse<br />
2.10.4.3 Anforderungen<br />
Im Folgenden werden die funktionalen und nicht-funktionalen Anforderungen<br />
erhoben. Diese setzen sich aus den bereits im Lastenheft festgelegten<br />
Anforderungen sowie den ermittelten Schwachstellen zusammen. Weiter<br />
muss der festgelegte Pick & Place Demonstrator, die Bewegung einer<br />
Schachfigur auf einem Schachbrett, berücksichtigt werden.<br />
Funktional<br />
Im Folgenden sind die Eigenschaften aufgelistet, welche der Roboterarm<br />
besitzen muss.<br />
F1 Der Roboterarm muss mit einem Greifer als TCP ausgestattet sein.<br />
F2 Der Roboterarm muss eine Standard-Schachfigur 42 heben und ablegen<br />
können.<br />
F3 Die Wiederholgenauigkeit muss ausreichen, um die Figuren kachelgenau<br />
zu positionieren.<br />
F4 Der Greifer muss über eine Datenrückleitung für den aktuellen Stromverbrauch<br />
verfügen.<br />
42 Die maximalen Größe und Gewicht der Schachfigur wird im Weiteren definiert<br />
309
Kapitel 2. Implementation 10. Oktober 2013<br />
Nicht-Funktional<br />
Folgender Abschnitt definiert die Rahmenbedingungen der oben beschriebenen<br />
Eigenschaften.<br />
• Benutzbarkeit<br />
NF 1.1 Die Plattform des Roboterarms muss an einer senkrechten,<br />
stationären Befestigung fixiert werden können. Durch diese Befestigung<br />
ist der Roboterarm um 90 Grad in die Waagerechte<br />
gedreht.<br />
NF 1.2 Es existieren nicht mehr als zwei parallele Achsen der hintereinander<br />
folgenden Gelenke.<br />
NF 1.3 Objekte werden nur von Oben gegriffen und abgesetzt.<br />
• Effizienz<br />
NF 1.2 Der Roboterarm muss Objekte mit einem Gewicht von mindestens<br />
50g tragen können.<br />
NF 1.3 Der Roboterarm muss ein Objekt mit einer Mindestgröße von<br />
5mm ∗ 5mm ∗ 5mm und einer Maximalgröße von 95mm ∗ 40mm ∗<br />
40mm greifen können.<br />
NF 1.4 Der Roboterarm muss einen Arbeitsbereich besitzen, der mindestens<br />
die durchgehende Fläche eines Schachfelds von 46, 4cm ∗<br />
46, 4cm abdeckt 43 .<br />
NF 1.5 Der Roboterarm muss in der Lage sein, eine Figur zu versetzen,<br />
ohne dabei die Position anderer Figuren zu verändern.<br />
sowie die Schachfiguren über den anderen darauf stehenden Figuren<br />
auf einen Sicheren Abstand hochheben kann. Der Sichere<br />
Abstand ist der, bei dem durch das Verschieben der Schachfigur<br />
keine auf dem Brett stehenden Figuren getroffen werden.<br />
NF 1.6 In Verbindung mit dem Gesamtsystem darf eine Latenz von<br />
500ms nicht überschritten werden.<br />
NF 1.7 Es existieren nicht mehr als zwei parallele Achsen der hintereinander<br />
folgenden Gelenke.<br />
• Änderbarkeit<br />
NF 1.8 Der Greifer des Roboterarms muss austauschbar sein.<br />
43 Quelle: http://de.wikipedia.org/wiki/Schachbrett - Material der Schachbundesliga<br />
310
Kapitel 2. Implementation 10. Oktober 2013<br />
80°<br />
0°<br />
180°<br />
0°<br />
0°<br />
180°<br />
0°<br />
180°<br />
0°<br />
x<br />
180°<br />
NF 1.9 Die Servos müssen durch alternative Motoren mit den selben<br />
Abmessungen austauschbar sein. Hierzu muss jedoch eventuell<br />
die Regelungselektronik entsprechend angepasst werden.<br />
2.10.4.4 Erarbeitung der Grundlagen<br />
G5<br />
l<br />
G 5<br />
5 G 4<br />
In diesem Abschnitt sollen die bei der Spezifikation eines Roboterarms<br />
wichtigen Teilgebiete analysiert werden. Auf der geschaffenen<br />
w<br />
Basis werden<br />
daraufhin 0° mögliche Lösungen entwickelt. w 3<br />
6<br />
4 w w 5 w G4<br />
w G3<br />
180°<br />
Arbeitsbereich<br />
l G<br />
l 6<br />
l7<br />
G<br />
w<br />
6 w G6<br />
7<br />
G<br />
Im Folgenden werden die Kriterien an den Arbeitsbereich festgelegt.<br />
Der Arbeitsbereich des aktuellen Roboterarms, beschrieben in 2.35, deckt<br />
die Fläche des in den Anforderungen festgelegten Schachbretts nicht ab.<br />
Aus diesem Grund muss der neue Roboterarm einen größeren Arbeitsbereich<br />
besitzen, so dass in der horizontalen Ebene die komplette Fläche<br />
eines Schachbretts umschlossen werden kann.<br />
w G5<br />
l 4<br />
G 3<br />
l 3<br />
w 2<br />
w G1<br />
w 1<br />
w G2<br />
G 2<br />
G3<br />
l 1<br />
l 2<br />
G 1<br />
l B<br />
+10%<br />
y<br />
x<br />
Abbildung 2.134: Schachbrett der Standard-Größe innerhalb des Arbeitsbereiches<br />
Die grün gestrichelten Kurven in Abbildung 2.134 zeigen die minimale<br />
äußere und innere Grenze des benötigten horizontalen Arbeitsbereichs.<br />
Dabei muss bei der Berechnung der minimalen Gesamt-Armlänge auch<br />
der Abstand vom Sockel bis zum Schachbrett (x) beachtet werden.<br />
311
Kapitel 2. Implementation 10. Oktober 2013<br />
Aus der Größe des Schachbretts sowie einem Erreichbarkeitspuffer von<br />
10% kann daraufhin die benötigte Gesamt-Armlänge berechnet werden.<br />
Diese Länge wird verwendet, um im späteren Verlauf die Maße der starren<br />
Glieder des Roboterarms sowie die Drehmomente der einzusetzenden<br />
Servos ermitteln zu können.<br />
Abbildung 2.135 zeigt beispielhaft den resultierenden horizontalen Arbeitsbereich<br />
bei einer an den Kuka Roboter 2.133 angelehnten Gelenkkonfiguration.<br />
Abbildung 2.135: Arbeitsbereich des Roboterarms<br />
Kinematischer Aufbau<br />
Die aktuell eingesetzte Kinematik basiert auf dem zu Anfang des Projektes<br />
zur Verfügung gestellten Roboterarm RA1-PRO der Fa. Arexx. Dieser<br />
besitzt sechs starre Verbindungsstücke, fünf Gelenke sowie sechs Servos.<br />
Aus der Gelenkkonfiguration resultieren fünf Freiheitsgrade. Aufgrund der<br />
kurzen Teilarme ist der Roboterarm in der Erreichbarkeit von Punkten im<br />
Raum trotzdem sehr eingeschränkt: Der Arbeitsbereich ist mehrere Ordnungen<br />
kleiner, als für den o.g. Anwendungsfall benötigt ist. Die Verdrehung<br />
des Greifers bezüglich des Weltkoordinatensystems ist nur um<br />
eine Achse möglich, die parallel zum zweiten und dritten Gelenk verläuft.<br />
Die aktuelle Rückwärtskinematik basiert auf dem speziell für die vorhandene<br />
Gelenkkonfiguration entwickelten geometrischen Modell. Diese berück-<br />
312
Kapitel 2. Implementation 10. Oktober 2013<br />
sichtigt dabei nicht die Pose des Greifers, so dass ein Punkt im Arbeitsbereich<br />
erreicht wird, ohne dabei die Ausrichtung des Greifers bezüglich des<br />
Weltkoordinatensystems gezielt angeben zu können. Die Ausrichtung wird<br />
durch die aktuelle Rückwärtskinematik je nach der Lage des Punktes im<br />
Arbeitsbereich bestimmt.<br />
Abbildung 2.136: Arbeitsbereich des Roboterarms<br />
Aus diesem Grund ist die aktuelle Kinematik nicht für den Anwendungsfall<br />
„Schachfiguren auf dem Schachbrett bewegen“ geeignet, da das nötige<br />
Greifen von oben nicht möglich ist. Daher kann der in Abbildung 2.136<br />
dargestellte Fall auftreten und nicht beteiligte Schachfiguren können während<br />
eines Greifvorgangs umgekippt werden.<br />
Für die Spezifikation ergeben sich bzgl. der Rückwärtskinematik zwei Möglichkeiten.<br />
Beibehalten der aktuellen Kinematik<br />
In diesem Fall wird die vorhandene Kinematik weiterverwendet. Dies schließt<br />
jedoch jede Änderung von möglichen Gelenkkonfigurationen des Roboterarms<br />
aus. Es wäre jedoch weiterhin möglich die Verbindungsstücke zu verlängern,<br />
um einen größeren Arbeitsbereich zu erzielen. In diesem Fall muss<br />
die Rückwärtskinematik angepasst werden, damit der Roboter die Objekte<br />
von oben greifen kann. Somit müsste ein neuer Roboter gebaut werden.<br />
Wird der aktuelle Roboterarm beibehalten und die Rückwärtskinematik<br />
nicht angepasst, ist das Greifen der Figuren nur bedingt möglich, da die in<br />
der Nähe stehenden Schachfiguren leicht getroffen werden.<br />
313
Kapitel 2. Implementation 10. Oktober 2013<br />
Entwicklung einer neuen Kinematik<br />
Die zweite Möglichkeit lässt Freiraum für individuelle Gelenkkkonfigurationen,<br />
würde jedoch auch als Folgearbeitspaket die Entwicklung einer<br />
gänzlich neuen Vor- sowie Rückwärtskinematik nach sich ziehen. Aufgrund<br />
des Freiraums ist es aber auch möglich, eine Konfiguration zu wählen,<br />
sodass eine analytische bzw. numerische Lösung bei der Entwicklung einer<br />
Kinematik angesetzt werden kann. Diese sind gemeinhin einfacher zu<br />
ermitteln als eine spezialisierte geometrische Lösung.<br />
Aktorik<br />
Da seit Beginn der Projektgruppe bereits mehrere Servos aufgrund eines<br />
Defekts ausgetauscht werden mussten und der mitgelieferte Greiferaufbau<br />
starke Ungenauigkeiten mit sich bringt, werden in diesem Kapitel Anforderungen<br />
an die Aktorik gestellt und ggf. bereits Alternativen vorgestellt.<br />
Servos<br />
Da die Servos des Roboterarms einen entscheidenden Punkt zur Stabilität,<br />
Genauigkeit und Traglast beitragen, werden in diesem Kapitel Anforderungen<br />
sowie die Grundlagen zur Berechnung der nötigen Drehmomente behandelt.<br />
Anforderungen<br />
In diesem Abschnitt werden die ermittelten Anforderungen an die zu nutzenden<br />
Servos aufgeführt.<br />
• Um eine höhere Stabilität zu erreichen sollen die Servos mit der höchsten<br />
Belastung an beiden Seiten des Servos mit einer Befestigungsmöglichkeit<br />
ausgestattet sein.<br />
• Die genutzten Servos sollten mit den gleichen Spannungen arbeiten.<br />
• Die genutzten Servos sollen mindestens einen Betriebsbereich von 180<br />
Grad besitzen.<br />
• Das Drehmoment der Servos muss ausreichen, um einen Roboterarm<br />
zu konstruieren, welcher im definierten Arbeitsbereich operieren<br />
kann.<br />
314
Kapitel 2. Implementation 10. Oktober 2013<br />
• Die Genauigkeit der Servos muss ausreichen, um die in den Anforderungen<br />
an den Roboteram beschriebene Wiederholgenauigkeit<br />
erreichen zu können.<br />
• Die Geschwindigkeit der Servos muss ausreichen, um die in den Anforderungen<br />
beschriebene Latenzzeit einhalten zu können.<br />
• Aufgrund der höheren Stellkraft und Stellgenauigkeit, im Vergleich<br />
zur analogen Variante, werden digitale Servos verwendet.<br />
Anmerkung: Auf dem Markt existieren einige Servotypen, die eine serielle<br />
Datenrückführung besitzen. Bei Verwendung eines solchen Servo-<br />
Typs könnte die im Anschluss an dieses Arbeitspaket geplante Entwicklung<br />
einer Platine zur Strommessung entfallen. Jedoch würde stattdessen<br />
die Implementierung eines IP-Cores zur seriellen Kommunikation nötig.<br />
Berechnung der Traglasten für die Servos<br />
Nach der Festlegung der Längen der Verbindungsstücke sowie der Anordnung<br />
der Gelenke und des maximal zu hebenden Objektgewichts, w 3<br />
istG eine<br />
3<br />
passende Servoauswahl nötig. Der Rechenweg, um das nötige w 4<br />
Drehmoment<br />
zu ermitteln wird daher im Folgenden<br />
w 2<br />
erläutert.<br />
l<br />
M<br />
l 2<br />
l 1<br />
w 1<br />
G 2<br />
G 1<br />
M<br />
l<br />
Abbildung 2.137: Drehmoment (M)<br />
F<br />
F<br />
Das Drehmoment ist definiert als Produkt der Länge des Hebels und der<br />
momentan auf diesen Hebel wirkenden Punktkraft in einem Kreis mit dem<br />
Radius der Länge des Hebels. In Abbildung 2.137 ist die Wirkungsrichtung<br />
der Kraft und des Drehmoments veranschaulicht.<br />
Aus der Gleichung des Drehmoments<br />
M = ⃗ F · l (2.16)<br />
315
Kapitel 2. Implementation 10. Oktober 2013<br />
folgt, dass das benötigte Drehmoment einerseits von der Länge des Teilarms<br />
sowie von dessen und dem sich am Armende befindlichen Gewicht abhängt.<br />
Die allgemeine Berechnung des Drehmoments für einen Servo in<br />
einer kinematischen Kette ist definiert als Summe aller Drehmomente, die<br />
sich aus den Gewichten der jeweiligen Punkte und ihrer Entfernung vom<br />
tragenden Servo zusammensetzen.<br />
In Abbildung 2.138 ist beispielhaft die Formel für einen Teilarm vorgestellt.<br />
Das benötigte Drehmoment eines Servos in der kinematischen Kette ist<br />
l 2<br />
l 1<br />
w 3<br />
G 3<br />
w 1<br />
F<br />
w 4<br />
w 2<br />
G 2<br />
G 1<br />
Abbildung 2.138: Berechnung des Drehmomentes für den Servomotor G 2<br />
beispielhaft wie folgt gegeben:<br />
M = w 1 · l1<br />
2 + l 1 · w 2 + (l 1 + l 2<br />
2 ) · w 3 + (l 1 + l 2 ) · w 4 (2.17)<br />
Die Gleichung 2.17 zeigt die sequentielle Addition der Produkte von Länge<br />
und Gewicht des Punktes. Wobei w 1 und w 3 jeweils die Gewichte der<br />
Verbindungsstücke mit den Längen l 1 und l 2 sind. w 2 und w 4 stellen die<br />
Gewichte des Gelenks G 3 und des Endeffektors dar. Um den Gesamtmittelpunkt<br />
eine Verbindungsstücks anzunehmen, werden die Gewichte der<br />
Verbindungsstücke halbiert. Liegt der Gewichtsmittelpunkt nicht in der<br />
Mitte des Verbindungsstücks, so ist er zu bestimmen und anhand dessen<br />
die Entfernung des Gewichtsmittelpunktes zur Drehachse des Servos zu<br />
berechnen. Die Gewichte von Servos, Endeffektor und der Teilarme sind<br />
nicht direkt in die Gleichung 2.16 einsetzbar. Daher wird für w i angenommen,<br />
dass w i eine Schwerkraft besitzt, die sich aus dem Produkt der Masse<br />
m i des jeweiligen Punktes und der Gravitationskonstante von 9, 81m/s 2<br />
bestimmen lässt.<br />
316
Kapitel 2. Implementation 10. Oktober 2013<br />
Servo-Überblick<br />
Die exakte Auswahl der Servos kann erst nach der Berechnung der benötigten<br />
Drehmomente für einen neuen Roboterarm erfolgen. In diesem Abschnitt<br />
wird daher ein kurzer Überblick über einige, im Bereich der Robotik genutzte,<br />
Servotypen gegeben. Diese sollen als Alternative zu den aktuell genutzten<br />
Servos in Tabelle 2.8 in Frage kommen.<br />
Benötigt werden Servos für die folgenden Bestandteile:<br />
• Servo für die Basis<br />
• Servos für Verbindungsstücke (möglichst mit bereits vorhandenem<br />
zweitem Lager auf der Servorückseite)<br />
• Servo für Greifer (möglichst mit Datenrückkanal)<br />
Hersteller von Servos für den Robotik Bereich sind unter Anderem die Fa.<br />
Hitec, Futaba oder auch Dynamixel. Im Folgenden Unterabschnitt erfolgt<br />
eine kurze Vorstellung der in Abbildung 2.139 dagrestellten Servos.<br />
Zur Vergleichbarkeit werden im Folgenden die wichtigsten Daten der aktuellen<br />
Servos aufgeführt. Beide Servos basieren dabei auf einem Metallgetriebe.<br />
Abbildung 2.139(a) zeigt den Stärkeren der beiden sich aktuell im<br />
Einsatz befindlichen Servos.<br />
44 45<br />
Typ Größe Gewicht 4.8 6V<br />
- mm gramm sek/60 ° kg-cm sek/60 ° kg-cm<br />
S05NF 28.8*13.8*30.2 20 0.20 2.8 0.18 3.2<br />
S06NF 40.4*20*37.6 56 0.18 13 0.16 13.5<br />
Tabelle 2.8: Servospezifikationen der Fa. Dago Metall<br />
• HSR-8498HB 46<br />
Abbildung 2.139(b) zeigt einen Servo der Fa. Hitec. Dieser besitzt ein Karbongetriebe<br />
und wird mit einer 2-seitigen Montagemöglichkeit geliefert.<br />
Der Betriebswinkel beträgt 0 - 180 Grad.<br />
44 S05NF: http://www.robotshop.com/s05nf-std-servo-motor-2.html<br />
45 S06NF: http://www.robotshop.com/s06nf-std-servo-motor-2.html<br />
46 Quelle: http://www.hitecrc.de/store/product.php?productid=21377&cat=312&page=1<br />
317
Kapitel 2. Implementation 10. Oktober 2013<br />
(a) S06NF<br />
(b) HSR-8489HB<br />
(c) AX-12A<br />
Abbildung 2.139: Servo-Überblick<br />
• HSR-5498SG 47<br />
Bei diesem Servo handelt es sich um eine stärkere Variante des HSR-8498SG<br />
Modells. Sie besitzt ein Metallgetriebe, 2-seitige Montagemöglichkeit und<br />
einen Betriebswinkel von 0 - 180 Grad.<br />
Beide Servos verfügen über eine Datenrückführung welche Strom, Spannung<br />
und Position beinhaltet. Eingesetzt wird dabei das serielle HITEC<br />
Multi-protocol interface (HMI). Tabelle 2.9 zeigt die Spezifikation beider<br />
Servos.<br />
Die Servos der der Fa. Dynamixel bieten ebenfalls eine Datenrückführung,<br />
besitzen jedoch mit Ausnahme der AX-Serie in der Regel ein sehr hohes<br />
Drehmoment und einen daraus resultierenden sehr hohen Stromverbrauch.<br />
Benötigt werden dabei Spannungen von um die 10V. Interessant ist die<br />
Möglichkeit der Serienschaltung dieser Servos. Somit muss vom Hauptcontroller<br />
lediglich ein Kabel zu einem im Netz vorhandenen Servo gelegt<br />
werden. Diese können daraufhin durch feste IDs über ein serielles Protokoll<br />
47 Quelle: http://www.hitecrc.de/store/product.php?productid=21392&cat=312&page=1<br />
318
Kapitel 2. Implementation 10. Oktober 2013<br />
Typ Größe Gewicht 6V 7.4V<br />
- mm gramm sek/60 ° kg-cm sek/60 ° kg-cm<br />
HSR-8498HB 40*20*47 55 0.2 7.4 0.18 9.0<br />
HSR-5498SG 40*20*37 59.8 0.22 11 0.19 13.5<br />
Tabelle 2.9: Servospezifikationen der Fa. Hitec<br />
angesteuert und ausgelesen werden. Weiterhin verfügen die Modelle über<br />
einen Betriebswinkel von 0 - 300 Grad.<br />
• AX-12A 48<br />
Dieser Servo, dargestellt in 2.139(c) besitzt ein vergleichsweise hohes Drehmoment,<br />
jedoch eine geringe Stellgeschwindigkeit gegenüber den Anderen<br />
hier aufgeführten Servotypen. In Tabelle 2.10 ist Spezifikation des Servos<br />
aufgeführt.<br />
Typ Größe Gewicht 12V<br />
- mm gramm sek/60 ° kg-cm<br />
AX-12A 32*50*40 54.6 0.08 15.29<br />
Tabelle 2.10: Servospezifikationen der Fa. Hitec<br />
Greifer<br />
In diesem Abschnitt werden die Anforderungen an den Greifer als Tool<br />
Center Point (TCP) gestellt und mögliche Greifertypen ermittelt.<br />
Anforderungen<br />
Der einzusetzende Greifer muss folgenden Anforderungen genügen.<br />
• Der Greifer muss in der Lage sein, jeden Schachfigur-Typ zu greifen.<br />
• Die maximale Breite des geöffneten Greifers soll die Länge der Diagonale<br />
einer Kachel nicht überschreiten.<br />
48 Quelle: http://www.robotis.com/xe/dynamixel_en<br />
319
Kapitel 2. Implementation 10. Oktober 2013<br />
• Der Greiferaufbau muss schmal genug sein, um eine einzelne Figur<br />
greifen und ablegen zu können. So wird das Treffen einer nebenstehenden<br />
Figur vermieden.<br />
• Das Greifen erfolgt über Kraftschluss.<br />
• Wenn nötig kann die Greifertechnik um Formschluss erweitert werden.<br />
320
Kapitel 2. Implementation 10. Oktober 2013<br />
Greifer-Überblick<br />
Da der gewählte Pick & Place Demonstrator keine hohe Komplexität an<br />
das Greiferdesign stellt, werden in diesem Abschnitt einige einfache Umsetzungen<br />
aufgeführt.<br />
(a) Gripper for Micro Robot Arm<br />
(b) Mini servo gripper Plate<br />
(c) Gripper for Multirotor<br />
Abbildung 2.140: Greifervarianten - Quelle: http://www.thingiverse.com<br />
Alle in Abbildung 2.140 dargestellten Greifervarianten 49 besitzen einen einfachen<br />
Aufbau und benötigen einen Servo zum Öffnen bzw. Schließen.<br />
Der erste Greifer 2.149(a) ist sehr einfach aufgebaut und weiterhin gut um<br />
Formschluss oder Kraftsensorik erweiterbar. Abbildung 2.149(b) stellt den<br />
Aufbau des aktuell eingesetzten Greifers dar. In 2.140(c) wird ein weiterer<br />
Greifertyp vorgestellt, der jedoch in Bezug auf den Anwendunsfall bereits<br />
ausgeschlossen werden kann, da das Greifen einer einzelnen Schachfigur<br />
schwieriger zu realisieren ist als mit den vorherigen vorgestelleten Greifern.<br />
49 Quelle: http://www.thingiverse.com/<br />
321
Kapitel 2. Implementation 10. Oktober 2013<br />
Sensorik<br />
Die am Roboterarm geplante Sensorik betrifft in erster Linie eine Rückführung<br />
des Greiferzustands, um zu ermitteln, ob ein Objekt bereits gegriffen<br />
wurde. Zur Realisierung stehen unterschiedliche Ansätze zur Auswahl.<br />
• Rückkopplung durch Kraftmessung<br />
– In diesem Fall wird der Greifer mit zusätzlichen Sensoren zur<br />
Kraftmessung ausgestattet.<br />
• Servos mit Datenrückleitung<br />
– Wie in Abschnitt beschrieben, können Servos eingesetzt werden,<br />
bei welchen über einen Rückkanal unter Anderem der aktuelle<br />
Stromverbrauch ausgelesen werden kann.<br />
• Entwicklung einer Strommessplatine<br />
– Es wird eine zusätzliche Platine entwickelt, die eine Strommessung<br />
der Servos ermöglicht. Bei diesem Ansatz muss beachtet<br />
werden, dass die Platine im Design des Roboterarms berücksichtigt<br />
wird.<br />
2.10.4.5 Ansätze neuer Roboterkongurationen<br />
Ansatz 1: Roboterarm auf Basis des KUKA mit 6 Freiheitsgraden (DOF)<br />
Die Gelenkkonfiguration dieses Ansatzes basiert auf der Idee eines Kuka<br />
Roboterarms. Durch eine geschickte Anordnung und Wahl der Gelenkachsen<br />
wird in der Regel die Entwicklung der Kinematik stark vereinfacht.<br />
Da diese Konfiguration zur Umsetzung der meisten von der Projektgruppe<br />
definierten Demonstratoren genutzt werden kann, erfolgt in diesem Abschnitt<br />
eine genauere Spezifikation. Anmerkung: Die in den Grundlagenkapiteln<br />
erarbeiteten Inhalte können jedoch ebenso auf andere Konfigurationen angewendet<br />
werden.<br />
Aufbau<br />
In diesem Abschnitt wird die Konfiguration und der Aufbau des neuen<br />
Roboterarms vorgestellt. Abbildung 2.141 zeigt die kinematische Konfiguration<br />
des Roboters.<br />
322
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.141: Kinematische Konfiguration des neuen Roboarms<br />
Dieser besitzt sechs Gelenke, durch die der Roboterarm über sechs Freiheitsgrade<br />
verfügt.<br />
Eine solche Konfiguration wurde gewählt, um einerseits den beschriebene<br />
Pick & Place Anwendungsfall umzusetzen, den Roboterarm jedoch auch<br />
für die weiteren geplanten Demonstratoren nutzen zu können. Zusätzlich<br />
existieren für eine solche Gelenkkonfiguration bereits Kinematiklösungen,<br />
da es weniger Schwierigkeiten bei der Rückwärtsrechnung gibt als bei der<br />
Konfiguration des aktuellen Roboterarms.<br />
In Abbildung 2.142 sind die Winkelgrenzen der Rotations- und Torsionsgelenke<br />
veranschaulicht 50 . Die rot gestrichelte Linie entlang der Grenze<br />
des dritten Servos zeigt die mögliche Pose des Roboterarmes bei gestrecktem<br />
Teilarm ab dem dritten Gelenk. Der Teilarm darf nicht mit dem Nachbarteilarm<br />
kollidieren und sich bei voller Ausstreckung nicht weiter zum<br />
Ursprung des Weltkoordinatensystems (WKS) nähern. Daher wird der Servo<br />
am dritten Gelenk so angebracht, dass die beschriebene Pose direkt<br />
der Endlage des Servos entspricht. Die Pose folgt aus der Einschätzung<br />
der Position des Schachbretts zum Fußpunkt (Base) des Roboterarms. Der<br />
Abstand x zeigt den minimal möglichen Abstand des Schachbretts zum<br />
Roboterarm.<br />
Bestimmung der Längen<br />
Im Folgenden werden werden die Längen der Verbindungsstücke, des Greifers<br />
sowie die Drehmomente der Servos formalisiert.<br />
Für die Berechnung der Längen wird als Einstiegspunkt die Größe eines<br />
Standard-Schachbretts angenommen und in diesem Abschnitt mit dem<br />
Buchstaben b definiert. Die Länge des Greifers sowie die Höhe der Base<br />
50 Dabei werden Servos mit einem Betriebsbereich von 180 Grad angenommen<br />
323
Kapitel 2. Implementation 10. Oktober 2013<br />
0°<br />
180°<br />
0°<br />
0°<br />
180°<br />
180°<br />
0°<br />
180°<br />
0°<br />
0°<br />
180°<br />
x<br />
180°<br />
Abbildung 2.142: Ausrichtung der Arbeitsbereiche der Servos<br />
werden ausgehend von den Schachfigurhöhen, der Beschaffenheit des Greifers<br />
sowie seines Verbindungsstücks bestimmt.<br />
Anschließend werden die Längen der restlichen Verbindungsstücke ermittelt.<br />
Aus den Längen und Gewichten der Verbindungsstücke und des Greifers<br />
werden daraufhin die benötigten Drehmomente berechnet.<br />
In Abbildung 2.144 ist das Prinzip zur Bestimmung der Greiferlänge vorgestellt.<br />
l GrLot<br />
Greifmechanis<br />
mus<br />
+<br />
Torsionsmecha<br />
nismus<br />
l mech<br />
G 5<br />
G 2<br />
G 6<br />
Greiferlänge<br />
l<br />
>0<br />
G<br />
F DIFF<br />
Baselänge l B<br />
G 1<br />
l Kopf<br />
Abbildung 2.143: Längen des Greifers und des Base<br />
Beim Greifen von kleinen Schachfiguren muss darauf geachtet werden,<br />
dass der Greifmechanismus nicht mit höheren Schachfiguren kollidiert.<br />
Aus diesem Grund muss die Greiferhöhe mindestens der Differenz F DIFF<br />
324
Kapitel 2. Implementation 10. Oktober 2013<br />
aus der höchsten und der niedrigsten Figur entsprechen. Weiter muss der<br />
Greifer in der Lage sein, den Kopf der kleinsten Schachfigur zu greifen.<br />
Daher wird die mittlere Höhe der Köpfe aller Figuren l Kop f hinzuaddiert.<br />
Die letzte Länge wird durch den Greifmechanismus selbst l mech sowie das<br />
Lot l GrLot des Verbindungsstücks zum fünften Gelenk bestimmt. Daraus<br />
ergibt sich die Gesamte Länge l G des Greifers wie folgt:<br />
l G = F DIFF + l Kop f + l mech + l GrLot (2.18)<br />
Die Länge l B des Base wird unter Berücksichtigung des Anwendungsfalls<br />
zum Greifen der niedrigsten Schachfigur berechnet. Sie setzt sich aus der<br />
Länge des Greifers l G und der Höhe der niedrigsten Schachfigur h klSch ohne<br />
Kopfhöhe l Kop f zusammen:<br />
l B = l G + h klSch − l Kop f (2.19)<br />
Angenommen werden Schachfigurhöhen von maximal 9cm und minimal<br />
4, 5cm, sowie eine Kopfhöhe von l Kop f = 1, 5cm. Weiter wird ein Schätzwert<br />
von l mech = 5cm für den Greifmechanismus sowie für die Strecke des Lots<br />
zum fünften Gelenk von l GrLot = 6cm gewählt. Somit ergeben sich für den<br />
Greifer eine Höhe von l G = 17cm und eine Höhe von l B = 20cm für den<br />
Base.<br />
Im Folgenden werden die Längen der restlichen Verbindungsstücke berechnet.<br />
+10%<br />
y<br />
b<br />
c<br />
x<br />
a<br />
Abbildung 2.144: Minimal benötigte Länge des Teilarmes. Sicht von oben<br />
325
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.144 zeigt das Schachbrett sowie den interessanten Teil des Arbeitsbereiches<br />
von oben. Da bei der festgelegten, senkrechten Greifertechnik<br />
die Längen des Greifers l G und der Base l B für die maximale Reichweite<br />
nicht relevant sind, werden diese zunächst vernachlässigt. Die Länge<br />
c ist die, vom Fußpunkt des Roboterarms gesehen, minimal zu erreichende<br />
Strecke, die benötigt wird, um den am weitesten entfernten Punkt des<br />
Schachbretts erreichen zu können. Diese wird mit dem Satz des Pythagoras<br />
als Hypotenuse eines rechtwinkligen Dreiecks bestimmt. Die Kathete<br />
b setzt sich aus der Brettseite y und dem minimalen Abstand x vom Brett<br />
zum Fuß des Roboters zusammen. Kathete a ist genau die Hälfte der Seitenlänge<br />
des Schachbretts y, also a = y/2.<br />
l L2<br />
l L1<br />
l G<br />
l B<br />
Abbildung 2.145: Längen der restlichen Verbindungsstücke<br />
In Abbildung 2.145 wird der Roboterarm nun seitlich zum Betrachter dargestellt.<br />
Die c muss sich daher aus der Summe der Teilstücke l L1 und l L2 zusammensetzen:<br />
c = l L1 + l L2 (2.20)<br />
Die Pose des Greifers in Abbildung 2.144 entspricht dem zum Fußpunkt<br />
des Roboters nahegelegendsten Punkt auf dem Schachbrett. Dabei gilt:<br />
Nach Umstellung der Gleichung 2.20 nach l L1 :<br />
l L1 + l B = l L2 + l G (2.21)<br />
l L1 = c − l L2 (2.22)<br />
326
Kapitel 2. Implementation 10. Oktober 2013<br />
und einsetzen dieser in die 2.21 ergibt sich:<br />
und folglich<br />
c − l L2 + l B = l L2 + l G (2.23)<br />
l L2 = c − l G + l B<br />
. (2.24)<br />
2<br />
Damit kann l L1 aus der gewonnenen Gleichung 2.22 ermittelt werden.<br />
Mit den erfassten Werten für l G = 17cm und l B = 20cm, dem geschätzten<br />
Abstand x = 10cm sowie der Seitenlänge des Bretts y ergeben sich die<br />
Werte für l L1 und l L2 .<br />
Bestimmung der Massen<br />
Nachdem alle Längen der Verbindungsstücke bekannt sind, werden die<br />
Massen der Verbindungsstücke bestimmt. Als Material wird Aluminium<br />
angenommen. Die Dicke der jeweiligen Verbindungsstücke werden jeweils<br />
mit 0.3cm und die Breite mit 4cm angenommen. Da ein Verbindungsstück<br />
so leicht wie möglich gestaltet werden soll, wird das errechnete Gewicht<br />
mit 2/3 multipliziert um sich dem realen Bauteil anzunähern. Aus der Aluminiumdichte<br />
von 2, 7 gr ergeben sich somit die Masse m<br />
cm 3 i der Verbindungsstücke<br />
i. In 2.25 wird beispielhaft die Masse für den Teilarm l 3 berechnet, siehe<br />
Abbildung 2.147.<br />
m 3 = 32, 05cm ∗ 4cm ∗ 0, 3cm ∗ 2, 7 gr ∗ (2/3) = 69, 228 (2.25)<br />
cm3 Da die ermittelten Werte der groben Bestimmung der benötigten Drehmomente<br />
dienen, werden diese jeweils aufgerundet.<br />
327
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.146 zeigt die bestimmten Längen und Massen. Der Rechenweg<br />
zur Bestimmung der Mindestdrehmomente erfolgt im nächsten Abschnitt.<br />
Abbildung 2.146: Berechnung der Drehmomente<br />
Bestimmung der Drehmomente<br />
Die benötigten Drehmomente werden durch die Schwerkräfte w i und die<br />
Längen l i bestimmt. In Abbildung 2.147 sind die relevanten Längen und<br />
Gewichtspunkte angegeben, die für Berechnung der Drehmomente der<br />
gewählten Roboterkonfiguration notwendig sind. Die Schwerkraft ⃗w i für<br />
die nachfolgenden Berechnungen ist definiert als eine Skalare Einheit und<br />
als Produkt der Masse und der Erdbeschleunigung von 9, 81 m/s 2<br />
w i = m · 9, 81 m/s 2 = kg · m/s 2 (2.26)<br />
Die Drehmomente werden hier nur für die Gelenke G 2 , G 3 , G 4 sowie G 5<br />
berechnet. Bei den Gelenken G 1 und G 6 handelt es sich um Torsionsgelenke,<br />
auf die verhältnismäßig wenig Last ausgeübt wird. Mit der grünen<br />
Farbe sind die Schwerkräfte der Verbindungsstücke und mit der schwarzen<br />
Farbe die Schwerkräfte der Gelenke gekennzeichnet. Die Längen sind mit<br />
roter Farbe gekennzeichnet.<br />
M G4 = (l 6 /2) · w 6 + l 6 · w G6 + (l 6 + l 7 /2) · w 7 + (l 6 + l 7 ) · w G (2.27)<br />
M G5 = M G4 (2.28)<br />
328
Kapitel 2. Implementation 10. Oktober 2013<br />
w G5<br />
l 5<br />
G 5 G 4<br />
l 4<br />
G 3<br />
l 3<br />
w G2<br />
G 2<br />
180°<br />
l G<br />
l 6<br />
l7<br />
w 6<br />
w 5<br />
G<br />
w<br />
6 w G6<br />
7<br />
G<br />
w G4<br />
w 4<br />
w G3<br />
w 3<br />
w 2<br />
w G1<br />
G3<br />
l 1<br />
w 1<br />
l 2<br />
G 1<br />
l B<br />
Abbildung 2.147: Modell der Gelenkgenkonfiguration mit Längen und<br />
Gewichten<br />
+20%<br />
M G3 =(l 4 /2) · w 4 + l 4 · w G4 + (l 4 + l 5 /2) · w 5 +<br />
(l 4 + l 5 ) · w G5 + (l 4 + l 5 + l 6 /2) · w 6 +<br />
y<br />
(2.29)<br />
(l 4 + l<br />
x<br />
5 + l 6 ) · w G6 + (l 4 + l 5 + l 6 + l 7 /2) · w 7 +<br />
(l 4 + l 5 + l 6 + l 7 ) · w G<br />
M G2 =(l 3 /2) · w 3 + l 3 · w G3 + (l 3 + l 4 /2) · w 4 +<br />
(l 3 + l 4 ) · w G4 + (l 3 + l 4 + l 5 /2) · w 5 +<br />
(l 3 + l 4 + l 5 ) · w G5 + (l 3 + l 4 + l 5 + l 6 /2) · w 6 +<br />
(2.30)<br />
(l 3 + l 4 + l 5 + l 6 ) · w G6 + (l 3 + l 4 + l 5 + l 6 + l 7 /2) · w 7 +<br />
(l 3 + l 4 + l 5 + l 6 + l 7 ) · w G<br />
Nach dem Einsetzen in die Gleichungen 2.27, 2.28, 2.29 sowie 2.30 ergeben<br />
sich folgende Drehmomente M Gi für die jeweiligen Gelenke G i mit i ∈<br />
{2, 3, 4, 5}:<br />
M G5 = 0.361473Nm<br />
M G4 = 0.361473Nm<br />
M G3 = 1.759807Nm<br />
M G2 = 3.831772Nm<br />
Als Vergleich sowie zur Evaluierung der aufgestellten Formeln werden im<br />
Folgenden die Drehmomente für die Gelenke der aktuellen Roboterkonfiguration<br />
aus Abbildung 2.148 berechnet:<br />
329
l 6<br />
w 6<br />
w 5<br />
4<br />
2<br />
l7<br />
G<br />
w<br />
6 w G6<br />
7<br />
w G<br />
Kapitel 2. Implementation 10. Oktober 2013<br />
l G<br />
G 4<br />
l G<br />
G 5<br />
l 3<br />
w Gr w G5 w 3<br />
l 2<br />
w w 2<br />
G4 w G3 w 1<br />
G 3<br />
l 1<br />
G 2<br />
G 1<br />
Abbildung 2.148: Konfiguration des alten Roboterarms<br />
Die Massen sowie Längen wurden von der bestehenden Hardware abgemessen:<br />
l 1 = 10, 5cm, l 2 = 12cm, l 3 = 6cm, die Greiferlänge l G = 105cm. Die Massen<br />
sind m 1 = 24gr, m 2 = 26gr, l 3 = 15gr sowie Masse des Greifers l G = 90gr.<br />
Die Drehmomente werden nach dem Prinzip aus Abschnitt 2.10.4.4 berechnet:<br />
M aG4 = (l 3 /2) · (w 3 + w G5 ) + (l 3 + l G /2) · w G (2.31)<br />
M aG3 =(l 2 /2) · w 2 + l 2 ∗ w G4 + (l 2 + l 3 /2) · (w 3 + w G5 )<br />
+ (l 2 + l 3 + l G /2) · w G<br />
(2.32)<br />
M aG3 =l 1 /2 · w 1 + l 1 · w G3 + (l 1 + l 2 /2) · w 2 + (l 1 + l 2 ) ∗ w G4 +<br />
(l 1 + l 2 + l 3 /2) · (w 3 + w G5 ) + (l 1 + l 2 + l 3 + l G /2) · w G<br />
(2.33)<br />
Nach dem Einsetzen in die Gleichungen 2.31, 2.32 sowie 2.33 ergeben sich<br />
folgende Drehmomente M aGi für die jeweiligen Gelenke aG i mit i ∈ {2, 3, 4, 5}:<br />
M aG4 = 0.193Nm<br />
M aG3 = 0.584Nm<br />
M aG2 = 0.988Nm<br />
Für das dem Fußpunkt am Nahegelegensten Gelenk G 2 wurde ein Drehmoment<br />
von M aG2 = 10.08kg/cm ermittelt. Dies ist der maximale Wert, der<br />
von dem in Tabelle 2.8 beschriebenen Servo S06NF aufgewendet werden<br />
muss. Für den Servo ergibt sich daher bei einem maximalen Drehmoment<br />
von 13, 5kg/cm ein Puffer von 3, 42kg/cm bzw. ca. 25%.<br />
Um den spezifizierten Roboterarm umsetzen zu können, müssen nun Servos<br />
mit den benötigten Drehmomenten ausgewählt werden. Diese werden<br />
dabei speziell auf jedes Gelenk angepasst und das Modell mit den neuen<br />
Servodaten neu simuliert.<br />
330
Kapitel 2. Implementation 10. Oktober 2013<br />
Die entsprechenden Servos werden den in Abbildung 2.147 benannten Gelenken<br />
zugeordnet.<br />
• Servos<br />
– G1: ab 10 bis 13 kg-cm, z.B. HSR-5498SG<br />
– G2: ab 42 bis 44 kg-cm, z.B. HS-7980TH 51<br />
– G3: ab 20 bis 25 kg-cm, z.B. HS-7954SH 52<br />
– G4: ab 7 bis 10 kg-cm, z.B. HSR-5498SG<br />
– G5: ab 7 bis 10 kg-cm, z.B. HSR-5498SG<br />
– G6: ab 3 bis 5 kg-cm, z.B. HSR-8498HB<br />
– Greifer-Servo: ab 3 bis 5 kg-cm, z.B. HSR-8498HB<br />
Diese hier aufgeführten Servos erfüllen die Anforderungen der Spezifikation.<br />
Für die Gelenke G 1 , G 4 bis G 6 würden bereits die aktuell genutzten Servos<br />
ausreichen.<br />
(a) HS-7954SH (bis 24 kgcm)<br />
(b) HS-7980TH (bis 44<br />
kg-cm)<br />
Abbildung 2.149: Leistungsstarken Servos HS-7954SH (a) und HS-7980TH<br />
(b)<br />
Für die Gelenke G 2 und G 3 müssen wesentlich leistungsstärkere Varianten<br />
eingesetzt werden. Die Kosten der in Abbildung 2.149 vorgestellten Servo-<br />
Modelle der Fa. Hitec belaufen sich auf ca. 175 ¿ für G 2 und ca. 100 ¿ für<br />
G 3 . Die Servos besitzen trotz ihrer schlanken Bauweise von 40mmx20mmx37mm<br />
(HS-7954SH) und 43.8mmx22.4mmx40mm (HS-7980TH) sowie den geringen<br />
Massen von jeweils 68gr und 78gr ein Drehmoment, welches dem für<br />
das jeweilige Gelenk maximal bestimmtem Drehmoment genügt.<br />
51 http://www.servocity.com/html/hs-7980th_servo.html<br />
52 http://www.servocity.com/html/hs-7954sh_servo.html<br />
331
Kapitel 2. Implementation 10. Oktober 2013<br />
Ansatz 2: Roboterarm Arexx R1-PRO mit 5 Freiheitsgraden (DOF)<br />
In diesem Fall würde die aktuelle Gelenkkonfiguration übernommen werden.<br />
Die Längen der Verbindungsstücke könnten vergrößert werden, um<br />
den Arbeitsbereich zu erhöhen. Die Entwicklung einer neuen Kinematik<br />
wäre jedoch trotzdem nötig, um den senkrechten Greifvorgang zu realisieren.<br />
Vergröÿerung des Arbeitsbereichs<br />
Im Folgenden werden die Auswirkungen einer Verlängerung der Verbindungsstücke<br />
des aktuellen Roboterarms ermittelt. Die Simulation liefert die unten stehenden<br />
Ergebnisse:<br />
Als neue Längen wurden l 1 und l 2 auf den dreifachen Wert verlängert.<br />
Damit erhöht sich entsprechend auch die Masse der Segmente. Für l 1 =<br />
31, 5cm und l 1 = 36cm sowie für die entsprechenden Massen m 1 = 72gr<br />
und m 2 = 78gr ergeben sich die Drehmomente je Gelenk wie folgt:<br />
M aG4 = 0.193Nm<br />
M aG3 = 1.366Nm<br />
M aG2 = 2.578Nm<br />
Damit muss das Gelenk G 2 mit einem Servo angetrieben werden, der mindestens<br />
ein Drehmoment von 26.29kg/cm aufbringen kann. Zusätzlich sollte<br />
immer ein gewisser Puffer mit eingeplant werden.<br />
Aus den ermittelten Werten wird ersichtlich, dass in einem solchen Fall<br />
das Beibehalten der aktuellen Roboterplattform keine Vorteile bringt, da<br />
Verbindungsstücke sowie Servos neu dimensioniert werden müssten.<br />
Ansatz 3: Roboterarm auf Basis des SCARA mit 3 Freiheitsgraden<br />
(DOF)<br />
Der dritte Ansatz schlägt eine Gelenkkonfiguration in Anlehnung an den<br />
in 2.10.4.2 beschriebenen Roboterarms vor. Diese Konfiguration ist jedoch<br />
explizit auf eine Pick & Place Anwendung ausgelegt, sodass der Demonstrator<br />
zur Nachahmung des menschlichen Arms mit diesem Roboterarm<br />
nicht praktikabel umsetzbar ist. Abbildung 2.150 zeigt die Standard Gelenkkonfiguration<br />
eines solchen Roboterarms.<br />
Für die Wahl dieser Konfiguration sprechen eine einfache Umsetzbarkeit<br />
sowie weniger Rechenaufwand, da die Belastung der Servos durch den<br />
Aufbau gering gehalten wird.<br />
332
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.150: Kinematische Konfiguration Scara<br />
2.10.5 Erweiterung des Servo-IP-Cores<br />
Ziel dieses Arbeitspaketes ist es den Servo-IP-Core, siehe Abb. 2.152, zu erweitern,<br />
sodass ruckartige Bewegungen vermieden werden. Der Servo-IP-<br />
Core steuerte bisher die Servos direkt über das Pulspositionsmodulation-<br />
Protokoll an. Dabei wurde unmittelbar die Zielposition angefahren. Dieses<br />
Vorgehen verursachte ruckartige Bewegungen, da der Servo bei größeren<br />
Differenzen zwischen Aktueller und Zielposition mit voller Leistung agiert.<br />
Entsprechend traten hier hohe Ströme und Belastungen für den Roboterarm<br />
auf.<br />
Um diese ruckartigen Bewegungen und übermäßigen Belastungen zu vermeiden<br />
wurde der Servo-IP-Core um eine Rampenfunktion, siehe Abb.<br />
2.151, erweitert. Die Rampen bewirken, dass der Servo die Zielpostion<br />
schrittweise anfährt, anstatt direkt mit voller Leistung die Zielpositionn<br />
anzufahren. Dieses schrittweise Erreichen der Zielposition bewirkt eine weichere<br />
Bewegung sowie geringere Belastungen.<br />
333
Kapitel 2. Implementation 10. Oktober 2013<br />
Servowinkel<br />
in ms<br />
Zielposition<br />
stepsize<br />
Startposition<br />
20 ms Interval des PWM-<br />
Signals des Servo<br />
t in ms<br />
Abbildung 2.151: Funktion der Rampen im Servo-IP-Core<br />
2.10.5.1 VHDL-Code<br />
Um die weiche Ansteuerung der Servos zu erreichen, wird das Signal reg<br />
aufgeteilt. Dieses Signal liefert nun nicht nur die anzufahrende Zielposition,<br />
sondern auch die Schrittweite. Es wird im Treiber gesetzt und in ein<br />
Register geschrieben. Die ersten 16 Bit enthalten die Zielposition und die<br />
zweiten 16 Bit die Schrittweite.<br />
Die Rampe ist im st1_high Zustand implementiert, für den Automaten<br />
(siehe Abschnitt 2.80). Sie erhöht oder verringert den Zielwinkel des Servos<br />
um die Stepsize. Der Wert ist dabei in Millisekunden angegeben. Ist der<br />
Unterschied zwischen Ziel und aktuellem Wert kleiner als die Differenz<br />
zwischen Ziel und aktuellem Wert, wird dieser direkt auf den Zielwert<br />
gesetzt, sodass ein Springen um die Zielposition verhindert wird.<br />
334
Kapitel 2. Implementation 10. Oktober 2013<br />
clk<br />
reset<br />
reg[0:31]<br />
servo_v1_00_a<br />
output<br />
Abbildung 2.152: Blockschaltbild Servo-IP-Core<br />
2.10.5.2 Treiber<br />
Im folgenden Unterabschnitt werden die Änderungen am Servo-Treiber<br />
aufgeführt.<br />
unsigned short stepsize ;<br />
Um die stepsize an den IP-Core zu übergeben, muss ein Register gesetzt<br />
werden. Zu diesem Zweck wurde der bestehende Treiber um den Wert<br />
stepsize erweitert.<br />
Servo ( unsigned int base_address , unsigned short minimum ,<br />
unsigned short maximum , unsigned short stepsize );<br />
Zudem wurde ein neuer Konstruktor eingeführt bei dem die stepsize übergeben<br />
wird.<br />
void set_stepsize ( unsigned short stepsize );<br />
Des Weiteren wurde eine Methode set_stepsize dem Treiber hinzugefügt.<br />
Mit dieser kann die stepsize neu gesetzt werden.<br />
void set_angle_over_time ( short degree , short ms );<br />
Die Methode set_angle_over_time erlaubt es den Zielwinkel und die Zeit<br />
in Millisekunden anzugeben, in der der Winkel erreicht werden soll. Intern<br />
berechnet die Methode die benötigte stepsize. Gibt der Benutzer eine<br />
Zeit ein, welche nicht erreicht werden kann so wird die maximal mögliche<br />
Zeit eingestellt. Dies geschieht nicht im Treiber sondern automatisch im<br />
IP-Core.<br />
unsigned short get_angle () ;<br />
Mit get_angle kann der aktuell eingestellte Winkel in Grad abgerufen werden.<br />
unsigned_short get_stepsize () ;<br />
Die Methode get_stepsize liefert die derzeit eingestellte stepsize zurück.<br />
335
Kapitel 2. Implementation 10. Oktober 2013<br />
Dateistruktur<br />
• ip-cores/drivers/servo_v1_00_a/data/servo_v2_1_0.mdd: Generiert von<br />
Xilinx<br />
• ip-cores/drivers/servo_v1_00_a/data/servo_2_1_0.tcl: Generiert von Xilinx<br />
• ip-cores/drivers/servo_v1_00_a/data/src/servo.cpp: Cpp-Datei mit Implementierung<br />
• ip-cores/drivers/servo_v1_00_a/data/src/servo.h: Cpp-Datei mit Prototypendefinition<br />
• ip-cores/pcores/servo_v1_00_a/hdl/vhdl/servoctrl.vhd: Servo-IP-Core<br />
inklusive der Rampen.<br />
• ip-cores/pcores/servo_v1_00_a/hdl/vhdl/user_logic.vhd: Anbindung<br />
an den PLB<br />
• ip-cores/pcores/servo_v1_00_a/hdl/vhdl/simulation/servoctlr_tb.vhd:<br />
Testbench für den veränderten IP-Core.<br />
336
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10.6 Entwicklung einer Trajektorienführung<br />
Ziel dieses Arbeitspaketes ist die Entwicklung und Umsetzung eines Algorithmus<br />
zur Trajektorienführung auf einer Ebene, welche in erster Linie im<br />
Anwendungsfall „Skizze zeichnen“ eingesetzt werden soll. Dies ist nötig,<br />
da die entwickelte Rückwärtskinematik alleine zur Ansteuerung eines eingegebenen<br />
Punktes dient. Damit wird zu diesem Zeitpunkt jedoch noch nicht das<br />
Abfahren einer vorgegebenen Strecke, also einer Trajektorie, realisiert.<br />
Durch Eingabe einer Punktliste können somit auf einer Ebene geometrische<br />
Formen wie z. B. Geraden mit dem Roboterarm abgefahren werden. Dafür<br />
soll in diesem Arbeitspaket die in Sprint 2 Abschnitt 2.2.3.3 erarbeitete<br />
Rückwärtskinematik genutzt und falls nötig angepasst werden, sodass das<br />
Abfahren der Trajektorien keine unerwünschten Sprünge beinhaltet.<br />
Das Ergebnis dieses Arbeitspakets ist ein zusätzliches Plugin für die OFFIS-<br />
Automation-Toolbox, welches aus einer Menge von Punkten als Eingabe<br />
eine Trajektorie interpoliert. Als Demonstrator wird ein Python-Skript implementiert,<br />
welches Trajektorienführung und Rückwärtskinematik kombiniert,<br />
sodass die errechneten Steuerwinkel über die USB-Schnittstelle und<br />
den FPGA an die Servos des realen Roboterarms weitergeleitet werden<br />
können.<br />
Vorbedingungen<br />
• OFFIS-Automation-Toolbox<br />
• Rückwärtskinematikplugin inkl. Python-Schnittstellen<br />
• Xilinx-Projekt(Genesys) inkl. Servo IP-Core<br />
• GENESYS FPGA-Board<br />
• Roboterarm<br />
Lieferumfang<br />
• Plugin zur Trajektorienberechnung für die OFFIS-Automation-Toolbox<br />
• Python-Skript zur Verbindung von Trajektorienführung und Rückwärtskinematik<br />
– Vollständiger Aufbau zum Zeichnen planarer geometrischer Formen:<br />
Rechteck, Dreieck, Kreis<br />
337
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10.6.1 Algorithmus<br />
Bei der Entwicklung einer Trajektorienführung spielt die Wahl des Algorithmus<br />
eine entscheidende Rolle. Daher erfolgen im Weiteren die Auswahl<br />
sowie Beschreibung der gewählten Methode.<br />
Auswahl<br />
Zur Planung einer Trajektorie zwischen zwei Punkten können je nach Bedarf<br />
unterschiedliche Interpolationsverfahren gewählt werden 53 . Dazu zählen<br />
unter Anderem lineare-, Kreis- oder auch Splineinterpolation.<br />
Der aufgrund seiner Einfachheit gewählte Algorithmus basiert auf einer<br />
linearen Interpolation der Punkte. Diese Methode reicht für die angestrebten<br />
Anwendungen aus und bereitet darüber hinaus weniger mathematischen<br />
Aufwand.<br />
v<br />
v<br />
Abbildung 2.153: Lineare Interpolation eines Vektors<br />
Im ersten Schritt wird die Länge der Strecke zwischen den eingegebenen<br />
Punkten ermittelt. Anschließend wird eine Menge der Punkte entlang des<br />
Vektors mit dem vorgegebenen Abstand zwischen diesen Punkten oder in<br />
der vorgegebenen Zahl dieser Punkte geliefert. Das Prinzip wird in Abbildung<br />
2.153veranschaulicht.<br />
Beschreibung<br />
Als Eingabe werden zwei Punkte P S sowie P E erwartet, die jeweils als Startund<br />
Endpunkt bezeichnet werden. Der minimale Abstand zwischen den<br />
Punkten der Interpolation A Int wird durch die Auflösung des Roboterarms<br />
festgelegt. Anschließend wird die Anzahl der benötigten Interpolationspunkte<br />
berechnet. Die Berechnung beginnt mit dem Verhältnis der<br />
53 http://edoc.sub.uni-hamburg.de/haw/volltexte/2011/1331/pdf/Trajektorienplanung.pdf<br />
338
Kapitel 2. Implementation 10. Oktober 2013<br />
Länge der Trajektorie L T zum Abstand A Int . Damit ergibt sich zunächst<br />
die grobe Anzahl der benötigten Punkte n grob .<br />
n grob =<br />
L T<br />
A Int<br />
(2.34)<br />
Da das Verhältnis nicht immer ganzzahlig ausfällt, entsteht ein gewisses<br />
Fehlermaß M F . Dies verhindert eine gleichmäßige Verteilung der Punkte<br />
über die Trajektorie. In einem solchen Fall würde bei bloßer Interpolation<br />
mit festgelegter Schrittweite der gewünschte Endpunkt nicht zwangsläufig<br />
erreicht werden.<br />
M F = L T mod A Int (2.35)<br />
Aus den Gleichungen 2.34 sowie 2.35 lässt sich daher ein Korrekturfaktor<br />
F K bestimmen.<br />
F K = M F<br />
n grob<br />
(2.36)<br />
Mit Hilfe des Korrekturfaktors wird nun die genaue Anzahl der benötigten<br />
Punkte der Interpolation n genau berechnet und somit der gewünschte Endpunkt<br />
erreicht.<br />
L<br />
n genau = T<br />
(2.37)<br />
A Int + F K<br />
Der Wert n genau bestimmt die Faktoren der Interpolation F I für die einzelnen<br />
Koordinaten (x, y) jedes Punktes auf der Trajektorie.<br />
Zunächst werden nun die Differenzen zwischen Start- und Endpunkten<br />
paarweise gebildet:<br />
x di f f = B.x − A.x<br />
y di f f = B.y − A.y<br />
(2.38)<br />
Anschließend erfolgt die Bestimmung der Faktoren der Interpolation F Ix<br />
und F Iy :<br />
F Ix = x di f f /n genau<br />
F Iy = y di f f /n genau<br />
(2.39)<br />
Jeder Punkt der Interpolation P Inti (x, y) ist wie folgt definiert:<br />
∀x i ∈ P Inti : P Inti .x = P Int0 .x + F Ix · i,<br />
∀y i ∈ P Inti : P Inti .y = P Int0 .y + F Iy · i,<br />
mit P Inti ∈ {P Int0 ..P Inti }<br />
(2.40)<br />
339
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10.6.2 Ermittlung der theoretischen Schrittweite<br />
Um eine Annäherung an die kleinstmögliche Schrittweite des Roboterarms<br />
zu ermitteln, wird die folgende Berechnung durchgeführt.<br />
Für die Winkelgenauigkeit der Servos wird 1 Grad pro / Schritt angenommen.<br />
Dabei handelt es sich ebenfalls um die minimal einstellbare Schrittweite<br />
seitens des Servo IP-Cores.<br />
⍺<br />
β<br />
l 1<br />
1°<br />
l 1<br />
1°<br />
l 2<br />
γ<br />
l 2<br />
l 1 + l 2<br />
a<br />
n<br />
Abbildung 2.154: Berechnung der minimalen Schrittweite<br />
Unter Einbezug der Längen des zweiten und dritten Verbindungsstücks<br />
kann die theoretisch mögliche Schrittweite eines Teilarms ermittelt werden.<br />
Hierzu wird der Kosinus-Satz angewendet. Die Längen der letzten<br />
beiden Verbindungsstücke des Roboterarms sind jeweils l 1 = 78, 5mm und<br />
l 2 = 70mm lang. Unter dem Winkel α = 180 ◦ , wie in Abbildung 2.154<br />
dargestellt ist, bilden beide Segmente die maximale gestreckte Länge von<br />
l 1 + l 2 . Falls die Gelenke (Winkel α und β) in Richtung der schwarzen<br />
Pfeilen sich um einen Grad drehen, verkürzt sich diese Strecke um n.<br />
Dabei ist das n die minimale Schrittweite, die der Roboterarm durch die<br />
Änderung der Gelenkwinkel um einen Grad erzielen kann. Die verkürzte<br />
Strecke wird zu einer Seite des Dreiecks und kann durch den Kosinus-Satz<br />
bestimmt werden. Das n ist die Differenz dieser Strecken.<br />
√<br />
n = l 1 + l 2 − l1 2 + l2 2 − 2 · l 1 · l 2 · cos(α) (2.41)<br />
Daraus ergibt sich eine theoretische Schrittweite von 0, 0225432mm. Da<br />
diese Schrittweite mit dem gegebenen System der Servos nicht realistisch<br />
umsetzbar ist, wurde als Voreinstellung eine höhere Auflösung von 1mm<br />
340
Kapitel 2. Implementation 10. Oktober 2013<br />
angenommen. Es kann jedoch weiterhin eine genauere Schrittweite bei der<br />
Trajektorienberechnung gewählt werden.<br />
2.10.6.3 Anpassung der Kinematik auf 2D Ebene<br />
Um auf einer Ebene zeichnen zu können, wird der Roboterarm seitlich<br />
zur Ebene platziert. Das untere Gelenk des Roboters sollte ohne Winkeländerungen<br />
stehen bleiben, wobei lediglich die restlichen Gelenke bewegt<br />
werden. Der Stift wird, wie in Abbildung 2.155 dargestellt, am Tool-Center-<br />
Point senkrecht zur x-Achse und parallel zur y-Achse befestigt.<br />
Zur Umsetzung sollte die Rückwärtskinematik genutzt und wenn nötig<br />
entsprechend angepasst werden. Im ersten Schritt wird zu diesem Zweck<br />
der Punkt auf der y-Achse fest gesetzt. Dies reicht jedoch nicht aus, um die<br />
Rückwärtskinematik auf den gewünschten Arbeitsbereich einzuschränken,<br />
da zwei Probleme entstehen. Diese führen zwangsweise zu ungewollten<br />
Zwischenzeichnungen, bzw. Ausbrüchen des Roboterarms während des<br />
Ablaufs einer Trajektorie.<br />
Die Problematiken werden im Folgenden kurz erläutert:<br />
Z-Achsen Problem<br />
Da die Rückwärtskinematik mit dem Ziel entworfen wurde, einen beliebigen<br />
Punkt im Raum zu erreichen, sodass der Winkel des untersten Drehgelenks<br />
von der Position des Punktes im Arbeitsraum abhängt, lässt sich<br />
diese nicht ohne Drehung des unteren Gelenks auf das später erdachte<br />
Konzept des seitlichen Zeichnens anwenden. Bei einer Trajektorie, die Punkte<br />
auf beiden Seiten der z-Achse beinhaltet, kann unter Umständen eine<br />
Drehung des Arms um 180 Grad erfolgen. Diese kann aufgrund der geometrischen<br />
Lösung der Rückwärtskinematik nicht durch ein einfaches Invertieren<br />
der Winkel gelöst werden.<br />
Strategiewechsel Problem<br />
Bei der aktuellen Rückwärtskinematik werden zwei Strategien zur Punktermittlung<br />
genutzt (siehe Abschnitt 2.2.3.3). Die erste Strategie dient dazu,<br />
Punkte zu erreichen, die weit vom Ursprung entfernt liegen. Die zweite<br />
Strategie sorgt dafür, dass Punkte erreicht werden können, die nah zum<br />
Ursprung liegen. Bei einem Wechsel zwischen diesen Strategien erfolgen<br />
wiederum ungewollte Zwischenbewegungen. Da jede Strategie für das Erreichen<br />
eines Punktes die Winkel der Gelenke anders berechnet, kommt<br />
eine sprunghafte Winkeländerung bei einem Strategiewechsel zustande.<br />
341
Kapitel 2. Implementation 10. Oktober 2013<br />
Auch diese können daher nicht ohne starke Anpassungen bzw. Entwicklung<br />
einer neuen Rückwärtskinematik ausgeschlossen werden.<br />
Lösungsansätze<br />
Um die aufgezählten Probleme zu umgehen bzw. zu lösen werden im Folgenden<br />
einige mögliche Ansätze dargestellt.<br />
Problemumgehung<br />
Um dem Z-Achsen Problem aus dem Weg zu gehen,<br />
wird die Methode zur Trajektorienverfolgung der Python Implementierung<br />
angepasst, so dass bei einer berechneten Drehung seitens der Rückwärtskinematik<br />
der Stift ebenfalls um 180 Grad gedreht wird. Im Falle des<br />
Strategiewechsel Problems wird die Methode zur Trajektorienverfolgung<br />
der Python Implementierung dahingehend erweitert, dass der Stift vor jedem<br />
Strategiewechsel von der Zeichenebene abgewendet und nach erfolgtem<br />
Wechsel wieder auf die Ausgangslage gedreht wird. Diese Möglichkeit<br />
hat den Vorteil, dass keine Änderungen an der Kinematik vorgenommen<br />
werden müssen. Jedoch handelt es sich dabei um unerwünschtes Verhalten,<br />
welches zusätzlich auf Kosten der Wiederholgenauigkeit umgesetzt wird.<br />
Neue Kinematik<br />
Für den speziellen Fall des seitlichen Zeichnens soll eine<br />
neue Kinematik entwickelt werden, welche möglichst lange ohne Strategiewechsel<br />
auskommt und somit den Größtmöglichen Arbeitsbereich zulässt.<br />
Eingeschränkter Arbeitsbereich<br />
Um einer Drehung sowie einem möglichen<br />
Strategiewechsel vollständig aus dem Weg zu gehen, kann der Zeichenvorgang<br />
in einem stark eingeschränkten Arbeitsbereich erfolgen.<br />
2.10.6.4 Implementierung<br />
Der folgende Abschnitt beschreibt die Implementierung des Plugins zur<br />
Trajektorienplanung sowie der zugehörigen Python Programmlogik.<br />
OFFIS-Toolbox Plugin: Trajektorienplanung<br />
Zur Berechnung einer Trajektorie zwischen zwei Punkten wurde ein neues<br />
Plugin für die OFFIS-Automation-Toolbox erstellt. Dieses bietet eine Schnittstelle<br />
zur Python Umgebung, sodass eine Kombination mit der Rückwärtskinematik<br />
ermöglicht wird.<br />
342
Kapitel 2. Implementation 10. Oktober 2013<br />
void setStepFactor ( float factor );<br />
Diese Methode setzt die übergebene mindeste Schrittweite zwischen den<br />
Interpolationspunkten.<br />
float getStepFactor () ;<br />
Diese Methode liefert die aktuell gesetzte Schrittweite zurück.<br />
QList < float > getInterpolationPoints ( float x1 , float y1 ,<br />
float x2 , float y2 );<br />
Diese Methode berechnet eine Trajektorie auf Basis von Start- und Endpunkt.<br />
Zurückgeliefert wird eine Punktliste in Form von X- und Y-Koordinaten.<br />
void interpolate () ;<br />
Diese Methode sorgt für die eigentliche Interpolation und füllt eine Liste<br />
mit den berechneten Punkten auf der Trajektorie. Die weitere Logik sorgt<br />
dafür, dass trotz gesetzter Schrittweite der genaue Start- sowie der Endpunkt<br />
erreicht wird.<br />
OFFIS-Toolbox Automation: Python Skript<br />
Zur Umsetzung des Demonstrators wird eine Automatisierung in der OFFIS-<br />
Automation-Toolbox implementiert. Diese nutzt die Plugins zur Trajektorienplanung<br />
sowie zur Berechnung der Rückwärtskinematik. Ziel ist es,<br />
mit dem Aufbau simple geometrische Figuren auf einer senkrechten Ebene<br />
zu zeichnen.<br />
def traceTrajectory (x1 , y1 , x2 , y2 )<br />
Diese Methode kombiniert die Trajektorienplanung mit der Rückwärtskinematik.<br />
Zu gegebenem Start- und Endpunkt wird zuerst eine Trajektorie<br />
ermittelt. Die Rückwärtskinematik wird nun genutzt, um die zugehörigen<br />
Winkel zu berechnen. Diese werden daraufhin zum Microblaze übertragen<br />
und dort weiterverarbeitet. Sie berücksichtigt jedoch nicht die in Abschnitt<br />
2.10.6.3 aufgezeigten Probleme der Rückwärtskinematik.<br />
def traceTrajectoryWithoutChaos (x1 , y1 , x2 , y2 )<br />
343
Kapitel 2. Implementation 10. Oktober 2013<br />
Diese Methode besitzt die Funktionen der obigen Methode, ist jedoch weiter<br />
darauf ausgelegt, die Probleme zwischen Trajektorienführung und Rückwärtskinematik<br />
zu erkennen und abzufangen. Anmerkung: Diese Methode<br />
wurde als erster Test implementiert, um zu analysieren, ob es sich um eine<br />
mögliche Lösung der Probleme handelt. Daher sind zu diesem Zeitpunkt<br />
nicht sämtliche Testfälle berücksichtigt.<br />
def getSortedTrajectory (x1 , y1 , x2 , y2 )<br />
Bei dieser Methode handelt es sich um eine Hilsmethode, welche die Rückgabewerte<br />
des Trajektorien-Plugins in eine separate x- und y-Liste einsortiert.<br />
def rectangle ()<br />
Diese Funktion dient der Evaluation und zeichnet ein Rechteck ohne Strategiewechsel.<br />
def triangle ()<br />
Diese Funktion dient der Evaluation und zeichnet ein Dreieck ohne Strategiewechsel.<br />
def circle ()<br />
Diese Funktion dient der Evaluation und zeichnet einen Kreis ohne Strategiewechsel.<br />
def house ()<br />
Diese Funktion dient der Evaluation und zeichnet das Haus vom Nikolaus<br />
ohne Strategiewechsel.<br />
344
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10.6.5 Aufbau<br />
Als Ziel des Arbeitspakets wurde ein Demonstrator festgelegt, der in der<br />
Lage ist, geometrische Formen auf einer Ebene zu zeichnen. Zu diesem<br />
Zweck wurde der in Abbildung 2.155 gezeigte Aufbau gewählt. Der Roboterarm<br />
steht dabei mit seiner x-Achse parallel zur Zeichenfläche.<br />
Abbildung 2.155: Aufbau des vorläufigen Demonstrators<br />
Einige der getesteten geometrischen Formen sind in Abbildung 2.156 dargestellt.<br />
345
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.156: erste Zeichnungen<br />
Das Zeichnen mit Auflösung A Int = 3mm sowie Verzögerungszeit von 1<br />
ms zwischen Versenden der Nachrichten erfolgte für den Kreis sowie das<br />
Rechteck in 5 und für das Dreieck in 3,75 Sekunden. Das Zeichnen erfolgt<br />
zitternd, das heißt, dass die interpolierte Trajektorie durch den Roboterarm<br />
nicht präzise verfolgt werden konnte. In Abbildung 2.156 sind Figuren<br />
dargestellt, die durch die Vorgabe der geradlinigen Trajektorien gezeichnet<br />
wurden. Der Wiederholungsfehler des Roboterarms ist dagegen maximal<br />
4 mm.<br />
Die Höhe des „Hauses vom Nikolaus“ beträgt 6 und die Breite 4 cm. Das<br />
Zeichenbereich ist durch das Konzept der Strategiewechsel stark begrenzt.<br />
Die Natur des „Zittern“ entlang des Zeichnens der Linien wird untersucht.<br />
Hierzu wurde ein neues Arbeitspaket erstellt, in dem das Zeichenbereich<br />
verbessert sowie der genaue Grund des Zig-Zag artigen Verhaltens (des<br />
Zitterns) beim Zeichnen herausgefunden und ggf. beseitigt werden soll.<br />
346
Kapitel 2. Implementation 10. Oktober 2013<br />
Da es zwischenzeitlich zu Unklarheiten bezüglich der Anbindung der Servoversorgungsplatine<br />
kam, wird in den Tabellen 2.11 die genaue Portbelegung<br />
für das Genesys-Projekt dieses Teilarbeitspakets beschrieben. Anmerkung:<br />
Stecker mit der weißen Markierung nach oben.<br />
Port oben links<br />
GND AK8 AM11 AN12 AP14<br />
PORT oben rechts<br />
AN14 AN13 AP12 AL10 GND<br />
Pmod D Pins<br />
VCC GND AL10 AP12 AN13 AN14<br />
VCC GND AK8 AM11 AN12 AP14<br />
Tabelle 2.11: Konnektor zwischen FPGA-Board und Servoplatine<br />
Dateistruktur<br />
• genesys/system.xmp : Genesys-Board Projektdatei.<br />
• genesys/system.ucf : Verbindung logischer Netze mit physikalischen<br />
Pins.<br />
• genesys/system.mhs : Hardwarespezifikationsdatei.<br />
• offis-toolbox/projects/TrajectoryDemo/TrajectoryDemo.oap und ogr:<br />
Dateien für das OFFIS-Automation-Toolbox-Projekt<br />
• offis-toolbox/projects/TrajectoryTest/main.py : Hauptdatei des Automatisierungsprojekts<br />
• offis-toolbox/projects/TrajectoryTest/trajectory.py : Kombination von<br />
Trajektorienplanung und Rückwärtskinematik.<br />
• offis-toolbox/projects/TrajectoryTest/testForms.py : Datei mit vordefinierten<br />
geometrischen Formen und Testfällen.<br />
• offis-toolbox/projects/TrajectoryTest/rangeTests.py : Datei mit vordefinierten<br />
Strategiewechsel Testfällen.<br />
• offis-toolbox/plugins/automation/Trajectory/trajectory.pro : QT-Projektdatei.<br />
347
Kapitel 2. Implementation 10. Oktober 2013<br />
• offis-toolbox/plugins/automation/Trajectory/src/trajectory.cpp : Implementierungen<br />
der trajectory Klasse.<br />
• offis-toolbox/plugins/automation/Trajectory/src/trajectory.h : Header<br />
der trajectory Klasse.<br />
• offis-toolbox/plugins/automation/Trajectory/src/trajectoryInterface.cpp<br />
: Schnittstellenfunktionen zur Python-Umgebung.<br />
348
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10.7 Erweitern des Zeichenbereiches und Untersuchung<br />
des Zig-Zag Verhaltens<br />
Im Abschnitt 2.10.6 wurden die Probleme mit dem Zeichenbereich sowie<br />
mit dem Zig-Zag mäßigen (zitternden) Verhalten festgestellt. Das Ziel dieses<br />
Arbeitspaketes ist das Programm der Rückwärtskinematik insofern nachzubessern,<br />
dass der Wechsel der Strategie so spät wie möglich erfolgt. Die Idee dabei<br />
ist, für die Punkte im Arbeitsbereich, die von beiden Strategien erreichbar<br />
sind, weiterhin mit der ersten Strategie die Winkelstellungen zu berechnen.<br />
Außerdem muss in diesem Arbeitspaket festgestellt werden, woher<br />
das oben beschriebene Verhalten beim Abfahren der geradlinigen Trajektorien<br />
stammt. Zusätzlich soll das Verhalten des Roboterarms beim Abfahren<br />
der Trajektorie „Von Punkt zum Punkt“ ohne Interpolation getestet<br />
werden.<br />
Vorbedingungen<br />
• OFFIS-Automation-Toolbox<br />
• Rückwärtskinematikplugin inkl. Python-Schnittstellen<br />
• Trajektorienführungsplugin inkl. Python-Schnittstellen<br />
• Xilinx-Projekt(Genesys) inkl. Servo IP-Core<br />
• GENESYS FPGA-Board<br />
• Roboterarm<br />
Lieferumfang<br />
• Ein Demonstrator des verbesserten Arbeitsbereiches<br />
• Bericht über Grund des Zig-Zag mäßigen Verhalten des Roboterarms<br />
2.10.7.1 Strategiewechsel<br />
Das Wechsel der Strategie erst bei einem Punkt, der ausschließlich mit der<br />
zweiten Strategie erreichbar ist, wurde realisiert. Das Plugin der Rückwärtskinematik<br />
wurde hierzu umgebaut. Es konnten Punkte, die mit beiden<br />
Strategien erreichbar sind, für die erste Strategie priorisiert werden.<br />
349
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.157: Arbeitsbereich nach neuen Strategiewechsel<br />
Als Ergebnis kam ein Arbeitsbereich wie in Abbildung 2.157 darstellt, heraus.<br />
Abbildung 2.158: Quadrat ohne Strategiewechsel<br />
So konnte ein Quadrat 2.158 mit der Seitenlänge von 10 cm ohne Strategiewechsel<br />
gezeichnet werden. Der komplette Verzicht auf Strategiewech-<br />
350
Kapitel 2. Implementation 10. Oktober 2013<br />
sel ist konzeptuell nicht möglich. Es muss eine einfachere oder komplett<br />
neue Rückwärtskinematik erstellt werden.<br />
2.10.7.2 Tests und Erkenntnisse/Bericht<br />
Die Bewegung der Servos über einer vorgegebene geradlinigen Trajektorie<br />
ohne ihren Interpolation ergibt keine geradlinigen Trajektorien.<br />
Abbildung 2.159: Quadrat über Eckpunkte ohne Interpolation der Trajektorie<br />
In Abbildung 2.159 ist das gleiche Ergebnisquadrat links ohne und rechts<br />
mit Interpolation der Trajektorie dargestellt.<br />
Um auf das Zig-Zag mäßige Verhalten einzugehen wurde aus der Vermutung<br />
des Zeit versetzten Setzen der Pulspositionsmodulation-Signale über<br />
Microblaze der Code optimiert. Die Datei servo.cpp wurde entfernt und<br />
sämtliche Prozeduren wurden zu inline-Prozeduren in der Datei servo.h.<br />
Die Tests zeigten erneut das Zig-Zag mäßige Verhalten.<br />
Des Weiteren wurde zum Untersuchen der Richtigkeit der Winkelstellungen<br />
eine neue USB-Message vom Typ [USB_TYPE_SERVO_ANGLES_FINE]<br />
für das genauere Setzen der Winkel über Pulspositionsmodulation-Signale<br />
erstellt.<br />
Die Tests zeigten erneut das Zig-Zag mäßige Verhalten, obwohl das Pulspositionsmodulation-Signal<br />
bis zum Zehntel eines Winkelgrades gesteuert<br />
werden konnte.<br />
Das Zeichnen wurde mit unterschiedlichen Schrittweiten A Int und Geschwindigkeiten<br />
getestet. Hierbei wurde die Geschwindigkeit durch das Variieren der<br />
Zeitabstände zwischen den Sendevorgänge der USB-Nachrichten realisiert.<br />
Die Anwendung der Rampenfunktion glättet die Ecken geringfügig, die<br />
Amplitude des Zig-Zag Verhaltens bleibt dabei gleich.<br />
351
Kapitel 2. Implementation 10. Oktober 2013<br />
Es wurde herausgefunden, dass das Zittern des Roboterarms an der Fähigkeit<br />
des Servos die Stellung nach dem PPM Signal anzunehmen liegt. Die Beschaffenheit<br />
der Servos ist so, dass diese nicht in der Lage sind jede Winkelstellung<br />
anzunehmen. Eine tatsächliche Winkeländerung beim Servo erfolgt<br />
erst dann, wenn der Servo eine Stellung annehmen kann. So ignorieren<br />
einige Servos ihre Winkelstellung aus dem Winkelvektor, der durch die<br />
Rückwärtskinematik vorgegeben wird. Während dessen kann für einen anderen<br />
Servo zugleich eine annehmbare Winkelstellung aus dem Winkelvektor<br />
kommen. Dadurch erfolgt die Winkeländerung nicht bei allen Servos<br />
zu jedem Zeitpunkt der neuen Winkelstellung durch die Vorgabe des Pulspositionsmodulation-Signals.<br />
Damit entsteht ein Zeit verzögertes Bewegen<br />
der Servos, was die Zig-Zag artigen Mustern (das „Zittern“) verursachen.<br />
2.10.7.3 Ermittelter Arbeitsbereich für Skizze Zeichnen<br />
Der ermittelte Arbeitsbereich für den Anwendungsfall Skizze zeichnen ist<br />
wie folgt angegeben:<br />
In Anbetracht der Roboterstellung in Tests, wie in Abbildung 2.155 kann<br />
ein Rechteck, wie in Abbildung 2.158 gezeichnet werden.<br />
Dabei liegt der Zeichenbereich in der X-Z Ebene. Das heißt, dass Die Y-<br />
Dimension unverändert bleiben muss. Der Bereich zum Zeichnen eines<br />
Rechtecks (X, Z) liegt zwischen<br />
200.0, 25.0 (unten links) sowie 90.0, 120.0 (oben rechts)<br />
der in Python setzbaren Angaben.<br />
Dies entspricht einem durch ein Lineal auf dem Flipchart gemessenen<br />
Rechteck von 10x10 cm, wie in Abbildung 2.158 dargestellt ist.<br />
352
Kapitel 2. Implementation 10. Oktober 2013<br />
Der gesamte Zeichenbereich, wie er in Abbildung 2.160 zu sehen ist, wird<br />
im Folgenden angegeben:<br />
Abbildung 2.160: Koordinaten des Arbeitsbereichs<br />
Der Arbeitsbereich ohne Strategiewechslung wird durch die gelben Grenzen<br />
sowie durch folgenden Koordinaten {A, B, C, D} im Format (X, Z)<br />
aufgefasst:<br />
A: 226.5, 25.0; B: 90.0, 25.0<br />
C: 25.0, 240.0; D: 25.0, 120.0<br />
353
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10.8 Drehgelenk<br />
Zielsetzung dieses Arbeitspaketes ist die Ermittlung des Drehwinkels des<br />
Roboterarms anhand gewonnener Informationen aus der Bildverarbeitung<br />
über die Position des menschlichen Arms.<br />
Dieser Winkel wurde bisher noch nicht berechnet. Hierzu muss eine gänzlich<br />
andere Strategie erdacht werden, als bei der Erkennung der Winkelstellungen<br />
des restlichen Arms. Dies hat zwei Gründe. Zum Einen ist das<br />
Armgelenk ein Kugelgelenk mit mehr Freiheitsgraden als der Roboterarm<br />
und zum Anderen wird dieses Kugelgelenk durch zwei unabhängig<br />
voneinander ansteuerbare Servos am Roboteram repräsentiert. Dabei ist<br />
zu beachten, dass Bewegungen, welche diese zusätzlichen Freiheitsgerade<br />
nutzen, nicht vollständig vom Roboterarm nachgeahmt werden können.<br />
Zur Ermittlung des Drehwinkels des Schultergelenks werden die Bildinformationen<br />
und berechneten Schwerpunkte aus der für den Arm vorhandenen<br />
Bildverarbeitung, zur Erkennung der Armgelenkwinkel, verwendet.<br />
Erstellt wird das entwickelte Verfahren mit Hilfe der OFFIS-Automation-<br />
Toolbox und wird entsprechend in der Programmiersprache Python geschrieben.<br />
Im Folgenden wird zunächst die Implementierung inklusive entsprechender<br />
Lösungsstrategie erläutert. Danach werden die durchgeführten Testfälle<br />
aufgelistet gefolgt von den aufgetretenen Problemen. Zum Schluss<br />
wird die Dateistruktur der mit diesem Arbeitspaket erzeugten Dateien<br />
aufgeführt.<br />
2.10.8.1 Algorithmus<br />
Dieser Abschnitt erläutert die Strategie zur Berechnung des Drehwinkels<br />
des Schultergelenks, sodass dieser auf den Roboterarm abgebildet werden<br />
kann. Die zugehörigen Gleichungen und Annahmen werden ebenfalls<br />
aufgeführt und erklärt.<br />
Zunächst wird aus drei Punkten ein Dreieck gebildet, sodass eine Ebene<br />
aufgespannt werden kann, welche parallel zur Szene liegt. Dabei ist der<br />
Stützvektor gleich dem Schwerpunkt des Schultergelenks. Die fehlenden<br />
beiden Punkte werden durch virtuelle Punkte erzeugt, da davon ausgegangen<br />
wir, dass der Benutzer parallel zur Szene steht. Der erste virtuelle<br />
Punkt liegt unterhalb des Schultergelenks und der zweite in Richtung des<br />
Schlüsselbeins des Benutzers. Der erste ist somit in y-Richtung verschoben<br />
und der zweite in x-Richtung, siehe Abb. 2.161.<br />
354
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.161: Runde Punkte stehen für die virtuellen Punkte in der<br />
Szene. Diese werden relativ zum Schwerpunkt des Schultergelenks<br />
gesetzt.<br />
Mit Hilfe dieser Punkte und der vorhandenen Funktionen zur Erstellung<br />
einer Ebene aus einem Dreieck wird die orthogonal zur Szene stehende<br />
Ebene erzeugt. Dabei ist die Reihenfolge der Punkte wichtig, damit die<br />
Ebene durch das Schultergelenk und den ersten virtuellen Punkt geht,<br />
siehe Abb. 2.162.<br />
Abbildung 2.162: Zeigt das Dreieck welches auf die Ebene projiziert wird,<br />
damit der Winkel α mit Hilfe des Kosinissatzes berechnet<br />
werden kann.<br />
Da der menschliche Arm verschiedene Stellungen einnehmen kann, muss<br />
355
Kapitel 2. Implementation 10. Oktober 2013<br />
je nach Stellung entschieden werden, welches Gelenk im Weiteren betrachtet<br />
wird. Ziwschen dem entsprechenden Gelenk und der Ebene wird<br />
nun der kürzeste Abstand, siehe Gleichung 2.42, die orthogonal zur Ebene,<br />
berechnet.<br />
d =⃗r ·⃗n −⃗a ·⃗n (2.42)<br />
Dieser Abstand ist wichtig, um den Durchstoßpunkt durch die Ebene zu<br />
bestimmen. Um den Durchstoßpunkt auf der Ebene zu erhalten, reicht es<br />
in diesem Fall aus, den Abstand auf den Schwerpunkt des entsprechenden<br />
Gelenks zu addieren. Dies begründet sich in der Annahme, dass sich der<br />
Benutzer parallel zur Szene befindet und mit Hilfe der virtuellen Punkte<br />
eine korrekte Ebene erzeugt wurde. Das bedeutet, dass sich der Abstand<br />
von Punkt zu Ebene auf die x-Richtung abbilden lässt. Mit Hilfe dieses<br />
Punktes, des Schwerpunktes des Schultergelenks und des ersten virtuellen<br />
Punktes, lässt sich nun ein auf die Ebene projiziertes Dreieck erzeugen. Da<br />
alle Punkte bekannt sind, können die Längen der Seiten bestimmt werden.<br />
Mit Hilfe dieser Seitenlängen und des Kosinussatzes, siehe Gleichung 2.43,<br />
lässt sich nun der Winkel alpha bestimmen.<br />
a 2 = b 2 + c 2 − 2 · b · c cos α ⇒ α = cos −1 ( b2 + c 2 − a 2<br />
) (2.43)<br />
2 · b · c<br />
Um zu entscheiden welches Gelenk für die Berechnungen verwendet wird,<br />
wurden folgende Fallunterscheidungen ausgearbeitet.<br />
1. Arm ist an einem beliebigen Gelenk gekrümmt<br />
a) Schulter gedreht (z.B. Abb. 2.164)<br />
b) Ellenbogen gedreht (z.B. Abb. 2.163)<br />
c) Handgelenk gedreht<br />
2. Arm ist gerade (z.B. Abb. 2.161)<br />
Das Gelenk zum Drehen des Roboterarms entspricht der Drehung des<br />
menschlichen ausgestreckten Arms um seine eigene Achse. Dabei wird<br />
ein Winkel von 180 Grad abgedeckt. Ein nach oben ausgestreckter Arm<br />
entspricht einer Drehung von 180 Grad und ein nach unten ausgestreckter<br />
Arm einer Drehung von 0 Grad, siehe Abb. 2.163 sowie Abb. 2.164.<br />
356
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.163: Angewinkelter Arm. Resultierende Drehung des<br />
Roboterarms 180 Grad.<br />
Abbildung 2.164: Gestreckter Arm. Resultierende Drehung des Roboterarms<br />
180 Grad.<br />
357
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10.8.2 Implementierung<br />
Dieser Abschnitt beschreibt die verwendeten bzw. implementierten Funktionen<br />
zur Umsetzung des oben beschriebenen Algorithmus.<br />
Folgende Funktionen waren bereits existent und wurden extra verwendet<br />
und nicht abgeändert, da diese schon auf dem Microblaze portiert wurden.<br />
def calcAngleFromTriangle ( self , side ):<br />
Diese Funktion berechnet einen Winkel anhand eines Dreiecks, mit Hilfe<br />
des Cosinussatzes.<br />
def scalarProduct ( self , v1 , v2 ):<br />
Diese Funktion berechnet das Skalarprodukt zweier Vektoren.<br />
def crossProduct ( self , v1 , v2 ):<br />
Diese Funktion berechnet das Kreuzprodukt zweier Vektoren.<br />
def deriveHyperPlaneNormalForm ( self , linkPosition , a , b):<br />
Diese Funktion berechnet eine Ebene im Raum und gibt diese in der Normalform<br />
zurück.<br />
Bei der Implementierung des oben erläuterten Algorithmus sind folgende<br />
neue Funktionen enstanden:<br />
def __init__ ( self )<br />
In dieser Funktion werden die vorausgesetzen Winkel und Punkte global<br />
definiert.<br />
def shortestDistance ( self , point , plane )<br />
Diese Funktion berechnet den kürzesten Abstand von einem Punkt zu einer<br />
Ebene.<br />
def deriveIntersectionPointPlane ( self , point , plane )<br />
358
Kapitel 2. Implementation 10. Oktober 2013<br />
Diese Funktion liefert den Durchstoßpunkt zwischen einem beliebigen Punkt<br />
und einer Ebene. Dabei wird der Normalenvektor der Ebene als Richtungsvektor<br />
auf den Punkt gelegt und anschließend der Schnittpunkt zwischen<br />
Vektor und Ebene berechnet.<br />
def calculateTriangleLengths ( self , intersection )<br />
Diese Funktion berechnet anhand eines Schnittpunktes und globaler Hilfspunkte<br />
ein Dreieck in Form der drei Seitenlängen.<br />
def radianToDegree ( self , angle )<br />
Diese Funktion wandelt einen Winkel in Radiant zu einem Winkel in Grad<br />
um.<br />
def length3dVector ( self , vector )<br />
Diese Funktion berechnet die Länge eines Vektors in Form des Betrags<br />
eines Vektors.<br />
def vectorSubstraction ( self , vectorOne , vectorTwo )<br />
Diese zentrale Funktion berechnet aus den globalen Punkten und Winkeln<br />
(Voraussetzungen) den Drehwinkel, auch Alphawinkel genannt. Dies geschieht<br />
anhand der Krümmungsrichtung der verschiedenen Armgelenke, welche<br />
durch eine Fallunterscheiung berücksichtigt werden.<br />
2.10.8.3 Testfälle<br />
Zur Überprüfung der korrekten Funktionsweise des Algorithmus, wurden<br />
unter anderem folgende Testfälle durchgeführt:<br />
Test 1 (Arm komplett gerade)<br />
gamma = 180.0<br />
delta = 180.0<br />
betaCog = [100.0, 100.0, 100.0]<br />
gammaCog = [200.0, 100.0, 100.0]<br />
deltaCog = [500.0, 100.0, 100.0]<br />
tcp = [1250.0, 100.0, 100.0]<br />
Ergebnis:<br />
359
Kapitel 2. Implementation 10. Oktober 2013<br />
Arm streight, no change in Alpha<br />
Alpha = 0.0<br />
Test 2 (Nur Schultergelenk nach unten gedreht)<br />
gamma = 180.0<br />
delta = 180.0<br />
betaCog = [100.0, 100.0, 100.0]<br />
gammaCog = [200.0, 200.0, 100.0]<br />
deltaCog = [400.0, 400.0, 100.0]<br />
tcp = [500.0, 500.0, 100.0]<br />
Ergebnis:<br />
Arm not streight, checking subcases..<br />
Shoulder-joint is bent<br />
Alpha = 0.0<br />
Test 3 (Nur Ellenbogengelenk ist nach unten gebeugt)<br />
gamma = 270.0<br />
delta = 180.0<br />
betaCog = [100.0, 100.0, 100.0]<br />
gammaCog = [200.0, 100.0, 100.0]<br />
deltaCog = [400.0, 200.0, 100.0]<br />
tcp = [800.0, 400.0, 100.0]<br />
Ergebnis:<br />
Arm not streight, checking subcases..<br />
Elbow-joint is bent<br />
Alpha = 0.0<br />
Test 4 (Nur Handgelenk ist nach unten gebeugt)<br />
gamma = 180.0<br />
delta = 270.0<br />
betaCog = [100.0, 100.0, 100.0]<br />
gammaCog = [200.0, 100.0, 100.0]<br />
deltaCog = [400.0, 100.0, 100.0]<br />
tcp = [800.0, 200.0, 100.0]<br />
Ergebnis:<br />
Arm not streight, checking subcases..<br />
Hand-joint is bent<br />
360
Kapitel 2. Implementation 10. Oktober 2013<br />
Alpha = 0.0<br />
Test 5 (Kombination, schräg vorne)<br />
gamma = 180.0<br />
delta = 180.0<br />
betaCog = [50.0, 50.0, 50.0]<br />
gammaCog = [75.0, 75.0, 25.0]<br />
deltaCog = [100.0, 100.0, 0.0]<br />
tcp = [125.0, 135.0, 0.0]<br />
Ergebnis:<br />
Arm not streight, checking subcases..<br />
Shoulder-joint is bent<br />
Alpha = 45.00000000000026<br />
Test 6 (Kombination)<br />
gamma = 270.0<br />
delta = 180.0<br />
betaCog = [50.0, 50.0, 50.0]<br />
gammaCog = [75.0, 50.0, 50.0]<br />
deltaCog = [75.0, 25.0, 25.0]<br />
tcp = [75.0, 12.0, 12.0]<br />
Ergebnis:<br />
Arm not streight, checking subcases..<br />
Elbow-joint is bent<br />
Alpha = 134.99999999999974<br />
Test 7 (Arm frontal nach vorne)<br />
gamma = 270.0<br />
delta = 180.0<br />
betaCog = [50.0, 50.0, -50.0]<br />
gammaCog = [75.0, 50.0, 0.0]<br />
deltaCog = [75.0, 25.0, 0.0]<br />
tcp = [75.0, 12.0, 0.0]<br />
Ergebnis:<br />
Arm not streight, checking subcases..<br />
Shoulder-joint is bent<br />
Alpha = 89.99999999999974<br />
361
Kapitel 2. Implementation 10. Oktober 2013<br />
Test 8 (Handgelenk geknickt)<br />
gamma = 180.0<br />
delta = 90.0<br />
betaCog = [50.0, -50.0, 0.0]<br />
gammaCog = [50.0, -60.0, 0.0]<br />
deltaCog = [50.0, -70.0, 0.0]<br />
tcp = [100.0, -70.0, 0.0]<br />
Ergebnis:<br />
Arm not streight, checking subcases..<br />
Hand-joint is bent<br />
Alpha = 180.0<br />
Test 9 (wie Test 8, nur mit geändertem TCP)<br />
tcp = [100.0, -70.0, 10.0]<br />
Ergebnis:<br />
Arm not streight, checking subcases..<br />
Hand-joint is bent<br />
Alpha = 153.43494882292217<br />
Test 10 (wie Test 8, nur mit geändertem TCP)<br />
tcp = [100.0, -70.0, 25.0]<br />
Ergebnis:<br />
Arm not streight, checking subcases..<br />
Hand-joint is bent<br />
Alpha = 128.65980825409036<br />
2.10.8.4 Probleme<br />
Dieser Abschnitt erläutert die aufgetretenen Probleme welche während der<br />
Ermittlung der Strategie sowie während der Implementierung aufgetretene<br />
sind. Bei der Strategie war zu beachten, dass der Roboterarm weniger Freiheitsgrade<br />
als der menschliche Arm hat. Somit lassen sich nicht alle Armstellungen<br />
auf den Roboterarm abbilden.<br />
Desweiteren konnte mit den vorhandenen Punkten keine Ebene konstruiert<br />
werden, welche orthogonal zur Szene steht. Damit dies möglich ist,<br />
musste ein zusätzlicher virtueller Punkt zur Szene hinzugefügt werden.<br />
Dieser befindet sich in Richtung des Schlüsselbeins des Benutzers. Dies<br />
362
Kapitel 2. Implementation 10. Oktober 2013<br />
ist notwendig, damit drei Punkte zur Verfügung stehen. Ohne diese drei<br />
Punkte ist es nicht möglich eine eindeutige Ebene aufzuspannen.<br />
Bei der Verwendung des Systems durch den Benutzer muss darauf geachtet<br />
werden, dass dieser orthogonal zur Szene stehen muss. Sollte dieser nicht<br />
orthogonal zur Szene stehen, so müssen die virtuellen Hilfspunkte entsprechend<br />
angepasst werden. Alternativ könnte das System erweitert werden. Hierzu<br />
wären zusätzlichen Markierung an den entsprechenden Stellen am<br />
Benutzer notwendig.<br />
2.10.8.5 Dateistruktur<br />
Dieser Abschnitt beschreibt die in diesem Teilpaket entstandenen Dateien.<br />
• offis-toolbox/projects/shoulderAngleDetection/ShoulderJoint.opa und<br />
ogr: Allen relevanten Dateien für das entsprechende OFFIS-Automation-<br />
Toolbox-Projekt.<br />
• offis-toolbox/projects/shoulderAngleDetection/main.py: Hauptdatei<br />
in der die Klasse ShoulderJoint definiert ist und entsprechend verschiedene<br />
Testfälle getestet werden können.<br />
• offis-toolbox/projects/shoulderAngleDetection/ShoulderJoint.py: Klasse<br />
in der die Realisierung der Ermittelung des Winkels des Schultergelenks<br />
(Drehwinkel) implementiert ist.<br />
• offis-toolbox/projects/shoulderAngleDetection/tests.txt: Datei mit den<br />
durchgeführten Testfällen und den entsprechenden Ergebnissen.<br />
363
Kapitel 2. Implementation 10. Oktober 2013<br />
2.10.9 Referenztakt für den cam_bootloader<br />
In diesem Arbeitspaket soll der bestehende cam_bootloader IP-Core derart<br />
geändert werden, dass ein fest bestimmter Referenztakt angelegt werden<br />
muss. Dieser Takt soll ermöglichen, dass die Parameter N und M des<br />
Treibers camcfg fest gewählt werden können.<br />
2.10.9.1 Modizierter cam_bootloader<br />
Der cam_bootloader IP-Core bekommt von uns ein zusätzlichen Eingangspin,<br />
welcher Boardunabhängig die gleiche Taktrate angelegt bekommen<br />
soll. Der IP-Core benutzt im folgenden diesen Pin als Taktgeber für die<br />
Kameras. Zusätzlich wurde ein TCL-Skript geschrieben, welches überprüft,<br />
ob an diesen Pin die korrekte Taktrate von 50MHz angelegt wurde.<br />
Blockschaltbild<br />
PLB Bus<br />
pclk (50MHz)<br />
cam_bootloader<br />
vdd_en<br />
mclk1<br />
mclk2<br />
reset1<br />
reset2<br />
pwdn1<br />
pwdn2<br />
PLB Bus<br />
Abbildung 2.165: Blockschaltbild des geänderten cam_bootloader<br />
Treiber API<br />
Die API des “camcfg” Treiber wurde wie folgt verändert:<br />
1 enum CAM_SPEED {<br />
2 CAM_SPEED_75_MHZ = (1
Kapitel 2. Implementation 10. Oktober 2013<br />
Dieser Enum stellt korrekte Werte für N und M dar. N und M sind Werte<br />
dafür, wie schnell die Kameras getaktet werden.<br />
void reset ( CAM_SPEED speed = CAM_SPEED_75_MHZ );<br />
Die Arbeitsweise dieser Methode hat sich im Vergleich zur ursprünglich<br />
Version nicht geändert. Hinzugekommen ist jedoch, das N und M nicht<br />
mehr direkt angegeben werden müssen, sondern ein enum bereitgestellt<br />
ist. Weiterhin kann diese Methode auch ohne Parameter aufgerufen werden,<br />
so dass automatisch ein Standardwert gesetzt wird.<br />
Probleme<br />
• Der “clock_generator” IP-Core des ATLYS kann die am besten geeigneten<br />
Taktraten nicht herausgeben, wenn gleichzeitig ein 75MHz Takt benötigt<br />
wird.<br />
Dateistruktur<br />
Die Dateistruktur von Treiber und IP-Core blieb mit Außnahme des TCL-<br />
Skripts unverändert:<br />
• pcores/cam_bootloader_v1_00_a/data/cam_bootloader_v2_1_0.tcl - TCL-<br />
Skript für die MPD-Datei<br />
2.10.10 Fazit und Ausblick<br />
Fast alle gesetzten Ziele des Sprint Ziele wurden erfolgreich erreicht. Die<br />
3D Armerkennung wurde portiert, jedoch weichte das Verhalten auf dem<br />
Microblaze von dem in Python programmierten Algorithmus ab. Der Softwareprototyp<br />
für die Trajektorienführung wurde für die zweidimensionale<br />
Ebene umgesetzt. Da die Trajektorienführung vor allem für den Anwendungsfall<br />
Sizze zeichnen erstellt wurde, reichte es den Softwareprototyp für<br />
die zweidimensionale Anwendung zu erstellen. Dieser ist auf dreidimensionale<br />
Anwendungen erweiterbar. Die übrigen geplanten Arbeitspakete<br />
wurden erfolgreich und vollständig umgesetzt. Die Untersuchung des Zig-<br />
Zag Verhaltens beim Zeichnen ergab, dass die sehr kleine und ungenaue<br />
Auflösung der Servos sowie der instabile Aufbau des Roboterarms der<br />
365
Kapitel 2. Implementation 10. Oktober 2013<br />
Grund für solches Verhalten ist. Eine bessere Roboterarm-Hardware würde<br />
diesem Problem entgegen wirken. Das Zeichenbereich wurde durch Verbesserung<br />
der Kinematik auf 10 · 10 cm verbessert. Des Weiteren wird ein neuer Sprint<br />
geplant, in dem die Integration der vorhandenen, Entwicklung der neuen<br />
Komponenten, sowie der Bau des neuen Roboterarms erfolgen soll.<br />
366
Kapitel 2. Implementation 10. Oktober 2013<br />
2.11 Sprintplanung Sprint 7<br />
In diesem Sprint wird der Akzent auf die Integration der Komponenten<br />
für Steuerung sowie die Entwicklung der neuen Komponenten für den<br />
Anwendungsfall Skizze Zeichnen gesetzt. Außerdem wird in diesem Sprint<br />
der neue Roboterarm schrittweise designet und gebaut. Hierzu werden die<br />
Teile des Roboters in CAD designet und mit Hilfe einer Erodier-Maschine<br />
erstellt.<br />
Die Integration umfasst die Portierung der vorhandenen OFFIS-Automation-<br />
Toolbox-Plugins für die Kinematik und die alternative Gestensteuerung auf<br />
den Microblaze. Damit sollen die Kinematik sowie die alternative Gestensteuerung<br />
ohne Computer laufen.<br />
Die Entwicklung der Komponenten für den Anwendungsfall Skizze zeichnen<br />
umfasst die Vektorisierung einer durch die Kamera aufgenommenen<br />
Person sowie die Entwicklung der neuen Kinematik. Dabei wird die Kinematik<br />
für den neuen Roboterarm entwickelt, sodass sie bei der Fertigstellung<br />
des neuen Roboterarms bereits eingesetzt werden kann. Die Vektorisierung<br />
soll als OFFIS-Automation-Toolbox-Plugin realisiert werden,<br />
damit sie später mit der direkten Ansteuerung des Roboterarms integriert<br />
wird.<br />
2.11.1 Portierung der Kinematik<br />
Vorbedingungen<br />
• Kinematik Code<br />
Arbeitspaketbeschreibung<br />
Ziel dieses Arbeitspaketes ist die Portierung der Kinematik. Dabei soll die<br />
momentan in der OFFIS-Automation-Toolbox laufende Programmlogik derart<br />
geändert werden, dass sie auf dem Microblaze ausführbar ist. Um dies<br />
zu erreichen wird in einem ersten Schritt die Programmlogik in der OFFIS-<br />
Automation-Toolbox behalten, jedoch nicht auf dem Microblaze ausführbaren<br />
Programmteile ersetzt. Zu den nicht ausführbaren Programmteilen gehören<br />
zum Einen verwendete Bibliotheken wie Qt und zum Anderen Datenformate<br />
welche der Microblaze nicht verwenden kann wie doubles.<br />
Aufwand<br />
• 8 PT Portierung<br />
367
Kapitel 2. Implementation 10. Oktober 2013<br />
• 4 PT Integration<br />
Lieferumfang<br />
• Portierter C++ Quelltext für den Microblaze<br />
• Testprojekt zur Verifizierung<br />
368
Kapitel 2. Implementation 10. Oktober 2013<br />
2.11.2 Portierung der alternativen Gestensteuerung<br />
Vorbedingungen<br />
• Programmquelltext der Alternativen Gestensteuerung<br />
• BlobDetection Treiber<br />
• portierte Kinematik<br />
Arbeitspaketbeschreibung<br />
Ziel dieses Arbeitspaketes ist die Portierung der alternativen Gestensteuerung.<br />
Dabei soll die momentan in der OFFIS-Automation-Toolbox laufende Programmlogik<br />
derart geändert werden, dass sie auf dem Microblaze ausführbar<br />
ist. Dabei müssen die Python-Skripte in C++ Dateien übersetzt<br />
werden.<br />
Aufwand<br />
• 2 PT Portierung<br />
• 2 PT Integration<br />
Lieferumfang<br />
• Portierter C++ Code für den Microblaze<br />
• Testprojekt zur Verifizierung<br />
369
Kapitel 2. Implementation 10. Oktober 2013<br />
2.11.3 Integration der Komponenten zum Demonstrator<br />
Armhaltung nachahmen<br />
Vorbedingungen<br />
• Einzelkomponenten in Form von IP-Core für Hardware<br />
• Treiber der IP-Core für den Microblaze<br />
Arbeitspaketbeschreibung<br />
Ziel dieses Arbeitespaketes ist es die Integration aller nötigen Komponenten<br />
vorzunehmen für den Anwendungsfall Ärmhaltung nachahmen".<br />
Dazu wird die bereits erstellte doppelte Bildverarbeitungskette und die<br />
Ansteuerung der Servomotoren in einem Projekt integriert, sowie die Ausgabe<br />
der Aufnahmen über ein HDMI fähiges Display. Dazu werden die<br />
benötigten Hardwarekomponenten in einem Aufbau auf dem Atlys-Entwicklungsboard<br />
untergebracht.<br />
Die Ansteuerung der Komponenten erfolgt über Software die auf dem Microblaze<br />
laufen wird. Dazu werden bestehende Treiber und Algorithmen<br />
zu einem Programm vereint. Anschließend wird ermittelt ob die Laufzeiten<br />
der Software den Anforderungen entsprechen.<br />
Aufwand<br />
• 1W (4 PT) Integration der Hardware Komponenten<br />
• 1W (4 PT) Integration der nötigen Treiber, sowie weiterer Software<br />
Algorithmen<br />
• 1W (4 PT) Dokumentation sowie Geschwindigkeitsanalyse<br />
Lieferumfang<br />
• ATLYS-Projekt das den Anwendungsfall Ärmhaltung nachahmenërfüllt<br />
und die gestzten Anforderungen erfüllt.<br />
370
Kapitel 2. Implementation 10. Oktober 2013<br />
2.11.4 Kinematik für neuen Roboterarm<br />
Vorbedingungen<br />
• OFFIS-Automation-Toolbox<br />
• OFFIS-Automation-Toolboxplugin für Trajektorienführung mit Python-<br />
Schnittstellen<br />
Arbeitspaketbeschreibung<br />
Ziel dieses Arbeitspakets ist die Vor- sowie Rückwärtskinematik für den<br />
neuen Roboterarm zu entwickeln. Die Vorwärtskinematik soll die Position<br />
des Tool-Center-Point bezüglich des Weltkoordinatensystems des Roboters<br />
je nach Stellung der Gelenkwinkeln liefern. Die Rückwärtskinematik soll<br />
als Eingabe die Pose (Position und Ausrichtung) bekommen und eine Lösungsmenge<br />
im Sinne von Winkelvektoren liefern. Als Demonstrator wird<br />
ein Pythonscript erstellt, das die Schnittstellen der neuen Kinematik über<br />
OFFIS-Automation-Toolbox bereitstellt.<br />
Personen<br />
• Vitaliy Beguchiy<br />
Aufwand<br />
• 4PT - Kinematische Beschreibung der Roboterkonfiguration und Entwicklung<br />
der Vorwärtskinematik<br />
• 4PT - Implementierung der Vorwärtskinematik<br />
• 12PT - Spezifikation und Implementierung der Rückwärtskinematik<br />
Lieferumfang<br />
• OFFIS-Automation-Toolboxplugin mit Pythonschnittstellen<br />
• OFFIS-Automation-Toolboxprojekt (Pythonscript) als Demonstrator<br />
Deadlines<br />
• 24.07.2013 12:00 Implementierung der Vorwärtskinematik<br />
• 07.08.2013 12:00 Implementierung der Rückwärtskinematik<br />
371
Kapitel 2. Implementation 10. Oktober 2013<br />
2.11.5 Anbindung des Grauwertlters an den PLB<br />
Vorbedingungen<br />
• RGB2Grey IP-Core<br />
Arbeitspaketbeschreibung<br />
Ziel dieses Arbeitspaketes ist den gewichteten Grauwertfilter an den PLB<br />
anzubinden. Dies soll es ermöglichen zur Laufzeit die gewichtetet Farbe<br />
auf dem Microblaze einzustellen. Dadurch kann die selbe Hardwarekonfiguration<br />
für mehrere Anwendungsfälle verwendet werden.<br />
Aufwand<br />
• 1W (4 PT) Anbindung des RGB2Grey IP-Core an den PLB<br />
Lieferumfang<br />
• ATLYS-Projekt, das den Anwendungsfall „Armhaltung nachahmen“<br />
sowie die gesetzten Anforderungen erfüllt.<br />
372
Kapitel 2. Implementation 10. Oktober 2013<br />
2.11.6 Vektorisieren eines Portraits<br />
Vorbedingungen<br />
• OFFIS-Automation-Toolbox<br />
• Windows 7 Plattform<br />
Arbeitspaketbeschreibung<br />
Ziel dieses Arbeitespaketes ist die Vektorisierung eines mit der OFFIS-<br />
Automation-Toolbox aufgenommen Bildes einer Person. Dieses Bild soll<br />
mit Hilfe von Software, welche auf einem Windows 7 PC läuft, automatisiert<br />
in ein Vektorgrafikformat konvertiert werden. Das Quellbild ist ein<br />
Farbbild, das von einer Webcam aufgezeichnet wird sowie in ein schwarz<br />
weiß Vektorgrafikformat übertragen werden soll. Dabei ist zwischen den<br />
vorhanden Formaten abzuwegen.<br />
Aufwand<br />
• 1W (2 PT) Recherche und Evaluierung vorhandener Lösungen<br />
• 1W (2 PT) Erstellen eines Bildvektorisierungsprozesses<br />
Lieferumfang<br />
• Eine OFFIS-Automation-Toolbox Plugin für das erstellen einer Vektorgrafik<br />
373
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12 Sprint 7<br />
Im Folgenden werden die Ergebnisse der Planung sowie der Umsetzung<br />
der einzelnen Arbeitspakete ausführlich vorgestellt.<br />
2.12.1 Portierung der Kinematik<br />
Ziel dieses Arbeitspaketes ist die Portierung der Kinematik. Dabei soll die<br />
momentan in der OFFIS-Automation-Toolbox laufende Programmlogik derart<br />
geändert werden, dass sie auf dem Microblaze ausführbar ist. Um dies<br />
zu erreichen wird in einem ersten Schritt die Programmlogik in der OFFIS-<br />
Automation-Toolbox behalten, jedoch nicht auf dem Microblaze ausführbaren<br />
Programmteile ersetzt. Zu den nicht ausführbaren Programmteilen gehören<br />
zum Einen verwendete Bibliotheken wie Qt und zum Anderen Datenformate,<br />
welche der Microblaze nicht verwenden kann, wie doubles.<br />
2.12.1.1 Durchgeführte Änderungen<br />
1. Includes Aufräumen<br />
2. Alle Vorkommen von QMatrix4x4 durch Matrix4x4 ersetzten<br />
3. Alle Vorkommen von QVector[234]D durch Vector[234]D ersetzten<br />
4. Alle Vorkommen von QVector und QList durch std::vector ersetzten<br />
5. Matrix4x4 und Vector[234]D implementieren (Programmquelltext aus<br />
Qt übernehmen)<br />
6. QSettings Verwendung durch struct mit Konstanten ersetzten<br />
7. Alle Vorkommen von double durch float ersetzten<br />
8. Alle double verwendeten-Funktionen (sqrt, sin, cos, ...) durch float Varianten<br />
ersetzten<br />
9. Alle Vorkommen von printf durch pg_printf ersetzten, welches per<br />
Präprozessor gesetzt werden kann<br />
10. Testen des Programmquelltextes in der Toolbox und auf dem Microblaze<br />
374
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.1.2 Dateistruktur<br />
Die folgenden Dateien wurden für die Portierung angelegt oder Verändert.<br />
Das Basisverzeichnis ist offis-toolbox.git/plugins/automation/RoboArm/.<br />
Diese Dateien können desweiteren direkt in ein Microblaze-Projekt kopiert<br />
und verwendet werden.<br />
• Link.h<br />
Meta-Informationen zur Link-Klasse<br />
• Link.cpp<br />
Klasse welche Informationen über ein Verbindungselement des Roboterarms<br />
liefert<br />
• InverseKinematic.h<br />
Meta-Informationen für die Rückwärtskinematik<br />
• InverseKinematic.cpp<br />
Implementierung der Rückwärtskinematik<br />
• KinematicChain.h<br />
Meta-Informationen für die Vorwärtskinematik<br />
• KinematicChain.cpp<br />
Implementierung der Vorwärtskinematik<br />
• config.h<br />
Enthält die Meta-Informationen für die Konfiguration<br />
• config.cpp<br />
Enthält die Link-Konfiguration des Roboterarms<br />
• vector.h<br />
Enthält die Definition und Implementierung von Vector[234]D<br />
• matrix.h<br />
Enthält die Definition und Implementierung von Matrix4x4<br />
• xilinx_foo.h<br />
Enthält Präprozessor-Definitionen für pg_printf<br />
375
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.2 Portierung der alternativen Gestensteuerung<br />
Ziel dieses Arbeitspaketes ist die Portierung der alternativen Gestensteuerung.<br />
Dabei soll die momentan in der OFFIS-Automation-Toolbox laufende Programmlogik<br />
derart geändert werden, dass sie auf dem Microblaze ausführbar<br />
ist. Dabei müssen die Python-Skripte in C++ Dateien übersetzt<br />
werden. Weiterhin soll ein Demonstrator aufgebaut werden, welcher die<br />
alternative Gestensteuerung umsetzt. Dies bedeutet, dass eine komplette<br />
Kette von der Kamera bis zur Kinematik zusammenspielt.<br />
2.12.2.1 Umstellung des Graustufenlters auf mehrere Farben<br />
In seiner bisherigen Form hat der gewichtete Graustufenfilter immer den<br />
roten Kanal als größtes Gewicht genommen. Da die alternative Gestensteuerung<br />
aber auch auf einen gewichteten Grünkanal angewiesen ist, wurde<br />
dieser IP-Core angepasst, so dass durch einen Generic die Farbe der Gewichtung<br />
einstellbar ist. Am Quelltext wurde dabei nichts geändert, es wurden<br />
lediglich einige Variablen hinzugefügt um auf den Generic reagieren zu<br />
können.<br />
2.12.2.2 Probleme<br />
Die portierte Version der alternativen Gestensteuerung muss die BLOB-<br />
Detection wesentlich anders ansprechen, als es der Pythonquelltext kann.<br />
Dies führte zu Problemen im zeitlichen Ablauf, was korrigiert werden konnte.<br />
Die Integration der benötigten Komponenten hat sehr viel Zeit benötigt,<br />
da das XPS viele Probleme bereitete. Hierzu gehörte unter Anderem eine<br />
Anpassung des Speed Grade von -2 auf -3, damit das Timing stimmte. Der<br />
Graustufenfilter musste auf mehrere Farben angepasst werden.<br />
2.12.2.3 Dateistruktur<br />
Die folgenden Dateien wurden für die Portierung angelegt. Das Basisverzeichnis<br />
ist microblazecode.git/alternative_gestensteuerung/. Das in diesem<br />
Verzeichnis enthaltene Projekt kann als Demonstrator verwendet werden.<br />
Das zugehörige XPS-Projekt befindet sich im Branch alternative_gestensteuerung<br />
des gits atlys.git/.<br />
• magic.h<br />
Meta-Informationen zur alternativen Gestensteuerungs-Klasse<br />
376
Kapitel 2. Implementation 10. Oktober 2013<br />
• magic.cpp<br />
Klasse, welche die komplette Alternative Gestensteuerung enthält.<br />
Die Methode main beinhaltet die Logik.<br />
• main.cc<br />
Enthält ein Beispiel zur Verwendung der alternativen Gestensteuerung<br />
377
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.3 Kinematik für neuen Roboterarm<br />
Ziel dieses Arbeitspakets ist die Vor- sowie Rückwärtskinematik für den<br />
neuen Roboterarm zu entwickeln. Die Vorwärtskinematik soll die Position<br />
des Tool-Center-Point bezüglich des Weltkoordinatensystems des Roboters<br />
je nach Stellung der Gelenkwinkeln liefern. Die Rückwärtskinematik soll<br />
als Eingabe die Pose (Position und Ausrichtung) bekommen und eine Lösungsmenge<br />
im Sinne von Winkelvektoren liefern. Als Demonstrator wird<br />
ein Pythonscript erstellt, das die Schnittstellen der neuen Kinematik über<br />
OFFIS-Automation-Toolbox bereitstellt.<br />
Vorbedingungen<br />
• OFFIS-Automation-Toolbox<br />
• OFFIS-Automation-Toolboxplugin für Trajektorienführung mit Pythonschnittstellen<br />
Lieferumfang<br />
• OFFIS-Automation-Toolboxplugin mit Pythonschnittstellen<br />
• Pythonscript als Demonstrator<br />
378
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.3.1 Umstellung der Entwicklungsstrategie<br />
Die Spezifikation des neuen Roboterarms beruht auf dem Modell des Puma-<br />
Roboters (Siehe Kapitel 2.10.4.2). Nach dem die ersten Analyseschritte der<br />
herkömmlichen Entwicklung der Kinematik gemacht wurden (Festlegung<br />
der Koordinatensysteme für jedes Segment sowie Aufstellung der Denavit<br />
Hartenberg-Tabelle) war die Gruppe auf die quelloffene Software Open-<br />
RAVE gestoßen. Da sich im Sprint 2 die Entwicklung der Kinematik als<br />
ein sehr zeitaufwändiger Prozess erwiesen hat, wurde durch die Gruppe<br />
beschlossen dieses Werkzeug zu benutzen, da es eine vollständige Berechnung<br />
der Vor- und Rückwärtskinenmatik übernehmen kann. Außerdem ist<br />
das Werkzeug in der Lage, eine komplett eigenständig lauffähige Anwendung<br />
in Form eines C++ Quelltextes zu generieren.<br />
Im Team wurde beschlossen statt eines kompletten Entwurfs der Kinematik<br />
die Zeit in die Einarbeitung in das Werkzeug OpenRAVE zu investieren.<br />
Damit wurden die konkreten Ziele (Teilaufgaben) dieses Arbeitspakets<br />
entsprechen geändert:<br />
• Einarbeitung in das Werkzeug OpenRAVE (Einrichtung, Nutzung,<br />
Codegenerierung)<br />
• Einarbeitung in das OpenRAVE konforme XML-Format für Modellierung<br />
der Roboter<br />
• Modellieren des neuen Roboterarms im OpenRAVE<br />
• Erstellung des neuen Kinematik-Plugins (Implementierung der Schnittstellen<br />
für die Benutzung der Kinematik)<br />
• Integration der generierten Programm in das eigene Projekt (Einarbeitung<br />
in die Schnittstellen des generierten Quelltextes)<br />
• Validierung des integrierten Programms<br />
Da bei der Einarbeitung nicht absehbare Probleme entstehen können, wurde<br />
eine Zeit von vier Wochen plus zwei Wochen Puffer für das Arbeitspaket<br />
geplant.<br />
2.12.3.2 Vorwärtskinematik<br />
Zur Beschreibung der Kinematik werden zunächst die Winkel der Gelenke<br />
definiert. Die Zuordnung der Winkelnamen zu Gelenken ist in Abbildung<br />
2.166 dargestellt.<br />
379
Kapitel 2. Implementation 10. Oktober 2013<br />
180°<br />
0°<br />
γ<br />
180°<br />
ζ<br />
0°<br />
ε<br />
180°<br />
0°<br />
180°<br />
δ<br />
0°<br />
β<br />
0°<br />
0°<br />
⍺<br />
180°<br />
180°<br />
Abbildung 2.166: Kinematische Konfiguration des neuen Roboarms<br />
Die schwarzen Pfeile in Abbildung 2.166 stellen die Arbeitsbereiche und<br />
damit auch die Einschränkungen jedes einzelnen Gelenks dar.<br />
Da nach der Entscheidung der Gruppe die Vor- sowie Rückwärtskinematik<br />
aus dem OpenRAVE-Modell generiert werden soll, wurde zunächst das<br />
spezifizierte Modell aus Abbildung 2.166 im XML-Format umgesetzt.<br />
In Abbildung 2.167 ist das Ergebnis der Modellierung des neuen Roboterarm<br />
im OpenRAVE konformen XML-Format dargestellt.<br />
Die generierte C++ Datei für Kinematik ergibt ein eigenständiges Programm,<br />
das auch ohne ihre main-Methode als Programmbibliothek nutzbar<br />
ist. Diese bekommt einen validen Winkelvektor als Eingabe und liefert die<br />
Position und die Orientierungsmatrix des Tool-Center-Point zurück. Die<br />
Schnittstellen werden im Abschnitt 2.12.3.4 ausführlicher erklärt.<br />
2.12.3.3 Rückwärtskinematik<br />
Die Rückwärtsberechnung aus Position und Ausrichtung des Endeffektors<br />
(Tool-Center-Point) auf mögliche Winkelvektoren wurde ebenso aus dem in<br />
Abbildung 2.167 dargestellten Modell generiert. Das ist dieselbe C++ Datei,<br />
welche auch für die Rückwärtskinematik eine Schnittstelle bereitstellt. Als<br />
Eingabe bekommt diese Position des Tool-Center-Point und seine Orientierungsmatrix<br />
als Ausrichtung. Zurückgeliefert werden entweder mehrere<br />
Lösungen als Winkelvektoren oder keine Lösung, falls die eingegebene<br />
380
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.167: Modell des neuen Roboarm in OpenRAVE<br />
Kombination aus Position und Ausrichtung außerhalb des theoretisch erreichbaren<br />
Bereich des Roboters liegt. Anmerkung: diese Lösungen beachten<br />
nicht die gegebenen Winkeleinschränkungen.<br />
2.12.3.4 OFFIS-Automation-Toolboxplugin für neue Kinematik<br />
Da das generierte C++ Programm nicht die in dem Projekt RoboArm definierten<br />
Schnittstellen für die Kinematik bereitstellt, wurde das OFFIS-Automation-<br />
Toolboxplugin als Wrapper um das generierten Programm erstellt. Damit<br />
konnte die Kinematik getestet und in das Projekt eingebunden werden.<br />
Die generierte Rückwärtskinematik benötigt als Eingabe Rotationsmatrix<br />
und Ortsvektor der zu erreichenden Ausrichtung und Position. Da diese<br />
vom Benutzer nicht leicht auszurechnen sind, wird im Wrapper eine Umrechnung<br />
von Ausrichtung und Position in diese Parameter vorgenommen.<br />
Dabei beinhaltet die Rotationsmatrix die Drehungen um alle Koordinatenachsen.<br />
Schnittstelle Plugin<br />
Folgende Schnittstellen stellt das OFFIS-Automation-<br />
Toolboxplugin für die Nutzung im Projekt RoboArm bereit:<br />
381
Kapitel 2. Implementation 10. Oktober 2013<br />
1 QList < double > getTCP_ByModelAngleValues ( RcRepeatable < double<br />
, 1, 6> angles );<br />
Diese Methode liefert die Position des Tool-Center-Point als Werteliste (x,<br />
y, z) zurück. Der Eingabeparameter ist ein sechsstelliger Winkelvektor in<br />
Radianten für die sechs Gelenke des Roboterarms (α, β, γ, δ, ɛ, λ) im Sinne<br />
von den durch OpenRAVE verwendeten Winkel.<br />
1 QList < double > getTCP_ByServoHardwareAngleValues (<br />
RcRepeatable < double , 1, 6> angles );<br />
Diese Methode liefert die Position des Tool-Center-Point als Werteliste (x,<br />
y, z) zurück. Der Eingabeparameter ist ein sechsstelliger Winkelvektor in<br />
Radianten für die sechs Gelenke des Roboterarms (α, β, γ, δ, ɛ, λ)im Sinne<br />
von Winkelwerten der Servos.<br />
1 QList < double > getAngleVectorModelValues ( double xP , double<br />
yP , double zP , double xO , double yO , double zO );<br />
Diese Methode gibt eine Liste der Winkelvektoren im OpenRAVE konformen<br />
Format zurück. Die Winkelvektoren sind die berechneten Lösungen,<br />
die als aneinander gehängte Listen (immer genau sechs Werte) zusammengefasst<br />
sind. Beispiel: gibt es nur eine Lösung, dann ist die Länge der<br />
Rückgabeliste genau sechs. Bei zwei Lösungen ist die Länge 12 und bei n<br />
Lösungen ist die Rückgabeliste von der Länge 6 · n. Wenn keine Lösung<br />
gefunden werden kann, wird eine leere Liste zurückgegeben.<br />
Die ersten drei Eingabeparameter stehen für die Position des Tool-Center-<br />
Point im dreidimensionalen Raum und die anderen drei Parameter stehen<br />
für die Orientierung im Raum im Sinne von separaten Drehungen um die<br />
jeweiligen Koordinatenachsen (X, Y, Z) des Weltkoordinatensystems. Die<br />
Drehwinkel werden in Radiant im Bereich von −π bis π angenommen.<br />
1 QList < double > getAngleVectorMappedToHardware ( double xP ,<br />
double yP , double zP , double xO , double yO , double zO );<br />
Diese Methode setzt die gleiche Funktionalität um, wie die getAngleVector-<br />
ModelValues. Jedoch liefert diese Methode die auf die Hardware abgebildeten<br />
Winkelwerte.<br />
1 QList < double > getOptimalSolution ( RcRepeatable < double , 1, 6><br />
currentAngleVector , RcRepeatable < double ,0 ,48 ><br />
solutionsAngleVector );<br />
Diese Methode implementiert die Kostenfunktion. Die Ausgabe dieser Methode<br />
ist ein Winkelvektor. Die Eingabe der Methode sind zum Einen der<br />
Winkelvektor der aktuellen Stellung und zum Anderen eine Lösungsmenge<br />
von Winkelvektoren. Die Methode wählt aus den Eingabewinkelvektoren<br />
382
Kapitel 2. Implementation 10. Oktober 2013<br />
denjenigen, welcher am Wenigsten vom aktuellen Winkelvektor im Sinne<br />
der Kostenfunktion unterscheidet.<br />
Schnittstelle OpenRave<br />
Das OpenRAVE Plugin, das die Kinematiken<br />
berechnet und das Programm generiert, heisst IKfast.<br />
Folgende Schnittstellen stellt das von OpenRAVE generierte C++ Programm<br />
bereit (IKFAST_API 54 ):<br />
1 bool ComputeIk ( const IkReal * eetrans , const IkReal * eerot ,<br />
const IkReal * pfree , ikfast :: IkSolutionListBase < IkReal >&<br />
solutions );<br />
Diese Methode berechnet die Rückwärtskinematik. Sie gibt true zurück,<br />
wenn mindestens eine Lösung gefunden werden konnte. Das eetrans ist ein<br />
Array, welches den Translationsanteil des Tool-Center-Point (x, y, z) darstellt.<br />
Das eerot ist ein Array, welches die Orientierungsmatrix (Rotationsanteil)<br />
3x3 darstellt. Diese ist zeilenweise im Array abgelegt. Der Parameter pfree<br />
steht für freie Parameter(Gelenke), die aber von der im Projekt RoboArm<br />
benutzten Kinematik nicht verwendet werden und daher leer bleiben muss.<br />
Der letzte Parameter solutions ist der Zeiger auf die Lösungen, wenn sie gefunden<br />
werden konnten.<br />
1 void ComputeFk ( const IkReal * joints , IkReal * eetrans , IkReal *<br />
eerot );<br />
Diese Methode berechnet die Vorwärtskinematik. Der Zeiger joints zeigt<br />
auf den Winkelvektor. Die berechnete Position des Tool-Center-Point wird<br />
im Parameter eetrans, welches ein Zeiger auf einen Array ist, abgelegt.<br />
Die Orientierung wird in der Drehmatrix kodiert zurückgegeben, die im<br />
Array über den Zeiger eerot erreichbar ist. Diese Drehmatrix müsste erst<br />
umgerechnet werden, so dass die Ausrichtung zurückgegeben werden kann.<br />
Dies wird nicht vorgenommen, da die Ausrichtung für das Projekt RoboArm<br />
keine praktische Bedeutung hat.<br />
2.12.3.5 Generierung des Quelltextes der Kinematik<br />
Hier wird ein kurzer Arbeitsfluss erläutert, wie die Kinematik mit IKfast<br />
erstellt werden kann.<br />
In Abbildung 2.168 ist der Arbeitsfluss für Generierung der Kinematik<br />
dargestellt.<br />
54 Quelle dieses Begriffes ist: openrave-users-list.185357.n3.nabble.com/<br />
IK-generated-rotation-problem-td4026671.html<br />
383
Kapitel 2. Implementation 10. Oktober 2013<br />
XML-Modell des<br />
Roboters bearbeiten<br />
Roboterbestandteile<br />
(Segmente und Gelenke)<br />
untersuchen<br />
Kinematik generieren<br />
Abbildung 2.168: Arbeitsfluss für IKfast-Generierung<br />
Zunächst wird ein OpenRAVE konformes XML-Modell des Roboters erstellt<br />
55 . Danach muss der Roboter auf die Anzahl der Segmente, Gelenke<br />
sowie das erste (Base) und das Letzte Segment (meistens der Greifer) untersucht<br />
werden.<br />
Mit dem Befehl<br />
openrave-robot.py ROBOTERNAME.xml –info links<br />
werden die Segmente (Links) des Roboters aufgelistet. Anschließend wird<br />
durch den Befehl<br />
python ‘openrave-config<br />
–python-dir‘/openravepy/_openravepy_/ikfast.py<br />
–robot=ROBOTERNAME.xml –iktype=transform6d<br />
–baselink=ERSTES_SEGMENT –eelink=LETZTES_SEGMENT<br />
–savefile=DATEINAME.cpp<br />
die Kinematik für den angegebenen Roboter berechnet und eine C++ Datei<br />
mit dem Namen DATEINAME.cpp generiert. Dies erfolgt, falls der Roboter<br />
OpenRAVE konform in XML modelliert ist und eine richtige Anzahl an<br />
Gelenke für den Verwendenden Kinematiktyp (ggf. iktype=transform6d)<br />
besitzt 56 .<br />
55 http://openrave.programmingvision.com/wiki/index.php/Format:XML<br />
56 http://openrave.org/docs/latest_stable/openravepy/ikfast/<br />
384
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.3.6 Probleme<br />
Einrichtung von OpenRAVE<br />
Auf der Webpage von OpenRAVE 57 sind<br />
die Installationspakete sowohl für Windows als auch für Ubuntu Linux<br />
Plattformen angeboten. In dem Projekt RoboArm werden die meisten Entwicklungswerkzeuge,<br />
abgesehen von Verwaltungs- sowie Versionierungssoftware,<br />
unter Windows verwendet. Aus diesem Grund wurde versucht die<br />
vollständige OpenRAVE Software unter Windows aufzusetzen. Dies scheiterte<br />
allerdings aufgrund der mangelhafte Unterstützung für Windows seitens<br />
Entwicklerteams von OpenRAVE. Es fehlten mehrere Bibliotheken sowie<br />
lies sich die OpenSource Software nicht mit den beschriebenen Mitteln<br />
kompilieren. Unter Windows wurde lediglich die Testumgebung für XML-<br />
Modelle installiert. Dies hat bereits eine Woche Zeit gekostet.<br />
Danach wurde zu Ubuntu Linux gewechselt, wo die OpenRAVE Software<br />
installiert und verwendet werden konnte.<br />
XML-Modell<br />
Ein OpenRAVE konformes XML-Modell besitzt eine Besonderheit:<br />
Die Maße der starren Körper, also der Segmente der Roboter,<br />
sind stets relativ zum Zentrum, dem sog. Gewichtsmittelpunkt angegeben.<br />
Auch die weiteren Segmente, die relativ zu den vorherigen Segmenten<br />
in der kinematischen Kette platziert sind, können mit ihren Gewichtsmittelpunkte<br />
relativ zum Gewichtsmittelpunk des vorherigen Segments lokalisiert<br />
werden. Dies erschwert den Aufwand der Anpassung der Längen der Segmente<br />
eines Roboters, wenn ein Robotermodell der gleichen Gelenkkonfiguration<br />
verschiedene Längen der Segmente besitzen soll. Die Kinematik<br />
muss stets entsprechend neu generiert werden, sobald etwas an Gelenkoder<br />
Längenkonfiguration geändert wurde. Das ist ein Nachteil gegenüber<br />
der herkömmlichen Art und Weise der Kinematikengineerings. Bei der<br />
herkömmlichen Kinematikengineering werden lediglich die Denavit Hartenberg-Parameter<br />
verändert und erst bei der Änderung der Gelenkkonfiguration<br />
eine neuen Kinematik entwickelt.<br />
Einbindung des generierten C++ Programms<br />
Die Einbindung des generierten<br />
Programms ins eigene Projekt besitzt gewissen Eigenheiten, welche<br />
beachtet werden müssen. Hier müssen die Definitionen der spezifischen<br />
Konstanten sowie die Reihenfolge dieser Definitionen beachtet werden.<br />
Außerdem müssen bestimmte Konstanten gesetzt werden, so dass das Programm<br />
selbständig lauffähig ist oder als gemeinsam genutzte Bibliothek<br />
verwendet werden kann.<br />
57 http://openrave.org/docs/latest_stable/install/<br />
385
Kapitel 2. Implementation 10. Oktober 2013<br />
Diese Eigenheiten der Einbindung des C++ Programms in das eigene Projekt<br />
ist nicht auf der OpenRAVE Webpage oder in der Dokumentation<br />
angegeben.<br />
Schnittstelle der Rückwärtskinematik<br />
Die meisten Probleme ergab die<br />
Benutzung der Schnittstellen der Rückwärtskinematik und die Validierung<br />
über die Vorwärtskinematik. Die ersten Tests der Anwendung des generierten<br />
Programms wurden mit Hilfe des Robot Operation System (ROS)<br />
IKfast Testmoduls (ikfastdemo.cpp) 58 durchgeführt. Das generierte C++<br />
Programm verwendet in der main-Methode lediglich die Schnittstelle für<br />
die Rückwärtskinematik. Dies führte daher zu dem Irrtum, dass IKfast<br />
lediglich die Rückwärtskinematik berechen kann.<br />
Mit dem ROS IKfast Testmodul wurde dann ersichtlich, dass auch die Vorwärtskinematik<br />
nutzbar ist. Die Vorwärtskinematik ist im Gegensatz zur<br />
Rückwärtskinematik einfacher zu verwenden.<br />
Das Hauptproblem der Rückwärtskinematik stellt die Transformationsmatrix<br />
für den Rotationsanteil dar. Es gibt keine Dokumentation für die Verwendung<br />
der Schnittstelle und in welcher Form die Drehwinkel in der Matrix<br />
kodiert sind (z.B. Euler-Notation oder Yaw-Pitch-Roll-Notation). Nach<br />
dem Feststellen der richtigen Matrix sind einige Tests gescheitert, welche<br />
zu der Vermutung geführt haben, dass die Matrix falsch verwendet wurde<br />
oder die Matrix selbst falsch ist. Nach dem Hinzufügen einer weiteren Person<br />
zur Bearbeitung der Aufgabe, wurden die Tests erneut durchgeführt<br />
und die korrekte Matrix herausgefunden. Die Interpretation der Winkel<br />
für die Rotation um die jeweiligen Achse war fehlerhaft.<br />
2.12.3.7 Dateistruktur<br />
Folgende Dateien wurden für die Umsetzung des OFFIS-Automation-Toolboxplugins<br />
der neuen Kinematik angelegt:<br />
• ForwardKinematics.h<br />
Meta-Informationen zum Wrapper um die IKfast Vorwärtskinematik.<br />
• ForwardKinematics.cpp<br />
Wrapper um die IKfast Vorwärtskinematik.<br />
• InverseKinematics.h<br />
Meta-Informationen zum Wrapper um die IKfast Rückwärtskinematik.<br />
58 tutorial: http://wiki.ros.org/Industrial/Tutorials/Create_a_Fast_IK_Solution<br />
386
Kapitel 2. Implementation 10. Oktober 2013<br />
• InverseKinematics.cpp<br />
Wrapper um die IKfast Rückwärtskinematik. Beinhaltet die Logik<br />
der Umrechnung(Kodierung) der Winkel in die Enddrehmatrix (Rotationsanteil).<br />
• New_Kinematics.h<br />
Meta-Informationen zum Einstiegspunkt des Wrappers um die IKfast<br />
Vorwärtskinematik. Stellt die C++ Schnittstellen für die Benutzung<br />
der Kinematik im für das Projekt RoboArm definierten Format bereit.<br />
• New_Kinematics.cpp<br />
Einstiegspunkt des Wrappers für IKfast Vorwärtskinematik. Ruft die<br />
Funktionalität der Klassen ForwardKinematics und InverseKinematics<br />
auf.<br />
• New_KinematicsInterface.h<br />
Meta-Informationen zur Schnittstellen für Python<br />
• New_KinematicsInterface.cpp<br />
Stellt die C++ Schnittstellen als Python Schnittstellen bereit.<br />
• ikfast.h<br />
Meta-Informationen zur IKfast.<br />
• or_ikfast_generated_roboarm2.cpp<br />
IKfast generierte Datei, die Kinematiken berechnet.<br />
Die XML-Dateien, aus denen die Kinematik generiert wurde:<br />
• roboarm.kinbody.xml<br />
Definiert den kinematischen Aufbau des Roboters<br />
• roboarm.hand.xml<br />
Definiert den Greifer des Roboters<br />
• roboarm.robot.xml<br />
Definiert den kompletten Roboter<br />
2.12.3.8 Ausblick<br />
Die Rückwärtskinematik wurde auf Zeitverhalten untersucht und mit der<br />
selbst entwickelten Rückwärtskinematik verglichen. Die Testfälle wurden<br />
387
Kapitel 2. Implementation 10. Oktober 2013<br />
mit Hilfe der QElapsedTimer-Programmbibliothek auf dem PC durchgeführt.<br />
Der Testablauf bestand aus der Messung der Ausführungszeiten beider<br />
OFFIS-Automation-Toolbox-Kinematik-Plugins (alten und der neuen).<br />
Jede Testvariante wurde mindestens 10000 Mal (mehrfach) aufgerufen und<br />
die mittlere Ausführungszeit wurde festgehalten. Als Testergebnisse wurden<br />
folgende Testwerte festgestellt:<br />
• Inverse Kinematik aus OpenRAVE mit Qt im Wrapper: 204.1 µs<br />
• Inverse Kinematik aus OpenRAVE ohne Qt im Wrapper: 109.8 µs<br />
• Alte inverse Kinematik ohne Qt im Wrapper: 10.8 µs<br />
Aus den Tests ist es ersichtlich, dass durch die Verwendung von Qt-Bibliothek<br />
die Ausführungszeiten um den Faktor 2 verlängert werden. Die aus dem<br />
OpenRAVE XML-Modell generierte Rückwärtskinematik arbeitet zusätzlich<br />
auf Double-Werten. Dies verlängert die Ausführungszeit gegenüber der<br />
mit Float-Werten implementierten Rückwärtskinematik der vorherigen Version.<br />
Ein weiteres Arbeitspaket wäre, zum Beispiel, die Optimierung des generierten<br />
Quelltext und anschließende Portierung auf den Microblaze. Nach<br />
der Fertigstellung des Roboters muss das XML-Modell bezüglich der Segmentlängen<br />
ggf. dem Roboter adoptiert werden.<br />
388
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.4 Integration der Komponenten zum Demonstrator<br />
Armhaltung nachahmen<br />
Ziel dieses Arbeitspaketes ist die Integration aller Komponenten für den<br />
Anwendungsfall Armhaltung nachahmen durchzuführen. Dabei liegt der Schwerpunkt<br />
auf der funktionalen Fertigstellung des Systems. Dazu gehört ebenfalls<br />
eine Analyse der Performanz und die Identifikation zeitintensiver Programmzeilen.<br />
Die Integration umfasst dabei das Erstellen das Hardwaredesigns. Darauf<br />
aufbauend werden die bereits fertigen Softwarekomponenten zu einem<br />
Gesamtsystem zusammengefügt. Eine weitere Aufgabe ist die Migration<br />
der in Python geschriebenen Funktionalität zur Erkennung des α -Winkels,<br />
des Drehwinkels des Schultergelenks, in die Programmiersprache C++.<br />
Dies ist notwendig, damit dieser auf dem Microblaze ausgeführt werden<br />
kann.<br />
2.12.4.1 Integration der Hardware Komponenten<br />
Dieser Unterabschnitt beinhaltet die Beschreibung der Integration der Hardwarekomponenten.<br />
Um dies zu erreichen, müssen die entsprechenden IP-<br />
Cores miteinander verknüpft werden. Hieraus lässt sich dann der entsprechende<br />
Bitstream für den FPGA erstellen. Als Ausgangspunkt für das Layout wurde<br />
das bereits erstellte Design aus dem Arbeitspaket 2.10.3 verwendet. Dieses<br />
besitzt bereits einen Großteil der benötigten Komponenten und wurde<br />
bereits ausführlich getestet.<br />
Als erstes wurde die Steuerung der Servos hinzugefügt, die in Abschnitt<br />
2.10.5 erstellt wurde. Diese IP-Cores generieren die nötigen Pulspositionsmodulations-Signale<br />
für die Servomotoren. Die Ansteuerung beziehungsweise<br />
das Setzen der Winkel für die IP-Cores wird durch die Software auf dem<br />
Microblaze übernommen.<br />
Des Weiteren wurde die Bildausgabe über die HDMI-Schnittstelle in das<br />
Hardwaredesign aufgenommen, welche im Abschnitt 2.6.3 dokumentiert<br />
ist. Diese Bildausgabe ermöglicht während der Entwicklung eine unmittelbare<br />
und autonome Fehleranalyse. Hiermit ist es möglich Daten über die<br />
aktuelle Szene, Winkel und Informationen über die aktuelle Tiefe, zu visualisieren.<br />
Somit bekommt der Benutzer eine Rückmeldung über die richtige<br />
Positionierung seines Armes gegenüber der Kamera.<br />
Um während der Entwicklung Informationen auf dem Bildschirm, zusätzlich<br />
zum Kamerabild, einblenden zu können, wurde der Overlay-IP-Core<br />
hinzugefügt, der in Abschnitt 2.10.1 beschrieben ist. In Rahmen dieses Ar-<br />
389
Kapitel 2. Implementation 10. Oktober 2013<br />
beitspaketes wurden zugehörige Zeitgebersignale aufgrund des HDMI-IP-<br />
Cores auf 75 MHz umgestellt.<br />
Die bereits vor diesem Arbeitspaket vorhandene Möglichkeit, Bilder an<br />
den PC zu übertragen, wurde nicht aus dem Hardwaredesign entfernt.<br />
Diese Funktionalität ist nicht für den in diesem Arbeitspaket beschriebenen<br />
Demonstrator wichtig, die USB-Kommunikation wird jedoch für einen<br />
weiteren Anwendungsfall benötigt. Hierbei geht es um den Anwendungsfall<br />
„Skizze zeichnen“, welcher in Abschnitt Skizze zeichnen 1.2.3.4 aufgeführt<br />
ist. Zu Gunsten eines verminderten Wartungsaufwandes, wurde das<br />
Hardwaredesign so gewählt, das alle Demonstratoren mit ihr realisiert werden<br />
können.<br />
Die Fläche des FPGAs ist mit dem erstellten Hardwarelayout zu ca. 90 %<br />
ausgelastet, sodass noch wenig Platz für weitere Hardwarekomponenten<br />
zur Verfügung stehen. Eine Übersicht über die verwendeten Hardwarekomponenten<br />
findet sich in Abbildung 2.169.<br />
simple_i2c<br />
cam_bootloader<br />
simple_i2c<br />
VmodCamA<br />
VmodCamB<br />
cam_data<br />
cam_data<br />
image_bus_switch<br />
cam_deserialzer<br />
cam_deserialzer<br />
image_ bus_ overlay<br />
pixel_Skipping<br />
busConverterToRGB888<br />
busConverterToRGB888<br />
hdmi_out<br />
usb_driver<br />
rgb2grey<br />
rgb2grey<br />
HDMI Display<br />
cam_usb<br />
schwellwertfilter<br />
schwellwertfilter<br />
PC<br />
pixel_Skipping<br />
pixel_Skipping<br />
servo_1<br />
blob_detection<br />
blob_detection<br />
servo_2<br />
servo_3<br />
Interruptcontroller<br />
servo_4<br />
Microblaze Microcontroller<br />
servo_5<br />
servo_6<br />
Abbildung 2.169: Aufbau der Verwendeten Hardwarekomponenten<br />
390
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.4.2 Integration der Software<br />
Dieses Unterabschnitt beschreibt die integrierten Softwarekomponenten.<br />
Diese werden den vorhergegangenen Arbeitspaketen entnommen. Die auf<br />
dem Microblaze ausgeführte Software ist für verschiedene Aufgaben zuständig.<br />
Initial werden die notwendigen Einstellungen zur Konfiguration der einzelnen<br />
IP-Cores durchgeführt. Ein Beispiel für eine solche Einstellung ist das<br />
Setzen des Schwellwertes für den Schwellenwertfilter.<br />
In der Hauptmethode, des auf dem Microblaze ausgeführten Programms,<br />
werden aus Bildregionen und ihren Schwerpunkten Winkel berechnet. Diese<br />
Winkel werden benutzt, um die Winkel der Servomotoren einzustellen.<br />
Der eingesetzte Algorithmus ist in Abschnitt 2.6.2 beschrieben und dessen<br />
Übersetzung in die Programmiersprache C++ in Abschnitt 2.10.2.<br />
Die erkannten Schwerpunkte der Bildregionen werden durch einen Interrupt<br />
aktualisiert. Dies geschieht im BLOB-Treiber. Dieser wird Ausgelöst,<br />
wenn die Hardwarekomponenten die Verarbeitung eines Bildes abgeschlossen<br />
haben. Die Bildregionen werden zwischen den einzelnen Bilder verfolgt,<br />
sodass eine Zuordnung möglich ist. Dieser Vorgang wird im Folgenden als<br />
Tracking bezeichnet.<br />
Während der Tests dieser Umsetzung hat sich herausgestellt, dass mit dem<br />
bestehenden Algorithmus die Zuordnung von Bildpunkten untereinander<br />
nicht zuverlässig erfolgt. Zur Lösung dieses Problems wird eine Matrix<br />
aufgestellt, welche alle Abstände zwischen alten und neuen Schwerpunkten<br />
beinhaltet.<br />
Daraufhin wurde eine weitere Matrix, mit den möglichen Kombination<br />
zwischen neuer Schwerpunktliste und alter Schwerpunktliste, erstellt. Danach<br />
wurde mit Hilfe der beiden erstellten Matrizen der kürzeste Pfad zwischen<br />
alten und neuen Schwerpunkten ermittelt.<br />
Des Weiteren wurden der Algorithmus aus dem Abschnitt 2.10.8 von der<br />
Programmiersprache Python in C++ übersetzt. Dieser ermöglicht die Bewegungen<br />
des menschlichen Schultergelenkes genauer auf die Freiheitsgrade<br />
des Roboterarms abzubilden.<br />
2.12.4.3 Probleme<br />
Dieses Arbeitspaket wurde in der angesetzten Zeit nicht vollständig umgesetzt,<br />
da an verschiedenen Stellen der Umsetzung Problemen auftraten, die<br />
vorher nicht abgeschätzt werden konnten.<br />
391
Kapitel 2. Implementation 10. Oktober 2013<br />
Fehler im IP-Core-Image-Overlay<br />
Ein Problem, das aufgetreten ist, resultierte<br />
aus der Umstellung der Zeitgeber auf ein 75 MHz Signal. Dies führte<br />
dazu, dass der Overlay-IP-Core nicht mehr in der Lage war ein Zeilenende<br />
im Bildstrom zu generieren. Dies führte dazu, dass die Ausgabe auf dem<br />
HDMI-Bildschirm nicht wie vorgesehen funktionierte.<br />
Fehler bei der Verfolgung der Schwerpunkte über die Zeit<br />
Dieser Absatz<br />
erläutert die aufgetretene Zuordnungsproblematik der Schwerpunkte<br />
über die Zeit, beziehungsweise über mehrere Frames. Wie bereits angeführt,<br />
verursachte das Verfolgen von Bildregionen und die Zuordnung<br />
dieser in der aktuellen Implementierung das Verlieren von Bildregionen.<br />
Die Lösung zu diesem Problem ist komplexer als zuvor, ermöglicht jedoch<br />
eine stabilere Verfolgung der Regionen und wurde umfangreich mit den<br />
Kameradatenströmen getestet. Die Komplexität der Lösung ergibt sich aus<br />
dem Problem selbst, welches als „Problem des Handlungsreisenden“(Englisch:<br />
Traveling Salesperson Problem) bezeichnet wird und für das es keine allgemeine<br />
Lösung gibt.<br />
Dieser Algorithmus wurde jedoch zu einem späteren Zeitpunkt ebenfalls<br />
zu einem Problem, da dieser zu einem Speicherproblem auf dem FPGA<br />
führte. Zur Lösung dieses Problems wurden die möglichen Kombinationen<br />
der vier Markierungen direkt im Programm aufgeführt. Durch entsprechende<br />
Tests stelle sich heraus, dass diese Lösung sowohl funktional korrekt als<br />
auch performanter als die vorherige Lösung ist.<br />
Diese Lösung ist jedoch nicht kompatibel mit mehreren Markierungen.<br />
Die Anzahl der möglichen Kombinationen ergibt sich durch die Fakultät<br />
der Anzahl der Markierungen. Aus diesem Grund müsste für eine abweichende<br />
Anzahl von Markierungen eine neue Menge an möglichen Kombinationen<br />
eingegeben werden.<br />
Fehler bei der Berechnung der Tiefenwerte<br />
Zusätzlich stellte sich heraus,<br />
dass die Berechnung der Tiefenwerte von Bildregionen nicht zu den<br />
gemachten Bewegungen passten. Dies war sowohl mit dem in der OFFIS-<br />
Automation-Toolbox entwickelten Algorithmus in Python als auch mit der<br />
in C++ übersetzten Version der Fall. Da jedoch die Tiefen zum Testen und<br />
Analysieren der Bewegungen des Schultergelenks, Schwerpunkt mäßig der<br />
Drehwinkel nötig sind, konnte dies nicht abgedeckt werden.<br />
Das Problem konnte als Berechnungsfehler innerhalb der Berechnungen<br />
für die Tiefe identifiziert werden. Die stereoskopische Aufnahme einer Bildszene<br />
durch zwei Kameras führt dazu, dass sich die Position der selben<br />
Markierung im Raum auf den beiden Bildsensoren unterscheidet. Dieser<br />
392
Kapitel 2. Implementation 10. Oktober 2013<br />
Abstand wurde in der ersten Implementation nicht korrekt berechnet. Die<br />
alte Berechnung addierte jeweils die Längen der beiden Vektoren, im Bezug<br />
auf den Abstand zum Mittelpunkt des Bildsensors. Korrekt ist jedoch der<br />
direkte Abstand der beiden Punkte auf den entsprechenden Bildsensoren.<br />
Die vorher durchgeführten Testfälle ergaben dennoch korrekte Tiefen, da<br />
der direkte Abstand beider Punkte durch das Zentrum des Bildsensors verlief.<br />
Nach oben genannten Änderung und entsprechenden Testfällen funktioniert<br />
die Berechnung der Tiefen. Die Genauigkeit schwangt jedoch, wie<br />
auch schon zuvor, je nach Belichtungsverhältnis.<br />
2.12.4.4 Testfälle<br />
Dieser Unterabschnitt beschäftigt sich mit dem Testen des Systems. Dabei<br />
wird zunächst das portierte System mit statischen Testfällen getestet. Danach<br />
wird das System mit Hilfe von verschiedenen Testpersonen getestet. Als<br />
Testpersonen standen Tobias Schüürhuis, Vitaliy Beguchiy, Peter Gewald<br />
und Patrick Elfert zur Verfügung.<br />
Statische Testfälle<br />
Zur Validierung der am Ende des integrierten Algorithmus<br />
berechneten Winkel wurden folgende statische Testfälle verwendet.<br />
Die Eingabewerte entsprechen den Schwerpunkten bzw. den 3D-<br />
Koordinaten der Gelenke eines Arms und sind im Folgenden in der Reihenfolge<br />
Schulter (β-Schwerpunkt), Ellenbogen (γ-Schwerpunkt), Handgelenk<br />
(δ-Schwerpunkt) und Finger (ɛ- Tool-Center-Point) aufgelistet. Das<br />
Ergebnis entspricht den Gelenkwinkeln in gleicher Reihenfolge, wobei der<br />
erste Winkel (α) dem Drehwinkel des Roboterarms entspricht.<br />
Handgelenk geknickt (nach oben):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
180<br />
60<br />
90<br />
⎞⎤<br />
⎠⎦ ⇒<br />
⎛<br />
⎜<br />
⎝<br />
α = 180°<br />
β = 90°<br />
γ = 180°<br />
δ = 90°<br />
⎞<br />
⎟<br />
⎠<br />
̌<br />
Handgelenk geknickt (nach oben, gebeugt):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
180<br />
60<br />
60<br />
⎞⎤<br />
⎠⎦ ⇒<br />
⎛<br />
⎜<br />
⎝<br />
α = 90°<br />
β = 90°<br />
γ = 180°<br />
δ = 90°<br />
⎞<br />
⎟<br />
⎠<br />
X<br />
393
Kapitel 2. Implementation 10. Oktober 2013<br />
Der obige Testfall zeigt einen Fehler bei der Berechnung des Drehgelenks.<br />
Die schräge Ausrichtung hätte eine Drehung von 135° ergeben müssen.<br />
Die Ausrichtung der Hyperebene, welche zur Berechnung des Drehwinkels<br />
verwendet wird, wurde im Folgenden statisch gesetzt. Die Ausrichtung<br />
dieser Ebene ist immer orthogonal zur Szene, sodass eine explizite Berechung<br />
nicht erforderlich ist. Lediglich der Stützvektor, also die Position der Ebene<br />
bleibt dynamisch. Nach Behebung dieses Fehlers, wurden sämtliche Winkel<br />
nochmals mit verschiedenen Gelenkpositionen wie folgt getestet.<br />
Gestreckter Arm (waagerecht):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
180<br />
90<br />
90<br />
⎞⎤<br />
⎠⎦ ⇒<br />
⎛<br />
⎜<br />
⎝<br />
α = 0°<br />
β = 90°<br />
γ = 180°<br />
δ = 180°<br />
⎞<br />
⎟<br />
⎠<br />
̌<br />
Gestreckter Arm (diagonal nach oben):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
60<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
30<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
180<br />
0<br />
90<br />
⎞⎤<br />
⎠⎦ ⇒<br />
Gestreckter Arm (diagonal nach oben, gebeugt):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
60<br />
60<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
30<br />
30<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
Gestreckter Arm (diagonal nach unten):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
120<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
150<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
180<br />
0<br />
0<br />
180<br />
180<br />
90<br />
⎞⎤<br />
⎠⎦ ⇒<br />
⎞⎤<br />
⎠⎦ ⇒<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
α = 180°<br />
β = 135°<br />
γ = 180°<br />
δ = 180°<br />
α = 135°<br />
β = 125°<br />
γ = 180°<br />
δ = 180°<br />
α = 0°<br />
β = 45°<br />
γ = 180°<br />
δ = 180°<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠<br />
̌<br />
̌<br />
̌<br />
Gestreckter Arm (diagonal nach unten, gebeugt):<br />
394
Kapitel 2. Implementation 10. Oktober 2013<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
120<br />
60<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
150<br />
30<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
180<br />
180<br />
0<br />
Ellenbogen geknickt (senkrecht nach oben):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
60<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
30<br />
90<br />
⎞⎤<br />
⎠⎦ ⇒<br />
⎞⎤<br />
⎠⎦ ⇒<br />
Ellenbogen geknickt (sekrecht nach oben, gebeugt):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
60<br />
60<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
30<br />
30<br />
⎞⎤<br />
Ellenbogen geknickt (senkrecht nach unten):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
120<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
150<br />
90<br />
⎠⎦ ⇒<br />
⎞⎤<br />
⎠⎦ ⇒<br />
Ellenbogen geknickt (sekrecht nach unten, gebeugt):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
120<br />
60<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
150<br />
30<br />
⎞⎤<br />
⎠⎦ ⇒<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
α = 45°<br />
β = 55°<br />
γ = 180°<br />
δ = 180°<br />
α = 180°<br />
β = 90°<br />
γ = 90°<br />
δ = 180°<br />
α = 135°<br />
β = 90°<br />
γ = 90°<br />
δ = 180°<br />
α = 0°<br />
β = 90°<br />
γ = 90°<br />
δ = 180°<br />
α = 45°<br />
β = 90°<br />
γ = 90°<br />
δ = 180°<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠<br />
̌<br />
̌<br />
̌<br />
̌<br />
̌<br />
Handgelenk geknickt (nach oben):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
60<br />
90<br />
⎞⎤<br />
⎠⎦ ⇒<br />
⎛<br />
⎜<br />
⎝<br />
α = 180°<br />
β = 90°<br />
γ = 180°<br />
δ = 90°<br />
⎞<br />
⎟<br />
⎠<br />
̌<br />
395
Kapitel 2. Implementation 10. Oktober 2013<br />
Handgelenk geknickt (nach oben, gebeugt):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
90<br />
90<br />
⎞<br />
Handgelenk geknickt (nach unten):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
90<br />
90<br />
⎛<br />
⎠ , ⎝<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
60<br />
60<br />
150<br />
130<br />
90<br />
Handgelenk geknickt (nach unten, gebeugt):<br />
⎡⎛<br />
⎣⎝<br />
90<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
120<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
90<br />
90<br />
⎞<br />
⎛<br />
⎠ , ⎝<br />
150<br />
130<br />
60<br />
⎞⎤<br />
⎠⎦ ⇒<br />
⎞⎤<br />
⎠⎦ ⇒<br />
⎞⎤<br />
⎠⎦ ⇒<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
⎛<br />
⎜<br />
⎝<br />
α = 135°<br />
β = 90°<br />
γ = 180°<br />
δ = 90°<br />
α = 0°<br />
β = 90°<br />
γ = 180°<br />
δ = 90°<br />
α = 35°<br />
β = 90°<br />
γ = 180°<br />
δ = 90°<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠<br />
⎞<br />
⎟<br />
⎠<br />
̌<br />
̌<br />
̌<br />
Die verwendeten statischen Testfälle zeigen somit, dass die gewünschte<br />
Funktionalität, die Berechnung von Winkeln anhand der Schwerpunkte im<br />
Raum, realisiert wurde und von den Berechnungen auf Seite des Microblaze<br />
entsprechend den Erwartungen funktioniert.<br />
Dynamische Testfälle<br />
Dieser Abschnitt führt die dynamischen Testfälle<br />
auf. Diese zeigen die Berechnungen von Winkeln und Tiefen mit Hilfe verschiedener<br />
Testpersonen zeigen.<br />
Im Rahmen der Testfälle hat sich herausgestellt, dass das verwendete Modell<br />
zur Berechnung der Armwinkel, exklusive Drehwinkel, nicht kompatibel<br />
mit der Berechnung des Drehwinkels ist. Bei der Entwicklung der<br />
Armwinkelberechnung wurde der Ellenbogenwinkel und Handgelenkwinkel<br />
als 180° abdeckendes Gelenk modelliert, siehe Abbildung 2.170. Der menschliche<br />
Arm erreicht die Abdeckung dieser 180° jedoch durch ein 90° Gelenk<br />
und die Drehung der Schulter, siehe Abbildung 2.171.<br />
396
Kapitel 2. Implementation 10. Oktober 2013<br />
α=180°<br />
α‘=0°<br />
x<br />
x<br />
γ=270°<br />
γ‘=90°<br />
Abbildung 2.170: Falsche Berechnung des Ellenbogenwinkels<br />
Daraus resultiert, dass bei der Berechnung der Winkel des Arms die Hyperebene<br />
zur Berechnung des entsprechenden Winkels nicht benötigt werden.<br />
Dies bedeutet, dass eine Umrechnung des Ellenbogen- oder Handgelenkwinkels<br />
von 90° auf 270° durch eine 180° Drehung ersetzt wird. Die<br />
oben aufgelisteten Testwerte sind also aufgrund des Drehwinkels als korrekt<br />
anzusehen.<br />
397
Kapitel 2. Implementation 10. Oktober 2013<br />
γ=90°<br />
α=180°<br />
α‘=0°<br />
x<br />
x<br />
γ‘=90°<br />
Abbildung 2.171: Korrekte Berechnung des Ellenbogenwinkels<br />
Systemtests<br />
Dieser Abschnitt führt die durchgeführten Systemtests auf.<br />
Dabei wird das gesamte System verwendet, sodass das Zusammenspiel<br />
aller Komponenten miteinander validiert werden kann.<br />
Als Testpersonen wurden Peter Gewald, Vitaliy Beguchiy und Patrick Elfert<br />
eingesetzt. Die Tests lieferten dabei immer die selben Ergebnisse. Die Winkel<br />
waren tendenziell wie beobachtet, unterlagen jedoch Schwankungen. Gerade<br />
im Bereich des α -Winkels waren diese sehr stark und führten teilweise<br />
zu einer fehlerhaften Auswertung.<br />
Die Analyse des Problems ergab, dass leichte Schwankungen in den Tiefenwerten<br />
der Schwerpunkte ausreichten, um einen vermeindlich geraden<br />
Arm als schief zu interpretieren. Somit berechnet der Algorithmus den<br />
α -Winkel in Bezug auf den Ellenbogen, obwohl sich die Berechnung des<br />
α -Winkels auf das Handgelenk beziehen sollte.<br />
2.12.4.5 Geschwindigkeitsanalyse<br />
Dieser Abschnitt beschreibt die getätigten Geschwindigkeitsmessungen (Profiling)<br />
an dem gesamten Algorithmus des Demonstrators Armerkennung.<br />
398
Kapitel 2. Implementation 10. Oktober 2013<br />
Im Fokus der Analyse stehen neben den verwendeten Treibern, BLOB-<br />
Treiber und Servotreiber, insbesondere die Funktionen aus den in Abschnitt 2.12.4.7<br />
genannten Dateien.<br />
Zunächst wurde die interne Funktion zum Profiling des Microblaze auf<br />
Basis des XPS-Timers verwendet, siehe 2.12.4.5. Da diese jedoch bereits zu<br />
detailierte Informationen liefert, z.B. zur Laufzeit von elementaren Rechenoperationen,<br />
wurde anschließend eine weitere Geschwindigkeitsmessung<br />
durchgeführt. Diese operiert auf einem höheren Abstraktionsgrad und misst<br />
die verschiedenen Laufzeiten der im Rahmen dieses Demonstrators entstandenen<br />
Methoden.<br />
Low level Microblaze Proling<br />
Dieser Abschnitt enthält die low level<br />
Geschwindigkeitsanalyse. Wie auch im folgenden Abschnitt über das<br />
high level Profiling, siehe Abschnitt 2.12.4.5, werden hier die verschiedenen<br />
Methoden, welche im Zuge der Realisierung des Demonstrators implementiert<br />
wurden, auf ihre Laufzeit untersucht. Hierzu wurde das von Xilinx zur<br />
Verfügung gestellte Profilingswerkzeug angepasst und verwendet. Dokumentiert<br />
ist die Vorgehensweise, mit kleineren Abweichungen, in einem<br />
von Xilinx zur Verfügung gestellten Dokument [19]. Dieses liefert eine<br />
Beschreibung zur Durchführung des Profilings auf dem Microblaze über<br />
die Xilinx Microprocessor Debugger-Console enthält. Um die getätigten<br />
Schritte zu diesem Profilingverfahren nachvollziehen zu können, sind diese<br />
im Folgenden aufgelistet.<br />
• Zunächst muss das Profiling in dem Xilinx Software Development Kit<br />
bei dem Kontextmenüpunkt Board Support Package Settings aktiviert<br />
und ein Timer zugewisen werden, siehe Abbildung 2.172<br />
– enable_sw_intrusive_profiling bei Overview→ Standalone auf<br />
true setzen<br />
– Timer xps_timer_0 dem profile_timer zuweisen.<br />
399
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.172: Profiling im Board Support Package Settings aktivieren<br />
• Der Compiler muss wissen, dass Profiling betrieben werden soll. Daher<br />
wird in dem Software Development Kit unter dem Kontextmenüpunkt<br />
des Projektes Properties → C/C + + − Build → Settings → Pro f iling →<br />
Enable Pro f iling (−pg) die Compileroption -pg gesetzt, siehe Abbildung<br />
2.173.<br />
Abbildung 2.173: Compileroption für Profiling setzen<br />
• Im Linkerskript lscript.ld muss eine freie Adresse reserviert werden<br />
(z.B. 0x91000000) mit einer festen Größe (z.B. 0x01000000).<br />
• Das Profiling kann in dem Software Development Kit unter dem<br />
Menüpunkt Run → Run Con f igurations → Pro f ile Options konfiguriert<br />
werden, siehe Abbdildung 2.174.<br />
400
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.174: Konfiguration des Profilings<br />
Alternativ können diese Optionen auch über die Xilinx Microprocessor<br />
Debugger-Console gesetzt werden. Zu einen ist die Frequenz<br />
einzugeben, welche die Messabstände definiert (sampling_frq_hz).<br />
Des Weiteren muss die Größe der Datenwörter (binsize) angegeben<br />
werden und abschließend die Speicheradresse, in welcher die Ergebnisse<br />
abgelegt werden sollen.<br />
XMD% profile -config sampling_freq_hz 10000 binsize 4 \<br />
profile_mem 0x91000000<br />
• Anschließend muss das Programm (Binärdatei) auf den FPGA geladen<br />
werden.<br />
XMD% dow camera.elf<br />
• Danach wird der Breakpoint automatisch gesetzt.<br />
XMD% bps exit<br />
Setting breakpoint at 0x8c001dd8<br />
• Mit dem Befehl con wird der Microblaze mit dem Programm gestartet.<br />
XMD% con<br />
Info:Processor started. Type stop to stop processor<br />
• Terminiert das Programm, wird an dem gesetzten Breakpoint angehalten.<br />
401
Kapitel 2. Implementation 10. Oktober 2013<br />
RUNNING> XMD% Info:Software Breakpoint 0 Hit, Processor \<br />
Stopped at 0x8c001dd8<br />
Alternativ muss das Programm manuell gestoppt werden:<br />
XMD% stop<br />
• Mit dem Befehl profile werden die gemessenen Daten im hexadezimalen<br />
Format abgespeichert.<br />
XMD% profile<br />
Profile data written to gmon.out<br />
• Schließlich müssen die codierten Ergebnisse noch unter Angabe der<br />
verwendeten Programmdatei in ein lesbares Format übersetzt werden.<br />
XMD% mb-gprof camera.elf gmon.out > profile.txt<br />
Alternativ kann die Datei gmon.out mit der Software Development<br />
Kit geöffnet werden, welche eine lesbarere Ausgabe der Ergebnisse<br />
liefert.<br />
Bei dem Wechsel zwischen Debug und Release Modus innerhalb der Entwicklungsumgebung<br />
ist darauf zu achten, dass diese Einstellungen erneut<br />
kontrolliert werden. Durch den Wechsel ist es möglich, dass diese Einstellungen<br />
zurückgesetzt werden. Ebenfalls können Problem mit der Option<br />
-PG auftreten. Es ist möglich, dass diese Option in der Entwicklungsumgebung<br />
als aktiviert angezeigt wird, sie aber deaktiviert ist. Nun ist<br />
es notwendig diese Option zu deaktivieren, zu bestätigen und erneut zu<br />
aktivieren und zu bestätigen.<br />
Im Folgenden ist ein Auszug aus der Textdatei zu sehen, welcher sich auf<br />
die am meisten genutzten elementaren Funktionen des Microblaze bezieht.<br />
% Ergebnisse<br />
Each sample counts as 0.0001 seconds.<br />
% cumulative self self total<br />
time seconds seconds calls us/call us/call name<br />
49.63 0.00 0.00 __divdf3<br />
8.82 0.00 0.00 _malloc_r<br />
6.62 0.00 0.00 __pack_d<br />
5.88 0.00 0.00 __udivsi3<br />
5.15 0.01 0.00 __unpack_d<br />
2.94 0.01 0.00 12 16.67 16.67 Servo::set_range(<br />
unsigned short,<br />
unsigned short)<br />
2.94 0.01 0.00 6 33.33 50.00 Servo::Servo()<br />
402
Kapitel 2. Implementation 10. Oktober 2013<br />
2.94 0.01 0.00 1 200.00 500.00 __static_initializa<br />
tion_and_destruction<br />
_0(int, int)<br />
2.94 0.01 0.00 __gedf2<br />
1.47 0.01 0.00 std::vector<<br />
BlobRegion,<br />
std::allocator<<br />
BlobRegion>>::<br />
operator=(std::<br />
vector const&)<br />
1.47 0.01 0.00 __fixdfsi<br />
1.47 0.01 0.00 __floatsidf<br />
1.47 0.01 0.00 __fpcmp_parts_d<br />
1.47 0.01 0.00 __malloc_lock<br />
1.47 0.01 0.00 _free_r<br />
1.47 0.01 0.00 malloc<br />
0.74 0.01 0.00 __malloc_unlock<br />
0.74 0.01 0.00 memset<br />
0.37 0.01 0.00 __muldf3<br />
0.00 0.01 0.00 17640 0.00 0.00 std::vector
Kapitel 2. Implementation 10. Oktober 2013<br />
Pfade analysiert, welche einen entsprechend großen Anteil an der Laufzeit<br />
der Hauptmethode haben. Diese Vorgehensweise setzt sich nun bis in die<br />
Spitze des Baumes fort, bis entsprechende Methoden gefunden werden,<br />
welche den größten Anteil an der Laufzeit haben. Diese Vorgehensweise<br />
wurde gewählt, damit nicht jede Methode bezüglich ihrer Laufzeit getestet<br />
werden muss. Die zusammengefassten Ergebnisse dieser Tests werden im<br />
Folgenden aufgeführt. Die vollständigen generierten Berichte sind ebenfalls<br />
vorhanden und könnten mit Hilfe der Dateistruktur 2.12.4.7 gefunden<br />
werden.<br />
Für die Laufzeitmessungen wurde ein Timer von Claas Diederichs verwendet.<br />
Dieser Timer wurde über den PLB-Bus an den Microblaze angebunden.<br />
Hauptfunktion:<br />
Ein Durchlauf, von Erkennung der BLOBs bis zur Ansteuerung<br />
der Servos benötigt eine gewisse Zeit, welche in Millisekunden<br />
angegeben wird. Diese Zeit teilt sich im Durchschnitt wie folgt auf, siehe<br />
Tabelle 2.12.<br />
Codeabschnitt Timer Zeit in [ms]<br />
Tracking (2x) 0x000000000004FFA8 327,600<br />
Tiefenberechnung 0x0000000000001E51 7,761<br />
Winkelberechnung 0x000000000000A5B8 42,420<br />
Overlay 0x000000000008A1B7 565,700<br />
Mapping 0x0000000000000C87 3,207<br />
Servoansteuerung 0x00000000000000F6 0,246<br />
Gesamtzeit 946,93<br />
Tabelle 2.12: Laufzeitmessung Übersicht<br />
Die Zeit für das Tracking gilt sowohl für die rechte als auch für die linke<br />
Kamera, siehe Abschnitt Optimierung 2.12.4.6. Im Folgenden sollen die<br />
oben am meisten Zeit beanspruchenden Teilfunktionen gemessen werden.<br />
Zu diesem Zweck wird das Tracking, die Winkelberechnung und das Overlay<br />
näher betrachtet.<br />
Initiale Sortierung der Schwerpunkte:<br />
Bevor die Werte verfolgt werden<br />
können, das Tracking durchgeführt werden kann, müssen diese initial sortiert<br />
werden. Die Laufzeit der Sortierung ist im Folgenden angegeben, siehe<br />
Tabelle 2.13.<br />
404
Kapitel 2. Implementation 10. Oktober 2013<br />
Codeabschnitt Timer Zeit in [ms]<br />
Sort 0x000000000000052D 1,325<br />
Rest of Tracking 0x0000000000000345 0,837<br />
Sort 0x00000000000008EE 2,286<br />
Rest of Tracking 0x0000000000000421 1,057<br />
Verfolgung der Schwerpunkte:<br />
Tabelle 2.13: Laufzeitmessung Sortieren<br />
Das Verfolgen der Schwerpunkte gliedert<br />
sich in folgende Zeitabschnitte. Dabei werden zunächst die Zeitwerte bei<br />
Stillstand des Armes und anschließend bei Bewegung des Armes aufgelistet,<br />
siehe Tabelle 2.14 und Tabelle 2.15.<br />
Codeabschnitt Timer Zeit in [ms]<br />
Erstellen der Distansmatrix 0x0000000000002B2A 11,05<br />
Erstellen der Kombinationsmatrix 0x000000000000305D 12,38<br />
Restliches Tracking 0x0000000000002A7D 10,88<br />
Tabelle 2.14: Laufzeitmessung Tracking ohne Armbewegung<br />
Codeabschnitt Timer Zeit in [ms]<br />
Erstellen der Distansmatrix 0x0000000000002C3F 11,33<br />
Erstellen der Kombinationsmatrix 0x0000000000002D11 11,54<br />
Restliches Tracking 0x0000000000002D78 11,64<br />
Tabelle 2.15: Laufzeitmessung Tracking mit Armbewegung<br />
Wie aus den beiden Tabelle zu entnehmen ist, unterscheidet sich die Laufzeit<br />
für den bewegten bzw. nicht bewegten Arm nicht signifikant. Da die Programmzeilen<br />
für das Tracking ca. 35 ms benötigen, jedoch für den gesamten<br />
Aufruf ca. 160 ms (327/2) benötigt werden, wird die restliche Zeit für den<br />
Aufruf der Methode, also für die Übergabe der Variablen verwendet. An<br />
dieser Stelle ist das Kopieren der Werte jedoch einmal notwendig, da sich<br />
der Speicher mit den entsprechenden Stellen durch den IP-Core jederzeit<br />
ändern kann.<br />
BLOB-Treiber:<br />
Als weitere für das System relevante Komponente wurde<br />
der BLOB-Treiber gemessen. Die Ergebnisse dieser Messung sind folgender<br />
Tabelle zu entnehmen.<br />
405
Kapitel 2. Implementation 10. Oktober 2013<br />
Codeabschnitt Timer Zeit in [ms]<br />
BLOB-Treiber 0x0000000000000077 0,119<br />
BLOB-Treiber (ohne Rechnung) 0x0000000000000044 0,068<br />
Image-Overlay:<br />
Tabelle 2.16: BLOB-Treiber<br />
Die letzte gemessene und für das System relevante Komponente<br />
ist das Image-Overlay. Es setzt sich aus folgenden Zeitabschnitten<br />
zusammen, siehe Tabelle 2.17.<br />
Codeabschnitt Timer Zeit in [ms]<br />
Overlay-Text 0x00000000000716EA 464,600<br />
Overlay-Kreuze 0x0000000000000556 1,366<br />
Overlay-Pageflip 0x0000000000006386 25,480<br />
Tabelle 2.17: Laufzeit des Image-Overlays<br />
Hier ist klar zu erkennen, dass das Zeichnen des Textes einen Großteil der<br />
Laufzeit in Anspruch nimmt. In diesem Fall beträgt der Anteil rund 50 %<br />
der Gesamtlaufzeit. Angezeigt werden im getesteten System die Winkel des<br />
Arms sowie die zu jedem Schwerpunkte gehörenden Tiefen. Aktuell werden<br />
diese jedoch als Fließkommazahl dargestellt und haben dementsprechend<br />
viele Stellen. Hier ist es anzuraten diese in einer kompakteren Art und<br />
Weise darzustellen, dass hier entsprechend viel Laufzeit eingespart werden<br />
kann.<br />
Winkelberechnung<br />
Die Winkelberechnung bildet die zentrale Komponente<br />
des Systems. Die oben gemessenen 42 ms setzen sich wie folgt zusammen,<br />
siehe Tabelle 2.18.<br />
Codeabschnitt Timer Zeit in [ms]<br />
3D-Vektoren generieren 0x0000000000002338 9.016<br />
3D-Vektoren vorbereiten 0x0000000000001F08 7.944<br />
Dreiecke berechnen 0x0000000000002253 8.787<br />
Winkel aus Dreiecken berechnen 0x0000000000001AEB 6.891<br />
Drehwinkel berechnen 0x0000000000001C1A 7.194<br />
Tabelle 2.18: Laufzeit der Winkelberechnung<br />
406
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.4.6 Optimierung<br />
Dieser Abschnitt enthält Vorschläge, welche umgesetzt werden sollten, um<br />
den Demonstrator in Funktion und Performanz zu verbessern. Dies ist<br />
notwendig, um die geforderte minimale Latenz von 500 ms einzuhalten,<br />
siehe Abschnitt 1.2.6. Die aktuelle Gesamtlaufzeit für die Berechnung einer<br />
Bewegung, Änderung der Schwerpunkt Positionen liegt bei fast einer<br />
Sekunde. Somit ist die Anforderung an die Performanz des Gesamtsystems<br />
nur zu ca. 50% erfüllt. Um die maximal mögliche Geschwindigkeit<br />
der Kamera zu nutzen, 15 fps, ist eine Laufzeit von unter 66, 66 ms zu erreichen.<br />
Möglichkeiten zur Steigerung der Performanz ergaben sich durch die Analyse<br />
der Ergebnisse der low level und der high level Geschwindigkeitsanalyse.<br />
Optimierungsmöglichkeiten zur Verbesserung der Funktionalität des<br />
Demonstrators ergaben sich aus der Analyse der Funktionalität der Programmzeilen,<br />
sowie durch Systemtests.<br />
Die Geschwindigkeit der Nachahmung des menschlichen Arms durch den<br />
Roboterarm erfolgt bis jetzt nicht in der geforderten Geschwindigkeit. Ebenfalls<br />
ist die Stabilität der Nachahmung nicht gegeben. Versucht der Benutzer<br />
zum Beispiel seinen Arm parallel zur Kamera zu halten, müssten<br />
vom System stabile Werte für die Winkel berechnet werden können. Diese<br />
sollten eine Schwankung von zehn Grad in der Regel nicht überschreiten.<br />
Schwankungen von bis zu 40 Grad treten jedoch in der aktuellen<br />
Version der Ansteuerung regelmäßig auf. Ebenfalls Schwankungen der<br />
berechneten Tiefenwerte sind ein Problem. Hier sind im Bereich von zwei<br />
Metern Kameraabstand, Schwankungen von über einem halben Meter regelmäßig<br />
aufgetreten. Das Systemspiel dieser Instabilitäten führt zu einem<br />
ruckartigen und nur entfernt menschenähnlichen Nachahmung des menschlichen<br />
Arms durch den Roboterarm.<br />
Bevor Maßnahmen zur Verbesserung der Performanz des Demonstrators<br />
durchgeführt werden, sollten die Änderungen zur Verbesserung der Funktionalität<br />
durchgeführt werden. Unter diesen Maßnahmen befindet sich die<br />
Möglichkeit der Bildung eines Mittelwertes über die Position der entsprechenden<br />
Schwerpunkte. Ebenfalls wäre es alternativ möglich einen Mittelwert<br />
über die berechneten Winkel zu bilden. Hierdurch würde jedoch die<br />
Performanz des Systems verschlechtert werden. Darüber hinaus gibt es<br />
mehr Schwerpunkte als berechnete Winkel, da das berechnen der Winkel<br />
mehr Zeit in Anspruch nimmt, als das Lesen der Schwerpunkte, weshalb<br />
ein Mittelwert über die Schwerpunkte sinnvoller sein kann.<br />
Zur Steigerung der Performanz ist es möglich Prozesse, die auf dem Mi-<br />
407
Kapitel 2. Implementation 10. Oktober 2013<br />
croblaze ausgeführt werden, auf die Hardware auszulagern. Hier ist es<br />
möglich Operationen durch Parallelität und Streaming zu beschleunigen.<br />
Beispielsweise können bei der Funktion zum Tracking der Schwerpunkte<br />
parallelisiert werden.<br />
Im Rahmen der Laufzeitmessungen, siehe Abschnitt 2.12.4.5 und 2.12.4.5,<br />
sind folgende Optimierungsschritte zu empfehlen.<br />
• Der angezeigte Text (Tiefenwerte und Winkel) im Overlay sollte gekürzt<br />
werden, z.B. ohne Nachkommastellen, um Laufzeit im Overlay zu<br />
sparen.<br />
• Der Speicherbereich für den Text im Overlay sollte nur einmal reserviert<br />
werden, um Speicherzugriffe zu sparen.<br />
• Die Schwerpunkte werden sowohl für die linke als auch für die rechte<br />
Kamera verfolgt. Es sollte nur eine Kameraseite verfolgt, und die<br />
Sortierung anschließend auf die andere Seite übertragen werden.<br />
• Das Tracking sollte die Variablen über Referenzen statt als Kopie erhalten.<br />
Damit könnte ein Großteil der Laufzeit dieser Methode eingespart<br />
werden.<br />
• Es sollten mehr, insbesondere kleine, Methoden als inline deklariert<br />
werden, um unnötige Funktionsaufrufe zu vermeiden.<br />
• Die Matrix, welche innerhalb der Tracking Funktion die möglichen<br />
Kombinationen für die Verfolgung der Punkte angibt ist statisch und<br />
konstant. Daher sollte diese nur einmal deklariert bzw. gefüllt werden,<br />
statt bei jedem Durchlauf.<br />
• Die Berechnung der unterschiedlichen Abstände der alten und neuen<br />
Schwerpunkte könnte optional auf Hardware ausgelagert werden.<br />
• Arrays und Vektoren sollten immer, mit fester Länge angelegt werden.<br />
• Arrays und Vektoren sollten immer direkt statt mit der Methode<br />
push_back beschrieben werden.<br />
• Fließkommazahlen sollten immer mit einem f deklariert werden, z.B.:<br />
180.0f statt 180.0, da damit Rechenoperationen performater durchgeführt<br />
werden können.<br />
408
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.4.7 Dateistruktur<br />
Während der Integration wurden folgende Dateien erweitert oder funktional<br />
angepasst. Alle geänderten oder auch neu erstellten Dateien sind in<br />
dem Repository atlys und microblazecode vorhanden.<br />
• lib/MyProcessorIPlib/drivers/blob_detection_v2_10a/src/blob_detection.h<br />
C++ Header der BLOB Erkennung.<br />
• lib/MyProcessorIPlib/drivers/blob_detection_v2_10a/src/blob_detection.cpp<br />
C++ Datei der Implementation der BLOB Erkennung.<br />
• microblazecode/camera/src/AngleCalculation.h: C++ Header Datei<br />
der Winkelberechnung.<br />
• microblazecode/camera/src/AngleCalculation.cpp: C++ Datei mit der<br />
Implementation der Winkelberechnung.<br />
• microblazecode/camera/src/Stereoscopy.h: C++ Header Datei der 3D-<br />
Berechnung.<br />
• microblazecode/camera/src/Stereoscopy.cpp: C++ Datei mit der Implementation<br />
der 3D-Berechnung.<br />
• microblazecode/camera/src/main.cc: Programmquelltext, der die erstellten/geänderten<br />
Klassen benutzt, um das Hauptprogramm auszuführen.<br />
• roboarm/arbeitspakete/sprint7/Integration_Komponenten/profile_low.txt<br />
Textdatei, welche die Ergebnisse des low level Profilings enthält.<br />
• roboarm/arbeitspakete/sprint7/Integration_Komponenten/profile_high.txt<br />
Textdatei, welche die Ergebnisse des high level Profilings enthält.<br />
409
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.5 Anbindung des Grauwertlters an den PLB<br />
Ziel dieses Arbeitspaketes ist es den gewichteten Grauwertfilter an den PLB<br />
anzubinden. Dies soll es ermöglichen zur Laufzeit die gewichtete Farbe auf<br />
dem Microblaze einzustellen. Dadurch kann die selbe Hardwarekonfiguration<br />
für mehrere Anwendungsfälle verwendet werden.<br />
2.12.5.1 Herangehensweise<br />
Um den RGB2Grey IP-Core an den PLB anzubinden wurde in einem ersten<br />
Schritt ein neuer IP-Core selben Names durch das XPS generiert. Dies<br />
hat den Vorteil, dass die Anbindung an den PLB automatisch geschieht.<br />
Danach wurden in den generierten Dateien die für den RGB2Grey IP-<br />
Core benötigten Signal hinzugefügt. In der user_logic wurde nun eine Entität<br />
des vorherigen rgb2grey_v2_00_a eingebaut. Diese wurde geändert,<br />
so dass weiterhin ein 32-Bit Register als Eingabe erwartet wird. In der user_logic<br />
wurde dann das generierte Register slv_reg0 angebunden und die<br />
plb-clk an die pixel_clk gelegt. Im Weiteren mussten die .mpd und die .pao<br />
Dateien angepasst werden.<br />
Zu dieser PLB-Anbindung gehört auch ein Treiber, durch welchen das Register<br />
gesetzt werden kann. Der hier geschriebene Treiber hat die Dateien<br />
vom Schwellwertfilter übernommen, lediglich die Namen und die Art, wie<br />
das Register gesetzt wird sind anders.<br />
2.12.5.2 Dateistruktur<br />
Die folgenden Dateien wurden für die Anbindung angelegt oder verändert.<br />
Das Basisverzeichnis ist ipcores.git/.<br />
• pcores/rgb2grey_v2_00_a/hdl/vhdl/rgb2grey_toplevel.vhd<br />
Toplevel Entität des IP-Core. Verarbeitet die PLB Logik.<br />
• pcores/rgb2grey_v2_00_a/hdl/vhdl/user_logic.vhd<br />
Mittlere Entität des IP-Core. Ordnet die Signale dem eigentlichen Filter<br />
zu.<br />
• pcores/rgb2grey_v2_00_a/hdl/vhdl/rgb2grey.vhd<br />
Lowlevel Entität des IP-Core. Implementiert die eigentliche Filterlogik<br />
• pcores/rgb2grey_v2_00_a/data/rgb2grey_v2_1_0.mpd<br />
Beinhaltet die Definition der Ein- und Ausgangssignale.<br />
410
Kapitel 2. Implementation 10. Oktober 2013<br />
• pcores/rgb2grey_v2_00_a/data/rgb2grey_v2_1_0.pao<br />
Definiert Dateiabhängigkeiten des IP-Core<br />
• drivers/rgb2grey_v2_00_a/data/rgb2grey_v2_1_0.mdd<br />
Definition des Treibers.<br />
• drivers/rgb2grey_v2_00_a/data/rgb2grey_v2_1_0.tcl<br />
TCL-Skript des Treibers.<br />
• drivers/rgb2grey_v2_00_a/src/rgb2grey.h<br />
Die Metaklasse des Treibers, beinhaltet nur den Konstruktor und einen<br />
Getter/Setter.<br />
• drivers/rgb2grey_v2_00_a/src/rgb2grey.cpp<br />
Implementierung des Treibers.<br />
• drivers/rgb2grey_v2_00_a/src/Makefile<br />
Makefile zum kompilieren des Treibers<br />
411
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.6 Vektorisierung von Portraitaufnahme<br />
Aufgabe ist es, ein mittels Kamera aufgezeichnetes Portraitbild mittels Software<br />
in eine Skizze zu verarbeiten, welche dann als Vektorgrafik vorliegen<br />
soll. Die erstellte Vektorgrafik soll im weiteren Projektverlauf genutzt werden,<br />
um Steuerinformationen für den Roboterarm generieren zu können.<br />
Ziel ist es, eine schematische Darstellung eines Gesichts zu erreichen, wie<br />
es in der Aufgabenstellung Kapitel 1.2.3.4 beschrieben wurde. In Abbildung<br />
2.175 ist ein mögliches Bild und dessen zu erstellende Vektorgrafik<br />
visualisiert.<br />
Abbildung 2.175: Farbbild und resultierende schematische Darstellung, als<br />
Anforderung an die Vektorisierung<br />
Das Bild einer Person wird mit einer handelsüblichen Webkamera aufgezeichnet,<br />
wobei für die Ansteuerung und das Aufzeichnen des Bildes die<br />
OFFIS-Automation-Toolbox verwendet wird. Mit dieser Software wird das<br />
Bild ebenfalls weiterverarbeitet.<br />
2.12.6.1 Bildvorverarbeitung<br />
Bevor die Pixelgrafik in die gewünschte Form überführt werden kann, wird<br />
das Bild vorverarbeitet. Dazu wurde eine Bildverarbeitungskette in der<br />
OFFIS-Automation-Toolbox erstellt. Die Bildverarbeitungskette reduziert<br />
412
Kapitel 2. Implementation 10. Oktober 2013<br />
die Informationen des aufgenommenden Bildes stark. Dies geschieht unter<br />
anderem über ein erstellten Filter, welcher die Helligkeit erhöht, gleichzeitig<br />
ebenfalls den Kontrast erhöht, wodurch Details reduziert werden, jedoch<br />
gleichzeitig die Konturen des Gesichts erhalten bleiben. Anschließend<br />
werden weitere Farbfilter eingesetzt um das Gesicht des Benutzers hervorzuheben.<br />
Das erzeugte Bild nach diesen Schritten ist als Zwischenergebnis<br />
in Abbildung 2.176 dargestellt.<br />
Abbildung 2.176: Zwischenergebnis der Bildverarbeitungskette<br />
Für die Manipulation von Helligkeit und Konstrast des Bildes wurde ein<br />
OFFIS-Automation-Toolbox Plugin entwickelt welches diese Funktionalität<br />
auf Basis der OpenCV Bibliothek bereitstellt. Die gesammte Bildverarbeitungskette<br />
ist in Abbildung 2.177 zu sehen.<br />
413
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.177: die gesammte Bildverarbeitungskette<br />
Das Endresultat der Bildverarbeitungskette wird an das letzte Plugin übergeben.<br />
In den Abbildungen 2.178 und 2.179 sind verschiedene Personen mit dem<br />
Bildverarbeitungsalgorithmus getestet worden. Dabei lieferte dieser Prozess<br />
eine ausreichende Detailstufe in den Bildern um die Person auf dem Bild<br />
noch ausmachen zu können. Das Resultat wird dann als Pixelgrafik an das<br />
letzte Glied in der Verarbeitungskette zur Vektorisierung gereicht.<br />
414
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.178: Farbbild und resultierende schematische Darstellung von<br />
einer Testperson<br />
Abbildung 2.179: Farbbild und resultierende schematische Darstellung von<br />
einer weiteren Testperson<br />
2.12.6.2 Vektorisierung<br />
Um eine Vektorisierung des vorbereiteten Bildes vornehmen zu können,<br />
wurden sich verschiedene existierende Lösungen angeschaut. Dabei wurde<br />
versucht die Vektorisierung mit dem Vekorgrafikprogramm Inkscape zu<br />
realisieren, da sich diese über die Windows Eingabeaufforderung aufrufen<br />
und in Teilen steuern lässt. Dies ließ sich jedoch nicht ohne Weiteres für<br />
die gewünschten Zwecke voll nutzen. Als eine weitere mögliche Lösung<br />
für unser Problem stellte sich die Freie Software Potrace 1 heraus, welche<br />
intern von Inkscape benutzt wird. Dieses Programm wurde in ein ebenfalls<br />
1 Dokumentation und Quellcode der Software Potrace http://potrace.sourceforge.net<br />
(Besucht am 3.9.2013)<br />
415
Kapitel 2. Implementation 10. Oktober 2013<br />
von uns erstelltes Plugin gekapselt und mit entsprechenden Parametern<br />
aufgerufen. Ein Ergebnis des Vektorisierungsvorgangs ist in Abbildung<br />
2.180 dem Eingangbildern und der schematischen Pixelgrafik gegenüber<br />
gestellt.<br />
Abbildung 2.180: Farbbild, Zwischenschritt und resultierende schematische<br />
vektorisierte Darstellung<br />
2.12.6.3 Ausblick auf anstehende Aufgaben<br />
Die erstellte Vektorgrafik muss noch interpretiert werden, sodass es möglich<br />
wird den Roboterarm zu steuern. Für Inkskape existiert ein Plugin, welches<br />
Vektorgrafiken aus dem SVG Format in ein Format überführt, welches<br />
für Computer gesteuerten Fräsen genutzt wird, auch Gcode genannt. Diese<br />
Erweiterung ließ sich jedoch noch nicht vollständig in den automatisierten<br />
Ablauf integrieren, konnte jedoch bereits ein Resultat erzeugen, welches in<br />
der Abbildung 2.181 abgebildet ist. Die grünen Linien ist das Absetzen der<br />
Fräse und die roten Linien sind die Linien, an denen entlang gefräst wird.<br />
Abbildung 2.181: Darstellung des generierten Gcodes<br />
416
Kapitel 2. Implementation 10. Oktober 2013<br />
Die Erzeugung dieses Datenformats muss im Weiteren automatisiert werden,<br />
sodass nachfolgend daraus Steuerbefehle für den Roboterarm generiert<br />
werden können. Ebenfalls sollte die erzeugen Pfade in der Vektorgrafik<br />
vereinfacht werden, da sonst sehr komplexe und lange Wege für<br />
den Roboterarm entstehen können, wie es aktuell noch der Fall ist. In Abbildung<br />
2.182 lässt sich der Umfang an Bewegungen allein für das Auge<br />
bereits deutlich anhand der vielen Kanten erkennen.<br />
Abbildung 2.182: Bildausschnitt und die Komplexität der Pfade aus der<br />
generierten Vektorgrafik<br />
2.12.6.4 Dateistruktur<br />
• projects/offis-toolbox/plugins/vision/brightness.pro :<br />
OFFIS Automation Framework Projektdatei<br />
• projects/offis-toolbox/plugins/vision/brightness/src/brightness.h :<br />
Header Datei des Brightness Quellcodes<br />
• projects/offis-toolbox/plugins/vision/brightness/src/brightness.cpp :<br />
C++ Programm des brightness Plugin<br />
• projects/offis-toolbox/projects/Vectorizer.oap :<br />
Bildverarbeitungskette für die Bildvorverarbeitung und Vektorisierung.<br />
417
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.7 Design und Bau des Roboterarms<br />
Ziel dieses Arbeitspakets ist die Planung und Erstellung von CAD Modellen<br />
der benötigten Bauteile. Im Anschluss werden diese gefertigt und<br />
montiert. Das Ergebnis ist dabei ein Roboterarm mit der in Abschnitt 2.9.4<br />
festgelegten Gelenkkonfiguration.<br />
Im Folgenden Unterabschnitt werden zuerst die wichtigsten Designentscheidungen<br />
hervorgehoben.<br />
2.12.7.1 Designentscheidungen<br />
Die geplante Konfiguration des Roboterarms erfordert ein entsprechendes<br />
Design der Links und Gelenke. Abbildung 2.193 zeigt die erste Version des<br />
zusammengebauten Roboterarms. Zur Erstellung der Zeichnungen wurden<br />
die freien Programme FreeCAD 59 sowie LibreCAD 60 genutzt.<br />
Als Material wird einheitlich Aluminiumblech der Dicke 1,5mm ausgewählt.<br />
Um die Knickgelenke zu realisieren werden Öffnungen für Kugellager und<br />
Servos in das Material eingelassen. Durch eine Gewindestange, die zusammen<br />
mit den Lagern als Achse dient, kann somit die Verbindung zum nächsten<br />
Link hergestellt werden.<br />
Ein Axialgelenk besteht aus drei einzelnen Bauteilen. Diese werden mit<br />
Winkeln an den Links befestigt und bieten Halterung für den Servo, Kugellager<br />
sowie die Verbindung zum nächsten Link.<br />
Die letzten beiden Gelenke werden zusammengefasst und durch ein Differential<br />
realisiert.<br />
Um höheren Belastungen stand zu halten oder den Arbeitsbereich zu erhöhen,<br />
werden an einigen Stellen Zahnräder zwischen Servos und Achse<br />
mit einer 1:2 sowie 2:1 Übersetzung eingesetzt. Weiter sind Anbringungsmöglichkeiten<br />
für ein Gegengewicht am zweiten Link eingeplant. Um eine Gewichtsreduzierung<br />
zu erlangen, wurden bei den Links Aussparungen ins Design<br />
eingefügt.<br />
Im nächsten Unterabschnitt werden die CAD-Zeichnungen der einzelnen<br />
Bauteilgruppen kurz dargestellt und beschrieben.<br />
2.12.7.2 CAD-Zeichnungen<br />
Um die Abstände der erstellten Zeichnungen im voraus zu verifizieren<br />
wurden für jedes Bauteil Protoypen aus Pappelholz gefertigt. Im Folgenden<br />
werden die einzelnen Bauteile kurz vorgestellt.<br />
59 http://www.freecadweb.org/<br />
60 http://librecad.org/<br />
418
Kapitel 2. Implementation 10. Oktober 2013<br />
Basis<br />
Die Basis, die gleichzeitig auch den ersten Link des Arms darstellt,<br />
besteht aus zwei Elementen. Abbildung 2.183 zeigt die Seiten aus denen<br />
die Box für die in Abbildung 2.184 dargestellte Axialverbindung besteht.<br />
Die Axialverbindung verbindet dabei die Basis mit dem zweiten Link.<br />
(a) Seite A<br />
(b) Seite B<br />
Abbildung 2.183: Base Seiten<br />
419
Kapitel 2. Implementation 10. Oktober 2013<br />
(a) Servohalterung (b) Kugellagerhalterung (c) Achshalterung<br />
Abbildung 2.184: Base Axialverbindung zum zweiten Link<br />
Zweiter Link<br />
Der zweite Link besteht aus in Abbildung 2.185 dargestellten<br />
Bauteilen. In die in Abbildung 2.185(b) gezeigte Seite B kann der entsprechende<br />
Servo eingelassen werden, mit dem über die Zahnradkonstruktion die Achse<br />
zwischen zweitem und drittem Link bewegt werden kann. Beide Seiten besitzen<br />
zu diesem Zweck Bohrungen zur Befestigung der Kugellager.<br />
420
Kapitel 2. Implementation 10. Oktober 2013<br />
(a) Seite A<br />
(b) Seite B<br />
Abbildung 2.185: Zweiter Link<br />
Dritter Link<br />
Wie der zweite besitzt auch der dritte Link in Abbildung<br />
2.186 die Bohrungen zur Befestigung der Kugellager sowie eine Ausfräsung<br />
für den Servo. Da dieser nur auf einer Seite der Konstruktion benötigt<br />
wird, existieren die Seiten A und B des Links. Weiterhin ist ca. in der Mitte<br />
des Bauteils ein Loch zur Anbringung einer Stabilisierungsstange geplant.<br />
Link drei und Link vier werden dabei wiederum durch die Achsenkonstruktion<br />
verbunden.<br />
421
Kapitel 2. Implementation 10. Oktober 2013<br />
(a) Seite A<br />
(b) Seite B<br />
Abbildung 2.186: Dritter Link<br />
422
Kapitel 2. Implementation 10. Oktober 2013<br />
Vierter Link<br />
Der in Abbildung 2.187 gezeigte Link vier besitzt am oberen<br />
Ende Bohrungen zur Befestigung der im Folgenden beschriebenen Axialverbindnug.<br />
Abbildung 2.187: Vierter Link<br />
Axialgelenk<br />
Abbildung 2.188 zeigt die zur Realisierung eines Axialgelenks<br />
benötigten Bauteile. Die Servo- sowie Kugellagerhalterung in Abbildungen<br />
2.188(a) und 2.188(b) werden dabei an Link vier, die Achshalterung<br />
in Abbildung 2.188(c) am Folgelink angebracht.<br />
423
Kapitel 2. Implementation 10. Oktober 2013<br />
(a) Servohalterung (b) Kugellagerhalterung (c) Achshalterung<br />
Abbildung 2.188: Axialverbindung<br />
Fünfter Link<br />
Das Ende des in Abbildung 2.189 dargestellten Links fünf<br />
bildet die Basis für das im folgenden beschriebene Differential. Zu diesem<br />
Zweck werden auf beiden Seiten des Links Servos eingesetzt.<br />
424
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.189: Fünfter Links<br />
Dierential<br />
Zur Realisierung des Differentials werden vier der in Abbildung<br />
2.190 gezeigten Seiten zu einer Box verbunden. Diese bietet Platz für<br />
die benötigten Kegelzahnräder.<br />
Abbildung 2.190: Differential<br />
Kugellager-Halterung<br />
Um sämtliche Kugellager der Links, Gelenke und<br />
des Differentials beidseitig zu fixieren, werden je Lager zwei der in Abbil-<br />
425
Kapitel 2. Implementation 10. Oktober 2013<br />
dung 2.191 gezeigten Kugellager-Halterungen eingesetzt.<br />
Abbildung 2.191: Kugellager-Halterung<br />
Greifer<br />
Bei dem Greifer aus Abbildung 2.192 handelt es sich um ein Design<br />
aus der Sammlung der Thingiverse 61 3D-Modelle.<br />
Abbildung 2.192: Gripper for Micro Robot Arm<br />
61 http://www.thingiverse.com/thing:71797<br />
426
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.7.3 Zusammenbau<br />
Abbildung 2.193 zeigt den aktuell zusammengebauten Roboterarm. Die<br />
weiteren Abbildungen 2.194 zeigen einzelne Abschnitte des Arms.<br />
Abbildung 2.193: Gesamter Arm<br />
(a) Basis (b) Axialverbindung (c) Differential<br />
Abbildung 2.194: einzelne Abschnitte des Roboterarms<br />
2.12.7.4 Ausblick<br />
Um ein Umkippen des Arms zu verhinden müssen an der Basis noch<br />
Ausleger angeschraubt werden. Diese sollten möglichst schwer sein.<br />
Bei ersten Tests des neuen Roboterarms wurde festgestellt, dass das erste<br />
Knickgelenk dem Gewicht des Arms nicht standhält. Der Servo scheint das<br />
Gewicht jedoch zu verkraften. Da in der Planungsphase dieses mögliche<br />
Szenario bereits betrachtet wurde, existiert für das Problem bereits eine<br />
Lösung:<br />
• Die Kunststoffzahnräder am Knickgelenk werden durch Zahnräder<br />
aus Stahl ausgetauscht.<br />
427
Kapitel 2. Implementation 10. Oktober 2013<br />
• Diese benötigen eine größere Achse, welche ebenfalls mehr Stabilität<br />
bietet.<br />
• Zur weiteren Steigerung der Stabilität werden die Zahnräder mittig<br />
auf der Achse (also zwischen den Links) angebracht. Dazu wird der<br />
Servo so in die Servohalterung eingeschraubt, dass die Achse nach<br />
innen zeigt.<br />
• Es wird eine weitere Achse von dem Servo in die gegenüberliegende<br />
Linkseite gezogen, um die Konstruktion zu entlasten/stabilisieren.<br />
• An Link 3 befinden sich Löcher zum befestigen eines Gegengewichtes.<br />
An diesem sollte ein weiterer Link außenliegend hinter die Achse<br />
geführt werden. Dort sollte nach ersten Berechnungen als Gegengewicht<br />
ungefähr das halbe Gewicht des Armes montiert werden.<br />
Der Bau eines neuen Greifers wurde bereits begonnen, jedoch nicht abgeschlossen.<br />
Für diesen muss noch eine Servohalterung entworfen und gebaut werden,<br />
siehe Abbildung 2.192.<br />
2.12.7.5 Dateistruktur<br />
Für die erstellten CAD-Zeichnungen wurde ein eigenes CAD Repository<br />
erstellt. In diesem befinden sich die folgenden Dateien:<br />
• cad/freecad_parts/*.fcstd FreeCAD-Zeichnungen der Bauteile.<br />
• cad/export_base/*.dxf DXF-Export der Basis.<br />
• cad/export_links/*.dxf DXF-Export der Links.<br />
• cad/export_differential/*.dxf DXF-Export des Differentials.<br />
• cad/export_lagerhalterung/*.dxf DXF-Export der Lagerhalterung.<br />
• cad/export_axial/*.dxf DXF-Export des Axialgelenks.<br />
428
Kapitel 2. Implementation 10. Oktober 2013<br />
2.12.8 Fazit und Ausblick<br />
In dem Sprint 7 wurden als Ziele die Portierung von Kinematik und alternativer<br />
Gestensteuerung, die Kinematik für den neuen Roboterarm, die<br />
Anbindung des Grauwertfilters an den PLB und die Entwicklung der Vektorisierung<br />
gesetzt. Außerdem musste der neue Roboterarm gebaut werden.<br />
Fast alle Ziele wurden erfolgreich umgesetzt. Der Bau des neuen Roboterarms<br />
konnte nicht im geplanten Umfang umgesetzt werden. Aufgrund<br />
der Qualität der Zahnräder, die für Gelenkbau eingesetzt wurden, konnte<br />
der Roboterarm den Widerstand der Räder überwinden. Aus Zeitgründen<br />
wurde der Prototyp des neuen Roboterarms mit den vorhandenen<br />
Zahnräder fertiggestellt, die jedoch keinen Betrieb des Roboterarmes ermöglichen.<br />
Des Weiteren wird ein neuer Sprint geplant, welcher die bisher erarbeiteten<br />
Ergebnisse zusammenführen und integrieren soll, sowie Demonstratoren<br />
vorbereiten soll.<br />
429
Kapitel 2. Implementation 10. Oktober 2013<br />
2.13 Sprintplanung Sprint 8<br />
Der Sprint 8 ist der abschließende Sprint der Projektgruppe RoboArm.<br />
Die Ziele des Sprints sind die Fertigstellung der Demonstratoren sowie<br />
deren Optimierung. Außerdem wird die gesamte Dokumentation überarbeitet,<br />
um die Einheitlichkeit der festgelegten Struktur des Dokumentes<br />
zu validieren, sowie die Endpräsentation wird erstellt. Folgende Demonstratoren<br />
werden fertiggestellt: Armhaltung nachahmen, Gestensteuerung<br />
sowie Skizze zeichnen.<br />
2.13.1 Fertigstellung und Optimierung des<br />
Demonstrators Armhaltung nachahmen<br />
Vorbedingungen<br />
• Einzelkomponenten in Form von IP-Core für Hardware<br />
• Treiber der IP-Core für den Microblaze<br />
• Quellcode aus dem Arbeitspaket „Integration der Komponenten“<br />
• Vollständig und funktional einsatzfähiges Gesamtsystem<br />
Arbeitspaketbeschreibung<br />
Ziel dieses Arbeitespaketes ist die Stabilisierung und Optimierung der<br />
im vorherigen Arbeitspaket integrierten Komponenten. Resultat des Arbeitspakets<br />
ist der vollständige Demonstrator für den Anwendungsfall „Armhaltung<br />
nachahmen“, d.h. ein ohne Rechner lauffähiges System, welches den<br />
Anwendungsfall erfüllt. Dieser muss stabil die funktionalen sowie nichtfunktionalen<br />
Anforderungen des Anwendungsfalles erfüllen. Dabei darf<br />
die maximale Laufzeit von 500 ms nicht überschritten werden. Ebenfalls<br />
müssen die Bewegungen des Benutzers korrekt nachgeahmt werden. Auch<br />
hierbei sind die Anforderungen an den Anwendungsfall einzuhalten. Verantwortlich<br />
für die Durchführung dieses Arbeitspakets sind Peter Gewald<br />
und Patrick Elfert.<br />
Aufwand<br />
• 1W (4 PT) Stabilisierung der Roboterarmbewegung<br />
430
Kapitel 2. Implementation 10. Oktober 2013<br />
• 1W (4 PT) Optimierung gemäß der Vorschläge aus dem vorherigen<br />
Arbeitspaket (Integration)<br />
• 1W (4 PT) Dokumentation, inkl. Userguide<br />
Lieferumfang<br />
• ATLYS-Projekt das den Anwendungsfall „Armhaltung nachahmen“erfüllt<br />
und die gestzten Anforderungen erfüllt.<br />
• Ausführbare Programmdatei (.elf) für den Microblaze.<br />
• Userguide zur Bedienung der Armverfolgung.<br />
431
Kapitel 2. Implementation 10. Oktober 2013<br />
2.13.2 Semi-Demonstrator Gestensteuerung<br />
Vorbedingungen<br />
• OFFIS-Toolbox Projekt zur Greiferansteuerung<br />
Arbeitspaketbeschreibung<br />
In diesem Abschnitt soll die Ansteuerung für den Greifer durch eine Geste<br />
der Hand umgesetzt werden, sowie das Verfolgen der Handposition zur<br />
Steuerung des TCP des Roboterarms. Die Ansteuerung des Greifers basiert<br />
auf einem OFFIS-Toolbox Projekt aus einem vorherigen Sprint. Für die Ansteuerung<br />
des TCP soll ein Konzept erarbeitet und umgesetzt werden. Ziel<br />
ist es, dass der Demonstrator Objekt bewegen, mit dem neuen Roboterarm,<br />
umsetzbar ist.<br />
Aufwand<br />
• 1W (2 PT) Konzeptionierung und Hardwarekette zu Bildverarbeitung<br />
• 1W (2 PT) C-Code und Integration<br />
• 1W (2 PT) Dokumentation, und Test<br />
Lieferumfang<br />
• C-Code für Gestensteuerung incl. Ansteuerung des Greifers<br />
• Hardwarekette für Gestensteuerung<br />
432
Kapitel 2. Implementation 10. Oktober 2013<br />
2.14 Sprint 8<br />
In diesem Sprint werden die Ergebnisse der Fertigstellung der Demonstratoren<br />
sowie der Überarbeitung der Dokumentation vorgestellt.<br />
2.14.1 Fertigstellung und Optimierung des<br />
Demonstrators Armhaltung nachahmen<br />
Ziel dieses Arbeitspaktes ist die Fertigstellung eines stabilen und zeitlich<br />
optimierten Demonstrators der Armverfolgung. Zu diesem Zweck werden<br />
zunächst die getätigten Schritte zur Verbesserung der Performanz erläutert.<br />
Anschließend folgen Maßnahmen zur Stabilisierung des Roboterarms.<br />
Nach einem Ausblick, welcher weitere mögliche Verbesserungen vorschlägt,<br />
ist schließlich die finale Datenstruktur kurz beschrieben.<br />
2.14.1.1 Verbesserung der Performanz<br />
Im Folgenden sind die Laufzeitverbesserungen beschrieben, welche auf<br />
den Optimierungsvorschlägen des vorherigen Sprints basieren. Dabei wurden<br />
die Zeitgewinne in grüner Farbe markiert. Die angegebenen Werte<br />
entsprechen der möglichst schlechtesten Laufzeit innerhalb einer Zeitmessung,<br />
die Resultate dieser Laufzeitverbesserungen sind dem folgenden Diagramm<br />
2.195 zu entnehmen.<br />
433
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.195: Optimierungsdiagramm<br />
1. Als erster Schritt wurde die Optimierung der Treiber vorgenommen.<br />
Insbesondere der BLOB -Treiber und der Image-Overlay Treiber wurden<br />
überarbeitet. Des Weiteren wurde für das Overlay nur einmal<br />
Speicher alloziert, anstatt dieses bei jedem Durchlauf erneut durchzuführen,<br />
siehe Tabelle 2.19.<br />
Programmteil Alte Zeit in [ms] Zeit in [ms]<br />
Tracking (2x) 327,600 260,500<br />
Tiefenberechnung 7,761 6,140<br />
Winkelberechnung 42,420 41,110<br />
Overlay 565,700 545,300<br />
Mapping 3,207 3,308<br />
Servoansteuerung 0,246 0,248<br />
Gesamtzeit 946,934 856,606<br />
Tabelle 2.19: Laufzeitmessung nach Treiberoptimierung<br />
2. Der angezeigte Text, Tiefenwerte und Winkel, im Overlay wird gekürzt,<br />
434
Kapitel 2. Implementation 10. Oktober 2013<br />
die Werte haben künftig keine Nachkommastellen, um Laufzeit im<br />
Overlay zu sparen, siehe Tabelle 2.20.<br />
Programmteil Alte Zeit in [ms] Zeit in [ms]<br />
Tracking (2x) 260,500 260,500<br />
Tiefenberechnung 6,140 6,140<br />
Winkelberechnung 41,110 41,280<br />
Overlay 545,300 204,606<br />
Mapping 3,308 3,220<br />
Servoansteuerung 0,248 0,247<br />
Gesamtzeit 856,606 515,990<br />
Tabelle 2.20: Laufzeitmessung nach erster Overlayoptimierung<br />
3. Des Weiteren werden die Tiefenwerte statt in mm in cm angezeigt,<br />
was ebenfalls Zeit beim Zeichnen des Overlays einspart, siehe Tabelle<br />
2.21.<br />
Programmteil Alte Zeit in [ms] Zeit in [ms]<br />
Tracking (2x) 260,500 260,500<br />
Tiefenberechnung 6,140 6,140<br />
Winkelberechnung 41,280 41,630<br />
Overlay 204,606 169.091<br />
Mapping 3,220 3,211<br />
Servoansteuerung 0,247 0,244<br />
Gesamtzeit 515,990 480,816<br />
Tabelle 2.21: Laufzeitmessung nach zweiter Overlayoptimierung<br />
4. Die Matrix, welche innerhalb der Funktion für das Tracking die möglichen<br />
Kombinationen für die Verfolgung der Punkte angibt, ist statisch und<br />
konstant. Daher wird diese nun nur noch einmal deklariert und mit<br />
Werten gefüllt, statt dies bei jedem Durchlauf durchzuführen. Folglich<br />
fällt das Erstellen der Matrix bei jeden Durchlauf weg, was ca.<br />
10 ms einspart, siehe Tabelle 2.22.<br />
435
Kapitel 2. Implementation 10. Oktober 2013<br />
Programmteil Alte Zeit in [ms] Zeit in [ms]<br />
Erstellen der Distanzmatrix 11,05 11,55<br />
Erstellen der Kombinationsmatrix 12,38 0,00<br />
Restliches Tracking 10,88 7,74<br />
Tabelle 2.22: Laufzeitmessung Tracking ohne Armbewegungg<br />
Dem Tracking werden die Schwerpunkte über Referenzen statt als<br />
Kopie übergeben. Damit wird ein Großteil der Laufzeit dieser Methode<br />
bzw. des Gesamtsystems eingespart, siehe Tabelle 2.23.<br />
Programmteil Alte Zeit in [ms] Zeit in [ms]<br />
Tracking (2x) 260,500 39,367<br />
Tiefenberechnung 6,140 6,153<br />
Winkelberechnung 41,280 36,226<br />
Overlay 169,091 183,362<br />
Mapping 3,211 3,246<br />
Servoansteuerung 0,244 0,252<br />
Gesamtzeit 480,816 268,606<br />
Tabelle 2.23: Laufzeitmessung nach Trackingoptimierung<br />
5. Der folgende Optimierungsschritt berücksichtigt drei kleinere Aspekte.<br />
Zum einen werden Arrays und Vektoren künftig immer mit fester<br />
Länge angelegt. Darüber hinaus werden Arrays Vektoren immer<br />
direkt statt mit der Methode push_back() beschrieben. Schließlich<br />
sind Fließkommazahlen ab sofort immer mit einem „f“deklariert werden,<br />
z.B.: 180.0 f statt 180.0, damit Rechenoperationen performanter<br />
durchgeführt werden. Insgesamt konnte hier nur eine geringe Zeit<br />
von 8 ms eingespart werden, siehe Tabelle 2.24.<br />
436
Kapitel 2. Implementation 10. Oktober 2013<br />
Programmteil Alte Zeit in [ms] Zeit in [ms]<br />
Tracking (2x) 39,367 38,871<br />
Tiefenberechnung 6,153 6,151<br />
Winkelberechnung 36,226 31,134<br />
Overlay 183,362 182,887<br />
Mapping 3,246 1,161<br />
Servoansteuerung 0,244 0,252<br />
Gesamtzeit 268,606 260,456<br />
Tabelle 2.24: Laufzeitmessung nach Array und Vektor Optimierung<br />
6. Es werden mehr, insbesondere kleine, Methoden der Winkelberechnung<br />
als inline deklariert, um unnötige Funktionsaufrufe zu vermeiden.<br />
Diese Optimierungsmaßnahme bewirkt lediglich eine sehr geringe<br />
Performanzverbesserung, siehe Tabelle 2.25.<br />
Programmteil Alte Zeit in [ms] Zeit in [ms]<br />
Tracking (2x) 38,871 39,046<br />
Tiefenberechnung 6,151 6,172<br />
Winkelberechnung 31,134 30,218<br />
Overlay 182,887 181,976<br />
Mapping 1,161 1,166<br />
Servoansteuerung 0,252 0,252<br />
Gesamtzeit 260,456 258,830<br />
Tabelle 2.25: Laufzeitmessung nach inline-Optimierung<br />
7. Im Folgenden wird die Zeitmesseung im Releasemode durchgeführt,<br />
was die Laufzeit nochmals optimiert, siehe Tabelle 2.26.<br />
437
Kapitel 2. Implementation 10. Oktober 2013<br />
Programmteil Alte Zeit in [ms] Zeit in [ms]<br />
Tracking (2x) 39,046 26,189<br />
Tiefenberechnung 6,172 5,871<br />
Winkelberechnung 30,218 19,546<br />
Overlay 181,976 146,114<br />
Mapping 1,166 0,490<br />
Servoansteuerung 0,252 0,123<br />
Gesamtzeit 258,830 198,324<br />
Tabelle 2.26: Laufzeitmessung im Releasemodus<br />
Der Text des Overlays, welcher die Winkel- und Tiefenwerte angibt<br />
hat eine Laufzeit von 143, 090 ms und ist damit der größte Bestandteil<br />
des Overlays.<br />
8. Ohne diesen Text, der nicht zwangsläufig im Endprodukt angezeit<br />
werden muss, würde eine Laufzeit von 55, 234 ms erreicht. Dieser<br />
Wert liegt unter der Grenze von 66 ms, welcher der maximale Ausnutzung<br />
der 15 fps der Kamera entspricht.<br />
2.14.1.2 Gesamtzeit<br />
Nachdem die Zeiten des Algorithmus gemessen wurden, soll im Folgenden<br />
die von außen beobachtbare Zeit von einer Bewegungsänderung des<br />
menschlichen Arms bis zur sichtbaren Reaktion des Roboterarms gemessen<br />
werden. Zu diesem Zweck wird anhand einer Videoaufnahme mit 30 fps<br />
Frameweise analysiert. Um einen möglichst genauen Wert zu erhalten, werden<br />
zehn Messwerte gemittelt, siehe Tabelle 2.27.<br />
Nr. 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.<br />
Zeit in [ms]: 453 708 590 435 195 284 380 541 433 681<br />
Tabelle 2.27: Beobachtete Reaktionszeit<br />
Aus den obigen Werten ergibt sich eine durchschnittliche Zeit von 470 ms.<br />
Damit liegt der Demonstrator Armhaltung nachahmen unter den im Lastenheft<br />
geforderten Zeitgrenze von 500 ms.<br />
438
Kapitel 2. Implementation 10. Oktober 2013<br />
2.14.1.3 Stabilisierung<br />
Das Abfahren von vorgegeben Punkten bzw. einer Trajektorie verläuft problemlos,<br />
jedoch sind die Armbewegunden mit Erkennung der Schwerpunkte<br />
nicht stabil. Aufgrund von suboptimalen Lichtverhältnissen und der<br />
BLOB-Erkennnug ergeben sich zum Teil sprunghafte Tiefeninformationen,<br />
welche sich in fehlerhaften Bewegungen des Roboterarms äußern. Um diesem<br />
Verhalten entgegen zu wirken, wird der Mittelwert aus den letzten acht<br />
Tiefenwerten berechnet. Da bei der Berechnung durch diese Anzahl dividiert<br />
wird, sollte es sich aus Effizienzgründen um eine Zweierpotenz<br />
handeln. Dieser Wert ist unter dem Bezeichner DEPTHSTORE in der Datei<br />
main.cc definiert. Diese Optimierung benötigt einen zeitlichen Mehrverbrauch<br />
von 6 ms. Abgesehen vom Overlay ist die zeitliche Grenze von 66 ms<br />
insgesamt mit ca. 61 ms nicht überschritten.<br />
Der wichtigste Faktor für die Stabilität des System bleibt jedoch eine möglische<br />
statische Beleuchung, welche aus Kamerarichtung auf die Armbinden<br />
trifft.<br />
2.14.1.4 Ausblick<br />
Im Folgenden sind weitere Möglichkeiten der Optimierung und Stabilisierung<br />
genannt:<br />
• Die Schwerpunkte werden sowohl für die linke als auch für die rechte<br />
Kamera verfolgt. Es könnte nur eine Kameraseite verfolgt und die<br />
Sortierung anschließend auf die andere Seite übertragen werden.<br />
• Die Berechnung der unterschiedlichen Abstände der alten und neuen<br />
Schwerpunkte könnte zu Gunsten einer parallelen Berechnung auf<br />
der Hardware ausgelagert werden.<br />
• Die Armbinden könnten durch rote LEDs ersetzt werden, um die Stabilität<br />
der Erkennung der Schwerpunkte zu verbessern.<br />
• Eine weitere Möglichkeit das System zu optimieren, wäre die Verwendung<br />
von Infrarotlicht. Dies ist im aktuellen Setup des System jedoch<br />
nicht ohne Weiteres möglich, da die VModCam einen entsprechenden<br />
Filter hat, welcher das infrarote Licht herausfiltert.<br />
439
Kapitel 2. Implementation 10. Oktober 2013<br />
2.14.1.5 Dateistruktur<br />
Während der Integration wurden folgende Dateien erweitert oder funktional<br />
angepasst. Alle geänderten oder auch neu erstellten Dateien liegen<br />
in dem Repository microblazecode vor.<br />
• microblazecode/camera/src/AngleCalculation.h: C++Header Datei der<br />
Winkelberechnung.<br />
• microblazecode/camera/src/AngleCalculation.cpp: C++Datei mit der<br />
Implementation der Winkelberechnung.<br />
• microblazecode/camera/src/Stereoscopy.h: C++Header Datei der 3D-<br />
Berechnung.<br />
• microblazecode/camera/src/Stereoscopy.cpp: C++Datei mit der Implementation<br />
der 3D-Berechnung.<br />
• microblazecode/camera/src/main.cc: Programmcode, der die erstellten/geänderten<br />
Klassen benutzt, um das Hauptprogramm auszuführen.<br />
2.14.1.6 Finale Methoden<br />
Abschließend sind die finalen Schnittstellen der Methoden dieses Demonstrators<br />
aufgelistet und kurz beschrieben, da sich diese zum Teil im Rahmen<br />
der Optimierung geändert haben.<br />
Öffentliche Methoden der Stereoskopie:<br />
Stereoscopy () ;<br />
Konstruktur für die Erstellung einer Stereoskopieinstanz.<br />
float calcDepthPoint ( Vector2d left , Vector2d right );<br />
Berechnet die Tiefe anhand von 2D-BLOBs und Kamerakonstanten<br />
DepthList getAllDepths ( const CenterOfGravityList &<br />
cogListLeft , const CenterOfGravityList & cogListRight );<br />
Berechnet die Tiefe für alle Schwerpunkte, indem die Funktion calcDepthPoint<br />
jeden Schwerpunkt aufruft.<br />
für<br />
440
Kapitel 2. Implementation 10. Oktober 2013<br />
CenterOfGravityList calcCogVectors ( const<br />
CenterOfGravityList & coglist , const DepthList &<br />
depthlist );<br />
Berechnet 3D-Vektoren für alle Schwerpunkte in [mm].<br />
Öffentliche Methoden der AngleCalculation:<br />
AngleCalculation () ;<br />
Konstruktor zur Erstellung einer Winkelberechnungsinstanz.<br />
CenterOfGravityList getSortedPose2DList (<br />
CenterOfGravityList cogList , SIDE side );<br />
Tracking Algorithmus, welcher die Schwerpunkte über die Zeit verfolgt.<br />
Beim ersten Durchlauf werden die Schwerpunkte zunächst sortiert.<br />
AngleSet calcAngles ( Stereoscopy stereo , const DepthList &<br />
depthlist );<br />
Berechnet die Winkel anhand von 3D-Vektoren.<br />
ArmAngleSet mapAngles ( const ArmAngleSet & aaSet );<br />
Stellt sicher, dass die eingehenden Winkel in einem gültigen Wertebereich<br />
liegen und bildet diese auf die Servohardware ab.<br />
Private Methoden der AngleCalculation:<br />
Vector3d vectorSubstraction ( Vector3d vectorOne , Vector3d<br />
vectorTwo );<br />
Subtrahiert zwei 3D-Vektoren voneinander.<br />
Vector3d deriveIntersectionPointPlane ( Vector3d point ,<br />
Plane plane );<br />
Berechnet Schnittpunkt zwischen einem 3D-Punkt und einer Ebende im<br />
3D-Raum.<br />
Vector3d calculateTriangleLengths ( Vector3d<br />
intersection , Vector3d betaCog , Vector3d<br />
betaBottom );<br />
441
Kapitel 2. Implementation 10. Oktober 2013<br />
Berechnet aus drei Punkten ein Dreieck in Form von drei Seitenlängen.<br />
VectorListContainer prepareVectors ( Stereoscopy stereo ,<br />
const DepthList & depthlist );<br />
Erstellt und füllt Datenstruktur für die Winkelberechnung.<br />
std :: vector < Vector3d > calcTriangleList ( const std :: vector <<br />
Vector3d >& linkVectors );<br />
Gibt eine Liste von Dreiecken in Form von drei Seitenlängen für jeden zu<br />
berechnenden Winkel zurück.<br />
float calcAngleFromTriangle ( Vector3d side );<br />
Gibt einen Winkel in Radiant anhand eines Dreiecks (drei Seitenlängen)<br />
zurück.<br />
Vector3d crossProduct ( Vector3d v1 , Vector3d v2 );<br />
Gibt das Kreuzprodukt zweier 3D-Vektoren zurück. Ein Vertauschen der<br />
Parameter hat einen Vorzeichenwechsel zur Folge.<br />
float calcAlphaAngle ( std :: vector < Vector3d > oldCogList ,<br />
float gamma , float delta );<br />
Berechnet den Drehwinkel des Roboterarms, anhand der Schwerpunkte<br />
und der bereits berechneten Winkel.<br />
442
Kapitel 2. Implementation 10. Oktober 2013<br />
2.14.2 Semi-Demonstrator Gestensteuerung<br />
Das Ziel dieses Arbeitspakets ist es, die Ansteuerung des Greifers entsprechend<br />
des OFFIS-Automation-Toolbox Projekts aus einem vorherigen Sprint umzusetzten.<br />
Zudem soll die Steuerung der Position des Tool-Center-Point der<br />
Roboterarm konzeptioniert und implementiert werden. Die Umsetzung<br />
des Pakekts erfordert eine, für diesem Anwendungsfall angepasste Hardware,<br />
für die Bildverarbeitung, welche in Abschnitt 2.14.2.3 beschrieben<br />
wird. In Abschnitt 2.14.2.1 wird das Konzept der Ansteuerung des Greifers<br />
und in Abschnitt 2.14.2.2 das Konzept zur Ansteuerung des Tool-Center-<br />
Point erläutert.<br />
2.14.2.1 Greiferansteuerung<br />
Die Ansteuerung des Greifers erfolgt über eine Geste der Hand. Diese<br />
Geste wird mit dem Daumen und Zeigefinger der Hand ausgeführt. Um<br />
die Geste zu erkennen werden grüne Markierungen an Daumen und Zeigefinger<br />
verwendet. Die Gesten für Öffnen und Schließen sind in den Abbildungen<br />
2.196 dargestellt. Rechts ist die Geste zum schließen und links die Geste<br />
zum öffnen des Greifers zu sehen.<br />
Abbildung 2.196: Handgesten zur Ansteuerung des Greifers. Rechts: Geste<br />
für das Schließen des Greifers; Links: Geste für das Öffnen<br />
des Greifer.<br />
Die grünen Markierungen werden durch eine für die Farbe angepasste<br />
Bildverarbeitungskette in Hardware gefiltert. Die Gesten werden durch den<br />
dafür entwickelten Quellcode erkannt. Im Quellcode werden dabei zwei<br />
443
Kapitel 2. Implementation 10. Oktober 2013<br />
Zustände unterschieden. Wenn nur eine grüne Markierung erkannt wird,<br />
wird dies als Geste für eine geschlossene Greiferstellung interpretiert. Sollten<br />
zwei grüne Markierungen erkannt werden, wird der Abstand der Center<br />
of Gravity der grünen Markierungen berechnet. Solange der Abstand<br />
einen bestimmten Schwellwert nicht überschreitet, wird die Geste als eine<br />
geschlossene Greiferstellung interpretiert. Überschreitet der Abstand den<br />
Schwellwert, so wird die Geste als offene Greierstellung interpretiert. Die<br />
Auswertung der Geste für die Greiferstellung ist in der Methode gestensteuerung::getHandStatus()<br />
gekapselt. Bei der Ausführung liefert die Methode<br />
das enum hand_status zurück. Dieses enum kann die Werte OPEN und<br />
CLOSED annehmen.<br />
2.14.2.2 Tool-Center-Point-Ansteuerung<br />
Um die Ansteuerung des Tool-Center-Point auszuführen wird eine rote<br />
Binde an der Hand verwendet. Die Position des Tool-Center-Point wird<br />
relativ zur Position des Binde zum Start der Ansteuerung berechnet. Das<br />
bedeutet, die Position zum Start stellt den Ursprung da. In diesem Punkt<br />
hält der Roboterarm seine Position. Sobald die Position der Binde relativ<br />
zum Ursprung einen bestimmten Abstand überschreitet, wird eine Bewegung<br />
des Roboterarm ausgeführt. Die Abbildung 2.197 verdeutlicht das<br />
vorgehen anhand einer Beispielbewegung.<br />
y-Achse<br />
z-Achse<br />
rote Binde<br />
TCP<br />
x-Achse<br />
x-Achse<br />
z-Achse<br />
y-Achse<br />
Abbildung 2.197: Steuerung der Tool-Center-Point-Position durch Position<br />
der Hand<br />
444
Kapitel 2. Implementation 10. Oktober 2013<br />
Der Roboterarm kann dabei in allen drei Dimensionen gleichzeitig angesteuert<br />
werden. Hierzu wird auch die Tiefeninformation der Binde ausgewertet.<br />
Um die Tiefe zu berechnen wird die Stereoskopie verwendet,<br />
welche auch bei der Nachahmung der Armhaltung zum Einsatz kommt.<br />
Die Auswertung der Postition und Tiefeninformation der Binde, sowie die<br />
Berechnung der Ansteuerung des Roboterarms, erfolgen in der Methode<br />
getHandPosition(). Die Methode schreibt die Ergebnisse in ein Array, welches<br />
aus der Main-Methode ausgelesen und an die Kinematik weitergereicht<br />
wird.<br />
2.14.2.3 Hardware der Bildverarbeitungskette<br />
Die entwickelten Algorithmen für die Ansteuerung des Greifers und des<br />
Roboterarms erfordern eine angepasste Bildverarbeitungskette. Die Greifersteuerung<br />
benötigt eine Filterkette die den grünen Farbkanal aus dem Bild<br />
extrahiert und eine BLOB-Detektion, die die grünen Objekte im Bild erkennt.<br />
Diese Filterkette wird lediglich auf einer der zwei Kameras des Kameramoduls<br />
benötigt. Um die rote Binde zu erkennen wird eine Filterkette<br />
eingesetzt die den roten Farbkanal aus dem Bild extrahiert und eine BLOB-<br />
Detektion, die die roten Objekte im Bild erkennt. Da bei der Ansteuerung<br />
des Roboterarms auch die Tiefeninformation ausgewertet wird, muss diese<br />
Bildverarbeitungskette auf beiden Kameras des Kameramoduls angewendet<br />
werden. Das vollständige Hardwaredesign ist in Abbildung 2.198 zu<br />
sehen.<br />
445
Kapitel 2. Implementation 10. Oktober 2013<br />
simple_i2c<br />
cam_bootloader<br />
simple_i2c<br />
Legende:<br />
Filterkette für den roten Farbkanal<br />
VmodCamA<br />
VmodCamB<br />
Filterkette für den grünen Farbkanal<br />
cam_data<br />
cam_data<br />
cam_deserialzer<br />
cam_deserialzer<br />
busConverterToRGB888<br />
busConverterToRGB888<br />
rgb2grey<br />
rgb2grey<br />
rgb2grey<br />
schwellwertfilter<br />
schwellwertfilter<br />
schwellwertfilter<br />
pixel_Skipping<br />
pixel_Skipping<br />
pixel_Skipping<br />
servo_1<br />
blob_detection<br />
blob_detection<br />
blob_detection<br />
servo_2<br />
servo_3<br />
Interruptcontroller<br />
servo_4<br />
Microblaze Microcontroller<br />
servo_5<br />
servo_6<br />
Abbildung 2.198: Bildverarbeitungskette für die Gestensteuerung<br />
Als Grundlage für das Hardwaredesign wurde das ATLYS-Projekt der alternativen<br />
Gestensteuerung verwendet. Dieses wurde um eine zweite Bildverarbeitungkette<br />
für den roten Farbkanal erweiter. Das Design verwendete<br />
94% der zur Verfügung stehenden Fläche des FPGA. Dies hatte zu Folge,<br />
dass das Design nicht mehr synthetisiert werden konnte. Grund hierfür<br />
ist, dass das Zeitmodell des Designs nicht mehr alle Bedingungen erfüllen<br />
konnte. Um das Design synthetisieren zu können, mussten IP-Core aus<br />
dem Design entfernt werden. Bei den IP-Core die entfernt wurden, handelt<br />
es sich um die HDMI-Ausgabe und das Overlay, sowie den Image-Bus-<br />
Switch.<br />
2.14.2.4 Ausblick<br />
In diesem Arbeitspaket wurde die Ansteuerung des Greifers durch Gesten<br />
der Hand, sowie die Steuerung der Position des Roboterarms, realisiert.<br />
Diese Funktionen wurde zur Umsetzung des Demonstrators Objekt be-<br />
446
Kapitel 2. Implementation 10. Oktober 2013<br />
wegen 1.2.3.2 entwickelt. Da der Demonstrator auf dem neuentwickelten<br />
Roboterarm, welcher in Sprint 6 spezifiziert wurde, ausgeführt werden soll,<br />
konnte die Funktion zur Steuerung der Position der Roboterarm bisher<br />
nicht auf dem Zielsystem getestet werden. Ausführliche Tests der Funktionen<br />
müssen nach Fertigstellung des neuen Roboterarm noch durchgeführt<br />
werden. Alle bisherigen Tests wurden auf dem alten Roboterarm durchgeführt.<br />
Die Steuerung des Tool-Center-Point kann durch eine alternative Ansteuerung<br />
ergänzt werden. Dieser Ansatz umfasst eine Kalibrierung des Arbeitsbereichs<br />
des Roboterarms auf den Bewegungsraum des Arms des Benutzers.<br />
Dies könnte eine intuitivere Steuerung ermöglichen.<br />
Im Abschnitt 2.14.2.3 wurden die HDMI-Bildausgabe und das Overlay aus<br />
dem Hardwaredesign entfernt. Dies war erforderlich um das Hardwaredesign<br />
zu synthetisieren. Da die Bildausgabe als Rückmeldung für den<br />
Benutzer nichtmehr zur Verfügung steht, kann es passieren, dass der Benutzter<br />
sich aus dem Sichtfeld der Kamera entfernt. Dadurch würde der<br />
Roboterarm nicht mehr auf Eingaben des Benutzers reagieren. Um die Bedienbarkeit<br />
zu verbessern kann das Hardwaredesign überarbeitet werden,<br />
um die HDMI-Bildausgabe und das Overlay wieder in das Design zu integrieren.<br />
Hierzu kann eine Neukonfiguration des Microblaze durchgeführt<br />
werden.<br />
2.14.2.5 Dateistruktur<br />
Während der Integration wurden folgende Dateien erweitert oder funktional<br />
angepasst. Alle geänderten oder auch neu erstellten Dateien liegen<br />
in dem Repository microblazecode vor.<br />
• microblazecode/gestensteuerung/src/gestensteuerung/gestensteuerung.h:<br />
C++Header Datei der Gestensteuerung.<br />
• microblazecode/gestensteuerung/src/gestensteuerung/gestensteuerung.cpp:<br />
C++Datei mit der Implementation der Gestensteuerung.<br />
• microblazecode/gestensteuerung/main.cc: Programmcode, der die erstellten/geänderten<br />
Klassen benutzt, um das Hauptprogramm auszuführen.<br />
• ATLYS (Branch gestensteuerung): Xilinx EDK Projekt mit Hardwaredesign.<br />
447
Kapitel 2. Implementation 10. Oktober 2013<br />
2.14.3 Fertigstellung und Optimierung Skizze Zeichen <br />
In diesem Arbeitsschritt sollen die bereits im Kapitel 2.12.6 erstellen Prozesse<br />
optimiert werden, welche für das Erstellen einer Skizze nötig sind. Dabei<br />
sollen die einzelnen Schritte dahingehend optimiert werden, dass von dem<br />
Benutzer ein Bild mit einer Webcam aufgenommen und so vorbereitet wird,<br />
das Steuerinformation an den FPGA gesendet werden können und dieser<br />
den Roboterarm benutzt, um eine Skizze des Benutzer automatisiert zu zeichnen,<br />
so wie es in den Anforderungen im Abschnitt 1.2.3.4 beschrieben ist<br />
Die einzelnen Prozesse müssen aufeinander weiter abgestimmt werden,<br />
um die formulierten Anforderungen erfüllen zu können. Dazu zählt zum<br />
Beispiel die Bildverarbeitungskette, welche das Bild vereinfacht und aus<br />
dem Bild eine Vektorgrafik erstellt, da dies noch nicht optimal erfolgt.<br />
Ebenfalls ist es nötig dem Benutzer eine auf die Anforderung zugeschnittene<br />
Benutzeroberfläche bereitzustellen. Der Ablauf soll für den Benutzer<br />
darauf reduziert werden, das sein Gesicht von ihm vor eine Webcam platziert<br />
wird und durch das auslösen einer Aktion der gesamte Prozess gestartet<br />
wird, ohne weiteres zutun des Benutzers.<br />
2.14.3.1 Umsetzung der Anforderungen<br />
Für den Anwendungsfall Skizze zeichnen wurde die Anforderung gestellt,<br />
dass das System vor dem Beginn des Zeichnens sich selbständig initialisiert<br />
und eine Kalibrierung druchgeführt. Die Initialisierung erfolgt durch<br />
die erstellen Servomotoren-IPCore und durch die entwickelten Treiber. Die<br />
Aufnahme und die Verarbeitung des Portraits des Benutzer erfolgt durch<br />
die Verwendung eines PCs und entsprechender Software, die bereits im<br />
Abschnitt 2.12.6 vorgestellt wurde.<br />
2.14.3.2 Optimierungen für die Anforderungen<br />
Bisher wurde die Bildverarbeitungskette mit statischen Bildern getestet<br />
und entwickelt. Diese Bilder haben bereits verwendbare Ergebnisse geliefert,<br />
jedoch waren die resultierenden Konturen welche in ein Vektorgrafik übersetzt<br />
werden sollten noch zu komplex. Folglich musste der Bildverarbeitungsprozess<br />
optimiert werden und eine Möglichkeit für den Benutzer geschaffen werden,<br />
ein Bild von sich aufzunehmen.<br />
448
Kapitel 2. Implementation 10. Oktober 2013<br />
(a) Anbindung einer Webcam in den<br />
Verarbeitungsprozess<br />
(b) Bildvorverarbeitung einschließlich<br />
der Vektorisierung<br />
Abbildung 2.199: Bildverarbeitungsketten die verwendet wurden<br />
Im Ersten Schritt wurde die Integration der Webcam vorgenommen. Dafür<br />
wurde ein zusätzlicher Bildverarbeitungsprozessor erstellt, welcher eine<br />
Webcam ansteuert. In unserem Szenario wurde eine Webcam der Firma<br />
Logitech vom Typ HD C270 verwendet. Die Bildverarbeitungskette, in Abbildung<br />
2.199(a) dargestellt, ist ausschließlich für das Aufzeichnen, Zuschneiden<br />
und Spiegeln des Bildes zuständig.<br />
Das resultierende Bild wird anschließend mit einer weiteren Bildverarbeitungskette<br />
verarbeitet. Diese Kette, dargestellt in der Abbildung 2.199(b),<br />
ist eine Weiterentwicklung der Kette aus dem Abschnitt 2.12.6.1. Sie wurde<br />
um eine öffnende und schließende morphologische Operation erweitert,<br />
449
Kapitel 2. Implementation 10. Oktober 2013<br />
welche kleine Flächen auf dem Bild entfernt.<br />
Darüber hinaus wurden die Parameter der einzelnen Filter optimiert, so<br />
dass die Konturen einfacher werden konnten. Nachstehend ist in Abbildung<br />
2.200 ein Vergleich der jeweiligen Ergebnisse aus den verschiedenen<br />
Bildverarbeitungsketten dargestellt. Dabei ist deutlich zu sehen, das rechts<br />
weniger und einfachere Linien enthalten sind.<br />
Abbildung 2.200: Links vor und rechts nach der Optimierung der Bildverarbeitungskette<br />
2.14.3.3 Optimierungen der Bildaufnahme<br />
Der letzte Filter in der Bildverarbeitungskette beinhaltet die Vektorisierung,<br />
als auch das Umwandeln in die CNC-Fräsmaschinen kompatiblen Anweisungen.<br />
Dieser Filter wird jedoch erst durch das Auslösen vom Benutzer<br />
aktiv, welches mittels einer Schaltfläche erfolgt. Dadurch bekommt<br />
der Benutzer die Möglichkeit eine Vorschau von den Konturen zu erhalten.<br />
Die Koordination der Prozesse wurde mittels der in die OFFIS-Automation-<br />
Toolbox integrierten Skriptumgebung und Erweiterungen für diese realisiert.<br />
Das Aufnehmen des Bildes erfolgt nun mit einer Webcam und durch den<br />
Benutzer ausgelöst. Die Aufnahme wird mittels eines Buttons in der OFFIS-<br />
450
Kapitel 2. Implementation 10. Oktober 2013<br />
Automation-Toolbox ausgelöst, wenn der Benutzer eine gewünschte Einstellung<br />
verwenden möchte. Der Aufbau der Benutzeroberfläche ist in Abbildung<br />
2.201 veranschaulicht.<br />
Abbildung 2.201: Aufbau der Benutzeroberläche für den Benutzer<br />
Zu der Möglichkeit die Aufnahme auszulösen, wurde ebenfalls die Optionen<br />
Helligkeits- und Kontrastwerte dynamisch anzupassen hinzugefügt,<br />
damit der Benutzer auf variierende Lichtverhältnisse und damit auf die<br />
erzeugte Skizze Einfluss nehmen kann.<br />
2.14.3.4 Verwendete Komponenten<br />
Für die Umsetzung wurde die OFFIS-Automation-Toolbox verwendet in<br />
Zusammenarbeit mit der frei erhältlichen Software Inkscape, wobei die<br />
Komunikation zwischen den Programmen über eigens entwickelte Plugins<br />
realisiert wurde.<br />
Ebenfalls wurde das Kinematik Projekt aus dem Sprint 2.10.6 verwendet,<br />
welches Erweiterungen für die OFFIS-Automation-Toolbox bereitstellt und<br />
451
Kapitel 2. Implementation 10. Oktober 2013<br />
ein Programm enthält, das auf dem Microblaze ausgeführt werden kann.<br />
Der FPGA wurde zur Ansteuerung der Servomotoren des Roboterarms<br />
verwendet. Der sich ergebende gesamte Aufbau ist in Abbildung 2.202<br />
vereinfacht dargestellt.<br />
FPGA<br />
Abbildung 2.202: Aufbau des Demonstrator Skizze zeichnen<br />
Das eingesetzte Hardwarelayout wurde aus dem Projekt 2.14.2 übernommen,<br />
da dieses alle benötigen Komponenten enthält. Auch hier waren keine<br />
weiteren Anpassungen mehr nötig.<br />
2.14.3.5 Prozess Steuerung<br />
Die Zusammenarbeit der einzelnen Komponenten ist mit einem Interpreterprogramm<br />
in der Programmiersprache Python umgesetzt worden. Der Ablauf<br />
ist in Abbildung 2.203 veranschaulicht und die einzelnen Funktionen der<br />
Klasse im weiteren erläutert.<br />
452
Kapitel 2. Implementation 10. Oktober 2013<br />
Start<br />
Verbindung mit Roboter<br />
Initialisieren<br />
Benutzeroberfläche<br />
Initialisieren<br />
Bildvorverarbeitung<br />
Benutzer<br />
löst<br />
Aufnahme<br />
aus<br />
nein<br />
ja<br />
Vektorisierung aktivieren<br />
Steuerbefehle generieren<br />
lassen<br />
einlesen der<br />
Steuerbefehlen<br />
Steuerbefehlen an den<br />
FPGA übertragen<br />
Stop<br />
Abbildung 2.203: Programmablauf der Hauptfuntion<br />
Funktionen<br />
Die für den Ablauf zuständige Klasse besitzt eine Hauptfunktion<br />
welche den Aufruf der restlichen Funktionen koordiniert.<br />
main ()<br />
In der Hauptfunktion werden Initialisierungen vorgenommen, als auch die<br />
koordination des Programmablaufs.<br />
handleNGC ()<br />
Mit Hilfe dieser Funktion werden die Maschienensteuerbefehle eingelesen<br />
und interpretiert.<br />
453
Kapitel 2. Implementation 10. Oktober 2013<br />
parse_g_cmd ( g_cmd_type , line )<br />
Diese Funktion bekommt eine Zeile mit Maschienensteuerbefehlen übergeben<br />
und extrahiert die nötigen Informationen.<br />
parse_g_cmd_value ( line , val )<br />
Um einen bestimmten Wert für einen Befehl zu erhalten wird diese Funktion<br />
benutzt, welche zum Beispiel den Wert für die X-Achsen Koordinate<br />
ermittelt.<br />
move ( oldPoint , point )<br />
Die Bewegungssteuerung wird mittels der Funktion move realisiert. Diese<br />
Funktion bewegt die Zeicheneinheit des Roboterarms entweder zeichnend<br />
oder nicht zeichnend und berechnet die benötigten Winkel.<br />
armPosition ( angles )<br />
Die Position, welche der Roboterarm mit Hilfe der Servomotoren einnehmen<br />
soll, wird mit dieser Funktion und vorher berechneter Winkel umgesetzt.<br />
2.14.3.6 Ergebnis und Ausblick<br />
Das erzielte Ergebnis ist in Abbildung 2.204 dargestellt und zeigt das Ursprungsbild<br />
vor und nach der Bildverarbeitung. Das rechte der drei Bilder,<br />
ist dann das von dem Roboterarm auf Papier umgesetzte Bild. Die Konturen<br />
lassen sich zum Teil erkennen, jedoch lässt diese Umsetzung noch<br />
spiel für Verbesserungen.<br />
454
Kapitel 2. Implementation 10. Oktober 2013<br />
Abbildung 2.204: Links ist das Ausgangsbild gezeigt, und in der Mitte und<br />
Rechts die Roboterumsetzung mit verschiedenen Stiften<br />
Das Resultat könnte sich noch verbessern lassen, in dem man auf eine überarbeitete<br />
Kinematik setzt, welche die Eigenheiten des Roboters besser abbildet.<br />
Das bezieht sich vor allem auf einen Strategiewechsel, auf welchen<br />
man nicht reagieren kann. Der Strategiewechsel sorgt in diesem Fall für<br />
unkontrollierbare Striche im Bild, die sich Aufgrund unserer aktuellen Umsetzung<br />
der Kinematik nicht vermeiden lassen.<br />
Ebenso wäre mit einer verbesserten Roboterarm-Hardware, das heißt genaueren<br />
Servomotoren und stabileren Konstruktion des Arms selber, auch eine detailreichere<br />
Zeichnung möglich gewesen. Es war aus Zeitgründen nicht<br />
mehr möglich den Aufbau mit dem neu geplanten und zum Teil bereits<br />
umgesetzten Roboterarm zu testen.<br />
2.14.4 Fazit und Ausblick<br />
In dem abschließenden Sprint wurden die geplanten Demonstratoren fertiggestellt.<br />
Allerdings wurden die Demonstratoren Alternative Gestensteuerung<br />
sowie Skizze zeichnen als Semi-Demonstratoren fertiggestellt. Beide Demonstratoren<br />
würden mit der neuen Kinematik und mit der neuen Roboter-<br />
Hardware genauer funktionieren. Aufgrund des Zeitmangels und des noch<br />
nicht komplett gebauten neuen Roboterarms war es nicht möglich, diese<br />
Demonstratoren mit dem neuen Roboterarm zu testen. Der vorhandene<br />
Roboterarm würde mit der verbesserten Kinematik einen größeren Arbeitsbereich<br />
aufweisen. Es war aus zeitlichen Gründen nicht mehr möglich<br />
455
Kapitel 2. Implementation 10. Oktober 2013<br />
dies zu testen. Die zwei Demonstratoren werden als Semi-Demonstratoren<br />
angesehen, da diese auf dem kleineren Arbeitsbereich die Zwecke der<br />
entsprechenden Anwendungsfälle erfüllen.<br />
Der Demonstrator Armhaltung nachahmen wurde vollständig fertiggestellt.<br />
Die Struktur der Dokumentation wurde validiert.<br />
456
3 Fazit<br />
Heutzutage werden in der Industrie immer häufiger Kamerasysteme verwendet,<br />
um die automatisierten Anlagen oder Roboter sowie die Bearbeitung<br />
und Manipulation der Werkstoffe zu beobachten. Die Daten der<br />
Kameras werden dabei als Eingabe für die entsprechenden Steuerungssysteme<br />
genutzt. Die Projektgruppe RoboArm stellte sich der Aufgabe, ein<br />
Kamerasystem zu entwickeln, welches ohne PC und auf Basis eines FP-<br />
GAs funktioniert.<br />
Das Hauptaugenmerk lag dabei auf der Bildverarbeitung sowie dem Steuerungssystem<br />
eines Roboterarms. Die Bildverarbeitung umfasste die Erkennung<br />
der Bewegungen eines menschlichen Arms sowie alternativer Gesten,<br />
wie zum Beispiel Bewegungen des Kopfs oder der Augen. Die Hauptanforderungen,<br />
welche die Projektgruppe umgesetzt hat, waren die Nachahmung<br />
der Bewegungen des menschlichen Armes, sowie die gezielte Ansteuerung<br />
des elektromechanischen Roboterarmes. Eine weitere Anforderung<br />
war, die Echtzeitfähigkeit des Systems zu gewährleisten. Das von der Projektgruppe<br />
realisierte System bestand aus einem FPGA, einer Kamera sowie<br />
einem vormontierten Roboterarm. Die Projektgruppe hat folgende Anwendungsfälle<br />
umgesetzt, die die Hauptanforderungen demonstrieren sollen:<br />
Anhand des Demonstrators Armhaltung nachahmen werden die Bewegungen<br />
des menschlichen Arms erkannt und diese durch den Roboterarm<br />
nachgeahmt. Der Demonstrator Roboter steuern durch alternative Gesten setzt<br />
die erkannten alternativen Gesten in Form von Kopfbewegungen in die<br />
vordefinierten Bewegungen des Roboterarms um. Der Demonstrator Skizze<br />
zeichnen nimmt durch die Kamera das Gesicht einer Person auf und zeichnet<br />
dessen Skizze auf einer Zeichenfläche.<br />
Die Projektgruppe näherte sich schrittweise den gestellten Ziele an. Zunächst<br />
befasste sich die Gruppe mit der Fertigstellung der grundlegenden Steuerungseinheiten<br />
der Systemkomponenten. Parallel wurde die Machbarkeitsstudie<br />
für das Eye-Tracking durchgeführt und ein Softwareprototyp für die Objektverfolgung<br />
erstellt. Nach dem Ergebnis dieser Studie fiel die Entscheidung<br />
auf die Erkennung von Kopf- statt Augenbewegungen als Eingabe der al-<br />
457
Kapitel 3. Fazit 10. Oktober 2013<br />
ternativen Gestensteuerung. Im nächsten Schritt folgte die Umsetzung der<br />
Module zur Bildvorverarbeitung auf dem FPGA sowie die Analyse der<br />
HDMI-Ausgaben in Echtzeit. Basierend auf diesen Ergebnissen wurden<br />
Softwareprototypen zur Erkennung der alternativen Gesten durch Kopfbewegungen,<br />
sowie für die Ermittlung der Tiefeninformation erstellt. Außerdem<br />
wurden die HDMI-Ausgabe sowie die Bewegungserkennung in Hardware<br />
umgesetzt. Weiterhin erfolgte die Umsetzung des Softwareprototyps<br />
zur Handsteuerung. Die weiteren Schritte in der Erstellung der Bildverarbeitungkette<br />
erfolgten mit der Realisierung der ImageBus-Overlay Hardware-<br />
Komponente sowie der Umsetzung des Softwareprototyps zur Vektorisierung<br />
eines Portraits. Danach wurden die Prototypen der Bildverarbeitung für die<br />
alternative Gestensteuerung und die Armnachahmung auf Hardware und<br />
den Microblaze portiert. Die Vektorisierung läuft dabei, konform mit der<br />
Spezifikation, auf einem Rechner ab.<br />
Für die Robotersteuerung wurden die Routinen für Ansteuerung der Servos<br />
sowie die Kinematik umgesetzt. Im späteren Verlauf wurde ein neuer<br />
Roboterarm entwickelt und gebaut, da der zur Verfügung gestellte Roboterarm<br />
viele Schwächen aufweist. Dennoch wurden die Demonstratoren mit<br />
dem alten Roboterarm realisiert, da der neue Roboterarm erst zum Schluss<br />
des Projektes fertiggestellt wurde. Die letzten Wochen dienten zur Optimierung<br />
der Demonstratoren.<br />
Im Laufe des Projekts hat sich die Entwicklung von Hardware als besonders<br />
zeitaufwändig herausgestellt. Es fiel auf, dass die Hardwareentwicklung<br />
im Gegensatz zur Software eine gründliche Planung der Komponenten<br />
sowie ein tiefes Verständnis von Echtzeit und Parallelität benötigt.<br />
Aus diesem Grund gehört die Entwurfsphase zu den wichtigsten Entwicklungsprozessen,<br />
da insbesondere bei der Planung vorausschauendes Denken<br />
erforderlich ist. Für eine Validierung des in VHDL beschriebenen Verhaltens<br />
ist daher das lange und kontinuierliche Simulieren und Testen jeder<br />
Hardware-Komponente notwendig. Durch die steigende Anzahl der Hardware-<br />
Komponenten sowie die sich dadurch verlängernden Synthesezeiten wurde<br />
die Bedeutsamkeit einer ausführlichen Planung stark verdeutlicht.<br />
Auf dem Weg zu den gestellten Zielen hat die Projektgruppe viele Probleme<br />
und Herausforderungen überwunden. Die automatische Regelung<br />
der Lichtverhältnisse der zur Verfügung gestellten Kameras stellten eine<br />
weitere Herausforderung dar: Erst durch die Anwendung mehrerer Filter<br />
konnte ein Bereich der Lichtintensität festgestellt werden, bei dem der<br />
Systemprototyp definitionsgemäß funktioniert. Jedoch bereitet eine wenig<br />
458
Kapitel 3. Fazit 10. Oktober 2013<br />
oder ungleichmäßig ausgeleuchtete Umgebung Probleme bei der Erkennung<br />
von eindeutig gefärbten Markierungen. Eine durch definierte Lichtverhältnisse<br />
festgelegte Umgebung erleichtert die Erkennung von Markierungen<br />
daher deutlich.<br />
Sowohl die mechanische Beschaffenheit der Metall- und Plastik-Komponenten<br />
als auch die grobe Auflösung der Servos stellten ein Hindernis bei der Umsetzung<br />
der Anwendungsfälle Skizze zeichnen und Objekt bewegen dar. Für<br />
den Anwendungsfall Objekt bewegen resultierte aus diesen Hindernissen<br />
eine starke Begrenzung der (Wiederhol-)Genauigkeit. Durch die Entwicklung<br />
und den Bau des neuen Roboterarms verzögerte sich die Umsetzung<br />
der Anwendungsfälle Objekt bewegen, Skizze zeichnen sowie Roboter<br />
steuern durch alternative Gesten. Eine weitere Herausforderung stellte das<br />
nur begrenzt vorhandene Ingenieurwissen in der Robotik dar, welches sich<br />
die Gruppe daher im nötigen Umfang aneignen musste. Die manuelle<br />
Entwicklung der Kinematik stellte sich als eine sehr rechenlastige und<br />
zeitaufwändige Aufgabe heraus. Nach dem Versuch die Kinematik algebraisch<br />
zu entwickeln wurde auf eine geometrische Lösung ausgewichen.<br />
Im Folgearbeitspaket stieß die Gruppe weiter auf die frei verfügbare Software<br />
OpenRAVE. Diese ermöglichte die automatisierte Entwicklung der<br />
Kinematik, erforderte jedoch eine gründliche Einarbeitung. Da die Entdeckung<br />
sowie Einarbeitung in diese Software erst relativ spät erfolgte,<br />
mussten die Anwendungsfälle Objekt bewegen und Skizze zeichnen weiterhin<br />
auf der manuell entwickelten Kinematik aufsetzen. Diese ermöglichte<br />
jedoch nicht die Nutzung des gesamten Arbeitsbereichs des Roboterarms.<br />
Außerdem ist in dieser Kinematik die Ansteuerung der Orientierung des<br />
Tool-Center-Point nicht enthalten.<br />
Durch die hohe Komplexität und Einarbeitung in viele neue Themengebiete<br />
wurde festgestellt, dass zur Realisierung der einzelnen Demonstratoren<br />
in den meisten Fällen mehr Zeit benötigt wurde, als zunächst erwartet.<br />
Dies hatte zur Folge, dass die verbleibende Arbeitszeit nicht mehr für die<br />
Integration und Tests mit der verbesserten Kinematik ausreichte. Daher<br />
wurde der Demonstrator Objekt bewegen nicht umgesetzt. Dennoch konnte<br />
die Gruppe die geforderten Grundlagen des Systems realisieren, um somit<br />
eine Basis für darauf aufbauende Arbeiten zu schaffen. Der Anwendungsfall<br />
Armhaltung nachahmen ist vollständig umgesetzt worden. Die weiteren<br />
Anwendungsfälle Roboter steuern durch alternative Gesten und Skizze zeichnen<br />
wurden ebenso fertiggestellt. Weiterhin wurde der Softwareprototyp<br />
zur Erkennung und Vektorisierung des Gesichts einer Person fertiggestellt.<br />
459
Kapitel 3. Fazit 10. Oktober 2013<br />
Das Zeichnen der Skizze funktioniert dabei auf einem Zeichenbereich von<br />
5 x 5 cm. Die Steuerung durch alternative Gesten erkennt die definierten<br />
Geste und ermöglicht das Senden der vordefinierten Steuersignale an den<br />
Roboterarm. Insgesamt hat die Projektgruppe ein System fertiggestellt, das<br />
die gesetzten Hauptanforderungen erfüllt. Die nicht eingebundenen Systemkomponenten<br />
funktionieren im einzelnen und sind lediglich aus Zeitgründen<br />
nicht integriert worden.<br />
Zur Unterstützung der Gruppe im Zeitmanagement wurde ein Mitglied<br />
der Gruppe zum Projektmanager ernannt. Diese hatte einen Überblick über<br />
alle laufenden Arbeitspakete und konnte somit wirkungsvoll Gruppenentscheidungen<br />
bei der Verteilung der Aufgaben koordinieren. Einzelne Sprints<br />
wurden zu diesem Zweck durch ein zusätzlich angefertigtes Gantt-Diagramm<br />
begleitet.<br />
Durch die Projektgruppe konnten viele Erfahrungen gesammelt werden,<br />
die zum Teil nicht Gegenstand des übrigen Studiums sind:<br />
Dazu zählt an erster Stelle das Zeitmanagement welches insbesondere für<br />
die Arbeit in einem richtigen Unternehmen unerlässlich ist. Durch das Erlernen<br />
der Hardwareentwicklung auf FPGAs hat die Gruppe einen vertieften<br />
Einblick in die eingebetteten Systeme und Hardware-Engineering<br />
bekommen. Jedes Teammitglied setzte sich dabei mit mehrere Entwicklungswerkzeuge<br />
auseinander. Weiterhin eignete sich die Gruppe Kenntnisse<br />
aus den Bereiche des Ingenieurwissens wie der Robotik, Kamerasensorik,<br />
Kinematik oder auch der CAD-Modellierung an. Durch das Erkennen<br />
der persönlichen Stärken und Neigungen konnten nach kurzer Einarbeitung<br />
einzelne Aufgaben gezielter verteilt werden. Insgesamt wurde der<br />
Erfolg der Projektgruppe durch enge Zusammenarbeit, kompetente Unterstützung<br />
der Betreuer sowie gegenseitige Hilfsbereitschaft geprägt.<br />
460
4 Ausblick<br />
Dieses Kapitel beschreibt mögliche Verbesserungen und Erweiterungen des<br />
Projekts. Grundsätzlich können die umgesetzten Demonstratoren als Prototypen<br />
angesehen werden, welche für den Einsatz im Bereich der Medizin,<br />
der Sicherheitstechnik oder der Geriatrie weiterentwickelt werden müssten.<br />
Zur Verbesserung der Unabhängig von Lichtverhältnissen und der damit<br />
verbundenen Präzisierung der Armbindenerkennung, können rote LEDs<br />
an Stelle der Armbinden verwendet werden. Es könnte darüber hinaus eine<br />
Kamera ohne Infrarotfilter zum Einsatz kommen. Dies ermöglicht andere,<br />
leichter erkennbare, Markierungen zu verwenden, um damit die Stabilität<br />
des System zu verbessern. Anstatt der farbigen Markierungen, welche dem<br />
Hintergrund sehr ähnlich sein können, würden Markierungen verwendet,<br />
welche nur in einer bestimmten Entfernung zur Infrarotlichtquelle erkannt<br />
werden.<br />
Eine weitere mögliche Erweiterung des Systems wäre die Steuerung des<br />
Roboterarms mit Hilfe der Verfolgung von Augenbewegungen. Das menschliche<br />
Auge könnte als Joystick fungieren und somit eine zusätzliche alternative<br />
Gestensteuerung umsetzen.<br />
Der Demonstrator Objekt bewegen wurde im Projekt Roboarm nicht umgesetzt.<br />
Abgesehen von der fehlenden Portierung sind alle Voraussetzungen<br />
für diesen Demonstrator geschaffen. Der Roboterarm ist gebaut, die zugehörige<br />
Kinematik erstellt, die Algorithmik ist fertig. Der neue Roboterarm<br />
könnte mit Hilfe der Ausgaben eines Schachcomputers Schachfiguren an<br />
die korrekte Position bewegen. Zu diesem Zweck bedürfte es entweder einer<br />
definierten Umgebung oder weitere Bilderkennungsverfahren zur Identifikation<br />
von Schachfiguren.<br />
Weiterhin können mit Hilfe des neuen Roboterarms schon umgesetzte Anwendungsfälle<br />
verbessert werden hinsichtlich des Arbeitsbereiches und der<br />
Präzision. Der Anwendungsfall Skizze zeichnen erhält dadurch die Möglichkeit<br />
größere Bilder zu skizzieren und die Linienführung würde verbessert. Der<br />
Arbeitsbereich des Anwendungsfalls alternative Gestensteuerung wird vergrößert<br />
und die Genauigkeit einen bestimmten Punkt anzufahren erhöht<br />
sich. Dies könnte der Erstellung von Portraits oder Landschaftszeichnungen<br />
mit künstlerischem Wert dienen.<br />
461
Kapitel 4. Ausblick 10. Oktober 2013<br />
Die Kapazität des verwendeten Boards (ATLYS) ist durch das Projekt erschöpft.<br />
Bei Erweiterung des Systems muss ein größeres Board verwendet<br />
werden (z.B. ein GENESYS). Dabei ergibt sich das Problem, dass die<br />
HDMI-Anbindung ATLYS spezifische Details verwendet und nicht auf anderen<br />
Boards funktioniert. Wenn bei Verwendung eines neuen Boards weiterhin<br />
die HDMI-Ausgabe verwendet werden soll, muss diese entsprechend<br />
an das neue Board angepasst werden. Beim GENESYS-Board ist beispielsweise<br />
ein eigener Chip für die HDMI-Codierung verbaut, welcher explizit<br />
angesprochen werden müsste.<br />
462
Literaturverzeichnis<br />
[1] V. Paletta A. Freimann, E. Topcagic, Eyetracking, 2011.<br />
[2] Aptina, Mt9d112 data sheet, URL http://www.aptina.com/assets/<br />
downloadDocument.do?id=801.<br />
[3] Donald G. Bailey, Design for Embedded Image Processing on FPGAs, 1 ed.,<br />
Wiley-IEEE Press, Massey University, New Zealand, August 2011.<br />
[4] Andry Black, Fontbuilder, URL https://github.com/andryblack/<br />
fontbuilder/.<br />
[5] J. E. Bresenham, Algorithm for computer control of a digital plotter, IBM<br />
Syst. J. 4 (1965), no. 1, 25–30, URL http://dx.doi.org/10.1147/sj.<br />
41.0025.<br />
[6] John J. Craig, Introduction to robotics mechanics and control, Pearson Education,<br />
Inc., New Jersey, 2005.<br />
[7] Linux Kernel Developers, Linux/drivers/staging/dream/camera/mt9d112.c,<br />
URL http://lxr.free-electrons.com/source/drivers/<br />
staging/dream/camera/mt9d112.c?v=2.6.36.<br />
[8] Digilent, Vmodcam reference manual, URL http://www.digilentinc.<br />
com/Data/Products/VMOD-CAM/VmodCAM_rm.pdf.<br />
[9] Patrick Elfert, Architekturbegründete Vor- und Nachteile FPGA basierender<br />
Bildverarbeitung sowie grundelegende Transformationsstrategien, 2012.<br />
[10] Jesse S. Jin John G. Allen, Richard Y. D. Xu, Object Tracking Using<br />
CamShift Algorithm and Multiple Quantized Feature Spaces, 2006.<br />
[11] Micron, Mt9d112 data sheet, URL http://www.zhopper.narod.ru/<br />
mobile/mt9d112_misoc-2020_full.pdf.<br />
463
Literaturverzeichnis 10. Oktober 2013<br />
[12] I. Oikonomidis, N. Kyriazis, and A.A. Argyros, Full DOF tracking<br />
of a hand interacting with an object by modeling occlusions and physical<br />
constraints, Proceedings of the 13th IEEE International Conference<br />
on Computer Vision, IEEE, November 2011, pp. 2088–2095 (english),<br />
URL http://www.ics.forth.gr/~argyros/mypapers/2011_11_<br />
iccv_hope.pdf.<br />
[13] Werner Roddeck, Einführung in die mechatronik, Teubner GmbH, Wiesbaden,<br />
2003.<br />
[14] R. Männer S. Hezel, A. Kugel, FPGA-based Template Matching using<br />
Distance Transforms, 2012.<br />
[15] Tobias Schüürhuis, FPGA Architektur und verfügbare Entwicklungsplattformen,<br />
2012.<br />
[16] Matthias Stasch, Objekterkennung, 2012.<br />
[17] Robert Y. Wang and Jovan Popović, Real-time hand-tracking with a<br />
color glove, ACM Transactions on Graphics 28 (2009), no. 3 (english),<br />
URL http://people.csail.mit.edu/rywang/handtracking/<br />
s09-hand-tracking.pdf.<br />
[18] xilinx, Logicore ip multi-port memory controller (v6.06.a), URL http:<br />
//www.xilinx.com/support/documentation/ip_documentation/<br />
mpmc/v6_06_a/mpmc.pdf.<br />
[19] xilinx (Richard Griffith and Felix Pang), Microblaze system performance<br />
tuning, URL http://www.xilinx.com/support/documentation/<br />
white_papers/wp348.pdf.<br />
[20] Projektgruppe yaDAS, Fpga-basiertes echtzeit-kamerasystem für fahrassistenz,<br />
IEEE, September 2011, pp. 2088–2095 (german), URL<br />
http://www-is.informatik.uni-oldenburg.de/~dibo/pg_fb10/<br />
endberichte/2011/yaDAS.pdf.<br />
464
Glossar<br />
3D-Kamera Kamera, welche Bilder mit Tiefeninformationen erstellt. 20<br />
Agilen Softwareentwicklung Oberbegriff für den Einsatz von Agilität (Dynamik)<br />
in der Softwareentwicklung. 63<br />
Algorithmus Aus endlichen, ausführbaren Schritten bestehende Handlungsvorschrift.<br />
155, 232, 234, 235, 279, 283, 337, 338, 391–393, 398, 441<br />
AMiR Abteilung Mikrorobotik und Regelungstechnik. 25, 158<br />
AREXX Firma, welche den von der Projektgruppe benutzten Roboterarm<br />
anbietet. 28<br />
Array Ein Array ist eine Datenstruktur, in der jedes Datum einen eindeutigen,<br />
fortlaufenden Index besitzt. 18, 408, 436, 437<br />
ATLYS Entwicklerplatine mit FPGA von Digilent. Siehe auch Digilent und<br />
FPGA. 28, 177, 181, 182, 190, 194, 203, 260, 285, 288, 289, 365, 446, 447,<br />
462<br />
Auösung Anzahl der gesamten Bildpunkte einer Rastergrafik, welche meistens<br />
als Bildpunkte pro Zeile multipliziert mit den Bildpunkten pro<br />
Spalte angegeben wird. 216, 227, 228, 236, 338<br />
Base Der festgeschraubte, im Raum unbewegliche Fußpunkt des Roboters<br />
wird Base genannt. 15, 323–326<br />
BGR888 BGR steht für blau, grün und rot. Den drei Kanälen stehen dabei<br />
jeweils acht Bit zur Verfügung. 173<br />
Bildwiederholungsrate Anzahl der Einzelbilder bzw. Bewegungsphasen,<br />
die in einem bestimmten Zeitabschnitt aufgenommen werden. 111,<br />
216<br />
Bitstream Ein Bitstream ist eine Bitfolge, welche aus IP-Cores generiert<br />
wird. Mit diesem Bitstream wird FPGA mit der entsprechenden Funktionalität<br />
programmiert. 389, siehe IP-Core<br />
465
Glossar 10. Oktober 2013<br />
BLOB Binary Large Object, Die Binary Large Objects sind Strukturen in<br />
binären Bildern. 13, 18, 184, 189, 198, 199, 214, 219, 227, 229, 234, 235,<br />
259, 266, 267, 269, 271, 272, 274, 285, 376, 391, 399, 404–406, 409, 434,<br />
439, 440, 445<br />
Breakpoint Ein Breakpoint wird in der Softwareentwicklung verwendet,<br />
um ein Programm an einer vorher festgelegten Stelle zu unterbrechen<br />
bzw. zu pausieren. Dies geschieht z.B. zum Debuggen von Programmzeilen<br />
see. 401<br />
Bulkdaten Übertragung großer Datenmengen über USB. 109<br />
Bus Binary Unit System, System zur Datenübertragung zwischen mehreren<br />
Teilnehmern. 109<br />
C++ Eine objektorientierte Programmiersprache, Erweiterung von C. 235,<br />
297, 368, 369, 376, 379–381, 383–387, 389, 391, 392, 409, 417, 440, 447<br />
Compiler Ein Compiler übersetzt geschriebenen (z.B. C++)-Quellcode in<br />
die Maschinensprache. 400, siehe C++<br />
Datenstrom kontinuierliche Abfolge von Datensätzen ohne absehbares Ende.<br />
27, 63<br />
Denavit Hartenberg DH-Transformation: Überführung von Ortskoordinatensystemen<br />
innerhalb von kinematischen Ketten. 116, 117, 120, 121, 123,<br />
212, 379, 385<br />
Digilent Firma, welche elektronische Bauteile, insbesondere FPGAs verkauft.<br />
28, 103, 106, 109, 110, 159, 177, 182, 465, 467, siehe FPGA<br />
Dilatation Beschreibt eine morphologische Bildoperation, welche mit Hilfe<br />
eines Filterkerns Strukturen vergrößert. 158, 171, 175, 223, 224, 231,<br />
232<br />
Disparitätskarte Karte aus zwei Kameras, welche den Versatz der erkannten<br />
Objekte angibt. 61<br />
Echtzeit Zwischen definierten Zeitgrenzen arbeiten. 24, 194, siehe Echtzeitsystem<br />
Echtzeitsystem System, welches zwischen definierten Zeitgrenzen arbeitet.<br />
23<br />
466
Glossar 10. Oktober 2013<br />
Ein-/Ausgabe Pin Pin, welcher für beliebige Ein/Ausgabe benutzt werden<br />
kann. 110<br />
eingebettetes System elektronisches System, welches in einen technischen<br />
Kontext eingebunden ist. 22<br />
Equalizer-Histogramm Equalizer-Histogramme werden verwendet um die<br />
Helligkeit eines Bildes anzugleichen. 198<br />
Erosion Beschreibt eine morphologische Bildoperation, welche mit Hilfe<br />
eines Filterkerns Strukturen verkleinert. 158, 171, 175, 223, 224, 231<br />
Euler-Notation Die Euler-Notation gibt ein Format an, in welchem Winkel<br />
angegeben werden. Dabei werden Rotation um X,Y,Z konsekutive<br />
ausgeführt. 386<br />
Eye-Tracking Tracking von Augen. 36, 66, 155, 158, 457, siehe Tracking<br />
FIFO Besondere Form der Queue, welche als Puffer dient. 14, 179, 207, 209,<br />
240, 241, 243–246, 285–289, siehe Queue<br />
Filter Eine mathematische Funktion, welche aus einem Eingangsbild ein<br />
reduziertes Ausgangsbild erzeugt. 23<br />
Flieÿkommazahl Eine Fließkommazahl ist eine angenährte Darstellung einer<br />
reellen Zahl. 436<br />
FPGA Field Programmable Gate Array, Integrierter Schaltkreis in den logische<br />
Schaltungen programmiert werden. 27, 28, 61, 66, 103, 106, 109,<br />
110, 156–158, 175, 177, 189, 192, 196, 200, 214, 216, 232, 279, 281, 289,<br />
297, 303, 337, 349, 389, 390, 392, 401, 446, 448, 452, 457, 458, 460, 465,<br />
467, 473, siehe Integrierter Schaltkreis<br />
fps Bilder pro Sekunde (Frames per Second). 216, 407, 438<br />
Frame Ein Frame ist ein Bild innerhalb eines Videostreams. 392<br />
Generic Ein Generic ist ein konfigurierbare Konstante. 171, 175, 178, 206,<br />
285, 303, 376<br />
GENESYS Entwicklerplatine mit FPGA von Digilent. Siehe auch Digilent<br />
und FPGA. 177, 181, 203, 279, 281, 285, 289, 337, 349, 462<br />
467
Glossar 10. Oktober 2013<br />
HDMI High Definition Multimedia Interface, Schnittstelle zur digitalen<br />
Übertragung von Audio- und Video-Daten. 111, 157, 159, 177, 180,<br />
181, 187, 189, 194, 239, 259, 389, 390, 392, 446, 447, 458<br />
HIL IP-Core, welcher Bilddaten vom PC entgegen nimmt, diese an eine<br />
Bildverarbeitungskette auf dem FPGA weiterreicht und am Ende wieder<br />
an den PC zurückschickt. 272<br />
I 2 C Inter-Integrated Circuit, serieller Datenbus, auch TWI (Two-Wire-Interface)<br />
genannt. 27, 104, 105<br />
IKfast Ein Modul des OpenRAVE, welches zur Generierung von Vor- und<br />
Rückwärtskinematik verwendet werden kann. 15, 383, 384, 386, 387<br />
Image-HIL Image Hardware in the Loop. Projekt welches ein Bildsignal<br />
vom PC annimmt und nach dem durchlaufen einer Bildkette an diesen<br />
zurückschickt. Es wird zum testen von Bildfilter IP-Cores verwendet.<br />
173, 289<br />
ImageBus der ImageBus ist ein Bus, über den die Bilddaten pixelweise<br />
seriell übertragen werden. 12, 14, 108, 110, 162, 163, 177, 180, 181, 209,<br />
272, 285–291, 293, 458<br />
ImageBusSwitch IP-Core, welcher einen Umschalter zwischen zwei ImageBus<br />
Eingängen auf einen ImageBus Ausgang implementiert. 157,<br />
169<br />
ImageCache IP-Core, welcher ein Bild zwischenspeichert. 111, 177, 181,<br />
232<br />
Infrarot-Cutter Kamerafilter, welcher infrarote Strahlung eliminiert. 200<br />
inline Eine Anweisung für eine Methode innerhalb der Programmiertsprace<br />
C++, welche einen größeren Programmcode zu Gunsten eines effizienteren<br />
Programms zur Folge hat. 18, 437<br />
Interpolation hier: Dicheinterpolation. Berechnung von Pixeln zur Gewinnung<br />
von Bildgenauigkeit, z.B. beim nachträglichen erhöhen der Auflösung.<br />
61, 281, 338, 339, 343, 349, 351<br />
Interrupt Unterbrechung der normalen Programmausführung, zur Ausführung<br />
eines Interrupthandlers. 164, 165, 169, 189, 207, 255, 259, 391<br />
468
Glossar 10. Oktober 2013<br />
IP-Core Intellectual property core, Widerverwendbarer Teil eines Chipsdesigns.<br />
5, 6, 12–15, 27, 28, 61, 103–106, 108–111, 157–160, 162–165,<br />
169–183, 187, 189, 194–197, 203, 204, 206, 207, 209, 216, 239, 241–249,<br />
251–254, 258, 259, 272, 274, 275, 278, 284–291, 302–304, 315, 333–336,<br />
340, 364, 365, 370, 372, 376, 389–392, 405, 410, 411, 430, 446, siehe FPGA<br />
Iteration Wiederholung. 224, 226, 232<br />
Jenga Ein Geschicklichkeitsspiel, welches mit mehreren Holzklötzchen gespielt<br />
wird. 21, 24<br />
KB Größeneinheit von digital gespeicherten Objekten (z.B. Dateien). Entspricht<br />
1000 Bytes. 232<br />
Kinematik Kinematik ist die Wissenschaft über die physikalische Bewegung<br />
der Gegenstände im Raum. In der Robotik befasst sich die Kinematik<br />
mit der Abbildung der Position und Stellung des Endeffektors<br />
im Weltkoordinatensystem auf die Stellungen der einzelnen Robotersegmente<br />
und umgekehrt. Man unterscheidet die Vor- und Rückwärtskinematiken.<br />
Die Vorwärtskinematik bildet die Winkelstellungen<br />
der Gelenke eines Roboters auf die Position und Ausrichtung des<br />
Endeffektors (Tool-Center-Point) im Weltkoordinatensystem ab. Die<br />
Rückwärtswärtskinematik befasst sich mit der Abbildung der Position<br />
und Ausrichtung des Tool-Center-Point auf die Winkelstellungen<br />
der Gelenke. Damit wird jedes einzelne Segment eines Roboterarms<br />
oder Roboters in eine gewisse Stellung versetzt, um die gewünschte<br />
Position und Ausrichtung des Endeffektors zu erreichen. 7, 66, 198,<br />
203, 210–213, 278, 366, 367, 371, 374, 376, 378–381, 383–388, 429, 445,<br />
455, 458, 459, 472, 475<br />
KISS Keep It Small and Simple, Handhabe es möglichst einfach. 63<br />
Kreuzprodukt Mathematische Verknüpfung zweier Vektoren zu einem Vektor,<br />
welcher orthogonal auf den beiden Eingabevektoren steht. 237,<br />
300, 358<br />
Language Templates Durch die Entwicklungsumgebung vorgegebene Konstrukte,<br />
welche erkannt und ideal auf in Hardware übersetzt werden<br />
können. 176<br />
Latenz Verzögerungszeit zwischen Eingabe des Benutzers und Reaktion<br />
des Systems. 58<br />
469
Glossar 10. Oktober 2013<br />
Mapping Mapping, Abbildung oder Kartierung von Elementen (z.B. Funktionen,<br />
Eigenschaften ...). 198, 434–438<br />
Methode Eine Methode ist eine Programmfunktion, welche eine algorithmische<br />
Teilaufgabe löst. 436, 444, 445<br />
Microblaze in FPGAs von Xilinx verwendeter 32 Bit RISC Mikrocontroller.<br />
103, 104, 109, 164, 177, 178, 189, 193–195, 204, 207, 259, 272, 274, 275,<br />
283, 285, 286, 288–290, 297, 303, 343, 351, 358, 365, 367–369, 372, 374,<br />
376, 388, 389, 391, 396, 399, 401–404, 407, 410, 431, 447, 452, 458<br />
Mikado Ein Geschicklichkeitsspiel, welches mit mehreren bunten Holzstäbchen<br />
gespielt wird. 21, 24<br />
Morphologie Verarbeitung von binären Bildern bezüglich Teilmengen eines<br />
Bildes. 13, 158, 218–221, 223–227, 231<br />
MPMC IP-Core, welcher mehrere abstrahierte Schnittstellen auf Arbeitssspeicher<br />
anbietet. 177–179, 181, 239, 241, 244–246<br />
Normalform Hier: Spezielle Darstellung für eine Ebene zur leichteren Abstandsberechnung.<br />
238, 300, 358<br />
OFFIS-Automation-Toolbox grafisches Programm zum erstellen und testen<br />
von Filterketten. 7, 14, 28, 66, 103, 109, 155, 157, 158, 168, 170, 172, 182,<br />
184, 189–193, 214, 218, 235, 248–250, 257, 260, 279–281, 283, 289, 337,<br />
342, 343, 349, 354, 363, 367, 369, 371, 373, 374, 376, 378, 381, 386, 388,<br />
392, 412, 413, 443, 450, 451<br />
OpenCV Programmbibliothek zur Bildverarbeitung. 109, 215, 232, 413<br />
OpenRAVE Ein Werkzeug zum Modellieren und Berechnen Robotischer<br />
Umgebungen http://openrave.org. 15, 379–386, 388, 459<br />
Overlay Bild, welches über ein anderes Bild gelegt wird. 14, 18, 272, 285–<br />
293, 389, 392, 404, 406, 408, 434–439, 446, 447, 458<br />
Parameter Spezielle Variablen bzw. Kenngrößen. 224<br />
PC Personal Computer. 25, 27, 58, 108, 110, 163, 194, 241, 257, 258, 390, 457<br />
PIM Abtrahierte Schnittstelle, welche Zugriff auf den Arbeitsspeicehr ermöglicht.<br />
178, 179<br />
470
Glossar 10. Oktober 2013<br />
Pixel Digitaler Bildpunkt. 216, 222, 228, 236, 299<br />
PLB High-Speed Datenbus zur Kommunikation zwischen IP-Cores und<br />
Prozessorkernen. 110, 163, 164, 169, 171, 178, 179, 181, 204, 207, 243,<br />
245, 251, 272, 285, 286, 288, 336, 372, 404, 410, 429<br />
Plugin Ein Plugin ist Erweiterung oder auch ein Softwaremodul für eine<br />
bestehende Software, welches bei Bedarf eingebunden werden kann<br />
und den Funktionsumfang einer Software erweitert. 367, 388, 413,<br />
414, 416, 417<br />
Plugin Ein Plugin ist Erweiterung oder auch ein Softwaremodul für eine<br />
bestehende Software, welches bei bedarf eingebunden werden kann<br />
und den Funktionsumfang einer Software erweitert. 155, 189, 451<br />
Polygon Geometrisches Vieleck. 222<br />
Proling Profiling bezeichnet eine Analyse des Laufzeitverhaltens von Software.<br />
16, 398, 399, 401, 403, 409<br />
Pull-up Widerstand Widerstand, der den Standardzustand einer Leitung<br />
auf aktiv zieht. 109<br />
Pulspositionsmodulation Modulationsverfahren zur Datenübertragung. 28,<br />
203, 333, 351, 352, 389<br />
Python Programmiersprache, welche den Ruf hat leicht lesbar zu sein<br />
(Pseudocode). 155, 190, 192, 274, 279–281, 283, 337, 342, 349, 352, 365,<br />
369, 371, 376, 378, 387, 389, 391, 392<br />
Qt Qt ist eine C++ Programmbibliothek, siehe www.qt-project.org. 367,<br />
374, 388<br />
Queue Eine Warteschlange für Daten. 179, 180<br />
RA1-PRO Lern- und Schulungsroboter der Firma Arexx. 23<br />
RAM Schneller Speicher welcher als Ablage für Daten dient. 175–178, 194,<br />
239, 242, 244–246, 272, 285, 287, 289, 290<br />
Referenz Eine Referenz ist ein Verweis auf einen Speicherbereich. 408, 436<br />
Repository Eine Repository ist ein (hier: dezentrales, versioniertes) Datenarchiv.<br />
409, 428, 440, 447<br />
471
Glossar 10. Oktober 2013<br />
RGB2Grey Bildverarbeitungsfilter, der eine ausgewählte Farbe (Rot, Grün<br />
oder Blau) filtert. 158, 172, 173, 196, 199, 201, 214, 223, 372, 410<br />
RGB565 RGB steht für rot, grün und blau. Dem roten und blauen Kanal<br />
stehen dabei fünf Bit zur Verfügung, dem grünen sechs Bit. 239, 287,<br />
288<br />
RGB888 RGB steht für rot, grün und blau. Den drei Kanälen stehen dabei<br />
jeweils acht Bit zur Verfügung. 12, 158, 171–174<br />
RGBA888 RGB steht für rot, grün und blau. Den drei Kanälen stehen<br />
dabei jeweils acht Bit zur Verfügung. Zusätzlich existiert ein acht Bit<br />
Alpha-Kanal für Transparenzinformationen. 287, 290, 291, 294, 295<br />
RoboArm Name der Projektgruppe. 20, 25, 156, 182, 271, 381, 383, 385, 387,<br />
430, 457<br />
ROI Region of interest, Eingrenzung des Bildbereichs auf einen Bereich<br />
der im Weiteren verwendete Daten beinhaltet. 198, 200<br />
ROS Ein Betriebsystem zur Steuerung von Robotern www.ros.org. 386<br />
Rückwärtskinematik Kinematik. 155, 278–281, 337, 341–344, 349, 351, 352,<br />
371, 378, 381, 383, 386–388<br />
Schwellwertlter Schwellwertfilter werden im Bereich der Bildsegmentierung<br />
eingesetzt. Sie ermöglichen es durch Eingabe eines Wertes, in der<br />
Regel 0-255, Regionen voneinander zu unterscheiden. Dies kann sowohl<br />
auf Graubildern als auch auf den Farbkanälen von Farbbildern geschehen.<br />
158, 214, 225, 234<br />
Schwerpunkt Geometrischer Schwerpunkt eines Objekts, der durch Mittelung<br />
aller Punkte innerhalb des Objekts berechnet wird. 189, 269,<br />
297, 393, 405, 407, 408, 436, 439–442<br />
Sensor Messfühler, welcher bestimmte physikalische oder chemische Eigenschaften<br />
erfasst und in elektrische Signale umwandelt. 13, 216, 235,<br />
236<br />
Servo Elektromotor mit PPM-Ansteuerungselektronik. 5, 6, 13, 28, 47, 48,<br />
59, 66, 203–207, 212, 278, 279, 283, 305, 311, 312, 314–319, 321–323,<br />
330–337, 340, 352, 354, 365, 382, 389, 399, 403, 404, 418, 420, 421, 423,<br />
424, 428, 434–438, 441, 458, 459, siehe Pulspositionsmodulation<br />
472
Glossar 10. Oktober 2013<br />
Skalarprodukt Mathematische Verknüpfung zweier Vektoren zu eine Zahl<br />
(Skalar). 237, 300, 358<br />
Software Development Kit Das Xilinx Software Development Kit ist eine<br />
Entwicklungsumgebung für die Programmierung von Hardware. 399,<br />
400, 402, siehe Xilinx<br />
Spartan-6 FPGA Series von Xilinx. Siehe auch Xilinx und FPGA. 28<br />
Sprint Ein, eine festegelegte Dauer andauernder, Iterationsschritt, Konzept<br />
aus der Agilen Softwareentwicklung. 10, 63, 65, 66, 155, 189, 259, 260,<br />
271, 272, 279, 337, 365, 429, 430, 455<br />
Stereobild Zwei 2D-Bilder, welche mit einer 3D-Kamera zeitglich aufgenommen<br />
wurden. 232<br />
Stereoskopie Zwei 2D-Bilder, die zusammen einen räumlichen Eindruck<br />
enstehen lassen. 27, 235, 445<br />
Streaming Streaming bezeichnet einen Fluss von Daten, z.B. Bilddaten von<br />
einer Kamera zu einem Monitor. 408<br />
Testbench Virtuelle Testumgebung für Verhaltenstest und Verifikation von<br />
Designs oder ModellDesigns oder Modellen. 278, 304, 336<br />
Threshold Threshold, Schwellwert bei dem Pixelwerte unterhalb des Threshold<br />
auf 0 und alle Pixelwerte über dem Threshold auf 1 gesetzt werden.<br />
198, 199<br />
Tiefenkarte Bild, welches Tiefeninformationen für verschiedene Punkte im<br />
Bild enthält. 110, 232<br />
Timer Ein Timer ist ein Taktzähler. 399, 404<br />
Tool-Center-Point Mitte des Werkzeugkoordinatensystems des Roboterarms.<br />
8, 16, 57, 61, 112, 116, 117, 119–121, 123, 125, 127, 132, 134–136,<br />
138, 212, 213, 341, 371, 378, 380, 382, 383, 393, 443, 444, 447, 459, 469<br />
Torso Rumpf des Körpers. 215<br />
Tracking Alle Bearbeitungsschritte, welche zum Verfolgen von Objekten<br />
notwendig sind. 18, 32, 34, 37, 57, 198, 391, 404, 405, 408, 434–438<br />
473
Glossar 10. Oktober 2013<br />
Trajektorie Eine Trajektorie bezeichnet eine Raumkurve entlang derer sich<br />
ein Punkt bewegt. 15, 272, 278–281, 337–339, 341–344, 349, 351, 365,<br />
371, 378, 439<br />
Treiber Ein Treiber ist eine Software, welche z.B. durch das Setzen von<br />
Registern direkt die Hardware ansteurt. 18, 369, 391, 399, 403, 405,<br />
406, 410, 411, 434<br />
UCF User Constraint File. Datei in welcher Netze mit IO Pins des FP-<br />
GAs verknüpft werden und zusätzliche Einschränkungen, wie z.B.<br />
das Taktverhalten, gemacht werden. 181<br />
Unterschneidung Auch “Kerning” genannt. Verringerung des horizontalen<br />
Abstands zweier Buchstaben, so dass sich deren Rahmen bereits<br />
überschneidet. 295<br />
USB Ein serielles Bussystem zur Verbindung elektronischer Geräte. 27,<br />
103, 108–111, 155, 157, 163, 181, 189, 194, 207, 239, 245, 255, 257, 258,<br />
279, 289, 337, 351, 390<br />
Variable Eine Variable reserviert Speicher und ist ein Platzhalter für dynamische<br />
Werte. 408<br />
Vektor Mathematisches Objekt, welches einen Punkt in einem Koordinatensystem<br />
bzw. die Gerade von dem Ursprung (Nullpunkt) zu einem<br />
Punkt beschreibt. 18, 230, 235–237, 298–300, 338, 408, 436, 437<br />
Verilog Sprache in der Hardware beschrieben werden kann. 178<br />
VFBC Diese spezielle Schnittstelle des MPMC dient der Speicherung von<br />
2D-Bilddaten in einem externen Speicher. 12, 177–181, 194, 239–241,<br />
243–246, 272, 285, 287–289, siehe MPMC<br />
VHDCI Very-High-Density Cable Interconnect. 27, 28<br />
VHDL Very High Speed Integrated Hardware Description Language, Sprache<br />
in der Hardware beschrieben werden kann. 14, 178, 194, 286, 289, 458<br />
VHDL-Modul wiederverwendbarer und gekapselter VHDL-Quellcode. 285,<br />
287<br />
VModCam Stereo-Kameramodul für das Atlys- und Genesys-Board, welches<br />
von der Projektgruppe verwendet wird. 172, 184, 185, 187, 302, 439,<br />
siehe 3D-Kamera<br />
474
Glossar 10. Oktober 2013<br />
Vorwärtskinematik Kinematik. 155, 371, 378, 383, 386, 387<br />
Wrapper Eine Schnittstelle, welche zwei Programme verbindet. 381, 386–<br />
388<br />
Xilinx Firma, welche FPGAs designed. 28, 164, 206, 279, 281, 285, 337, 349,<br />
399, 447, 473, siehe FPGA<br />
Xilinx Microprocessor Debugger Der Xilinx Microprocessor Debugger ist<br />
eine Konsole, welche eine manuelle Kommunikation mit dem Microblaze<br />
erlaubt. 399, 401, siehe Xilinx &<br />
Xilinx Peripheral Wizard Tool, welches IP-Core Templates erstellt. 169, 242,<br />
246, 247, 251, siehe Xilinx<br />
XML Extensible Markup Language, Format zur Darstellung hierarchisch<br />
strukturierter Daten. 235<br />
XPS Xilinx Platform Studio, Grafisches Tool zum Erstellen, Bauen und<br />
Konfigurieren von eingebetteten Systemen. 178, 182, 376, 399, 410,<br />
siehe Xilinx<br />
Yaw-Pitch-Roll-Notation Die Yaw-Pitch-Roll-Notation-Notation gibt ein<br />
Format an, in welchem Winkel angegeben werden. Dabei werden Rotation<br />
um X,Y,Z parallel ausgeführt. 386<br />
z-Modus Modus, in welchem auf der z-Achse, statt auf der xy-Ebene gearbeitet<br />
wird. 56, 57<br />
Zustandsautomat Modell eines Verhaltens, welches aus Zuständen, Zustandsübergängen<br />
und Aktionen besteht. 204<br />
475