28.12.2013 Aufrufe

Abschlussbericht - Universität Oldenburg

Abschlussbericht - Universität Oldenburg

Abschlussbericht - Universität Oldenburg

MEHR ANZEIGEN
WENIGER ANZEIGEN

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 />

(night­mode). In some cameras this can be achieved through software se<br />

Abbildung 2.25: the weitere light mögliche sensor, possibly Einteilungen with non­opaque 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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!