diff --git a/Dokumentation_Systemtechnik/diag-LeonardoMixerIO.png b/Dokumentation_Systemtechnik/diag-LeonardoMixerIO.png deleted file mode 100644 index e05e8c8c73a4199f0ccb5d58bedb90d1dd950c73..0000000000000000000000000000000000000000 Binary files a/Dokumentation_Systemtechnik/diag-LeonardoMixerIO.png and /dev/null differ diff --git a/Dokumentation_VBLS/Bilder/diag-framework.png b/Dokumentation_VBLS/Bilder/diag-framework.png deleted file mode 100644 index 3d0c3586bf88e552f91745d4662f4437146b1535..0000000000000000000000000000000000000000 Binary files a/Dokumentation_VBLS/Bilder/diag-framework.png and /dev/null differ diff --git a/Dokumentation_VBLS/Bilder/diag-jni.png b/Dokumentation_VBLS/Bilder/diag-jni.png deleted file mode 100644 index 10bb2a550c0e0134ea15a78290a6b003a815b919..0000000000000000000000000000000000000000 Binary files a/Dokumentation_VBLS/Bilder/diag-jni.png and /dev/null differ diff --git a/Dokumentation_VBLS/Bilder/diag-vbls.png b/Dokumentation_VBLS/Bilder/diag-vbls.png deleted file mode 100644 index 06077869a8048d357ecf96f5fcd342f1ac498c98..0000000000000000000000000000000000000000 Binary files a/Dokumentation_VBLS/Bilder/diag-vbls.png and /dev/null differ diff --git a/Dokumentation_VBLS/Dokumentation_VBLS_Korrektur_Philipp.pdf b/Dokumentation_VBLS/Dokumentation_VBLS_Korrektur_Philipp.pdf deleted file mode 100644 index aade5db159f60d059632f072de7f8e06653fef2c..0000000000000000000000000000000000000000 Binary files a/Dokumentation_VBLS/Dokumentation_VBLS_Korrektur_Philipp.pdf and /dev/null differ diff --git a/LeonardoMixerIO/doc/Dokumentation_Systemtechnik.tex b/LeonardoMixerIO/doc/Dokumentation_Systemtechnik.tex index 185bab185e7c77bc1dad443b9d69fe237cac3ef6..feb6697cfcb71961880c0031f67d05232d49518c 100644 --- a/LeonardoMixerIO/doc/Dokumentation_Systemtechnik.tex +++ b/LeonardoMixerIO/doc/Dokumentation_Systemtechnik.tex @@ -647,8 +647,8 @@ void Scheduler::sortTasks(task **tasks, int left, int right) { } } \end{lstlisting} -Bei \lstinline{sortTasks(...)} handelt es sich um einen Heapsort-Algorithmus mit der -durchschnittlichen Ordnung von $\mathcal{O}(n\cdot\log n)$. Dieser sortiert das übergebene Array +Bei \lstinline{sortTasks(...)} handelt es sich um einen Heapsort-Algorithmus mit einer +Ordnung von $\mathcal{O}(n\cdot\log n)$. Dieser sortiert das übergebene Array entweder nach Zykluszeiten oder nach Prioritäten (abhängig davon, ob ein Array mit Pointern auf Realtime- oder auf Non-Realtime-Task übergeben wurde). Dadurch, dass als Typ des Übergabeparameters die Grund-Datenstruktur \lstinline{task} diff --git a/LeonardoMixerIO/doc/layout/BOmodern.sty b/LeonardoMixerIO/doc/layout/BOmodern.sty index 90895ec498260273a9f2031b84663f5e5964c76b..f58a01d8c922d65191c5c4f9e621ffd262a3a710 100644 --- a/LeonardoMixerIO/doc/layout/BOmodern.sty +++ b/LeonardoMixerIO/doc/layout/BOmodern.sty @@ -4,7 +4,7 @@ %% Page layout and dimensions \RequirePackage[a4paper,top=32mm,bottom=3cm,left=3cm,right=3cm,marginparwidth=1.75cm,headheight=12mm,footskip=12mm]{geometry} %% Language and font encodings -\RequirePackage[rm, light, sfdefault]{roboto} %%TODO: Needs to be implemented properly! +\RequirePackage[rm, light, sfdefault]{roboto} %%TODO: \RequirePackage[T1]{fontenc} %% Packages @@ -91,10 +91,10 @@ {0pt}{-12pt}{12pt} \titleformat{\section} - {\fontfamily{\sfdefault}\bfseries\fontsize{13}{15}\color{BO}}{\thesection}{1em}{#1} % without #1 the section title disappears, since [explicit]{titlesec} is used + {\fontfamily{\sfdefault}\bfseries\fontsize{13}{15}\color{BO}}{}{0em}{\thesection\hspace{1em}#1} % without #1 the section title disappears, since [explicit]{titlesec} is used \titleformat{\subsection} - {\fontfamily{\sfdefault}\bfseries\color{BO}}{\thesubsection}{1em}{#1} + {\fontfamily{\sfdefault}\fontseries{m}\selectfont\color{BO}}{}{0em}{\thesubsection\hspace{1em}#1} %% Custom titlepage (redefines \maketitle, might not be up to LaTeX standards!) \renewcommand{\maketitle}{ diff --git a/Systemtechnik/LeonardoJoystick/.clang_complete b/Systemtechnik/LeonardoJoystick/.clang_complete deleted file mode 100644 index 03cde810fb986254c028774e95176d609d3a7730..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoJoystick/.clang_complete +++ /dev/null @@ -1,48 +0,0 @@ --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\cores\arduino --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\variants\leonardo --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\HID\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Mouse\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\LiquidCrystal\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Servo\src --ID:\Users\Philipp\gitlab\vbls\Systemtechnik\LeonardoJoystick\LeonardoJoystick --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Bridge\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\EEPROM\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Esplora\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Ethernet\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Firmata --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Firmata\utility --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\GSM\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\HID\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Keyboard\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\LiquidCrystal\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Mouse\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\RobotIRremote\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Robot_Control\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Robot_Motor\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SD\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SPI\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SPI1\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Scheduler\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Servo\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SoftwareSerial\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SpacebrewYun\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Stepper\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\TFT\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Temboo\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\USBHost\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\WiFi\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Wire\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Wire1\src --IC:\Users\Philipp\.platformio\packages\toolchain-atmelavr\avr\include --IC:\Users\Philipp\.platformio\packages\toolchain-atmelavr\lib\gcc\avr\4.9.2\include --IC:\Users\Philipp\.platformio\packages\toolchain-atmelavr\lib\gcc\avr\4.9.2\include-fixed --DF_CPU=16000000L --DPLATFORMIO=30201 --DARDUINO_ARCH_AVR --DARDUINO_AVR_LEONARDO --DARDUINO=10612 --DUSB_VID=0x2341 --DUSB_PID=0x0036 --DUSB_PRODUCT="Arduino Leonardo" --DUSB_MANUFACTURER="Arduino" --D__AVR_ATmega32U4__ diff --git a/Systemtechnik/LeonardoJoystick/.gcc-flags.json b/Systemtechnik/LeonardoJoystick/.gcc-flags.json deleted file mode 100644 index 8d6efc14b07e93ec84bd842a788e16bda80daca1..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoJoystick/.gcc-flags.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "execPath": "C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/bin/avr-g++.exe", - "gccDefaultCFlags": "-fsyntax-only -std=gnu11 -fno-fat-lto-objects -g -Os -Wall -ffunction-sections -fdata-sections -flto -mmcu=atmega32u4 -DF_CPU=16000000L -DPLATFORMIO=30201 -DARDUINO_ARCH_AVR -DARDUINO_AVR_LEONARDO -DARDUINO=10612 -DUSB_VID=0x2341 -DUSB_PID=0x0036 -DUSB_PRODUCT=\"Arduino\\ Leonardo\" -DUSB_MANUFACTURER=\"Arduino\"", - "gccDefaultCppFlags": "-fsyntax-only -fno-exceptions -fno-threadsafe-statics -fpermissive -std=gnu++11 -g -Os -Wall -ffunction-sections -fdata-sections -flto -mmcu=atmega32u4 -DF_CPU=16000000L -DPLATFORMIO=30201 -DARDUINO_ARCH_AVR -DARDUINO_AVR_LEONARDO -DARDUINO=10612 -DUSB_VID=0x2341 -DUSB_PID=0x0036 -DUSB_PRODUCT=\"Arduino\\ Leonardo\" -DUSB_MANUFACTURER=\"Arduino\"", - "gccErrorLimit": 15, - "gccIncludePaths": "C:/Users/Philipp/.platformio/packages/framework-arduinoavr/cores/arduino,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/variants/leonardo,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/HID/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Mouse/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/LiquidCrystal/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Servo/src,D:/Users/Philipp/gitlab/vbls/Systemtechnik/LeonardoJoystick/LeonardoJoystick,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Bridge/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/EEPROM/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Esplora/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Ethernet/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Firmata,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Firmata/utility,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/GSM/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/HID/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Keyboard/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/LiquidCrystal/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Mouse/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/RobotIRremote/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Robot_Control/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Robot_Motor/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SD/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SPI/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SPI1/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Scheduler/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Servo/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SoftwareSerial/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SpacebrewYun/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Stepper/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/TFT/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Temboo/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/USBHost/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/WiFi/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Wire/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Wire1/src,C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/avr/include,C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/4.9.2/include,C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/4.9.2/include-fixed", - "gccSuppressWarnings": false -} diff --git a/Systemtechnik/LeonardoJoystick/.pioenvs/do-not-modify-files-here.url b/Systemtechnik/LeonardoJoystick/.pioenvs/do-not-modify-files-here.url deleted file mode 100644 index 78192327cb89a78741c9f8df40c216a41ebe8fdb..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoJoystick/.pioenvs/do-not-modify-files-here.url +++ /dev/null @@ -1,3 +0,0 @@ - -[InternetShortcut] -URL=http://docs.platformio.org/page/projectconf.html#envs-dir diff --git a/Systemtechnik/LeonardoJoystick/.pioenvs/structure.hash b/Systemtechnik/LeonardoJoystick/.pioenvs/structure.hash deleted file mode 100644 index 677eb81d17aba9f72b5b03f6f0a393fb8bb4d686..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoJoystick/.pioenvs/structure.hash +++ /dev/null @@ -1 +0,0 @@ -fe1b0b933c5bd32aaa0a80fa5736787a1a06f7d4 \ No newline at end of file diff --git a/Systemtechnik/LeonardoMixerIO/.clang_complete b/Systemtechnik/LeonardoMixerIO/.clang_complete deleted file mode 100644 index defc3d5d8667c503d4d803a4872a19a88cc34b87..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoMixerIO/.clang_complete +++ /dev/null @@ -1,45 +0,0 @@ --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\cores\arduino --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\variants\leonardo --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\LiquidCrystal\src --ID:\Users\Philipp\gitlab\vbls\Systemtechnik\LeonardoMixerIO\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Bridge\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\EEPROM\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Esplora\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Ethernet\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Firmata --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Firmata\utility --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\GSM\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\HID\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Keyboard\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\LiquidCrystal\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Mouse\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\RobotIRremote\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Robot_Control\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Robot_Motor\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SD\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SPI\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SPI1\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Scheduler\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Servo\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SoftwareSerial\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SpacebrewYun\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Stepper\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\TFT\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Temboo\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\USBHost\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\WiFi\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Wire\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Wire1\src --IC:\Users\Philipp\.platformio\packages\toolchain-atmelavr\avr\include --IC:\Users\Philipp\.platformio\packages\toolchain-atmelavr\lib\gcc\avr\4.9.2\include --IC:\Users\Philipp\.platformio\packages\toolchain-atmelavr\lib\gcc\avr\4.9.2\include-fixed --DF_CPU=16000000L --DPLATFORMIO=30201 --DARDUINO_ARCH_AVR --DARDUINO_AVR_LEONARDO --DARDUINO=10612 --DUSB_VID=0x2341 --DUSB_PID=0x0036 --DUSB_PRODUCT="Arduino Leonardo" --DUSB_MANUFACTURER="Arduino" --D__AVR_ATmega32U4__ diff --git a/Systemtechnik/LeonardoMixerIO/.gcc-flags.json b/Systemtechnik/LeonardoMixerIO/.gcc-flags.json deleted file mode 100644 index 7426b751d3d916ac190be176f2667115894e3adf..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoMixerIO/.gcc-flags.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "execPath": "C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/bin/avr-g++.exe", - "gccDefaultCFlags": "-fsyntax-only -std=gnu11 -fno-fat-lto-objects -g -Os -Wall -ffunction-sections -fdata-sections -flto -mmcu=atmega32u4 -DF_CPU=16000000L -DPLATFORMIO=30201 -DARDUINO_ARCH_AVR -DARDUINO_AVR_LEONARDO -DARDUINO=10612 -DUSB_VID=0x2341 -DUSB_PID=0x0036 -DUSB_PRODUCT=\"Arduino\\ Leonardo\" -DUSB_MANUFACTURER=\"Arduino\"", - "gccDefaultCppFlags": "-fsyntax-only -fno-exceptions -fno-threadsafe-statics -fpermissive -std=gnu++11 -g -Os -Wall -ffunction-sections -fdata-sections -flto -mmcu=atmega32u4 -DF_CPU=16000000L -DPLATFORMIO=30201 -DARDUINO_ARCH_AVR -DARDUINO_AVR_LEONARDO -DARDUINO=10612 -DUSB_VID=0x2341 -DUSB_PID=0x0036 -DUSB_PRODUCT=\"Arduino\\ Leonardo\" -DUSB_MANUFACTURER=\"Arduino\"", - "gccErrorLimit": 15, - "gccIncludePaths": "C:/Users/Philipp/.platformio/packages/framework-arduinoavr/cores/arduino,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/variants/leonardo,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/LiquidCrystal/src,D:/Users/Philipp/gitlab/vbls/Systemtechnik/LeonardoMixerIO/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Bridge/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/EEPROM/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Esplora/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Ethernet/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Firmata,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Firmata/utility,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/GSM/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/HID/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Keyboard/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/LiquidCrystal/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Mouse/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/RobotIRremote/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Robot_Control/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Robot_Motor/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SD/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SPI/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SPI1/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Scheduler/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Servo/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SoftwareSerial/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SpacebrewYun/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Stepper/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/TFT/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Temboo/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/USBHost/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/WiFi/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Wire/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Wire1/src,C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/avr/include,C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/4.9.2/include,C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/4.9.2/include-fixed", - "gccSuppressWarnings": false -} diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/.sconsign.dblite b/Systemtechnik/LeonardoMixerIO/.pioenvs/.sconsign.dblite deleted file mode 100644 index c5b320c3d2bd09a6c143368c2f48e9c244255a58..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/.sconsign.dblite and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/do-not-modify-files-here.url b/Systemtechnik/LeonardoMixerIO/.pioenvs/do-not-modify-files-here.url deleted file mode 100644 index 78192327cb89a78741c9f8df40c216a41ebe8fdb..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoMixerIO/.pioenvs/do-not-modify-files-here.url +++ /dev/null @@ -1,3 +0,0 @@ - -[InternetShortcut] -URL=http://docs.platformio.org/page/projectconf.html#envs-dir diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/CDC.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/CDC.o deleted file mode 100644 index 62640c6ab6b4b9d45beb8e5b5fdd7b4f936e4a93..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/CDC.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial.o deleted file mode 100644 index 3d7470308a6bbddc5effdaeeca51d1d2ec1d257f..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial0.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial0.o deleted file mode 100644 index 151d2e60155b6952732126f681d049073147f377..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial0.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial1.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial1.o deleted file mode 100644 index d9914fb21c6da0afa53692afb7dfc6f39de36ee2..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial1.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial2.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial2.o deleted file mode 100644 index d014b3d2d444dcad12cd192c6921fd63d3a36319..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial2.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial3.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial3.o deleted file mode 100644 index 150aa5dd9695a06c0822f555d63cb5f725b4e3fb..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/HardwareSerial3.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/IPAddress.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/IPAddress.o deleted file mode 100644 index 633908fa6d97fd2d8c1e7fbc0cee639dd66b4830..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/IPAddress.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/PluggableUSB.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/PluggableUSB.o deleted file mode 100644 index 1be7bed23264345d4e84d55fb42568137ce561ca..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/PluggableUSB.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/Print.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/Print.o deleted file mode 100644 index 72271d2497feeebb637712a20bb50c36aa1bd701..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/Print.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/Stream.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/Stream.o deleted file mode 100644 index be304afca4182e45dfac6078f8708cecde001d85..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/Stream.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/Tone.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/Tone.o deleted file mode 100644 index 8f58f70febcd104fb7b29d6982eb32262a914576..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/Tone.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/USBCore.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/USBCore.o deleted file mode 100644 index 80400de1380c0231e9c05b9fce1a12db3dfb1790..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/USBCore.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/WInterrupts.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/WInterrupts.o deleted file mode 100644 index 254792d8ff9eee48572362ee5162c24d0a251d80..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/WInterrupts.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/WMath.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/WMath.o deleted file mode 100644 index 79c144bba67930fb2c20d43e8babc3e64293ad50..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/WMath.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/WString.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/WString.o deleted file mode 100644 index 6e7eecd952a93dcd6d30c11c8dcd050a35c1dced..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/WString.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/_wiring_pulse.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/_wiring_pulse.o deleted file mode 100644 index dd979cc00c675b9f22f803e9b623965d00c5f30d..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/_wiring_pulse.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/abi.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/abi.o deleted file mode 100644 index ff6d0e3641dec04f892724ea02f406b6723bcb46..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/abi.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/hooks.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/hooks.o deleted file mode 100644 index 78920d21f54c032379a05f882b04e6942c3cb89e..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/hooks.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/main.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/main.o deleted file mode 100644 index f2317e94505e18df72962b10c59b436c852e04b0..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/main.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/new.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/new.o deleted file mode 100644 index 25e2f9b7c3a7cc4519b8cc85f841669a06acc372..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/new.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring.o deleted file mode 100644 index 7f1e156c10df48d5a6c9bed96633284443423414..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_analog.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_analog.o deleted file mode 100644 index ad12076358632185dda00591e8f91cca28a6f90e..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_analog.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_digital.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_digital.o deleted file mode 100644 index 19332d9f4b8b71bfa7152db63c00528b42567367..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_digital.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_pulse.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_pulse.o deleted file mode 100644 index 8fe7189101986dc502d82574438141e0816000d6..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_pulse.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_shift.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_shift.o deleted file mode 100644 index 692923784f0b9654606995c65458087f4e564481..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/FrameworkArduino/wiring_shift.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/firmware.elf b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/firmware.elf deleted file mode 100644 index 4d1bd0b81635d8a6e139fae3f60efc27c3717435..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/firmware.elf and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/firmware.hex b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/firmware.hex deleted file mode 100644 index fdbb3eaa83e7955f27a2ad040508aceacf08b6c0..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/firmware.hex +++ /dev/null @@ -1,748 +0,0 @@ -:100000000C94E6000C940E010C940E010C940E015D -:100010000C940E010C940E010C940E010C940E0124 -:100020000C940E010C940E010C9498060C940A0783 -:100030000C940E010C940E010C940E010C940E0104 -:100040000C940E010C940E010C940E010C940E01F4 -:100050000C940E010C940E010C940E010C946C0D7A -:100060000C940E010C9481090C945B090C940E0104 -:100070000C940E010C940E010C940E010C940E01C4 -:100080000C940E010C940E010C940E010C940E01B4 -:100090000C940E010C940E010C940E010C940E01A4 -:1000A0000C940E010C940E010C940E01350A380AC2 -:1000B000270A2B0A2F0A590A590A590A3C0A400AE8 -:1000C000440A4A0A4E0A590A540A080B000202025C -:1000D00001000904000001020200000524001001D3 -:1000E0000524010101042402060524060001070578 -:1000F000810310004009040100020A000000070506 -:1001000002024000000705830240000004030904C6 -:1001100041726475696E6F204C4C43004172647586 -:10012000696E6F204C656F6E6172646F0012010022 -:1001300002000000404123360000010102030112C9 -:10014000010002EF020140412336000001010203D9 -:10015000010000000200090F0000030401000C0070 -:10016000000000000000000000000000000000008F -:1001700000000000250028002B002E0031000000A8 -:100180000000240027002A002D003000040404048D -:10019000040304050202020204030202020206062C -:1001A0000606060604040202020404040802011002 -:1001B00040804010204080408008020401804020A0 -:1001C00010020110801020404020740E11241FBE28 -:1001D000CFEFDAE0DEBFCDBF12E0A0E0B1E0E8EBA8 -:1001E000FCE202C005900D92A63EB107D9F725E0CA -:1001F000A6EEB2E001C01D92AD33B207E1F710E008 -:10020000C6EED0E004C02197FE010E947F12C53ED9 -:10021000D107C9F70E94EE0E0C945A160C940000F8 -:100220004091E9025091EA022091E7023091E80200 -:1002300042175307B4F49091E8009570E1F3909160 -:10024000E80092FD19C08093F1008091E90290913D -:10025000EA0201968F739927892B19F48EEF809308 -:10026000E8008091E9029091EA0201969093EA02F7 -:100270008093E90281E0089580E00895CF92DF92B3 -:10028000EF92FF920F931F93CF93DF931F92CDB7FF -:10029000DEB7182F062FE42E862F880F8E5F9983E6 -:1002A0000E94100183E00E941001F12EC12E99815D -:1002B000D92E8C2D8F19801798F4F601E7FE02C015 -:1002C000849101C080810E941001182F80E00E945B -:1002D00010018123FFEFCF1ADF0A8111EACF01C09D -:1002E00081E00F90DF91CF911F910F91FF90EF90E0 -:1002F000DF90CF900895DF92EF92FF920F931F93BC -:10030000CF93DF93D82E8A017B01E40EF51EEB011B -:10031000CE15DF0571F0D7FE03C0FE01849101C048 -:1003200088810E94100121968111F2CF8FEF9FEFFB -:1003300001C0C801DF91CF911F910F91FF90EF9005 -:10034000DF900895615030F02091F100FC0120838E -:100350000196F8CF289884E68093F0020895CF9311 -:10036000DF93EC012FB7F89480910005909101057F -:10037000A0910205B09103052FBF88879987AA87AE -:10038000BB87E881F9810680F781E02DCE010995D0 -:1003900097FF1EC02FB7F89480910005909101053A -:1003A000A0910205B09103052FBF488559856A8544 -:1003B0007B85841B950BA60BB70B4C815D816E81F1 -:1003C0007F8184179507A607B707D8F28FEF9FEFB5 -:1003D000DF91CF910895CF92DF92EF92FF920F932A -:1003E0001F93CF93DF936C017A018B01C0E0D0E0C3 -:1003F000CE15DF0589F0D8016D918D01D601ED9103 -:10040000FC910190F081E02DC6010995892B11F432 -:100410007E0102C02196ECCFC701DF91CF911F91E1 -:100420000F91FF90EF90DF90CF900895FC01918D98 -:10043000828D981761F0828DDF01A80FB11D5D9646 -:100440008C91928D9F5F9F73928F90E008958FEFB4 -:100450009FEF0895FC01918D828D981731F0828D68 -:10046000E80FF11D858D90E008958FEF9FEF0895BF -:10047000FC01918D228D892F90E0805C9F4F821B23 -:1004800091098F739927089582EF92E00E943802B4 -:1004900021E0892B09F420E0822F0895FC01848D4E -:1004A000DF01A80FB11DA35ABF4F2C91848D90E09E -:1004B00001968F739927848FA689B7892C93A08979 -:1004C000B1898C9180648C93938D848D981306C030 -:1004D0000288F389E02D80818F7D80830895EF92DB -:1004E000FF920F931F93CF93DF93EC0181E0888FEE -:1004F0009B8D8C8D981305C0E889F989808185FDD5 -:1005000024C0F62E0B8D10E00F5F1F4F0F731127C5 -:10051000E02E8C8DE8120CC00FB607FCFACFE889EC -:10052000F989808185FFF5CFCE010E944E02F1CF7F -:100530008B8DFE01E80FF11DE35AFF4FF0820B8F08 -:10054000EA89FB898081806207C0EE89FF89608328 -:10055000E889F98980818064808381E090E0DF917F -:10056000CF911F910F91FF90EF900895CF93DF935C -:10057000EC01888D8823C9F0EA89FB89808185FD9B -:1005800005C0A889B9898C9186FD0FC00FB607FCFC -:10059000F5CF808185FFF2CFA889B9898C9185FF3D -:1005A000EDCFCE010E944E02E7CFDF91CF910895AB -:1005B00080E090E0892B29F00E94440281110C9484 -:1005C00000000895CF93DF931F92CDB7DEB7698304 -:1005D000DC01ED91FC910280F381E02D41E050E0DF -:1005E000BE016F5F7F4F09950F90DF91CF91089506 -:1005F00083E08093E9008091F200882319F08AE378 -:100600008093E8000895FC018485958597FD0BC0D3 -:100610009FB7F89482E08093E9008091F2009FBF39 -:1006200090E0019608959FB7F89482E08093E900E6 -:100630008091F2009FBF90E00895EF92FF920F9398 -:100640001F93CF93DF9300D000D01F92CDB7DEB7BA -:10065000F090E903FF0CBE016F5F7F4F85E0DB0187 -:100660001D928A95E9F784E289838DE48A838CE37D -:100670008B83FC8218EC1D838091E5039091E60347 -:10068000DC01ED91FC910280F381E02D45E050E02A -:100690000995F126E12C2091E9038091E5039091E1 -:1006A000E603E21678F50E2D10E0DC01ED91FC91E9 -:1006B000A091E703B091E803000F111FA00FB11F35 -:1006C0000190F081E02D6C9109958091E503909166 -:1006D000E603FC01A081B181E091E703F091E8031A -:1006E000E00FF11F6181ED91FC910995E091E70325 -:1006F000F091E803E00FF11F908181818927F826AE -:10070000E394C9CFDC01ED91FC910190F081E02DE3 -:100710006F2D09950F900F900F900F900F90DF9114 -:10072000CF911F910F91FF90EF900895CF92DF929C -:10073000EF92FF920F931F93CF93DF930091E1030A -:100740001091E203F80180859185C091DF03D0917B -:10075000E003E280F380873D9640B0F1C090E30370 -:10076000D090E403F601608171816C5D7540072EC5 -:10077000000C880B990B0E9410152AE939E949E908 -:100780005EE30E944B150E9485126E0D7F1D7983DA -:100790006883F601628173816C5D7540072E000CE1 -:1007A000880B990B0E9410152AE939E949E95EE3A3 -:1007B0000E944B150E948512F80124813581620F39 -:1007C000731F7B836A8307C0F982E882F801848102 -:1007D00095819B838A83DF91CF911F910F91FF9029 -:1007E000EF90DF90CF9008950F931F93CF93DF93F7 -:1007F0001F92CDB7DEB782E0898342E450E06AEC15 -:1008000070E080E80E947B010E94B00CDC0112962F -:100810000D911C9113970115110569F0D801ED9107 -:10082000FC910280F381E02DBE016F5F7F4FC80114 -:10083000099597FF07C089810F90DF91CF911F9194 -:100840000F910895F80100851185E5CF61157105B7 -:1008500079F0FB0101900020E9F73197AF01461BC9 -:10086000570BDC01ED91FC910280F381E02D09949E -:1008700080E090E008958F929F92AF92BF92CF92C6 -:10088000DF92EF92FF920F931F93CF93DF935C0160 -:100890006B018A0180910B01882309F459C0809172 -:1008A000F102882309F454C08091FE0480FF05C042 -:1008B0008091E00082608093E000E8018AEFF82EEA -:1008C00093E0E92E2FE3822E3AE3932E2097C9F18D -:1008D0008FB7F894E092E9009091E80095FF06C088 -:1008E0009091F200282D291B922F01C090E08FBF1C -:1008F000911106C0FA94FF2059F10E94E90CE6CF4D -:10090000292F30E0C217D3070CF49C2F8FB7F8942F -:10091000E092E9002091E80025FF11C0292F30E086 -:10092000C21BD30BF601915020F041914093F1008E -:10093000FACFC20ED31E9091E80095FF13C08FBF6F -:10094000C5CF5D9884E68093EB021016110644F043 -:1009500081E090E0F5019383828380E090E005C020 -:10096000C80103C09092E800EACFDF91CF911F91B8 -:100970000F91FF90EF90DF90CF90BF90AF909F903E -:100980008F900895CF93DF931F92CDB7DEB7FC0110 -:100990008485958597FD05C02FEF3FEF3587248728 -:1009A0000BC0CE0101960E94E30B019719F48981D7 -:1009B00090E002C08FEF9FEF0F90DF91CF910895ED -:1009C0000F931F93CF93DF931F92CDB7DEB78C01A8 -:1009D000FC018485958597FF0EC0CE0101960E948B -:1009E000E30B019719F4298130E002C02FEF3FEFAC -:1009F000F80135872487F801848595850F90DF916C -:100A0000CF911F910F910895CF93DF93809184042C -:100A100090918504DC01ED91FC910480F581E02D3D -:100A2000099502979CF0C0918404D0918504CE0171 -:100A30000E94AF0197FDEACF80938B04CE010E9404 -:100A4000AF0197FDE3CF80938C04E0CFC091860483 -:100A5000D09187044BE854E0FA0120E030E06CEDDF -:100A600075E0DE01A20FB31F8E2F841B823050F47D -:100A7000808190E09395880F991F880F991F8D931F -:100A80009C9302C06D937C9331962E5F3F4F203232 -:100A9000310539F70E94C40C68A379A38AA39BA3EC -:100AA000DF91CF9108950F931F93CF93DF938091A0 -:100AB000500490915104DC01ED91FC910480F5818A -:100AC000E02D099540975CF4C0915504609157045E -:100AD000D09158041091560440E050E011C00091AC -:100AE000500410915104CCE5D4E0C8010E94AF013C -:100AF00097FDEACF8993B4E0CC36DB07B1F7E4CFBA -:100B0000DA01A05BBB4F1E968C911E97282F2C23D9 -:100B100030E0062E02C0359527950A94E2F72D178E -:100B200090F42C3080F4F901FF27EE0FFF1FE459F9 -:100B3000FB4F812390E0982F88271F962C91820FDE -:100B4000911D918380834E5F5F4F4E305105C1F6FA -:100B500030915B04C0915204D0915304E0E5F4E07D -:100B600040E050E020E06CED75E080915804DE013B -:100B7000A40FB51F281758F4848D958D332311F0D9 -:100B80009695879584529C4F8D939C9302C06D934C -:100B90007C932F5F4E5F5F4F3296203131F70E947A -:100BA000C40C68A379A38AA39BA3DF91CF911F9163 -:100BB0000F910895CF93DF93CDB7DEB762970FB64D -:100BC000F894DEBF0FBECDBFE1E08091A404811197 -:100BD000E0E0E195F0E0EF56FB4F6489606881E961 -:100BE00094E00E940D0C60912E0470912F044AE055 -:100BF000CE010D960E94030E4AE068EDCE010796E5 -:100C00000E943B0E1A8219821C821B821E821D8248 -:100C100043E050E06FE471E0CE0101960E94E20DE6 -:100C2000BE01695F7F4FCE0101960E94CF0D63E543 -:100C300071E00E94B60DBE01635F7F4F0E94CF0D31 -:100C400068E571E00E94B60DFC0144815581608128 -:100C5000718181E994E00E94EB0189819A810E946F -:100C600050138F8198850E9450138D859E850E9418 -:100C70005013E091A404E23010F4E15001C0E1E02F -:100C8000F0E0EF56FB4F6489606881E994E00E94D0 -:100C90000D0C60913004709131044AE0CE010D9644 -:100CA0000E94030E4AE068EDCE0107960E943B0EBB -:100CB0001A8219821C821B821E821D8243E050E030 -:100CC0006FE571E0CE0101960E94E20DBE01695F01 -:100CD0007F4FCE0101960E94CF0D63E671E00E9426 -:100CE000B60DBE01635F7F4F0E94CF0D68E571E0D6 -:100CF0000E94B60DFC01448155816081718181E9BA -:100D000094E00E94EB0189819A810E9450138F81A7 -:100D100098850E9450138D859E850E94501362967F -:100D20000FB6F894DEBF0FBECDBFDF91CF9108950F -:100D30001F920F920FB60F9211248F939F93809161 -:100D4000E1009091E100937F9093E10083FF0FC059 -:100D50001092E90091E09093EB001092EC0092E386 -:100D60009093ED001092F10298E09093F00082FFD2 -:100D700020C093E09093E9009091F200992319F03C -:100D80009AE39093E8009091EB02992339F09091C7 -:100D9000EB0291509093EB02992389F19091F0022C -:100DA000992339F09091F00291509093F002992399 -:100DB00041F184FF10C08091E2008E7E81608093BB -:100DC000E2008091E1008F7E8093E1008091FE043B -:100DD0008E7E806111C080FF16C08091E2008E7E01 -:100DE00080618093E2008091E1008E7E8093E1003B -:100DF0008091FE048E7E81608093FE0404C05D9A23 -:100E0000CDCF289AD6CF9F918F910F900FBE0F9084 -:100E10001F9018951F920F920FB60F921124CF9228 -:100E2000DF92EF92FF920F931F932F933F934F9375 -:100E30005F936F937F938F939F93AF93BF93EF9342 -:100E4000FF93CF93DF93CDB7DEB76C97DEBFCDBFF7 -:100E50001092E9008091E80083FFFAC168E0CE01BA -:100E600045960E94A20182EF8093E8008D8987FF5A -:100E700005C09091E80090FFFCCF03C09EEF9093D7 -:100E8000E800982F907609F0C6C09E892F89188DAA -:100E900091110CC0803829F48091FF048093F100F7 -:100EA00002C01092F1001092F10047C1422F50E0B1 -:100EB000512B913051F4811140C14130510509F05D -:100EC0003CC18091FF048D7F0BC0933061F4811190 -:100ED00034C14130510509F030C18091FF04826076 -:100EE0008093FF042AC1953041F48091E80080FF8F -:100EF000FCCF20682093E30020C1963009F05FC04A -:100F0000EB8CFC8C1092E9001092EA021092E9023C -:100F1000123091F51092E8021092E7020E94F40359 -:100F200099E0BE016F5F7F4FDB01E92F1D92EA95CB -:100F3000E9F799831A8391E09E8390EA98879AEF64 -:100F400099872091E9023091EA02275F3F4F3C8365 -:100F50002B838D831092E9001092EA021092E9022D -:100F6000F092E802E092E70249E050E080E00E945F -:100F70007B010E94F403E1C0F092E802E092E702F4 -:100F80000E94B00CDC011296ED90FC901397E114D6 -:100F9000F10409F4C0C0D701ED91FC910480F58102 -:100FA000E02DBE016B5E7F4FC7010995009719F0D8 -:100FB0000CF0C3C0C6C0F701E084F184E8CF9730DD -:100FC00009F4BFC0983021F481E08093F100B5C0EE -:100FD000993009F0B2C0837009F0B3C0E1E2F1E0EA -:100FE00081E021E036E39081992361F08093E9006C -:100FF0002093EB0091919093EC003093ED008F5F84 -:10100000873089F78EE78093EA001092EA008F8993 -:101010008093F10292C08B8D9C8D1092E90010920A -:10102000EA021092E9029093E8028093E702898D28 -:10103000811156C08E899D89913A59F4813209F007 -:1010400080C047E050E064E071E080E00E947B01F6 -:1010500074C0913209F075C0833289F4888D90E0B4 -:10106000982F88272F89822BA0E0B0E08093000181 -:1010700090930101A0930201B09303015EC08032FE -:1010800069F48091E80082FFFCCF67E084E091E0A2 -:101090000E94A2018BEF8093E80006C0823209F023 -:1010A0004CC08F8980930B018091FD04882319F037 -:1010B000EEEFFAE002C0E0E0F8E0809104019091E8 -:1010C0000501A0910601B0910701803B9440A10564 -:1010D000B10509F088C080910B0180FFA0C083C0DA -:1010E0000E94B00CDC0112960D911C911397011512 -:1010F000110539F1D801ED91FC910190F081E02DBD -:10110000BE016B5E7F4FC8010995811116C0F801C1 -:1011100000851185ECCF1130C1F0133091F48F8927 -:10112000882309F455C08230E9F440E860E18CE19D -:1011300091E00E943E01882321F08EEF8093E80029 -:1011400087C081E28093EB0083C08B8D9C8D0897D4 -:1011500011F41093E6028091E602811136C06DE22F -:1011600071E038C0813029F440E86BE080E191E023 -:10117000E0CF833031F70E94B00CDC011296ED9085 -:10118000FC9013978E010F5F1F4F6801E114F1046B -:1011900079F0D701ED91FC910680F781E02DB8013F -:1011A000C7010995080F111DF701E084F184EECF06 -:1011B000D8011C92F60101900020E9F73197BF0198 -:1011C0006C197D0940E0C601B4CF6FE371E002C045 -:1011D0006CE071E06115710509F4B3CFFB01449136 -:1011E00050E080E833CF0FB6F894A8958091600066 -:1011F000886180936000109260000FBEA895EE3F5A -:101200002AE0F20739F08091FE0A9091FF0A91835B -:10121000808393CF1092FF0A1092FE0A8ECFEE3F8A -:101220008AE0F80731F0808191819093FF0A8093E2 -:10123000FE0A87E797E7918380839BE088E10FB6FA -:10124000F894A895809360000FBE9093600075CFCE -:101250006C960FB6F894DEBF0FBECDBFDF91CF9175 -:10126000FF91EF91BF91AF919F918F917F916F917E -:101270005F914F913F912F911F910F91FF90EF90B0 -:10128000DF90CF900F900FBE0F901F9018950F9387 -:101290001F93CF93DF93EC010E9426048C0168E634 -:1012A00071E0CE010E942604800F911FDF91CF9143 -:1012B0001F910F9108951F920F920FB60F92112454 -:1012C0002F933F934F935F936F937F938F939F934E -:1012D000AF93BF93EF93FF9382EF92E00E944E0291 -:1012E000FF91EF91BF91AF919F918F917F916F91FE -:1012F0005F914F913F912F910F900FBE0F901F90D4 -:1013000018951F920F920FB60F9211242F938F935F -:101310009F93EF93FF93E0910203F0910303808189 -:10132000E0910803F091090382FD12C09081809141 -:101330000B038F5F8F7320910C03821751F0E091A4 -:101340000B03F0E0EE50FD4F958F80930B0301C02F -:101350008081FF91EF919F918F912F910F900FBE00 -:101360000F901F901895FC0184A995A9009721F072 -:101370006BE671E00E944709FFCF0F931F93CF9355 -:10138000DF93FC01A6A5B7A51097D1F00D90BC91F5 -:10139000A02D1097A9F0EC01ED91FC910995EEA517 -:1013A000FFA5008111810E94C40CF8016283738340 -:1013B000848395838EA59FA502969FA78EA706C0BE -:1013C00084A595A5009711F097A786A7DF91CF91E7 -:1013D0001F910F91089590E0FC01E555FE4F249177 -:1013E000FC01E457FE4F8491882399F090E0880F28 -:1013F000991FFC01E258FE4FA591B491FC01E05900 -:10140000FE4F859194918FB7F894EC91E22BEC9379 -:101410008FBF0895362F90E0FC01EF5AFE4F4491A4 -:10142000FC01E555FE4F2491FC01E457FE4F8491E9 -:10143000882309F451C04423E1F150E0FA013197C7 -:10144000EF30F105B0F5EA5AFF4F0C947F129091FE -:1014500080009F7707C0909180009F7D03C090918E -:101460008000977F9093800024C094B59F7702C03E -:1014700094B59F7D94BD1DC0909190009F7707C04B -:10148000909190009F7D03C090919000977F9093E2 -:1014900090000FC09091C0009F7703C09091C00052 -:1014A0009F7D9093C00005C09091C200977F90935C -:1014B000C200E82FF0E0EE0FFF1FE059FE4FA591AC -:1014C000B4918FB7F894EC91311103C020952E237D -:1014D00001C02E2B2C938FBF0895CF93DF93EC0187 -:1014E00060E08E810E940A0A61E08E810E940A0AF1 -:1014F00060E08E810E940A0A8BE891E00197F1F783 -:10150000DF91CF910895CF92DF92EF92FF920F93E8 -:101510001F93CF93DF937C016C0187E0C80ED11C31 -:10152000C0E0D0E0062F10E0B8010C2E02C0759587 -:1015300067950A94E2F76170F60181916F010E944C -:101540000A0A2196C430D10579F7C701DF91CF91FE -:101550001F910F91FF90EF90DF90CF900C946D0A48 -:10156000CF92DF92EF92FF920F931F93CF93DF936F -:10157000EC01F62E642F8C810E940A0A8D818F3F28 -:1015800019F060E00E940A0A8F850F2D10E084FF99 -:1015900025C06E0187E0C80ED11CE12CF12CB801EA -:1015A0000E2C02C0759567950A94E2F76170F601FA -:1015B00081916F010E940A0AFFEFEF1AFF0A88E08B -:1015C000E816F10461F7CE01DF91CF911F910F91E1 -:1015D000FF90EF90DF90CF900C946D0AB80184E0FB -:1015E000759567958A95E1F7CE010E94830A6F2D64 -:1015F000CE01DF91CF911F910F91FF90EF90DF907F -:10160000CF900C94830A41E00E94B00A81E090E000 -:1016100008954F925F926F927F928F929F92AF92B6 -:10162000BF92EF92FF920F931F93CF93DF93161603 -:1016300017060CF092C0009709F48FC0EC012881C6 -:101640003981232B09F489C06F5F7F4FAB0155951A -:1016500047954F5F5F4F423051055CF0FA0132977A -:10166000EE0FFF1FE80FF91FA081B1814150510912 -:1016700010C0FB01E150F048EE0FFF1FE80FF91F0B -:10168000A081B181EC0128813981318320836150AF -:101690007109EA01CC0FDD1F9A018B010F5F1F4F0B -:1016A0006C177D076CF4F901E150F048EE0FFF1F55 -:1016B000E80FF91FB183A0836130710561F64DC059 -:1016C0006130710581F3C617D707D4F4FE01E150EC -:1016D000F048EE0FFF1FE80FF91FE080F180A280B5 -:1016E000B380F7014680578060847184F50186805D -:1016F0009780A084B184481459046A047B0458F18B -:10170000FE01E150F048EE0FFF1FE80FF91FE080E7 -:10171000F18016964D905D906D907C901997F70131 -:1017200086809780A084B184481459046A047B049D -:1017300068F4F901E150F048EE0FFF1FE80FF91FC0 -:10174000F182E082FE01EE0FFF1F02C0F801E90105 -:101750009E01EF01A5CF2196D3CFDF91CF911F91AD -:101760000F91FF90EF90BF90AF909F908F907F90E0 -:101770006F905F904F900895FC01A089B18982E03D -:101780008C93A485B5851C92A685B78580E18C9342 -:10179000108EA489B58986E08C93A289B3898C9137 -:1017A00080618C93A289B3898C9188608C93A28983 -:1017B000B3898C9180688C930288F389E02D8081B5 -:1017C0008F7D80830895FC018091F102811103C017 -:1017D0008FEF9FEF08959FB7F89482E08093E90020 -:1017E0002091F20030E01216130614F421E030E0EC -:1017F0002115310559F0289884E68093F0028091F4 -:10180000F10080838091F200882319F09FBFC90105 -:1018100008958BE68093E800F9CF40E00C94B00A7D -:10182000EF92FF920F931F93CF93DF93EC0142301F -:1018300018F08F8588608F874B8B1C8A80E48D8B96 -:101840006E8B70E0605C7F4F6F8B8C810E94EB0928 -:101850008D818F3F11F00E94EB098E810E94EB0970 -:101860007E0187E0E80EF11C00E010E08F8584FD2A -:1018700003C084E090E002C088E090E008171907F8 -:1018800044F4F70181917F010E94EB090F5F1F4F24 -:10189000EDCF8BE39DE00197F1F760E08C810E9432 -:1018A0000A0A60E08E810E940A0A8D818F3F19F03A -:1018B00060E00E940A0A6F8564FD1DC063E0CE01EE -:1018C0000E94830A0BE416E4C8010197F1F763E074 -:1018D000CE010E94830AC8010197F1F763E0CE01AF -:1018E0000E94830A83E592E00197F1F762E0CE015E -:1018F0000E94830A16C06062CE010E940D0C8BE428 -:1019000096E40197F1F76F856062CE010E940D0C9D -:1019100083E592E00197F1F76F856062CE010E9446 -:101920000D0C6F856062CE010E940D0C84E0888BE7 -:101930006CE0CE010E940D0C61E0CE010E940D0C06 -:101940008BE39FE10197F1F782E0898B66E0CE019E -:10195000DF91CF911F910F91FF90EF900C940D0CA0 -:101960008091AD0481110DC082E08093A90484E0D0 -:101970008093AA041092AC041092AB0481E080938F -:10198000AD0489EA94E008953FB7F8948091EC02A1 -:101990009091ED02A091EE02B091EF0226B5A89BC6 -:1019A00005C02F3F19F00196A11DB11D3FBFBA2FF1 -:1019B000A92F982F8827820F911DA11DB11DBC0151 -:1019C000CD0142E0660F771F881F991F4A95D1F716 -:1019D0000895CF92DF92EF92FF920E94C40C6B01A8 -:1019E0007C010E94C40CDC01CB018C199D09AE095D -:1019F000BF09883E9340A105B10598F3FF90EF9091 -:101A0000DF90CF9008950E94B2140F931F93CF934D -:101A1000DF93EC0188819981009729F02A813B812D -:101A20002617370788F48B016F5F7F4F0E94E813FA -:101A3000009761F0998388831B830A832C813D8101 -:101A4000232B11F4FC01108281E001C080E0DF91C2 -:101A5000CF911F910F910895EF92FF920F931F93D3 -:101A6000CF93DF93FC01248135816115710511F459 -:101A700080E019C041155105A9F07B01EC018A01F4 -:101A8000020F131FB8010E94050D882389F32881D6 -:101A900039818C819D81B701820F931F0E94D214DE -:101AA0001D830C8381E0DF91CF911F910F91FF90F7 -:101AB000EF900895CF93DF93EC018881998100978F -:101AC00011F00E945013198218821D821C821B8201 -:101AD0001A82DF91CF9108951F920F920FB60F9245 -:101AE00011242F933F938F939F93AF93BF93809134 -:101AF000000590910105A0910205B0910305309178 -:101B0000380523E0230F2D3720F40196A11DB11DC8 -:101B100005C026E8230F0296A11DB11D20933805AC -:101B20008093000590930105A0930205B0930305EF -:101B30008091EC029091ED02A091EE02B091EF0243 -:101B40000196A11DB11D8093EC029093ED02A0932C -:101B5000EE02B093EF02BF91AF919F918F913F91B1 -:101B60002F910F900FBE0F901F901895CF93DF937A -:101B7000EC016115710561F0FB0101900020E9F7AE -:101B80003197AF01461B570B0E942C0D811103C0EA -:101B9000CE010E945A0DCE01DF91CF910895CF93CF -:101BA000DF93EC01FB0144815581608171810E94CA -:101BB0002C0D811103C0CE010E945A0DCE01DF9180 -:101BC000CF910895EF92FF920F931F93CF93DF93DE -:101BD000EC017B018A01BA010E94050D811104C04C -:101BE000CE010E945A0D07C01D830C83B701888166 -:101BF00099810E94D214CE01DF91CF911F910F9154 -:101C0000FF90EF900895EF92FF920F931F93CF9361 -:101C1000DF93CDB7DEB761970FB6F894DEBF0FBE86 -:101C2000CDBF8C01CB01F801118210821382128288 -:101C30001582148250E09E012F5F3F4F7901B90158 -:101C40000E94D914F70101900020E9F73197AF0104 -:101C50004E195F09B701C8010E94E20D61960FB6E7 -:101C6000F894DEBF0FBECDBFDF91CF911F910F91D2 -:101C7000FF90EF900895EF92FF920F931F93CF93F1 -:101C8000DF93CDB7DEB729970FB6F894DEBF0FBE4E -:101C9000CDBF8C01862FF80111821082138212822F -:101CA0001582148250E09E012F5F3F4F7901B901E8 -:101CB00090E00E94D914F70101900020E9F73197D4 -:101CC000AF014E195F09B701C8010E94E20D2996C4 -:101CD0000FB6F894DEBF0FBECDBFDF91CF911F913D -:101CE0000F91FF90EF900895E2EFF2E013821282DD -:101CF00088EE93E0A0E0B0E084839583A683B78369 -:101D00002BE231E0318320832DEC30E035872487CE -:101D10002CEC30E03787268728EC30E0318B208BA5 -:101D200029EC30E0338B228B2AEC30E0358B248B8E -:101D30002EEC30E0378B268B118E128E138E148E84 -:101D4000EFE8F3E01382128284839583A683B7833E -:101D50008BE391E0918380838FEF9FEF958784875A -:101D6000E1E9F4E0138212828BE491E091838083B5 -:101D700088E084838FEF858389E0868384E087838E -:101D800085E0808786E0818787E0828713861486D6 -:101D900015861686178641E060E1CF010E94100C7F -:101DA00089ED94E09093870480938604E0E5F4E065 -:101DB0002CE234E03383228311821082138645EBB8 -:101DC00054E05093E8034093E703EFEDF3E05183D1 -:101DD000408333832283958384830895789484B5E4 -:101DE000826084BD84B5816084BD85B5826085BD17 -:101DF00085B5816085BD80916E00816080936E00A5 -:101E00001092810080918100826080938100809196 -:101E10008100816080938100809180008160809347 -:101E20008000809191008260809391008091910068 -:101E300081608093910080919000816080939000F8 -:101E40008091C10084608093C1008091C100826054 -:101E50008093C1008091C10081608093C100809116 -:101E6000C30081608093C3008091C0008260809332 -:101E7000C0008091C20081608093C20080917A008E -:101E8000846080937A0080917A00826080937A00E7 -:101E900080917A00816080937A0080917A008068D6 -:101EA00080937A001092F1021092FF041092FE04C7 -:101EB0008091D70081608093D70080EA8093D8001A -:101EC00089B5806189BD89B5826089BD09B400FE8C -:101ED000FDCF0E94E90C8091D8008F7C80618093B7 -:101EE000D8008091E000807F8093E0008091E10045 -:101EF0008E7E8093E1008DE08093E200559A209AD7 -:101F0000EEEFFFE7859194918B3F9C4D19F481E0B2 -:101F10008093FD048CEF8093550483E080935604F6 -:101F200082E08093570487E08093580488EF9AE218 -:101F300090935A048093590410925B04C2EFD2E04C -:101F4000D0935104C093500494E1C92ED12CE12CBC -:101F5000F12CC092F602D092F702E092F802F092D1 -:101F6000F902CE010E94BC0B8FE893E090938504A8 -:101F700080938404C0929303D0929403E0929503DB -:101F8000F09296038FEF9FEF90939C0380939B03B7 -:101F9000D093E603C093E503C092F602D092F70215 -:101FA000E092F802F092F902CE010E94BC0B88E0A8 -:101FB0008093E90381E090E0A0E0B0E080933205F7 -:101FC00090933305A0933405B093350524E035E0B4 -:101FD00030932D0520932C0510922E0510922F057D -:101FE00010923005109231058093280590932905B1 -:101FF000A0932A05B0932B0583E595E090932305E4 -:102000008093220510922405109225051092260532 -:102010001092270582E090E0A0E0B0E080931E05DA -:1020200090931F05A0932005B093210586E993E0C6 -:10203000909319058093180510921A0510921B05AC -:1020400010921C0510921D0583E090E0A0E0B0E026 -:102050008093140590931505A0931605B09317056A -:102060008AED95E090930F0580930E051092100570 -:102070001092110510921205109213058DE193E054 -:1020800090930505809304051092060510920705AC -:10209000109208051092090580E593ECA0E0B0E0ED -:1020A00080930A0590930B05A0930C05B0930D0542 -:1020B00086E390E00E94BB12EC01198218821DA6F3 -:1020C0001CA61FA61EA61DAA1CAA1B821A8219AA3C -:1020D00018AA1BAA1AAA8091160190911701892BA0 -:1020E00009F449C0CE0104969B838A8306E111E07E -:1020F000F80160E070E081919191892B31F06F5F80 -:102100007F4F6A307105B9F7C0C06150710916166A -:10211000170624F486E191E00E94090BA0E0B0E0EC -:1021200090E080E0F801219131918F012115310576 -:1021300001F1EA81FB81309771F0AF014C5F5F4F95 -:102140005B834A833183208313821282109759F470 -:102150009E2F8F2F0CC08CA99DA9009709F495C0C4 -:1021600062E971E090C01396FC93EE931297DF0141 -:10217000D9CF9883898380910C0190910D01892B8F -:1021800061F11BAA1AAA6AA97BA9FB01EE0FFF1F26 -:10219000E45FFE4F80819181892B79F06F5F7F4FE3 -:1021A0007BAB6AAB6A30710570F38CA99DA900976F -:1021B00009F46BC06BED71E066C08CE091E09DA707 -:1021C0008CA7615071091616170614F40E94090BAA -:1021D0008CA59DA59FA78EA702C01DA61CA6D09367 -:1021E0003705C093360548E062E081E994E00E943B -:1021F000100CC0913605D0913705E881F9813097F0 -:1022000009F448C1008111810E94C40CD8011296C2 -:102210000D911D912D913C911597DC01CB01801BF7 -:10222000910BA20BB30BE881F98100811181F801B8 -:10223000C680D780E084F1848C159D05AE05BF056E -:1022400008F423C19C01AD012C193D094E095F0919 -:10225000A4E6B0E00E940916A70196010E945D1253 -:102260002B3031054105510598F088A999A90196AF -:1022700099AB88AB893E934058F08CA99DA90097F3 -:1022800021F068E572E00E944709CE010E94B3097F -:10229000D801ED91FC910995E881F98100811181C6 -:1022A0000E94C40CF8016283738384839583088140 -:1022B0001981D8011296ED90FC901397E114F10466 -:1022C00009F494C0CD90DC90F6014680578060847C -:1022D00071840E94C40CD60112968D909D90AD9091 -:1022E000BC901597DC01CB0188199909AA09BB0993 -:1022F000481A590A6A0A7B0AF701C080D180D601C0 -:1023000016968D909D90AD90BC9019970E94C40C2C -:10231000F6012281338144815581DC01CB01821B8E -:10232000930BA40BB50B881A990AAA0ABB0A84144A -:102330009504A604B7040CF059C0F701828193817B -:10234000892B09F441C0D801CD90DC90F60146807C -:102350005780608471840E94C40CD60112968D90BF -:102360009D90AD90BC901597DC01CB01881999091F -:10237000AA09BB09481A590A6A0A7B0AF701C080F0 -:10238000D180D60116968D909D90AD90BC901997F6 -:102390000E94C40CF6012281338144815581DC0105 -:1023A000CB01821B930BA40BB50B881A990AAA0ABE -:1023B000BB0A84149504A604B70434F4D70112961A -:1023C000ED90FC901397B9CFD80112969C9112977B -:1023D00013968C911397F7012281338113963C93C6 -:1023E0002E93129713830283092F182F19830883C2 -:1023F0008CA59DA5009709F45DC06AA97BA96150D1 -:1024000071091616170614F40E94090B8CA59DA5D8 -:102410009FA78EA700E010E0EEA5FFA5309781F101 -:10242000E080F180E114F10459F10E94C40CD7015D -:102430001296CD90DD90ED90FC901597DC01CB01CC -:102440008C199D09AE09BF09803A9648A140B10593 -:1024500078F0EEA5FFA5E080F1808CA59DA5A801F0 -:10246000BC0102960E94C014ECA5FDA5F182E08299 -:102470008EA59FA502969FA78EA70E5F1F4FCCCF5C -:102480008CA59DA59FA78EA715C08CA59DA5892B62 -:1024900029F410C08CA59DA5892B21F0CE010E94A6 -:1024A000BD0908C08CA99DA9009721F06AEC72E0D3 -:1024B0000E9447090E94D8029CCEA1E21A2EAA1BB4 -:1024C000BB1BFD010DC0AA1FBB1FEE1FFF1FA217E4 -:1024D000B307E407F50720F0A21BB30BE40BF50BE1 -:1024E000661F771F881F991F1A9469F7609570956A -:1024F000809590959B01AC01BD01CF010895EE0F31 -:10250000FF1F0590F491E02D09940E948C126894AD -:10251000B1110C94031608950E94E81588F09F5796 -:1025200098F0B92F9927B751B0F0E1F0660F771FF7 -:10253000881F991F1AF0BA95C9F714C0B13091F0ED -:102540000E940216B1E008950C940216672F782FAE -:102550008827B85F39F0B93FCCF3869577956795B2 -:10256000B395D9F73EF490958095709561957F4F1E -:102570008F4F9F4F0895CF93DF938230910510F4D2 -:1025800082E090E0E0913B05F0913C0520E030E0F6 -:10259000C0E0D0E0309711F14081518148175907D0 -:1025A000C0F04817590761F482819381209719F090 -:1025B0009B838A832BC090933C0580933B0526C068 -:1025C0002115310519F04217530718F49A01BE017D -:1025D000DF01EF010280F381E02DDCCF2115310511 -:1025E00009F1281B390B2430310590F412968D9196 -:1025F0009C9113976115710521F0FB0193838283F0 -:1026000004C090933C0580933B05FD01329644C085 -:10261000FD01E20FF31F81939193225031092D9315 -:102620003C933AC02091390530913A05232B41F46F -:1026300020911C0130911D0130933A0520933905FA -:1026400020911A0130911B012115310541F42DB75C -:102650003EB740911E0150911F01241B350BE091A4 -:102660003905F0913A05E217F307A0F42E1B3F0B52 -:102670002817390778F0AC014E5F5F4F24173507F4 -:1026800048F04E0F5F1F50933A05409339058193F0 -:10269000919302C0E0E0F0E0CF01DF91CF91089587 -:1026A0000F931F93CF93DF93009709F48CC0FC0125 -:1026B00032971382128200913B0510913C0501155F -:1026C000110581F420813181820F931F20913905FA -:1026D00030913A052817390779F5F0933A05E093D8 -:1026E000390571C0D80140E050E0AE17BF0750F483 -:1026F00012962D913C911397AD012115310509F1E9 -:10270000D901F3CF9D01DA01338322836081718186 -:10271000860F971F8217930769F4EC01288139818E -:10272000260F371F2E5F3F4F318320838A819B8185 -:1027300093838283452B29F4F0933C05E0933B057A -:1027400042C01396FC93EE931297ED014991599173 -:102750009E01240F351FE217F30771F480819181E8 -:10276000840F951F029611969C938E93828193817C -:1027700013969C938E931297E0E0F0E0D8011296A6 -:102780008D919C911397009719F0F8018C01F6CF69 -:102790008D919C9198012E5F3F4F820F931F209146 -:1027A000390530913A052817390769F4309729F42B -:1027B00010923C0510923B0502C0138212821093C6 -:1027C0003A0500933905DF91CF911F910F9108953C -:1027D000A0E0B0E0EEEEF3E10C941816EC010097E7 -:1027E00021F4CB010E94BB12B8C0FC01E60FF71F19 -:1027F0009C0122503109E217F30708F4ACC0D9015B -:102800000D911C91119706171707B0F005301105AF -:1028100008F49FC0C80104978617970708F499C069 -:1028200002501109061B170B019311936D937C93B2 -:10283000CF010E9450138DC05B01A01AB10A4C0158 -:10284000800E911EA0913B05B0913C0540E050E008 -:10285000E12CF12C109709F44AC0A815B905D1F55F -:102860006D907C901197630182E0C80ED11CCA1450 -:10287000DB0480F1A3014A195B096A0182E0C80EFA -:10288000D11C1296BC9012971396AC91B5E0CB1662 -:10289000D10440F0B282A38351834083D9016D9368 -:1028A0007C930AC00E5F1F4FC301800F911FF90177 -:1028B00091838083EB2DFA2FE114F10431F0D701DD -:1028C0001396FC93EE93129744C0F0933C05E0936B -:1028D0003B053FC08D919C9111974817590708F40B -:1028E000AC017D0112960D90BC91A02DB3CF8091CB -:1028F000390590913A0588159905E1F4461757076F -:10290000C8F480911A0190911B01009741F48DB792 -:102910009EB740911E0150911F01841B950BE81733 -:10292000F907C8F4F0933A05E0933905F90171838A -:1029300060830FC0CB010E94BB127C01009759F04D -:10294000A801BE010E94B714CE010E945013C70116 -:1029500004C0CE0102C080E090E0CDB7DEB7EEE06B -:102960000C94341681E090E0F8940C945A16FB0114 -:10297000DC0102C001900D9241505040D8F70895FB -:102980006817790768F4FB01DC01E40FF51FA40F59 -:10299000B51F02C002900E9241505040D8F70895E2 -:1029A0000C94B714FB01DC0101900D920020E1F7BB -:1029B00008954532510520F4423010F00C94E4148F -:1029C000FB011082CB010895BB27FB015527AA27E5 -:1029D000880F991FAA1FA41710F0A41B83955051AC -:1029E000B9F7A05DAA3308F0A95DA193009779F724 -:1029F000B111B1931192CB010C94FE14DC01FC01D6 -:102A0000672F71917723E1F7329704C07C916D9322 -:102A100070836291AE17BF07C8F30895E89409C0A8 -:102A200097FB3EF490958095709561957F4F8F4F01 -:102A30009F4F9923A9F0F92F96E9BB279395F69517 -:102A4000879577956795B795F111F8CFFAF4BB0F95 -:102A500011F460FF1BC06F5F7F4F8F4F9F4F16C0F9 -:102A6000882311F096E911C0772321F09EE8872F83 -:102A7000762F05C0662371F096E8862F70E060E03F -:102A80002AF09A95660F771F881FDAF7880F9695B8 -:102A9000879597F908950E945E150C94CF150E94B2 -:102AA000C11538F00E94C81520F0952311F00C9440 -:102AB000B8150C94BE1511240C9403160E94E01551 -:102AC00070F3959FC1F3950F50E0551F629FF00181 -:102AD000729FBB27F00DB11D639FAA27F00DB11D9A -:102AE000AA1F649F6627B00DA11D661F829F222723 -:102AF000B00DA11D621F739FB00DA11D621F839FAA -:102B0000A00D611D221F749F3327A00D611D231F7F -:102B1000849F600D211D822F762F6A2F11249F57CD -:102B200050409AF0F1F088234AF0EE0FFF1FBB1FD0 -:102B3000661F771F881F91505040A9F79E3F51058F -:102B400080F00C94B8150C9403165F3FE4F3983EA4 -:102B5000D4F3869577956795B795F795E7959F5F39 -:102B6000C1F7FE2B880F911D9695879597F90895CB -:102B700097F99F6780E870E060E008959FEF80EC30 -:102B8000089500240A9416161706180609060895D3 -:102B900000240A9412161306140605060895092E39 -:102BA0000394000C11F4882352F0BB0F40F4BF2BA8 -:102BB00011F460FF04C06F5F7F4F8F4F9F4F0895E8 -:102BC00057FD9058440F551F59F05F3F71F04795DE -:102BD000880F97FB991F61F09F3F79F087950895C3 -:102BE000121613061406551FF2CF4695F1DF08C0E2 -:102BF000161617061806991FF1CF869571056105FF -:102C000008940895E894BB2766277727CB0197F9A6 -:102C100008950E944B16A59F900DB49F900DA49F00 -:102C2000800D911D112408952F923F924F925F9233 -:102C30006F927F928F929F92AF92BF92CF92DF92CC -:102C4000EF92FF920F931F93CF93DF93CDB7DEB731 -:102C5000CA1BDB0B0FB6F894DEBF0FBECDBF0994C5 -:102C60002A88398848885F846E847D848C849B841C -:102C7000AA84B984C884DF80EE80FD800C811B812A -:102C8000AA81B981CE0FD11D0FB6F894DEBF0FBE59 -:102C9000CDBFED010895A29FB001B39FC001A39FD6 -:102CA000700D811D1124911DB29F700D811D112485 -:082CB000911D0895F894FFCF77 -:102CB800FFFFFFFF00E10000000000002C052205D7 -:102CC80018050E0500000405000000003D05800001 -:102CD80000C18081000000000000006F02EB013895 -:102CE8000216022A02B60200000000E2023B0403B8 -:102CF80003C204E004F80200000000030BEB016DBE -:102D0800303D002073313D00202020202023006D1D -:102D1800313D002073323D000D0A00416E2065727E -:102D2800726F72206F636375726564212050726FD1 -:102D38006772616D6D207465726D696E617465642A -:102D4800210043616E277420696E697469616C693A -:102D58007A6520616E79206D6F7265206C696E6B83 -:102D68006564206C69737420656C656D656E747339 -:102D780021205368757474696E6720646F776E20BC -:102D88007363686564756C657221004E756D626564 -:102D980072206F66206E6F6E2D7265616C74696D3E -:102DA800652D7461736B7320657863656564732042 -:102DB8007461736B207468726573686F6C64206FDC -:102DC80072206E756C6C706F696E746572206174B8 -:102DD8002074686520656E64206F662074686520BD -:102DE8006172726179206D697373696E672120530E -:102DF80068757474696E6720646F776E2073636892 -:102E08006564756C657221004361706163697479EA -:102E1800206F7665726C6F6164212044656C6179FE -:102E2800206265747765656E207468656F72657475 -:102E38006963616C20616E64207072616374696398 -:102E4800616C206379636C652D74696D65206578A4 -:102E58006365656473207468726573686F6C642158 -:102E6800205368757474696E6720646F776E207379 -:102E780063686564756C657221004E6F20746173B8 -:102E88006B732E2E2E204E6F7468696E6720746FD8 -:062E980020646F21000020 -:00000001FF diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/lib/LiquidCrystal/LiquidCrystal.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/lib/LiquidCrystal/LiquidCrystal.o deleted file mode 100644 index 68338e6b81c4316b9e0cec2966357dfdf3eb8754..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/lib/LiquidCrystal/LiquidCrystal.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/lib/libLiquidCrystal.a b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/lib/libLiquidCrystal.a deleted file mode 100644 index 2dc57df69e82bc37235a23dc4cf0ae33fdb873d7..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/lib/libLiquidCrystal.a and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/libFrameworkArduino.a b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/libFrameworkArduino.a deleted file mode 100644 index 7de2bfc084ab459e07f3eadf2f1341331b71a37f..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/libFrameworkArduino.a and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/libFrameworkArduinoVariant.a b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/libFrameworkArduinoVariant.a deleted file mode 100644 index 8b277f0dd5dcdcb9c4b6c0b7a32153664f111266..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/libFrameworkArduinoVariant.a +++ /dev/null @@ -1 +0,0 @@ -!<arch> diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/LeonardoMixer.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/LeonardoMixer.o deleted file mode 100644 index ff1b165ad9516ede3f7bdb8bac34532f8a97bdde..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/LeonardoMixer.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/Mixer.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/Mixer.o deleted file mode 100644 index 5d3f17b2fa55c55353172a5dcd10a7146c69003c..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/Mixer.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/MultiWiiSerial.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/MultiWiiSerial.o deleted file mode 100644 index 98a82ec92d42d61fdf2871405f11dcb94021fa53..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/MultiWiiSerial.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/RawSerial.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/RawSerial.o deleted file mode 100644 index be5c293bf24bee7d155529235cf06b07b0f3529d..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/RawSerial.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/Scheduler.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/Scheduler.o deleted file mode 100644 index 9c916f35530756257e44f6f09fe19778ff9db469..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/Scheduler.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/Spektrum.o b/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/Spektrum.o deleted file mode 100644 index 41b90046b12a46e595916539fe2f181276b3fa02..0000000000000000000000000000000000000000 Binary files a/Systemtechnik/LeonardoMixerIO/.pioenvs/leonardo/src/Spektrum.o and /dev/null differ diff --git a/Systemtechnik/LeonardoMixerIO/.pioenvs/structure.hash b/Systemtechnik/LeonardoMixerIO/.pioenvs/structure.hash deleted file mode 100644 index 7733ad463b6c32402b9253effb18a65b7930bec6..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoMixerIO/.pioenvs/structure.hash +++ /dev/null @@ -1 +0,0 @@ -b585de1f065ce569ed5b1e7569e245f2a9e2860d \ No newline at end of file diff --git a/Systemtechnik/LeonardoMixerIO_Test/.clang_complete b/Systemtechnik/LeonardoMixerIO_Test/.clang_complete deleted file mode 100644 index cc54beea7506ff4e1cefd816d947c363542a0aee..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoMixerIO_Test/.clang_complete +++ /dev/null @@ -1,46 +0,0 @@ --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\cores\arduino --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\variants\leonardo --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Servo\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\LiquidCrystal\src --ID:\Users\Philipp\gitlab\vbls\Systemtechnik\LeonardoMixerIO_Test\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Bridge\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\EEPROM\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Esplora\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Ethernet\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Firmata --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Firmata\utility --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\GSM\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\HID\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Keyboard\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\LiquidCrystal\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Mouse\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\RobotIRremote\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Robot_Control\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Robot_Motor\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SD\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SPI\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SPI1\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Scheduler\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Servo\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SoftwareSerial\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\SpacebrewYun\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Stepper\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\TFT\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Temboo\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\USBHost\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\WiFi\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Wire\src --IC:\Users\Philipp\.platformio\packages\framework-arduinoavr\libraries\Wire1\src --IC:\Users\Philipp\.platformio\packages\toolchain-atmelavr\avr\include --IC:\Users\Philipp\.platformio\packages\toolchain-atmelavr\lib\gcc\avr\4.9.2\include --IC:\Users\Philipp\.platformio\packages\toolchain-atmelavr\lib\gcc\avr\4.9.2\include-fixed --DF_CPU=16000000L --DPLATFORMIO=30201 --DARDUINO_ARCH_AVR --DARDUINO_AVR_LEONARDO --DARDUINO=10612 --DUSB_VID=0x2341 --DUSB_PID=0x0036 --DUSB_PRODUCT="Arduino Leonardo" --DUSB_MANUFACTURER="Arduino" --D__AVR_ATmega32U4__ diff --git a/Systemtechnik/LeonardoMixerIO_Test/.gcc-flags.json b/Systemtechnik/LeonardoMixerIO_Test/.gcc-flags.json deleted file mode 100644 index a6bbad2afe9c46490747aaca4c655ad6c0fba260..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoMixerIO_Test/.gcc-flags.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "execPath": "C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/bin/avr-g++.exe", - "gccDefaultCFlags": "-fsyntax-only -std=gnu11 -fno-fat-lto-objects -g -Os -Wall -ffunction-sections -fdata-sections -flto -mmcu=atmega32u4 -DF_CPU=16000000L -DPLATFORMIO=30201 -DARDUINO_ARCH_AVR -DARDUINO_AVR_LEONARDO -DARDUINO=10612 -DUSB_VID=0x2341 -DUSB_PID=0x0036 -DUSB_PRODUCT=\"Arduino\\ Leonardo\" -DUSB_MANUFACTURER=\"Arduino\"", - "gccDefaultCppFlags": "-fsyntax-only -fno-exceptions -fno-threadsafe-statics -fpermissive -std=gnu++11 -g -Os -Wall -ffunction-sections -fdata-sections -flto -mmcu=atmega32u4 -DF_CPU=16000000L -DPLATFORMIO=30201 -DARDUINO_ARCH_AVR -DARDUINO_AVR_LEONARDO -DARDUINO=10612 -DUSB_VID=0x2341 -DUSB_PID=0x0036 -DUSB_PRODUCT=\"Arduino\\ Leonardo\" -DUSB_MANUFACTURER=\"Arduino\"", - "gccErrorLimit": 15, - "gccIncludePaths": "C:/Users/Philipp/.platformio/packages/framework-arduinoavr/cores/arduino,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/variants/leonardo,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Servo/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/LiquidCrystal/src,D:/Users/Philipp/gitlab/vbls/Systemtechnik/LeonardoMixerIO_Test/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Bridge/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/EEPROM/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Esplora/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Ethernet/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Firmata,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Firmata/utility,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/GSM/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/HID/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Keyboard/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/LiquidCrystal/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Mouse/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/RobotIRremote/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Robot_Control/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Robot_Motor/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SD/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SPI/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SPI1/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Scheduler/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Servo/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SoftwareSerial/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/SpacebrewYun/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Stepper/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/TFT/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Temboo/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/USBHost/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/WiFi/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Wire/src,C:/Users/Philipp/.platformio/packages/framework-arduinoavr/libraries/Wire1/src,C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/avr/include,C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/4.9.2/include,C:/Users/Philipp/.platformio/packages/toolchain-atmelavr/lib/gcc/avr/4.9.2/include-fixed", - "gccSuppressWarnings": false -} diff --git a/Systemtechnik/LeonardoMixerIO_Test/.pioenvs/do-not-modify-files-here.url b/Systemtechnik/LeonardoMixerIO_Test/.pioenvs/do-not-modify-files-here.url deleted file mode 100644 index 78192327cb89a78741c9f8df40c216a41ebe8fdb..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoMixerIO_Test/.pioenvs/do-not-modify-files-here.url +++ /dev/null @@ -1,3 +0,0 @@ - -[InternetShortcut] -URL=http://docs.platformio.org/page/projectconf.html#envs-dir diff --git a/Systemtechnik/LeonardoMixerIO_Test/.pioenvs/structure.hash b/Systemtechnik/LeonardoMixerIO_Test/.pioenvs/structure.hash deleted file mode 100644 index 6ec9321f3c9c07bc572908b984e629838838ac61..0000000000000000000000000000000000000000 --- a/Systemtechnik/LeonardoMixerIO_Test/.pioenvs/structure.hash +++ /dev/null @@ -1 +0,0 @@ -188fcb5ccec3ee54a7ccd4bc3e526eccad64a2c6 \ No newline at end of file diff --git a/Visual-Based-Landing-System/doc/Dokumentation_VBLS.pdf b/Visual-Based-Landing-System/doc/Dokumentation_VBLS.pdf index 9a10a8ca5ea2baacd774a748018094e4596a1051..9ca8770edca97d133810aa7fd8f70ba0e1e05c78 100644 Binary files a/Visual-Based-Landing-System/doc/Dokumentation_VBLS.pdf and b/Visual-Based-Landing-System/doc/Dokumentation_VBLS.pdf differ diff --git a/Visual-Based-Landing-System/doc/Dokumentation_VBLS.tex b/Visual-Based-Landing-System/doc/Dokumentation_VBLS.tex index a49fcdea3bee85b986ea46337bcf8fc186a969bc..a41b3463d62d94763189b53b55f0578701d0bf4f 100644 --- a/Visual-Based-Landing-System/doc/Dokumentation_VBLS.tex +++ b/Visual-Based-Landing-System/doc/Dokumentation_VBLS.tex @@ -12,6 +12,11 @@ \def\runcourse{Eingebettete Systeme} \def\runcategory{Projektdokumentation} +%% Allow for a greater part of the page to be occupied by figures +\renewcommand{\topfraction}{0.7} +\renewcommand{\bottomfraction}{0.7} +\renewcommand{\textfraction}{0.3} + %% Packages \usepackage{layout/BOmodern} % modern HS Bochum themed document template designed for assignments and documentations \usepackage{amsmath} @@ -53,7 +58,6 @@ \lstlistoflistings - \chapter{Einführung} \pagenumbering{arabic} @@ -69,10 +73,10 @@ Mit dieser Motivation behandelt diese Arbeit einen einfach zugänglichen, flexib \section{Zielsetzung} \label{ziel} -Ziel dieser Arbeit ist die Entwicklung einer Optical-Flow-basierten Applikation, welche eingehende Bilddaten einer Kamera verarbeiten und definierte Umgebungsmerkmale erfassen und herausstellen kann. Anhand dieser soll anschließend ein Ausgangssignal abhängig von der aktuellen Position des Merkmals im Bild erzeugt werden, welches die Steuerung einer gekoppelten Anwendung übernehmen oder beeinflussen kann (vgl.\ Spurhalteassistenzsysteme in einem Auto). +Ziel dieser Arbeit ist die Entwicklung einer Optical-Flow-basierten Applikation, welche eingehende Bilddaten einer Kamera verarbeiten und definierte Umgebungsmerkmale erfassen und herausstellen kann. Anhand dieser soll anschließend ein Ausgangssignal abhängig von der aktuellen Position des Merkmals im Bild erzeugt werden, welches bspw.\ die Steuerung einer gekoppelten Anwendung übernehmen oder beeinflussen kann (vgl.\ Spurhalteassistenzsysteme in einem Auto). Konkret soll als Zielplattform ein Smartphone auf Android-Basis sowie die Open Source Bibliothek OpenCV verwendet werden. Als Interface soll die USB-Schnittstelle dienen, da die Umwandlung von diesem Format in die meisten etablierten seriellen Datenprotokolle wie beispielsweise UART sehr einfach und kostengünstig umsetzbar ist und ein Großteil der gängigen Entwicklungsplattformen den Standard bereits von sich aus integriert. \\ -Zu Demonstrationszwecken soll neben einem allgemeinen Framework zur Entwicklung von OpenCV gestützten Bildverarbeitungsapplikationen für Android-Plattformen eine Landeplatzlokalisierung eines UAVs (Abk., engl. für Unmanned Aerial Vehicle) realisiert werden. Als zu erfassendes Merkmal fungiert zu diesem Zweck ein Kreis (vgl.\ Landeplatzsymbol eines Helikopters) und als Ausgabesignal eines sich unter dem Flugvehikel befindenden Smartphones soll die Stellgröße eines in die Applikation zu integrierenden Reglers dienen. Ziel ist es, dass das UAV sich autonom und ohne weitere Kenntnis über seine Umgebung über einem Landeplatz zu zentriert. +Zu Demonstrationszwecken soll neben einem allgemeinen Framework zur Entwicklung von OpenCV gestützten Bildverarbeitungsapplikationen für Android-Plattformen eine Landeplatzlokalisierung eines UAVs (Abk., engl. für Unmanned Aerial Vehicle) realisiert werden. Als zu erfassendes Merkmal fungiert zu diesem Zweck ein Kreis (vgl.\ Landeplatzsymbol eines Helikopters). Als Ausgabesignal eines sich unter dem Flugvehikel befindenden Smartphones soll die Stellgröße eines in die Applikation zu integrierenden Reglers dienen. Ziel ist es, dass das UAV sich autonom und ohne weitere Kenntnis über seine Umgebung über einem Landeplatz zu zentriert. Hierbei muss aus Sicherheitsaspekten ein manuelles Eingreifen durch den Menschen jederzeit möglich sein, weshalb eine signalverarbeitende Instanz in Form eines Mischers, welcher die Signale der Fernbedienung und der Applikation überlagert, zu integrieren ist. \chapter{Grundlagen} @@ -83,7 +87,7 @@ Hierbei muss aus Sicherheitsaspekten ein manuelles Eingreifen durch den Menschen \label{introductionAndroid} Android Inc. wurde 2003 von Andy Rubin gegründet, ursprünglich mit der Bestrebung, Software für Digitalkameras zu entwickeln. Bald stellte sich jedoch heraus, dass der Markt auf diesem Gebiet nicht groß genug war, so dass Rubin die Zielstellung zur Entwicklung eines für jeden Entwickler frei zugänglichen Betriebssystems für mobile Plattformen verallgemeinerte \cite[vgl.\ ][]{foundingAndroidNYTimes2007}. Diese Idee stieß weitgehend auf große Begeisterung, bis schließlich im Juli 2005 Google Android Inc. für 50 Millionene US-Dollar aufkaufte, um seine mobile Sparte zu erweitern \cite[vgl.\ ][]{googleBuysAndroidNYTimes2015}. Dem ursprünglichen Ziel von Rubin folgend, gründete sich am 5. November 2007 die Open Handset Alliance bestehend aus Unternehmen wie Sony, Samsung, HTC, T-Mobile, Qualcomm, Texas Instruments und Google selbst mit dem Ziel, einen offenen Standard für Mobilgeräte zu entwickeln - mit Android als Grundlage \cite[vgl.\ ][]{openPlatformMobileDevicesOpenhandsetalliance2007}. Daraufhin erschien am 22. Oktober 2008 das HTC Dream als erstes kommerzielles Mobilgerät auf Android-Basis. -Seit diesem Zeitpunkt hat sich Android als weltweit \cite[vgl.\ ][]{aboutAndroid} am Weitesten verbreitete Betriebssystem für mobile Systeme durchgesetzt mit inzwischen mehr als 1,4 Millarden aktiven Nutzern \cite[vgl.\ ][ Stand\ September\ 2015]{monthlyAndroidUsersAndroidcentral2015}. Seit der Veröffentlichung von Android Base, dem ersten offiziellen Release, hat das Betriebssystem eine Vielzahl von Varianten durchlaufen, bis hin zur derzeit (03.11.2016) aktuellsten Version 7.1.1 mit dem Namen Nougat. Neben der offiziellen Version von Google existieren weiterhin eine Vielzahl von modifizierten Distributionen des Betriebssystem wie beispielsweise CyanogenMod. +Seit diesem Zeitpunkt hat sich Android als das weltweit am Weitesten verbreitete Betriebssystem für mobile Systeme \cite[vgl.\ ][]{aboutAndroid} durchgesetzt mit inzwischen mehr als 1,4 Millarden aktiven Nutzern \cite[vgl.\ ][ Stand\ September\ 2015]{monthlyAndroidUsersAndroidcentral2015}. Seit der Veröffentlichung von Android Base, dem ersten offiziellen Release, hat das Betriebssystem eine Vielzahl von Varianten durchlaufen, bis hin zur derzeit (03.11.2016) aktuellsten Version 7.1.1 mit dem Namen Nougat. Neben der offiziellen Version von Google existieren weiterhin eine Vielzahl von modifizierten Distributionen des Betriebssystem wie beispielsweise CyanogenMod. \begin{figure}[htbp] \centering @@ -98,7 +102,19 @@ Das Interface kann in Form des Android SDK (Abk., engl. für \glqq{}Software Dev Android trennt bei der Entwicklung sehr stark zwischen dem funktionalen Quellcode und der GUI. Letztere wird in XML-Dateien beschrieben und anschließend mit Funktionen belegt. Zentrale, für die Funktionsfähigkeit der Applikation essentielle Informationen wie beispielsweise Berechtigungen werden dem System mittels des Android-Manifests (ebenfalls in XML) zur Verfügung gestellt \cite[vgl.\ ][]{manifestAndroid2016}. \\ -Der funktionale Anteil der Anwendung wird in Java geschrieben und implementiert die durch das SDK bereitgestellte Grundstruktur in Form des Activity Lifecycles (vgl.\ Abbildung \ref{fig:activity_lifecycle}). Activities stellen das Herzstück einer Anwendung dar und repräsentieren voneinander unabhängige Benutzerschnittstellen, die in Kombination die Anwendung bilden. Den Activity Lifecycle bildet ein Satz von Callback-Methoden, bestehend aus \lstinline{onCreate()} (Erstmaliges Starten der Activity), \lstinline{onStart()} (Initiierung der Activity), \lstinline{onPause()} (eine andere Applikation kommt in den Vordergrund), onResume() (pausierte Activity läuft weiter), \lstinline{onStop()} (Activity ist nicht länger sichtbar), \lstinline{onDestroy()} (Activity wird beendet oder vom System zerstört) und \lstinline{onRestart()} (Activity wird nach dem Stoppen erneut aufgerufen) und verwaltet den Lebenszyklus der Activity \cite[vgl.\ ][]{activityAndroid2016}. Weiterhin können aus einer Activity Services (über längere Zeit im Hintergrund fungierende Funktionen, bspw. Kommunikation mit einem USB-Gerät), Content Providers (Funktionen, um von mehreren Instanzen verwendete Datenquellen wie bspw. SQLite Datenbanken zu verwalten), Broadcast-Receiver und Handler (Funktionen, die systemweite Nachrichten (sogenannte Intents für Anfragen er Messages für reine Mitteilungen) filtern und je nach Konfiguration bei gewissen Nachrichten Aktionen auslösen) oder andere Activities aufgerufen werden. +Der funktionale Anteil der Anwendung wird in Java geschrieben und implementiert die durch das SDK bereitgestellte Grundstruktur in Form des Activity Lifecycles (vgl.\ Abbildung \ref{fig:activity_lifecycle}). Activities stellen das Herzstück einer Anwendung dar und repräsentieren voneinander unabhängige Benutzerschnittstellen, die in Kombination die Anwendung bilden. Den Activity Lifecycle bildet ein Satz von Callback-Methoden, bestehend aus + +\begin{itemize} + \item{\lstinline{onCreate()} (Erstmaliges Starten der Activity)} + \item{\lstinline{onStart()} (Initiierung der Activity)} + \item{\lstinline{onPause()} (eine andere Applikation kommt in den Vordergrund)} + \item{\lstinline{onResume()} (pausierte Activity läuft weiter)} + \item{\lstinline{onStop()} (Activity ist nicht länger sichtbar)} + \item{\lstinline{onDestroy()} (Activity wird beendet oder vom System zerstört)} + \item{\lstinline{onRestart()} (Activity wird nach dem Stoppen erneut aufgerufen)} +\end{itemize} + +Der Activity Lifecycle verwaltet den Lebenszyklus der Activity \cite[vgl.\ ][]{activityAndroid2016}. Weiterhin können aus einer Activity Services (über längere Zeit im Hintergrund agierende Funktionen, bspw.\ Kommunikation mit einem USB-Gerät), Content Providers (Funktionen, um von mehreren Instanzen verwendete Datenquellen wie bspw.\ SQLite Datenbanken zu verwalten), Broadcast-Receiver und Handler (Funktionen, die systemweite Nachrichten (sogenannte Intents für Anfragen er Messages für reine Mitteilungen) filtern und je nach Konfiguration bei gewissen Nachrichten Aktionen auslösen) oder andere Activities aufgerufen werden. \\ \\ Neben der klassischen Programmierung in Java bietet das NDK weiterhin die Option, Elemente nativen Codes mittels des Java Native Interfaces zu implementieren (siehe Kapitel \ref{jni}). @@ -108,13 +124,13 @@ Die eingängige Struktur des Interface erlaubt es auch weniger erfahrenen Progra \subsection{Warum Android?} -Wie bereits in der Einleitung dargestellt, ist das Ziel der Arbeit, einen einfach zugänglichen, flexibel erweiterbaren und kostengünstigen Ansatz mit variablen Einsatzgebieten zu erstellen, welcher auch Privatpersonen ohne ausgeprägte Programmier-Vorkenntnisse die Verwendung von Bildverarbeitungssoftware ermöglichen soll. Während die Einrichtung von Alternativplattformen wie beispielsweise eines Raspberry Pi eine relativ große Herausforderung für Personen ohne Vorkenntnisse darstellen kann, ist es verhältnismäßig einfach, mittels der Tutorials von OpenCV, Android Studio oder Eclipse und dem im Rahmen dieses Projekts erstellten Frameworks eine lauffähige Anwendung zu erstellen, da sich der eigentliche Programmieraufwand lediglich auf den reinen Bildverarbeitungsanteil beschränkt. Einen weiteren Vorteil bietet das Smartphone als Zielgerät an sich, da es im Normalfall ein Kameramodul, einen Bildschirm, diverse Kommunikationsschnittstellen und ein fertiges internes Bussystem mit sich bringt und sehr kompakt und leicht ist. Weiterhin wird durch die weite Verbreitung von Android mit mehr als 1,4 Millarden Geräten weltweit \cite[vgl.\ ][ Stand\ September\ 2015]{monthlyAndroidUsersAndroidcentral2015} die einfache Zugänglichkeit für jeden Nutzer sichergestellt. +Wie bereits in der Einleitung dargestellt, ist das Ziel der Arbeit, einen Ansatz mit variablen Einsatzgebieten zu erarbeiten, der auch Privatpersonen ohne ausgeprägte Programmier-Vorkenntnisse die Verwendung von Bildverarbeitungssoftware ermöglichen soll. Die Einrichtung von Alternativplattformen wie bspw.\ eines Raspberry Pi kann eine relativ große Herausforderung für Personen ohne Vorkenntnisse darstellen. Dem hingegen ist es verhältnismäßig einfach, mittels der Tutorials von OpenCV, Android Studio oder Eclipse und des im Rahmen dieses Projekts erstellten Frameworks eine lauffähige Android-Applikation zu erstellen, da sich der eigentliche Programmieraufwand lediglich auf den reinen Bildverarbeitungsanteil beschränkt. Einen weiteren Vorteil bietet das Smartphone als Zielgerät an sich, da es im Normalfall ein Kameramodul, einen Bildschirm, diverse Kommunikationsschnittstellen und ein fertiges internes Bussystem mit sich bringt und sehr kompakt und leicht ist. Weiterhin wird durch die weite Verbreitung von Android mit mehr als 1,4 Millarden Geräten weltweit \cite[vgl.\ ][ Stand\ September\ 2015]{monthlyAndroidUsersAndroidcentral2015} die einfache Zugänglichkeit für jeden Nutzer sichergestellt. \section{OpenCV} \subsection{Einführung} -OpenCV (Abk. für \glqq{}Open Source Computer Vision Library\grqq{}) wurde ursprünglich 1999 als Forschungsprojekt von Intel im Zuge der Entwicklung kommerziellen Bildverarbeitungsanwendungen ins Leben gerufen \cite[vgl.\ ][]{aboutOpenCVWillowGarage}. Im Laufe der Zeit wechselte das Projekt mehrfach den Entwickler, bis es schließlich im August 2012 von der nicht-profitablen Organisation OpenCV.org übernommen wurde, unter Anderem mit itseez, welches erst im Mai 2016 von Intel für sein Know-How im Bereich \glqq{}Computer Vision for IOT\grqq{} aquiriert wurde, als treibende Kraft im Hintergrund \cite[vgl.\ ][]{intelBuysItseezIntel2016}. +OpenCV (Abk. für \glqq{}Open Source Computer Vision Library\grqq{}) wurde ursprünglich 1999 als Forschungsprojekt von Intel im Zuge der Entwicklung kommerziellen Bildverarbeitungsanwendungen ins Leben gerufen \cite[vgl.\ ][]{aboutOpenCVWillowGarage}. Im Laufe der Zeit wechselte das Projekt mehrfach den Entwickler, bis es schließlich im August 2012 von der nicht-profitablen Organisation OpenCV.org übernommen wurde, u.\,a.\ mit itseez, welches erst im Mai 2016 von Intel für sein Know-How im Bereich \glqq{}Computer Vision for IOT\grqq{} aquiriert wurde \cite[vgl.\ ][]{intelBuysItseezIntel2016}, als treibende Kraft im Hintergrund. Seit August 2014 steht mit OpenCV3.0 die dritte Version des unter der modifizierten BSD-Lizenz veröffentlichten Projekts für maschinelles Lernen und Bildverarbeitung zur öffentlichen Verfügung \cite[vgl.\ ][]{changeLogOpenCVGitHub2016}. Die Bibliothek stellt über 2500 Algorithmen zur Verfügung, welche genutzt werden können, um: \begin{itemize} \item{Gesichter zu detektieren und zu erkennen} @@ -133,7 +149,7 @@ Seit August 2014 steht mit OpenCV3.0 die dritte Version des unter der modifizier \end{itemize} Ferner beinhaltet das Projekt eine Bibliothek für Maschinelles Lernen zur Implementierung von künstlichen neuronalen Netzen, EM-Algorithmen, Bayes-Klassifikation, Boosting, etc.. OpenCV bietet dabei C++, C, Python, Java und MATLAB Schnittstellen und unterstützt mit Windows, Linux, Android und Mac OS sämtliche großen Betriebssysteme \cite[vgl.\ ][]{aboutOpenCV}. -Genutzt wird die Bibliothek sowohl in Forschungs- und Regierungsprojekten, als auch von renommierten Unternehmen wie Google, Yahoo, Microsoft, Intel, IBM, Sony, Honda und Toyota für Anwendungen wie das Zusammenschneiden von Streetview-Bildern, Detektierung von Einbrüchen in Überwachungssystemen, Navigieren von Roboterbewegungen, Verkehrsüberwachung, Inspektion von Labeln in der Industrie, Rapid Face Detection und Vielem mehr \cite[vgl.\ ][]{aboutOpenCV}. +Genutzt wird die Bibliothek sowohl in Forschungs- und Regierungsprojekten, als auch von renommierten Unternehmen wie Google, Yahoo, Microsoft, Intel, IBM, Sony, Honda und Toyota für Anwendungen wie das Zusammenschneiden von Streetview-Bildern, Detektierung von Einbrüchen in Überwachungssystemen, Navigieren von Roboterbewegungen, Verkehrsüberwachung, Inspektion von Labeln in der Industrie, Rapid Face Detection u.\,v.\,m.\ \cite[vgl.\ ][]{aboutOpenCV}. Für weitere Informationen bzgl.\ der Programmierung von Bildverarbeitungsprogrammen mit OpenCV sind die Dokumentation des Projekts sowie ausführliche Tutorials zu finden unter \url{http://opencv.org/documentation.html}. @@ -150,7 +166,7 @@ Das JNI (Abk., engl. für \glqq{}Java Native Interface\grqq{}) dient dazu, nativ \lstinline{kationen} \cite[vgl.\ ][S.5]{liang1999}. \begin{itemize} -\item{Das JNI erlaubt es auf Java-Seite, \lstinline{native Methoden} aufzurufen. Der Aufruf innerhalb der Java-Applikation erfolgt nach den gleichen Prinzipien, wie auch eine Java-Methode aufgerufen wird. Im Hintergrund können diese jedoch in jeder nativen Programmiersprache wie beispielsweise C oder C++ geschrieben sein.} +\item{Das JNI erlaubt es auf Java-Seite, \lstinline{native Methoden} äquivalent zu Java-Methoden aufzurufen. Im Hintergrund können diese jedoch in jeder nativen Programmiersprache wie beispielsweise C oder C++ geschrieben sein.} \item{Auf nativer Seite bietet das JNI ein \lstinline{Interface} an, welches die Implementierung einer \lstinline{virtuellen Java-Maschine} in nativen Code erlaubt (siehe Abbildung \ref{fig:diag-jni}). Native Applikationen können Bibliotheken, welche die virtuelle Maschine implementieren, einbinden und somit über das Interface in Java programmierte Elemente aufrufen. So kann beispielsweise eine C++-Instanz von OpenCV den Bildstrom einer mittels Java gesteuerten Kamera abrufen.} \end{itemize} @@ -177,7 +193,7 @@ Für weitere Informationen bzgl.\ der einzuhaltenden Form und Semantik bei der V \section{Auswahl der Entwicklungsumgebung} -Für die Entwicklung der Applikation wurde aus persönlichen Präferenzen Eclipse (Download: \url{https://eclipse.org/downloads/}) als Entwicklungsumgebung verwendet. Alternativ kann ebenfalls Android Studio (Download: \url{https://developer.android.com/studio/index.html}) gewählt werden. Es ist jedoch zu erwähnen, dass Google seit der Veröffentlichung von Android Studio das ADT (Android Developer Tools) Plugin für Eclipse nicht länger weiterentwickelt \cite[vgl.\ ][]{adtAndroid2015}. Dementsprechend ist es zu empfehlen, bei zukünftigen Entwicklungsarbeiten zu Android Studio zu migrieren. +Für die Entwicklung der Applikation wurde aus persönlichen Präferenzen Eclipse (Download: \url{https://eclipse.org/downloads/}) als Entwicklungsumgebung verwendet. Alternativ kann ebenfalls Android Studio (Download: \url{https://developer.android.com/studio/index.html} gewählt werden. Es ist jedoch zu erwähnen, dass Google seit der Veröffentlichung von Android Studio das ADT (Android Developer Tools) Plugin für Eclipse nicht länger weiterentwickelt \cite[vgl.\ ][]{adtAndroid2015}. Dementsprechend ist es zu empfehlen, bei zukünftigen Entwicklungsarbeiten zu Android Studio zu migrieren. \section{Einrichtung der Entwicklungsumgebung} @@ -199,7 +215,7 @@ Links zu den offiziellen Tutorials: Es wird empfohlen, eine Testapplikation zu schreiben und zu überprüfen, ob diese sowie die Beispielanwendungen kompiliert und auf einem Testgerät zum Laufen gebracht werden können, um die richtige Einrichtung der IDE zu validieren. \\ \\ -Anmerkung: Beim Kompilieren der VBLS-Applikation (Abk., engl. für \glqq{}Visual Based Landing System\grqq{}) ist zu beachten, dass Elemente der verwendeten Bibliothek zur USB-Kommuni"=kation erst ab SDK-Version 12 oder höher verfügbar sind; dementsprechend muss die Zielplattform unter \lstinline{Preferences->Android} und in \lstinline{AndroidManifest.xml} angepasst werden. Des weiteren kann es vorkommen, dass Fehler beim Kompilieren des Layouts auftreten. Dies kann behoben werden, indem die Android Appcompat v7 oder höher als Bibliothek hinzugefügt wird (zu finden im Android SDK). +Anmerkung: Beim Kompilieren der VBLS-Applikation (Abk., engl. für \glqq{}Visual Based Landing System\grqq{}) ist zu beachten, dass Elemente der verwendeten Bibliothek zur USB-Kommuni"=kation erst ab SDK-Version 12 oder höher verfügbar sind. Dementsprechend muss die Zielplattform unter \lstinline{Preferences->Android} und in \lstinline{AndroidManifest.xml} angepasst werden. Des weiteren kann es vorkommen, dass Fehler beim Kompilieren des Layouts auftreten. Dies kann behoben werden, indem die Android Appcompat v7 oder höher als Bibliothek hinzugefügt wird (zu finden im Android SDK). \chapter{Entwicklung der Applikation: Allgemeines OpenCV-Android-Framework} \label{framework} @@ -213,13 +229,13 @@ Anmerkung: Beim Kompilieren der VBLS-Applikation (Abk., engl. für \glqq{}Visual \label{fig:diag-framework} \end{figure} -In diesem Kapitel soll zunächst das im Rahmen des Projekts erstellte allgemeine Framework zur Entwicklung von OpenCV-basierten Bildverarbeitungsapplikationen für Android-Systeme betrachtet werden. Wie in dem Architekturdiagramm (\ref{fig:diag-framework}) dargestellt, ist das Grundgerüst in drei Bestandteile unterteilt, welche im Folgenden nacheinander voneinander differenziert betrachtet werden: +In diesem Kapitel soll zunächst das im Rahmen des Projekts erstellte allgemeine Framework zur Entwicklung von OpenCV-basierten Bildverarbeitungsapplikationen für Android-Systeme betrachtet werden. Wie in dem Architekturdiagramm (\ref{fig:diag-framework}) dargestellt, ist das Grundgerüst in drei Bestandteile unterteilt, welche im Folgenden nacheinander betrachtet werden: \begin{itemize} \item{die Android-Schnittstelle} \item{die Bildverarbeitung auf OpenCV-Basis} \item{die USB-Bibliothek} \end{itemize} -Neben den jeweiligen Implementierungen der genannten Kernelemente sollen weiterhin die zwischen den einzelnen Abschnitten kommunizierenden Schnittstellen betrachtet werden. Dabei wird für eine gute Übersichtlichkeit nach verwendeten Programmiersprachen geordnet vorgegangen, beginnend mit Java, gefolgt von C++ und XML. Zentrale Funktionalitäten werden detailliert betrachtet, für nebensächliche oder rein organisatorische Aspekte wird die Kommentierung des Programms als ausreichend erachtet. Der vollständige Quellcode findet sich im Anhang. +Neben den jeweiligen Implementierungen der genannten Kernelemente sollen weiterhin die zwischen den einzelnen Abschnitten kommunizierenden Schnittstellen betrachtet werden. Dabei wird für eine gute Übersichtlichkeit nach verwendeten Programmiersprachen geordnet vorgegangen, beginnend mit Java, gefolgt von C++ und XML. Zentrale Funktionalitäten werden detailliert betrachtet, für nebensächliche oder rein organisatorische Aspekte wird die Kommentierung des Programms als ausreichend erachtet. Der vollständige Quellcode findet sich unter dem in Kapitel \ref{repository} angeführten Link. \section{Teil 1: Java} \lstset{language=JAVA} @@ -227,7 +243,7 @@ Neben den jeweiligen Implementierungen der genannten Kernelemente sollen weiterh \subsection{openCVActivity.java} \label{openCVActivity.java} -Die Klasse \lstinline{openCVActivity.java} bildet das Herzstück der Applikation. Sie implementiert mit dem Activiy-Lifecycle (s. Abbildung \ref{fig:activity_lifecycle}) die Android-Schnittstelle und verwaltet die USB-Konfiguration. Gleichzeitig leitet sie die aufgenommenen Bilder über \lstinline{openCVFramework.java} an \lstinline{openCVFramework.cpp} (Bildverarbeitung) weiter. +Die Klasse \lstinline{openCVActivity.java} bildet das Herzstück der Applikation. Sie implementiert mit dem Activiy-Lifecycle (s.\ Abbildung \ref{fig:activity_lifecycle}) die Android-Schnittstelle und verwaltet die USB-Konfiguration. Gleichzeitig leitet sie die aufgenommenen Bilder über \lstinline{openCVFramework.java} an \lstinline{openCVFramework.cpp} (Bildverarbeitung) weiter. \pagebreak \begin{lstlisting}[caption=Set Up] @@ -245,7 +261,7 @@ Die Klasse \lstinline{openCVActivity.java} bildet das Herzstück der Applikation /*-------------------------------------------------*/ \end{lstlisting} -Die Klasse ermöglicht ein nutzerspezifisches Set Up. An dieser Stelle kann die gewünschte Kameraauflösung eingestellt und ausgewählt werden, ob mit Farb- oder Graustufen-Bildern gearbeitet werden soll. Je weniger Informationen ein Bild enthält, desto höher ist die Performanz der Applikation; es ist daher zu empfehlen, die Auflösung nicht höher einzustellen als notwendig und falls möglich mit Graustufen zu arbeiten. +Die Klasse ermöglicht ein nutzerspezifisches Set Up. An dieser Stelle kann die gewünschte Kameraauflösung eingestellt und ausgewählt werden, ob mit Farb- oder Graustufen-Bildern gearbeitet werden soll. Je weniger Informationen ein Bild enthält, desto höher ist die Performanz der Applikation. Es ist daher zu empfehlen, die Auflösung nicht höher einzustellen als notwendig und falls möglich mit Graustufen zu arbeiten. \begin{lstlisting}[caption=OpenCV Loader] // Implementation of the LoaderCallbackInterface; tries @@ -295,7 +311,7 @@ Die Klasse ermöglicht ein nutzerspezifisches Set Up. An dieser Stelle kann die } \end{lstlisting} -Die Funktion \lstinline{onCreate()} ist Bestandteil des von Android bereitgestellten Interfaces und wird bei erstmaligem Öffnen der Applikation aufgerufen. Zunächst wird versucht, gespeicherte Einstellungen aufzurufen; danach wird die Verbindung zum User Interface der Applikation mittels \lstinline{setContentView(...)} herzustellen (s. Kapitel \ref{layout}). Anschließend wird die Kamera initialisiert und mit \lstinline{setMaxFrameSize(...)} die Auflösung auf die im Set Up festgelegten Werte gesetzt. Die Funktion \lstinline{setVisibility(...)} bewirkt die Anzeige der Bilder auf dem Display und kann bei Bedarf deaktiviert werden. +Die Funktion \lstinline{onCreate()} ist Bestandteil des von Android bereitgestellten Interfaces und wird bei erstmaligem Öffnen der Applikation aufgerufen. Zunächst wird versucht, gespeicherte Einstellungen aufzurufen; danach wird die Verbindung zum User Interface der Applikation mittels \lstinline{setContentView(...)} herzustellen (s.\ Kapitel \ref{layout}). Anschließend wird die Kamera initialisiert und mit \lstinline{setMaxFrameSize(...)} die Auflösung auf die im Set Up festgelegten Werte gesetzt. Die Funktion \lstinline{setVisibility(...)} bewirkt die Anzeige der Bilder auf dem Display und kann bei Bedarf deaktiviert werden. \begin{lstlisting}[caption=onPause] // Called if the application is moved to the background @@ -308,7 +324,7 @@ Die Funktion \lstinline{onCreate()} ist Bestandteil des von Android bereitgestel } \end{lstlisting} -Da es je nach Art und Verwendung der Applikation kritisch sein kann, wenn bei Pausieren der Anwendung beispielsweise die USB-Kommunikation (s. Beispielanwendung Visual Based Landing System) unterbrochen wird, ist \lstinline{onPause()} standardmäßig derart konfiguriert, dass lediglich die Kamera deaktiviert wird. +Da es je nach Art und Verwendung der Applikation kritisch sein kann, wenn bei Pausieren der Anwendung beispielsweise die USB-Kommunikation (s.\ Beispielanwendung Visual Based Landing System) unterbrochen wird, ist \lstinline{onPause()} standardmäßig derart konfiguriert, dass lediglich die Kamera deaktiviert wird. \begin{lstlisting}[caption=onResume] // Called if the application is resumed from the background @@ -353,11 +369,11 @@ Da es je nach Art und Verwendung der Applikation kritisch sein kann, wenn bei Pa \end{lstlisting} Die Funktion \lstinline{onResume()} ist ebenfalls Teil des von Android zur Verfügung gestellten Interfaces und wird jedes Mal aufgerufen, wenn die Applikation aus dem Hintergrund (pausiert) aufgerufen wird und somit wieder in den Vordergrund rückt, sowie nach dem erstmaligen Starten des Programms (siehe Abbildung \ref{fig:activity_lifecycle}). -Zunächst wird \lstinline{super.onResume()} aufgerufen, wodurch unter anderem versucht wird, die in onPause() deaktivierte Kamera wieder zu reaktivieren; es ist kein expliziter Aufruf von \lstinline{mOpenCvCameraView.enableView()} notwendig. +Zunächst wird \lstinline{super.onResume()} aufgerufen, wodurch u.\,a.\ versucht wird, die in \lstinline{onPause()} deaktivierte Kamera wieder zu reaktivieren; es ist kein expliziter Aufruf von \lstinline{mOpenCvCameraView.enableView()} notwendig. -Seit Version 6.0 arbeitet Android jedoch mit sogenannten Runtime Permissions, d.\,h.\ es ist möglich, einer Anwendung bestimmte Berechtigungen zu geben und zu nehmen, während diese läuft. Daher muss an dieser Stelle zunächst das Level der Distribution der Plattform überprüft werden und, falls dieses größer als 6.0 ist, ob die benötigte Nutzungsberechtigung für die Kamera aktuell immer noch vorliegt. Dies geschieht mittels der ersten if-Abfrage (\lstinline{android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M}) und \lstinline{check-} +Seit Version 6.0 arbeitet Android jedoch mit sogenannten Runtime Permissions, d.\,h.\ es ist möglich, einer Anwendung bestimmte Berechtigungen zu geben und zu nehmen, während diese läuft. Daher muss an dieser Stelle zunächst das Level der Distribution der Plattform überprüft werden und, falls dieses größer als 6.0 ist, ob die benötigte Nutzungsberechtigung für die Kamera aktuell immer noch vorliegt. Dies geschieht mittels der ersten if-Abfrage (\lstinline{android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M}) und \\ -\lstinline{SelfPermission(...)}. Liegt keine Berechtigung vor, so muss diese aktiv beim Nutzer mittels \lstinline{requestPermissions(...)} (siehe unten) angefragt werden. Da nach jeder Anfrage einer Berechtigung erneut \lstinline{onResume()} aufgerufen wird, kann mittels der Einführung der Einführung der Counter-Variablen \lstinline{counter_denied} eine Fallunterscheidung, ob bereits eine Abfrage stattgefunden hat, implementiert werden. So wird eine rekursive Endlosschleife vermieden, falls der Nutzer die Berechtigung beim Aufruf nicht geben möchte. +\lstinline{checkSelfPermission(...)}. Liegt keine Berechtigung vor, so muss diese aktiv beim Nutzer mittels \lstinline{requestPermissions(...)} (siehe unten) angefragt werden. Da nach jeder Anfrage einer Berechtigung erneut \lstinline{onResume()} aufgerufen wird, kann mittels der Einführung der Einführung der Counter-Variablen \lstinline{counter_denied} eine Fallunterscheidung, ob bereits eine Abfrage stattgefunden hat, implementiert werden. So wird eine rekursive Endlosschleife vermieden, falls der Nutzer die Berechtigung beim Aufruf nicht geben möchte. Die zweite if-Abfrage (\lstinline{if (!OpenCVLoader.initDebug()}) führt eine Unterscheidung nach der Art der Implementierung der OpenCV-Bibliothek (vorinstalliert mittels des OpenCV-Managers oder mit der Applikation zusammen installiert) durch und versucht, diese zu reinitialisieren. \begin{lstlisting}[caption=Überprüfen der Kamera-Berechtigung] @@ -387,9 +403,9 @@ Die zweite if-Abfrage (\lstinline{if (!OpenCVLoader.initDebug()}) führt eine Un Die Funktion \lstinline{onRequestPermissionsResult(...)} wird nach Anfragen einer Berechtigung mittels \lstinline{requestPermissions(...)} aufgerufen und kann verwendet werden, um Reaktionen abhängig vom zurückgelieferten Ergebnis zu definieren. Da diese Funktion jedoch bei jeder Anfrage einer beliebigen Berechtigung aktiviert wird, ist zunächst mittels \lstinline{switch(request-} \\ -\lstinline{Code)} eine Fallunterscheidung bzgl.\ der Art der angefragten Berechtigung durchzuführen; im Falle der in dieser Arbeit behandelten Applikation ist konkret die Nutzungsberechtigung für die Kamera von Bedeutung, welche mittels \lstinline{case REQUEST_CODE_CAMERA_PERMISSION} abgefragt wird. Der erste Eintrag des übergebenen Arrays grantResults entspricht nun dem Ergebnis der Anfrage. Ist die Berechtigung nun also erteilt worden (\lstinline{grantResults[0] ==} +\lstinline{Code)} eine Fallunterscheidung bzgl.\ der Art der angefragten Berechtigung durchzuführen; im konkreten Fall ist die Nutzungsberechtigung für die Kamera von Bedeutung, welche mittels \lstinline{case REQUEST_CODE_CAMERA_PERMISSION} abgefragt wird. Der erste Eintrag des übergebenen Arrays \lstinline{grantResults} entspricht dem Ergebnis der Anfrage. Ist die Berechtigung nun also erteilt worden (\lstinline{grantResults[0] == PackageManager.PERMISSION_GRANTED}), so wird \lstinline{counter} \\ -\lstinline{PackageManager.PERMISSION_GRANTED}), so wird \lstinline{counter_denied} zurückgesetzt und die Funktion wird ohne weitere Aktionen verlassen (return). Als Reaktion auf die Anfrage wird erneut \lstinline{onResume()} aufgerufen; da die Berechtigung jedoch erteilt wurde, wechselt die Funktion dieses Mal jedoch direkt zur Initialisierung der OpenCV-Bibliothek. Ist das Ergebnis der Anfrage dagegen negativ, so wird \lstinline{counter_denied} erhöht. Dadurch wird beim Aufruf von \lstinline{onResume()} nach Verlassen von \lstinline{onRequestPermissionsResult(...)} anstatt einer erneuten Abfrage die Applikation mittels \lstinline{onDestroy()} terminiert. +\lstinline{_denied} zurückgesetzt und die Funktion wird ohne weitere Aktionen verlassen (return). Als Reaktion auf die Anfrage wird erneut \lstinline{onResume()} aufgerufen; da die Berechtigung jedoch erteilt wurde, wechselt die Funktion dieses Mal direkt zur Initialisierung der OpenCV-Bibliothek. Ist das Ergebnis der Anfrage dagegen negativ, so wird \lstinline{counter_denied} erhöht. Dadurch wird beim Aufruf von \lstinline{onResume()} nach Verlassen von \lstinline{onRequestPermissionsResult(...)} anstatt einer erneuten Abfrage die Applikation mittels \lstinline{onDestroy()} terminiert. \begin{lstlisting}[caption=onDestroy] // Called if the application is terminated @@ -400,7 +416,7 @@ Die Funktion \lstinline{onRequestPermissionsResult(...)} wird nach Anfragen eine } \end{lstlisting} -Die Funktion \lstinline{onDestroy()} terminiert wie zu erwarten die Activity. Standardmäßig wird dabei lediglich \lstinline{disableView()} zusätzlich zu \lstinline{super.onDestroy()} aufgerufen um die Kamera zu deaktivieren. Die Funktion wird an dieser Stelle nur angeführt, um zu erwähnen, dass je nach Art der aus dem Framework abstrahierten Applikation alle weiteren mit der Activity zusammenhängenden Prozesse (wie beispielsweise weitere Views) beendet werden können/sollten. +Die Funktion \lstinline{onDestroy()} terminiert wie zu erwarten die Activity. Standardmäßig wird dabei lediglich \lstinline{disableView()} zusätzlich zu \lstinline{super.onDestroy()} aufgerufen um die Kamera zu deaktivieren. An dieser Stelle können/sollten in aus dem Framework abstrahierten Applikationen alle weiteren mit der Activity zusammenhängenden Prozesse (wie beispielsweise weitere Views) beendet werden. \begin{lstlisting}[caption=onCameraFrame] // Called on every frame received from the input - stream @@ -461,22 +477,22 @@ Die Funktion \lstinline{onDestroy()} terminiert wie zu erwarten die Activity. St } \end{lstlisting} -Die Funktion \lstinline{onCameraFrame(...)} ist eine weitere Callback-Methode des von Android bereitgestellten Interfaces. Sie wird jedes Mal aufgerufen, wenn die Kamera ein Bild aufnimmt und bekommt dieses als Übergabeargument in Form eines CvCameraViewFrames übergeben. Zunächst muss auch an dieser Stelle wieder ausgewählt werden, ob im weiteren Verlauf mit einem Farb- oder Graustufenbild gearbeitet werden soll; je nachdem wird das Bild mittels \lstinline{rgba()} oder \lstinline{gray()} von CvCameraViewFrames als Datentyp zu Mat (Abk., kurz für Matrix), einem Datentyp bestehend aus einem Array von Vektoren, welche wiederum die Informationen jedes Pixels des Bilds enthalten (d.\,h.\ für Farbbilder die RGB- sowie den Alpha-Anteil und für Graustufenbilder den Weißanteil), konvertiert. +Die Funktion \lstinline{onCameraFrame(...)} ist eine weitere Callback-Methode des von Android bereitgestellten Interfaces. Sie wird jedes Mal aufgerufen, wenn die Kamera ein Bild aufnimmt und bekommt dieses als Übergabeargument in Form eines CvCameraViewFrames übergeben. Zunächst muss auch an dieser Stelle wieder ausgewählt werden, ob im weiteren Verlauf mit einem Farb- oder Graustufenbild gearbeitet werden soll. Je nachdem wird das Bild mittels \lstinline{rgba()} oder \lstinline{gray()} von CvCameraViewFrames zu Mat (Abk., kurz für Matrix), einem Datentyp bestehend aus einem Array von Vektoren, welche wiederum die Informationen jedes Pixels des Bilds enthalten (d.\,h.\ für Farbbilder die RGB- sowie den Alpha-Anteil und für Graustufenbilder den Weißanteil), konvertiert. -Da die eigentliche Bildverarbeitung jedoch in \lstinline{openCVFramework.cpp} stattfindet und das JNI, welches als Kommunikationsschnittstelle zwischen Java und C++ fungiert, lediglich native Datentypen unterstützt, muss weiterhin die Matrix zu einem Array aus Bytes umgewandelt werden. Dies geschieht mit \lstinline{jMatToArray(...)} (s. Kapitel \ref{openCVFramework.java}). Das so erhaltene Array wird in jImageDate gespeichert. Schlägt die Umwandlung fehl, z.\,B.\ wenn die Bilddaten beschädigt sein sollten, so wirft \lstinline{jMatToArray(...)} eine \lstinline{IOException}, die an dieser Stelle abgefangen wird und mit einem entsprechenden Log-Eintrage zur Terminierung der Applikation führt. Anschließend wird mit \lstinline{process(...)} die eigentliche Bildverarbeitung initiiert. Das in Form des Byte-Arrays übergebene Bild wird per JNI an openCVFramework.cpp weitergeleitet und dort verarbeitet. Standardmäßig ist \lstinline{process(...)} so eingerichtet, dass die Rückgabe in Form eines Double-Arrays erfolgt, so dass beispielsweise Positionen oder Größen von detektierten Objekten übergeben werden können (s. Kapitel \ref{openCVFramework.cpp}). Alternativ ist es auch möglich ein bearbeitetes Bild ebenfalls wieder in Byte-Form zurückzugeben und anschließend anzeigen zu lassen. +Da die eigentliche Bildverarbeitung jedoch in \lstinline{openCVFramework.cpp} stattfindet und das JNI, welches als Kommunikationsschnittstelle zwischen Java und C++ fungiert, lediglich native Datentypen unterstützt, muss weiterhin die Matrix zu einem Array aus Bytes umgewandelt werden. Dies geschieht mit \lstinline{jMatToArray(...)} (s.\ Kapitel \ref{openCVFramework.java}). Das so erhaltene Array wird in jImageDate gespeichert. Schlägt die Umwandlung fehl, z.\,B.\ wenn die Bilddaten beschädigt sein sollten, so wirft \lstinline{jMatToArray(...)} eine \lstinline{IOException}, die an dieser Stelle abgefangen wird und mit einem entsprechenden Log-Eintrage zur Terminierung der Applikation führt. Anschließend wird mit \lstinline{process(...)} die eigentliche Bildverarbeitung initiiert. Das in Form des Byte-Arrays übergebene Bild wird per JNI an openCVFramework.cpp weitergeleitet und dort verarbeitet. Standardmäßig ist \lstinline{process(...)} so eingerichtet, dass die Rückgabe in Form eines Double-Arrays erfolgt, so dass beispielsweise Positionen oder Größen von detektierten Objekten übergeben werden können (s.\ Kapitel \ref{openCVFramework.cpp}). Alternativ ist es auch möglich ein bearbeitetes Bild (ebenfalls wieder in Byte-Form) zurückzugeben und anschließend anzeigen zu lassen. Treten bereits vor der Kommunikation mittels JNI Komplikationen auf, so wirft auch \lstinline{process(...)} eine Fehlermeldung, die ebenso wie bei \lstinline{jMatToArray(...)} zu einer Beendigung der Applikation führt; kommt es zu einem Fehler während der eigentlichen Bildverarbeitung, so liefert \lstinline{openCVFramework.cpp} einen Nullpointer als Rückgabewert zurück, der in einer if-Abfrage abgefangen wird. So kann im Fehlerfall beim Debugging leichter zwischen den Ursachen differenziert werden. -Anschließend an die Verarbeitung besteht die Möglichkeit, weitere Aktionen durchzuführen. So können beispielsweise die durch \lstinline{process(...)} erhaltenen Daten per USB ausgegeben oder ereignisbasierte Nachrichten dargestellt werden. Dadurch erhält der Nutzer bei Erstellung seiner eigenen Applikation neben der eigentlichen Bildverarbeitung mittels OpenCV eine weitere Schnittstelle auf Android-Seite, wodurch die Anzahl der Möglichkeiten vervielfältigt wird. +Anschließend an die Verarbeitung besteht die Möglichkeit, weitere Aktionen durchzuführen. So können die durch \lstinline{process(...)} erhaltenen Daten bspw.\ per USB ausgegeben oder ereignisbasierte Nachrichten dargestellt werden. Durch den Zugriff auf die Java-Bibliotheken auf Android-Seite vervielfältigen sich die Möglichkeiten. Abschließend wird mittels \lstinline{return} das Bild, welches auf dem Display angezeigt werden soll, in Matrix-Darstellung zurückgegeben. \\ \\ -Standardmäßig ist die Applikation derart eingerichtet, dass einfach das aufgenommene Bild in Graustufen-Form dargestellt wird. Wurde das Bild im Rahmen der Anwendung jedoch verändert (z.\,B.\ indem bestimmte detektierte Objekte eingerahmt wurden), so kann an dieser Stelle auch die modifizierte Variante übergeben werden. Es ist jedoch anzumerken, dass es rechentechnisch sehr aufwendig ist, das an die Bildverarbeitung übergebene Bild dort zu verändern, innerhalb von \lstinline{openCVFramework.cpp} wieder von einer Matrix in ein Byte-Array umzuwandeln, anschließend per JNI zurückzugeben und erneut zu einer Matrix zu konvertieren. Daher ist es aus Performanz-Gründen zu empfehlen, falls möglich lediglich die Detektion der Objekte im Bild in der Verarbeitung auszuführen, deren Positionen anschließend zurückzugeben und auf Java-Seite direkt in das Bild einzuzeichnen (auch wenn dort ohne die Einbindung einer weiteren externen Bibliothek lediglich triviale Aktionen zur Verfügung stehen). +Standardmäßig ist die Applikation derart eingerichtet, dass das aufgenommene Bild in Grau"=stufen-Form dargestellt wird. Wurde das Bild im Rahmen der Anwendung jedoch verändert (z.\,B.\ indem bestimmte detektierte Objekte eingerahmt wurden), so kann an dieser Stelle auch die modifizierte Variante übergeben werden. Es ist jedoch anzumerken, dass es rechentechnisch sehr aufwendig ist, das an die Bildverarbeitung übergebene Bild dort zu verändern, innerhalb von \lstinline{openCVFramework.cpp} wieder von einer Matrix in ein Byte-Array umzuwandeln, anschließend per JNI zurückzugeben und erneut zu einer Matrix zu konvertieren. Daher ist es aus Performanz-Gründen zu empfehlen, falls möglich lediglich die Detektion der Objekte im Bild in der Verarbeitung auszuführen, deren Positionen anschließend zurückzugeben und auf Java-Seite direkt in das Bild einzuzeichnen (auch wenn dort ohne die Einbindung einer weiteren externen Bibliothek lediglich triviale Aktionen zur Verfügung stehen). \subsection{openCVFramework.java} \label{openCVFramework.java} -Die Klasse \lstinline{openCVFramework.java} stellt die Schnittstelle zwischen \lstinline{openCVActivity.java} (Android) und \lstinline{openCVFramework.cpp} (OpenCV) dar und wird von \lstinline{openCVActivity.java} implementiert und instanziiert. +Die Klasse \lstinline{openCVFramework.java} stellt die Schnittstelle zwischen \lstinline{openCVActivity.java} (Android) und \lstinline{openCVFramework.cpp} (OpenCV) dar und wird von \lstinline{openCVActivity.java} eingebunden. \begin{lstlisting}[caption=Unterscheidung des Bildformats] // Color - image @@ -486,7 +502,7 @@ Die Klasse \lstinline{openCVFramework.java} stellt die Schnittstelle zwischen \l private static final int ch = 1; \end{lstlisting} -Wie auch in der übergeordneten Activity kann unterschieden werden, ob ein Farbbild oder ein Graustufen-Bild verarbeitet wird. Je nachdem sind jedem Pixel des Bildes unterschiedlich viele Informationen zugeordnet; im Falle des Farbbilds sind dies jeweils die RGB-Anteile und zusätzlich der Alpha-Anteil, bei einem Graustufen-Bild wird lediglich der Weißanteil des Pixels angegeben (0 = Schwarz, 255 = Weiß). Standardmäßig werden Graustufen-Bilder verwendet, da dies den Verarbeitungsaufwand senkt und eine höhere Performanz bewirkt. +Wie auch in der übergeordneten Activity kann unterschieden werden, ob ein Farbbild oder ein Graustufen-Bild verarbeitet wird. Je nachdem sind jedem Pixel des Bildes unterschiedlich viele Informationen zugeordnet; im Falle des Farbbilds sind dies jeweils die RGB-Anteile und zusätzlich der Alpha-Anteil, bei einem Graustufen-Bild wird lediglich der Weißanteil des Pixels angegeben. \begin{lstlisting}[caption=Laden der vorkompilierten Bibliothek] public openCVFramework() { @@ -523,8 +539,8 @@ Mittels des dargestellten Quellcodes wird die Bilbiothek \lstinline{openCVFramew } \end{lstlisting} -Wie bereits in Kapitel \ref{jni} erwähnt, können über das JNI lediglich native Datentypen kommuniziert werden. Da Android jedoch mit dem Datenformat Mat (s. Kapitel \ref{openCVActivity.java}) arbeitet, muss zunächst eine Konvertierung stattfinden, bevor die Bilder an \lstinline{openCVFramework.cpp} weitergeleitet werden können. Diese Funktionalität bietet die Funktion \lstinline{jMatToArray(...)}. Zunächst werden dabei die Parameter des Bildes eingelesen (Höhe, Breite, Kanäle und Format der Matrix) und anschließend in der if-Bedingung überprüft. Somit wird vermieden, dass ein beschädigtes Bild verarbeitet wird und einen Systemabsturz verursacht. -Ist sind die Parameter in Ordnung wird anschließend ein Byte-Array erzeugt und der Inhalt der Matrix wird mittels \lstinline{img.get(...)} in das Array übertragen. Ist die if-Bedingung nicht erfüllt, wirft die Funktion eine Exception, welche von \lstinline{openCVActivity.java} abgefangen wird und zu einer geregelten Beendigung der Applikation mittels \lstinline{onDestroy()} führt. +Wie bereits in Kapitel \ref{jni} erwähnt, können über das JNI lediglich native Datentypen kommuniziert werden. Da Android jedoch mit dem Datenformat Mat (s.\ Kapitel \ref{openCVActivity.java}) arbeitet, muss zunächst eine Konvertierung stattfinden, bevor die Bilder an \lstinline{openCVFramework.cpp} weitergeleitet werden können. Diese Funktionalität bietet die Funktion \lstinline{jMatToArray(...)}. Dabei werden zunächst die Parameter des Bildes (Höhe, Breite, Kanäle und Format der Matrix) eingelesen und überprüft. Somit wird vermieden, dass ein beschädigtes Bild verarbeitet wird und einen Systemabsturz verursacht. +Sind die Parameter in Ordnung wird anschließend ein Byte-Array erzeugt und der Inhalt der Matrix wird mittels \lstinline{img.get(...)} in das Array übertragen. Ist die if-Bedingung nicht erfüllt, wirft die Funktion eine Exception. \begin{lstlisting}[caption=Implementation des JNIs auf Java-Seite] // Calls the native method containing the image processing @@ -549,9 +565,10 @@ Ist sind die Parameter in Ordnung wird anschließend ein Byte-Array erzeugt und image, int r, int c, int ch, int d); \end{lstlisting} -Die Funktionen \lstinline{process(...)} und \lstinline{nativeImageProcession(...)} stellen die Implementierung des JNIs auf Java-Seite dar. Erstere Funktion überprüft zunächst, ob ob eine valide (d.\,h.\ ungleich \lstinline{null}) Datenstruktur übergeben wird und ruft, falls nicht, \lstinline{nativeImageProcession } -\lstinline{(...)} mit dem übergebenen Bild und den zugehörigen Eigenschaften auf, wodurch der Aufwand zur Verwendung der Funktion reduziert wird. Das Schlüsselwort \lstinline{native} in der Deklaration von \lstinline{nativeImageProcession(...)} signalisiert, dass es sich um eine über das JNI aufgerufene Funktion handelt und erlaubt es dem Interface, die Verknüpfung mit der Bibliothek \lstinline{openCVFramework.h} herzustellen. -Standardmäßig wird von der in openCVFramework.cpp implementierten Funktion ein Double-Array über das JNI zurückgeliefert, wodurch Positionen oder Größen von detektierten Gegenständen übergeben werden können. Kommt es während der Bildverarbeitung jedoch zu einem Fehler, so wird ein Nullpointer übergeben. +Die Funktionen \lstinline{process(...)} und \lstinline{nativeImageProcession(...)} stellen die Implementierung des JNIs auf Java-Seite dar. Erstere Funktion ruft \lstinline{nativeImageProcession(...)} mit dem übergebenen Bild und den zugehörigen Eigenschaften auf, wodurch der Aufwand zur Verwendung der Funktion reduziert wird. Das Schlüsselwort \lstinline{native} in der Deklaration von \lstinline{nativeImageProcession(...)} signalisiert, dass es sich um eine über das JNI aufgerufene Funktion handelt und erlaubt es dem Interface, die Verknüpfung mit der Bibliothek \lstinline{openCV-} +\\ +\lstinline{Framework.h} herzustellen. +Standardmäßig wird von der in \lstinline{openCVFramework.cpp} implementierten Funktion ein Double-Array über das JNI zurückgeliefert, wodurch Positionen oder Größen von detektierten Gegenständen übergeben werden können. Kommt es während der Bildverarbeitung jedoch zu einem Fehler, wird stattdessen ein Nullpointer übergeben. \section{Teil 2: C++} \lstset{language=C++} @@ -559,7 +576,7 @@ Standardmäßig wird von der in openCVFramework.cpp implementierten Funktion ein \subsection{openCVFramework.h} \label{vorgehenJNI} -In diesem Kapitel soll beschrieben werden, wie aus einer eine oder mehrere native Funktionen implementierenden Java-Klasse, in diesem Falle openCVFramework.java, die für die Verknüpfung mittels JNI benötigte native Bibliothek erstellt werden kann. +In diesem Kapitel soll beschrieben werden, wie aus einer eine oder mehrere native Funktionen implementierenden Java-Klasse, in diesem Falle \lstinline{openCVFramework.java}, die für die Verknüpfung mittels JNI benötigte native Bibliothek erstellt werden kann. Zunächst muss dafür aus dafür aus der betreffenden .java Datei aus ihrem Verzeichnis heraus mittels \begin{itemize} @@ -616,13 +633,14 @@ Die resultierende Bibliothek \lstinline{org_opencv_openCVFramework.h} hat anschl #endif \end{lstlisting} -Es ist darauf zu achten, dass die so erstellte .h Datei sich in dem jni-Ordner der Applikation befinden muss, damit das Java Native Interface diese bei Aufruf der nativen Funktion auf Java-Seite findet. Bei der Kompilierung der Applikation wird aus dem nativen Anteil der Anwendung schließlich eine .so Datei erstellt, die in \lstinline{openCVFramework.java} (s. Kapitel \ref{openCVFramework.java}) aufgerufen wird. Dieser Vorgang kann in der \lstinline{Android.mk} und in der \lstinline{Application.mk} (beide ebenfalls im JNI-Verzeichnis) definiert werden. Da beide Dateien als Makefiles jedoch selbsterklärend sind, wird an dieser Stelle nicht weiter darauf eingegangen. +Es ist darauf zu achten, dass die so erstellte .h Datei sich in dem jni-Ordner der Applikation befinden muss, damit das Java Native Interface diese bei Aufruf der nativen Funktion auf Java-Seite findet. Bei der Kompilierung der Applikation wird aus dem nativen Anteil der Anwendung schließlich eine .so Datei erstellt, die in \lstinline{openCVFramework.java} (s.\ Kapitel \ref{openCVFramework.java}) aufgerufen wird. Dieser Vorgang kann in der \lstinline{Android.mk} und in der \lstinline{Application.mk} (beide ebenfalls im JNI-Verzeichnis) definiert werden. \subsection{openCVFramework.cpp} \label{openCVFramework.cpp} -Die Klasse \lstinline{openCVFramework.cpp} bildet beeinhaltet die eigentliche Bildverarbeitung der Applikation und implementiert die in \lstinline{openCVFramework.java} definierte native Funktion \lstinline{native-} -\lstinline{ImageProcession(...)} (s. Kapitel \ref{openCVFramework.java}). +Die Klasse \lstinline{openCVFramework.cpp} beeinhaltet die eigentliche Bildverarbeitung der Applikation und implementiert die in \lstinline{openCVFramework.java} definierte native Funktion \lstinline{nativeImage-} +\\ +\lstinline{Procession(...)} (s.\ Kapitel \ref{openCVFramework.java}). \begin{lstlisting}[caption=Deklaration der nativeImageProcession-Funktion] #include "org_opencv_openCVFramework.h" @@ -635,7 +653,9 @@ Die Klasse \lstinline{openCVFramework.cpp} bildet beeinhaltet die eigentliche Bi jrows, jint jcolumns, jint jchannels, jint jdepth){ \end{lstlisting} -Damit das JNI den Bezug von der der nativen Funktion zu der Bibliothek und dadrüber zu deren Implementation in Java herstellen kann, ist es nötig, dass die native Klasse den selben Namen hat, wie die Java-Klasse, in der die Funktion aufgerufen wird, d.\,h.\ wenn die Java-Klasse \lstinline{openCVFramework.java} heißt, muss der Name des nativen Äquivalents \lstinline{openCVFramework.cpp} sein. Der Funktionsaufruf der nativen Funktion selbst muss nun demjenigen aus \lstinline{org_opencv_openCVFramework.h} gleichen, damit die Referenz zu der Bibliothek aufgelöst werden kann. Das Schlüsselwort \lstinline{JNIEXPORT} zeigt an, dass der nachfolgende Datentyp (in diesem Fall jdoubleArray) zurückgegeben wird; \lstinline{JNICALL} bedeutet, dass die Funktion über das JNI aufgerufen wird. +Damit das JNI den Bezug von der nativen Funktion zu der Bibliothek und dadrüber zu deren Einbindung in Java herstellen kann, ist es nötig, dass die native Klasse den selben Namen hat, wie die Java-Klasse, in der die Funktion aufgerufen wird, d.\,h.\ wenn die Java-Klasse \lstinline{openCVFramework.java} heißt, muss der Name des nativen Äquivalents \lstinline{openCVFramework.cpp} sein. Der Funktionsaufruf der nativen Funktion selbst muss demjenigen aus \lstinline{org_opencv_o-} +\\ +\lstinline{penCVFramework.h} gleichen, damit die Referenz zu der Bibliothek aufgelöst werden kann. Das Schlüsselwort \lstinline{JNIEXPORT} zeigt an, dass der nachfolgende Datentyp (in diesem Fall jdoubleArray) zurückgegeben wird; \lstinline{JNICALL} bedeutet, dass die Funktion über das JNI aufgerufen wird. \begin{lstlisting}[caption=Konvertierung der Java-Datentypen zu nativen Datentypen] Mat src, src_gray; @@ -658,7 +678,7 @@ Damit das JNI den Bezug von der der nativen Funktion zu der Bibliothek und dadr } \end{lstlisting} -Da die Speicherstruktur der Datentypen in Java sich teilweise von derjenigen in C++ unterscheidet, muss zunächst eine Konvertierung vorgenommen werden, um anschließend die Daten verwenden zu können. Das JNI stellt dafür die Datentypen jint, jbyteArray, etc.\ für die von Java übergebenen Argumente sowie Funktionen zur Umwandlung wie \lstinline{GetByte-} +Da die Speicherstruktur der Datentypen in Java sich teilweise von derjenigen in C++ unterscheidet, muss zunächst eine Konvertierung vorgenommen werden, um anschließend die Daten verwenden zu können. Das JNI stellt dafür die Datentypen \lstinline{jint}, \lstinline{jbyteArray}, etc.\ für die von Java übergebenen Argumente sowie Funktionen zur Umwandlung wie \lstinline{GetByte-} \lstinline{ArrayElements(...)} zur Verfügung. \begin{lstlisting}[caption=Wiederherstellung der Bildmatrix aus dem übergebenen Array] @@ -703,7 +723,7 @@ Da die Speicherstruktur der Datentypen in Java sich teilweise von derjenigen in } \end{lstlisting} -Vor der Verarbeitung muss aus dem übergebenen Bild-Array erneut eine Matrix erzeug werden, da die OpenCV-Funktionalitäten den Datentyp Mat als Übergabewert erwarten. Dafür werden die die Informationen eines Bildpixels wiederspiegelnden Einträge des Arrays (s. Kapitel \ref{openCVActivity.java}) jeweils in den dem Pixel zugeordneten Vektor geschrieben. Erneut hat der Nutzer die Auswahl zwischen einem Farb- und einem Graustufenbild. Entsprechen die Bildparameter nicht den diesen Bildformaten zugehörigen oder wird die Konvertierung nicht durchgeführt, so gibt die Funktion einen Nullpointer zurück, der in \lstinline{openCVActivity.java} abgefangen wird. +Vor der Verarbeitung muss aus dem übergebenen Bild-Array erneut eine Matrix erzeug werden, da die OpenCV-Funktionalitäten den Datentyp Mat als Übergabewert erwarten. Dafür werden die die Informationen eines Bildpixels wiederspiegelnden Einträge des Arrays (s.\ Kapitel \ref{openCVActivity.java}) jeweils in den dem Pixel zugeordneten Vektor geschrieben. Entsprechen die Bildparameter nicht den dem gewählten Bildformat zugehörigen oder wird die Konvertierung nicht korrekt durchgeführt, so gibt die Funktion einen Nullpointer zurück. \begin{lstlisting}[caption=Bildverarbeitung] // Color - image @@ -749,7 +769,7 @@ Für den Fall, dass ein Farbbild übergeben wurde, besteht auch an dieser Stelle } \end{lstlisting} -Abschließend besteht die Möglichkeit, Argumente, die über das JNI an Java zurückgegeben werden sollen, festzulegen. Standardmäßig ist die Rückgabe eines Double-Arrays implementiert. Dabei muss jedoch auch an dieser Stelle zunächst eine Konvertierung von einem C++-Array in die von Java verwendete Arraystruktur erfolgen. Dies geschieht, indem entsprechender Speicherplatz per \lstinline{malloc(...)} reserviert, der Zeiger des Ausgabearrays (in diesem Fall vom Typ jdoubleArray) auf diesen Speicherbereich gesetzt wird und anschließend der Inhalt des C++-Arrays per \lstinline{SetDoubleArrayRegion(...)} in das Java-Array geschrieben wird. Misslingt die Speicherbelegung, so wird ein Nullpointer zurückgegeben. Ansonsten wird nach Freigabe des durch das C++-Array reservierten Speicherplatzes das jdoubleArray zurückgegeben. +Abschließend besteht die Möglichkeit, Argumente, die über das JNI an Java zurückgegeben werden sollen, festzulegen. Standardmäßig ist die Rückgabe eines Double-Arrays implementiert. Dabei muss jedoch auch an dieser Stelle zunächst eine Konvertierung von einem C++-Array in die von Java verwendete Arraystruktur erfolgen. Dies geschieht, indem entsprechender Speicherplatz per \lstinline{malloc(...)} reserviert, der Zeiger des Ausgabearrays (in diesem Fall vom Typ \lstinline{jdoubleArray}) auf diesen Speicherbereich gesetzt wird und anschließend der Inhalt des C++-Arrays per \lstinline{SetDoubleArrayRegion(...)} in das Java-Array geschrieben wird. Misslingt die Speicherbelegung, so wird ein Nullpointer zurückgegeben. \section{Teil 3: XML} \lstset{language=XML} @@ -760,14 +780,16 @@ Jede Android-Applikation benötigt ein Android-Manifest. In diesem werden dem Sy \begin{itemize} \item{Das Java-Paket, in dem sich die Applikation befindet sowie die mindestens auf dem ausführenden Gerät benötigte Android-Version: + \begin{lstlisting}[caption=Java-Paket und min. Android-Version] package="org.opencv" android:versionCode="301" android:versionName="3.01" \end{lstlisting} + Die mindestens benötigte Android-Version orientiert sich dabei an den in der Applikation verwendeten Features. } -\item{Die Grundeigenschaften der Applikation wie Name und Icon sowie die einzelnen Bestandteile wie Activities, Services, Intent-Filter, etc.\ und ordnet diese einander zu: +\item{Die Grundeigenschaften der Applikation wie Name und Icon sowie die einzelnen Bestandteile wie Activities, Services, Intent-Filter, etc.: \begin{lstlisting}[caption=Aufbau der Applikation] <application @@ -787,7 +809,7 @@ Die mindestens benötigte Android-Version orientiert sich dabei an den in der Ap </application> \end{lstlisting} -Im Falle des Frameworks existiert standardmäßig auf Android-Seite lediglich eine Activity. Besteht jedoch im Rahmen der Implementierung des Frameworks je nach abzudeckender Anwendung die Notwendigkeit, weitere Android-Komponenten hinzuzufügen, so sind diese im Manifest nach folgendem Muster zu ergänzen: +Im Falle des Frameworks existiert auf Android-Seite standardmäßig lediglich eine Activity. Besteht jedoch im Rahmen der Implementierung des Frameworks je nach abzudeckender Anwendung die Notwendigkeit, weitere Android-Komponenten hinzuzufügen, so sind diese im Manifest nach folgendem Muster zu ergänzen: \begin{lstlisting}[caption=Ergänzen der Applikation um weitere Android-Komponenten] <application @@ -806,7 +828,7 @@ Im Falle des Frameworks existiert standardmäßig auf Android-Seite lediglich ei </application> \end{lstlisting} -Mittels des \lstinline{<application>} Blocks werden innerhalb des Betriebssystem bei starten der Applikation die Beziehung zwischen den einzelnen Teilkomponenten hergestellt. +Mittels des \lstinline{<application>} Blocks werden innerhalb des Betriebssystem beim Starten der Applikation die Beziehung zwischen den einzelnen Teilkomponenten hergestellt. } \item{Die mindestens zum Kompilieren der Applikation benötigte SDK-Version: @@ -829,10 +851,11 @@ Ebenso wie die mindestens benötigte Android-Version orientiert sich die SDK-Ver android:required="true"/> \end{lstlisting} -Standardmäßig wird für die Applikation lediglich die Kamera des Mobilgeräts sowie die zugehörige Berechtigung benötigt; werden in der nutzerspezifisch erstellten Anwendung weitere Features verwendet, sind diese an dieser Stelle im Manifest zu ergänzen. +Standardmäßig wird für die Applikation lediglich die Kamera des Mobilgeräts sowie die zugehörige Berechtigung benötigt. Werden in der nutzerspezifisch erstellten Anwendung weitere Features verwendet, sind diese an dieser Stelle im Manifest zu ergänzen. } \end{itemize} -Des weiteren können im Android-Manifest bei komplexeren Applikationen festgelegt werden, mit welcher Activity die Anwendung startet und gegen welche Bibliotheken sie gelinkt werden muss \cite[vgl.\ ][]{manifestAndroid2016}. + +Des Weiteren können im Android-Manifest bei komplexeren Applikationen festgelegt werden, mit welcher Activity die Anwendung startet und gegen welche Bibliotheken sie gelinkt werden muss \cite[vgl.\ ][]{manifestAndroid2016}. \subsection{Layout} \label{layout} @@ -844,7 +867,7 @@ Ein Layout definiert die visuelle Strukturierung eines User-Interfaces wie beisp \item{Alternativ können die visuellen Elemente bei Ausführung der Anwendung initialisiert werden. Dazu können in der Applikation selbst sogenannte Views erstellt werden.} \end{itemize} -Wichtig ist dabei, dass neben einem übergeordneten Layout, in dem sozusagen globale (d.\,h.\ für die ganze Applikation gültige) Parameter deklariert werden, ein Layout für jedes erstellte User Interface angelegt werden muss. Im Falle des Frameworks sind dies die Dateien \lstinline{activity_openCV.xml} und \lstinline{openCVFramework_surface_view.xml}. Die Dateien sind grundsätzlich selbsterklärend, da für die Erstellung des Frameworks auf weitere Anpassungen des Layouts verzichtet und stattdessen die Parameter automatisch von der nächsten übergeordneten Instanz, d.\,h.\ vom Betriebssystem bezieht und sich ansonsten an der Standard-Displayauflösung des Mobilgeräts orientiert. +Wichtig ist dabei, dass neben einem übergeordneten Layout, in dem \glqq{}globale\grqq{} (d.\,h.\ für die ganze Applikation gültige) Parameter deklariert werden, ein Layout für jedes erstellte User Interface angelegt werden muss. Im Falle des Frameworks sind dies die Dateien \lstinline{activity_openCV.xml} und \lstinline{openCVFramework_surface_view.xml}. Die Dateien sind grundsätzlich selbsterklärend, da die Parameter automatisch von der nächsten übergeordneten Instanz, d.\,h.\ vom Betriebssystem bezogen werden und sich ansonsten an der Standard-Display"=auflösung des Mobilgeräts orientiert wird. Weiterhin ist zu erwähnen, dass, falls im Android-Manifest ein Icon definiert wurde, die zugehörige Bilddatei ebenfalls im \lstinline{res}-Ordner in den \lstinline{drawable-XXX}-Verzeichnissen abgelegt werden muss. @@ -861,19 +884,19 @@ Weiterhin ist zu erwähnen, dass, falls im Android-Manifest ein Icon definiert w \end{figure} Auf Basis der in Kapitel \ref{framework} entwickelten Vorlage wurde mit Visual Based Landing System (VBLS) zu Demonstrationszwecken eine Applikation für die automatische Landeplatzlokalisierung von UAVs (Abk., engl. für Unmanned Aerial Vehicle) entwickelt. Mögliche Anwendungsfälle wären beispielsweise die Ermöglichung der selbstständigen Detektion von Ladestationen als Bestandteil eines autonomen Betriebs \cite[vgl.\ ][S.1]{vblsArticle2015} oder das Auffinden eines vordefinierten Landeplatzes in ansonsten unbekanntem oder unwegsamem Gelände. Als Kennzeichnung des Landeplatzes wurde in Anlehnung an die Markierung eines Helikopter-Landeplatzes ein Kreis gewählt. -Als Grundlage implementiert die Anwendung das OpenCV-Android-Framework; um die Unterscheidbarkeit von den generalisierten Klassen des Frameworks zu gewährleisten wurden die für diese Applikation spezialisierten Klassen entsprechend eindeutig benannt. Die Namenskonvention lässt sich dabei wie folgt interpretieren: +Als Grundlage implementiert die Anwendung das OpenCV-Android-Framework. Um die Unterscheidbarkeit von den generalisierten Klassen des Frameworks zu gewährleisten wurden die für diese Applikation spezialisierten Klassen entsprechend eindeutig benannt. Die Namenskonvention lässt sich dabei wie folgt interpretieren: \begin{itemize} \item{\lstinline{openCVActivity.java} -> \lstinline{VBLSActivity.java}} \item{\lstinline{openCVFramework.xxx} -> \lstinline{HoughCircleTransformation.xxx} (Hintergrund: Hough-Circle-Transformation ist die zur Detektion der Kreise genutzte Bildverarbeitungsfunktion)} \end{itemize} -Weiterhin wurden neben der Spezialisierung der Bildverarbeitung die Möglichkeit, dass das Mobilgerät als USB-Host gegenüber verbreiteten Mikrocontrollern wie dem Arduino fungieren und über diese Schnittstelle die erhaltenen Daten kommuniziert werden können, sowie ein PID-Regler zur Regelung der Ausgabewerte in Abhängigkeit von der Position des Landeplatzes im Kamerabild (für die Anpassung der Positionierung des UAVs) implementiert. +Weiterhin wurden die Möglichkeit, dass das Mobilgerät als USB-Host gegenüber verbreiteten Mikrocontrollern wie dem Arduino fungieren und über diese Schnittstelle die erhaltenen Daten kommuniziert werden können, sowie ein PID-Regler zur Regelung der Ausgabewerte in Abhängigkeit von der Position des Landeplatzes im Kamerabild, implementiert. \section{VBLSActivity.java} \lstset{language=JAVA} -Die Klasses \lstinline{VBLSActivity.java} wurde im Gegensatz zu \lstinline{openCVActivity.java} um die Verarbeitung der in \lstinline{HoughCircleTransformation.cpp} aus dem übergebenen extrahierten Daten sowie die Implementierung eines Reglers in Form der Klasse \lstinline{PID.java}, welcher die Zentrierung des UAVs über dem detektierten Landeplatz bewirkt, erweitert. Weiterhin wurde die USB-Kommunikation in dieser Activity realisiert. +Die Klasses \lstinline{VBLSActivity.java} wurde im Gegensatz zu \lstinline{openCVActivity.java} um die Verarbeitung der in \lstinline{HoughCircleTransformation.cpp} aus dem übergebenen Bild extrahierten Daten erweitert. Weiterhin wurde ein Regler in Form der Klasse \lstinline{PID.java}, welcher die Zentrierung des UAVs über dem detektierten Landeplatz bewirkt, implementiert und die USB-Kommunikation realisiert. Anmerkung: Da die USB-Kommunikation in Kapitel \ref{usb} seperat betrachtet wird, wird an dieser Stelle nicht weiter darauf eingegangen. @@ -888,7 +911,7 @@ Anmerkung: Da die USB-Kommunikation in Kapitel \ref{usb} seperat betrachtet wird final static IMG_HEIGHT = 240; \end{lstlisting} -Wie auch in dem zugrunde liegenden Framework wurde sowohl die Möglichkeit, Farbbilder als auch Graustufenbilder zu verarbeiten implementiert. Da die Natur der Anwendung jedoch eine möglichst hohe Echtzeitfähigkeit (d.\,h.\ in diesem Falle einfach möglichst viele Bildverarbeitungszyklen pro Zeitintervall) fordert, wurde die Priorität an dieser Stelle klar auf möglichst geringen Rechenaufwand gelegt und standardmäßig Graustufen als Format gewählt. Die Auflösung sollte für die beste Performanz möglichst so gering eingestellt werden, dass der als Landeplatz dienende Kreis aus der durchschnittlichen Flughöhe gerade noch so detektiert wird. +Da die Natur der Anwendung eine möglichst hohe Echtzeitfähigkeit (d.\,h.\ in diesem Falle einfach möglichst viele Bildverarbeitungszyklen pro Zeitintervall) fordert, wurde die Priorität an dieser Stelle klar auf möglichst geringen Rechenaufwand gelegt und standardmäßig Graustufen als Format gewählt. Die Auflösung sollte für die beste Performanz möglichst so gering eingestellt werden, dass der als Landeplatz dienende Kreis aus der durchschnittlichen Flughöhe gerade noch so detektiert wird. \begin{lstlisting}[caption=Implementierung von onCameraFrame] // Called on every frame received from the input - stream of @@ -982,9 +1005,10 @@ Wie auch in dem zugrunde liegenden Framework wurde sowohl die Möglichkeit, Farb } \end{lstlisting} -Die konkrete Implementation von \lstinline{onCameraFrame(...)} sieht vor, dass nach der eigentlichen und Kreisdetektion durch \lstinline{HoughCircleTransformation.cpp} (vgl.\ Kapitel \ref{implementationKreisdetektion}) zunächst überprüft wird, ob überhaupt Kreise und somit potentielle Landeplätze gefunden wurden (\lstinline{jImageDataCircels.length > 0}). Ist dies der Fall, so wird mit Hilfe der Funktion \lstinline{calculate-} -\\ -\lstinline{NearestCircle(...)} (vgl.\ Kapitel \ref{implementationHoughCircleTransformationJava}) der Kreis, welcher sich am nächsten zum Bildmittelpunkt befindet, ermittelt und zurückgegeben. Somit wird verhindert, dass bei mehreren Einträgen des Arrays \lstinline{jImageDataCircles} immer nur der erste und damit bedingt durch die Natur des Suchalgorithmus der am weitesten links oben im Bild angeordnete Kreis verwendet wird. Die derart erhaltenen Koordinaten werden im Anschluss an den PID-Regler (vgl.\ Kapitel \ref{pid}) übergeben, der wiederum auf dieser Basis die Stellgrößen anpasst. Diese werden mittels \lstinline{get_actuating_variables()} ausgelesen, auf einen Wertebereich von 0 bis 255 umgerechnet (Wertebereich eines Bytes; notwendig, damit bei der Konvertierung von Double zu Byte keine Informationen verloren gehen), und per \lstinline{write(...)} über die USB-Schnittstelle ausgegeben. Wichtig ist, dass sowohl in $x$- als auch in $y$-Richtung ein fester Offset von 127 auf die Ausgabegrößen beaufschlagt werden muss, da diese sich um 0 herum bewegen, der Flugcontroller jedoch Werte um 127 herum erwartet. +Die konkrete Implementation von \lstinline{onCameraFrame(...)} sieht vor, dass nach der eigentlichen Kreisdetektion durch \lstinline{HoughCircleTransformation.cpp} (vgl.\ Kapitel \ref{implementationKreisdetektion}) zunächst überprüft wird, ob überhaupt Kreise (und somit potentielle Landeplätze) gefunden wurden (\lstinline{jImage-} +\lstinline{DataCircels.length > 0}). Ist dies der Fall, so wird mit Hilfe der Funktion \lstinline{calculateNearest-} +\lstinline{Circle(...)} (vgl.\ Kapitel \ref{implementationHoughCircleTransformationJava}) der Kreis, der sich am Nächsten zum Bildmittelpunkt befindet, ermittelt und zurückgegeben. Somit wird verhindert, dass bei mehreren Einträgen des Arrays \lstinline{jImageDataCircles} immer nur der erste und damit bedingt durch die Natur des Suchalgorithmus der am weitesten links oben im Bild angeordnete Kreis verwendet wird. Die derart erhaltenen Koordinaten werden an den PID-Regler (vgl.\ Kapitel \ref{pid}) übergeben, der wiederum auf dieser Basis die Stellgrößen anpasst. Diese Stellgrößen werden mittels \lstinline{get_actuating_va-} +\lstinline{riables()} ausgelesen, auf einen Wertebereich von 0 bis 255 umgerechnet (Wertebereich eines Bytes; notwendig, damit bei der Konvertierung von Double zu Byte keine Informationen verloren gehen) und per \lstinline{write(...)} über die USB-Schnittstelle ausgegeben. Wichtig ist, dass sowohl in $x$- als auch in $y$-Richtung ein fester Offset von 127 auf die Ausgabegrößen beaufschlagt werden muss, da diese sich um 0 herum bewegen, der Flugcontroller jedoch Werte um 127 herum erwartet. \\ \\ Anmerkung: Der PID-Regler arbeitet threadbasiert. Um Nebenläufigkeitskomplikationen auszuschließen, ist es daher notwendig, beim Zugriff auf die Stellgrößen eine einmalige lokale Kopie dieser anzulegen und im Anschluss mit dieser Kopie zu arbeiten, anstatt sowohl für $x$- als auch für $y$-Richtung jeweils einzeln \lstinline{get_actuating_variables()} aufzurufen. Sonst läuft man Gefahr, dass die Stellgrößen zwischen dem ersten und dem zweiten Zugriff aktualisiert wurden und die beiden ausgelesenen Werte nicht mehr miteinander korrelieren. @@ -1017,15 +1041,17 @@ Anmerkung: Der PID-Regler arbeitet threadbasiert. Um Nebenläufigkeitskomplikati } \end{lstlisting} -Die Funktion \lstinline{calculateNearestCircle(...)} überprüft anhand der Länge des die Kreiskoordinaten enthaltenden Arrays, ob bei der Bildverarbeitung mehrere Kreise und somit potentielle Landeplätze detektiert wurden. Falls dies der Fall sein sollte, wird der dem Bildmittelpunkt am Nächsten gelegene Kreis ermittelt und zurückgegeben. Dazu wird zunächst der Abstand des ersten Positions-Eintrags des Arrays als minimaler Abstand festgelegt und anschließend für alle weiteren Kreiskoordinaten überprüft, ob deren Abstand zum Bildmittelpunkt geringer ist. Ist dies der Fall, wird der entsprechende Eintrag als neue Referenz gespeichert. Somit bleibt am Ende lediglich derjenige Kreis mit der geringsten Entfernung zur Bildmitte übrig. +Die Funktion \lstinline{calculateNearestCircle(...)} überprüft anhand der Länge des die Kreiskoordinaten enthaltenden Arrays, ob bei der Bildverarbeitung mehrere Kreise detektiert wurden. Falls dies der Fall sein sollte, wird der dem Bildmittelpunkt am Nächsten gelegene Kreis ermittelt und zurückgegeben. Dazu wird zunächst der Abstand des ersten Positions-Eintrags des Arrays als minimaler Abstand festgelegt und anschließend für alle weiteren Kreiskoordinaten überprüft, ob deren Abstand zum Bildmittelpunkt geringer ist. Ist dies der Fall, wird der entsprechende Eintrag als neue Referenz gespeichert. Somit bleibt am Ende derjenige Kreis mit der geringsten Entfernung zur Bildmitte übrig. Dies ist notwendig, da ansonsten immer der am weitesten links oben angeordnete Kreis als Ziel gewählt würde, da die Bildverarbeitung das Bild von der linken oberen Ecke aus durchläuft und somit dessen Koordinaten an erster Stelle im Array stehen würden. +\\ +\\ Anmerkung: Der Offset von \lstinline{0.5*img_width} bzw. \lstinline{0.5*img_height} ergibt sich dadurch, dass der Nullpunkt des Bildes standardmäßig in der oberen linken Ecke liegt. \section{HoughCircleTransformation.cpp} \label{implementationKreisdetektion} \lstset{language=C++} -\lstinline{HoughCircleTransformation.cpp} basiert auf der Klasse \lstinline{openCVFramework.cpp} des Frameworks und implementiert die OpenCV-Methoden Lokalisierung von Kreisen und damit potentiellen Landeplätzen im per JNI übergebenen Bild. +\lstinline{HoughCircleTransformation.cpp} basiert auf der Klasse \lstinline{openCVFramework.cpp} des Frameworks und implementiert die OpenCV-Methoden zur Lokalisierung von Kreisen und damit potentiellen Landeplätzen. \begin{lstlisting}[caption=Kreisdetektion] // Reduce the noise so false circle detection is avoided (or @@ -1037,7 +1063,7 @@ Anmerkung: Der Offset von \lstinline{0.5*img_width} bzw. \lstinline{0.5*img_heig (double) src_gray.rows/8, 150.0, 75.0, 0, 0); \end{lstlisting} -Nachdem das in Byte-Array-Form per JNI übergebene Bild erneut zurück in eine Matrix umgewandelt wurde (s. Kapitel \ref{openCVFramework.cpp}, wird zunächst mittels \lstinline{GaussianBlur(...)} eine Reduzierung des Rauschens im Bild durchgeführt. Dafür werden jeweils die Pixel in direkter Nachbarschaft zum aktuell betrachteten Bildpunkt untersucht und deren Farb- oder Helligkeitswert (je nachdem, ob Farb- oder Graustufenbilder verwendet werden) in Relation gesetzt. Ist also beispielsweise das aktuelle Pixel schwarz, alle benachbarten Bildpunkte jedoch weiß, so wird der Wert des Pixels ebenfalls auf weiß gesetzt. Diese Verminderung des Rauschens ist notwendig, um bei nachfolgender Objektlokalisierung gute Ergebnisse zu erzielen. +Nachdem das in Byte-Array-Form per JNI übergebene Bild erneut zurück in eine Matrix umgewandelt wurde (s.\ Kapitel \ref{openCVFramework.cpp}, wird zunächst mittels \lstinline{GaussianBlur(...)} eine Reduzierung des Rauschens im Bild durchgeführt. Dafür werden jeweils die Pixel in direkter Nachbarschaft zum aktuell betrachteten Bildpunkt untersucht und deren Farb- oder Helligkeitswert (je nachdem, ob Farb- oder Graustufenbilder verwendet werden) in Relation gesetzt. Ist also beispielsweise das aktuelle Pixel schwarz, alle benachbarten Bildpunkte jedoch weiß, so wird der Wert des Pixels ebenfalls auf weiß gesetzt. Diese Verminderung des Rauschens ist notwendig, um bei der nachfolgenden Objektlokalisierung bessere Ergebnisse erzielen zu können. Anschließend wird mittels \lstinline{HoughCircles(...)} die eigentliche Kreisdetektion durchgeführt. Diese basiert ebenfalls darauf, dass Cluster von benachbarten, gleichfarbigen Pixeln betrachtet werden und zu jedem dieser Cluster ein zugehöriger Kreisradius und -mittelpunkt interpoliert werden. Liegen genügend Mittelpunkte von Clustern mit gleichem Radius in einem gewissen Bereich, so wird angenommen, dass diese Pixel zu einem Kreis gehören. Die Attribute der gefundenen Kreise (bestehend aus den Koordinaten des Mittelpunkts und dem Radius) werden in einem einem Array von Vektoren, \lstinline{circles}, gespeichert. Die letzten fünf Übergabeparameter der Funktion stellen dabei konfigurierbare Parameter wie beispielsweise minimale und maximale Radien oder Thresholds für die Kantendetektion dar. @@ -1051,7 +1077,6 @@ konsultiert werden. vec_size = circles.size(); sub_vec_size = 3; double *outCArray; - //LOGD("%d, %d", vec_size, sub_vec_size); outCArray = (double *) malloc((vec_size*sub_vec_size)*sizeof( double)); // Malloc to prevent the application from using // new memory space on every call of this method @@ -1059,21 +1084,20 @@ konsultiert werden. for (int j = 0; j < sub_vec_size; j++) { outCArray[i*sub_vec_size+j] = cvRound((double)circles[i][ j]); - //LOGD("%d, %d", i, j); } } \end{lstlisting} -Um die extrahierten Daten anschließend wieder über das JNI an \lstinline{VBLSActivity.java} zurückgeben zu können, muss die Vektordatenstruktur von \lstinline{circles} in ein Array eines nativen Datentyps, in diesem Falle Double, konvertiert werden. Dafür wird zunächst die Größe des benötigten Feldes berechnet und der entsprechende Speicherplatz per \lstinline{malloc(...)} reserviert. Anschließend werden die einzelnen den detektierten Kreisen zugehörigen Vektoren nacheinander ausgelesen und deren Inhalt in das Array geschrieben. Die \lstinline{sub_vec_size} von drei kommt daher, dass jedem Kreis sowohl der Radius als auch die Koordinaten des Mittelpunkts zugeordnet werden. Anschließend wird das Array wie in \lstinline{openCVFramework.cpp} (s. Kapitel \ref{openCVFramework.cpp}) per JNI zurückgegeben. +Um die extrahierten Daten anschließend wieder über das JNI an \lstinline{VBLSActivity.java} zurückgeben zu können, muss die Vektordatenstruktur von \lstinline{circles} in ein Array eines nativen Datentyps, in diesem Falle Double, konvertiert werden. Dafür wird zunächst die Größe des benötigten Feldes berechnet und der entsprechende Speicherplatz per \lstinline{malloc(...)} reserviert. Anschließend werden die einzelnen den detektierten Kreisen zugehörigen Vektoren nacheinander ausgelesen und deren Inhalt in das Array geschrieben. Die \lstinline{sub_vec_size} von drei kommt daher, dass jedem Kreis sowohl der Radius als auch die Koordinaten des Mittelpunkts zugeordnet werden. Anschließend wird das Array wie in \lstinline{openCVFramework.cpp} (s.\ Kapitel \ref{openCVFramework.cpp}) per JNI zurückgegeben. \section{USB-Kommunikation} \label{usb} \subsection{Anforderungen an die zu verwendende Bibliothek} -Wie bereits in Kapitel \ref{vblsAufbau} beschrieben, verfügen Android-Mobilgeräte standardmäßig nicht über die Möglichkeit, als Host gegenüber anderen USB-Geräten zu fungieren. Für diesen Zweck stellt das Betriebssystem das sogenannte Open Accessory zur Verfügung \cite[vgl.\ ][S.199ff.]{schwark2016}. Dabei simuliert das Android dem angeschlossenen USB-Gerät, der Host zu sein, obwohl in Realität letzteres die Host-Funktion übernimmt. Da diese Funktionalität jedoch bisher nur in wenigen Chips von FTDI integriert und damit sehr unflexibel hinsichtlich der Gerätekompabilität. +Wie bereits in Kapitel \ref{vblsAufbau} beschrieben, verfügen Android-Mobilgeräte standardmäßig nicht über die Möglichkeit, als Host gegenüber anderen USB-Geräten zu fungieren. Für diesen Zweck stellt das Betriebssystem das sogenannte Open Accessory zur Verfügung \cite[vgl.\ ][S.199ff.]{schwark2016}. Dabei simuliert das Android dem angeschlossenen USB-Gerät, der Host zu sein, obwohl in Realität letzteres die Host-Funktion übernimmt. Diese Funktionalität ist bisher jedoch nur in wenigen Chips von FTDI integriert und somit sehr unflexibel hinsichtlich der Gerätekompabilität. -Alternativ zu Open Accessory besteht die Möglichkeit, eine von mehreren zur Verfügung stehenden Bibliotheken inklusive Treibern für die anzusprechenden Endgeräte in die Applikation zu integrieren. Von zentraler Wichtigkeit bei der Auswahl der passenden Bibliothek ist deren Lizenz. Um der in der Zielsetzungen des Projekts (s. Kapitel \ref{ziel}) geforderte möglichst einfache Zugänglichkeit zu gewährleisten, ist es wichtig, ein Projekt unter einer Open Source Lizenz auszuwählen. Von technischer Seite aus sollte besonderes Augenmerk auf die Flexibilität bzgl.\ der USB-Chips, die jede der Bibliotheken unterstützt, gelegt werden, um somit eine möglichst große Anzahl an Endgeräten unterstützen zu können. Weiterhin ist es wichtig, dass asynchrone Kommunikation unterstützt wird, um die Applikation nicht unnötig zu verlangsamen (die Bildverarbeitung im UI-Thread kann weiter stattfinden, während der USB-Thread kommuniziert). Zuletzt ist eine gute Dokumentation und Verständlichkeit der Bibliothek wichtig, um die Implementierung einfach und korrekt durchführen zu können. +Alternativ zu Open Accessory besteht die Möglichkeit, eine von mehreren zur Verfügung stehenden Bibliotheken inklusive Treibern für die anzusprechenden Endgeräte in die Applikation zu integrieren. Von zentraler Wichtigkeit bei der Auswahl der passenden Bibliothek ist deren Lizenz. Um der in der Zielsetzungen des Projekts (s.\ Kapitel \ref{ziel}) geforderte möglichst einfache Zugänglichkeit zu gewährleisten, ist es wichtig, ein Projekt unter einer Open Source-Lizenz auszuwählen. Von technischer Seite aus sollte besonderes Augenmerk auf die Flexibilität bzgl.\ der USB-Chips, die jede der Bibliotheken unterstützt, gelegt werden, um eine möglichst große Anzahl an Endgeräten unterstützen zu können. Weiterhin ist es wichtig, dass asynchrone Kommunikation unterstützt wird, um die Applikation nicht unnötig zu verlangsamen (die Bildverarbeitung im UI-Thread kann weiter stattfinden, während der USB-Thread kommuniziert). Zuletzt ist eine gute Dokumentation und Verständlichkeit der Bibliothek wichtig, um die Implementierung einfach und korrekt durchführen zu können. \\ \\ Auf Grundlage dieser Kriterien wurde sich für die USB-Serial-Bibliothek von Felipe Herranz, zu finden unter \url{https://github.com/felHR85/UsbSerial}, unter der MIT-Lizens ausgewählt. @@ -1088,8 +1112,9 @@ Bei der Entwicklung von Android-Applikationen wird bzgl.\ des funktionalen Codes \item{Einbindung in die Activity} \end{itemize} -Die der Implemetierung des Services dienliche Klasse \lstinline{USB_Service.java} orientiert sich stark an der der Bibliothek beiliegenden Beispiel-Implementation (ebenfalls zu finden unter \url{https://github.com/felHR85/UsbSerial}) und ist an dieser Stelle gut dokumentiert; dementsprechend soll an dieser Stelle nicht weiter darauf eingegangen, sondern sich lediglich auf die Integration in \lstinline{VBLSActivity.java} fokussiert werden. Einzig erwähnenswert an dieser Stelle ist, dass mittels der zu Beginn des Services definierten Variable \lstinline{BAUD_RATE} die für die Kommunikation zu verwendende Baud-Rate eingestellt werden kann. - +Die der Implemetierung des Services dienliche Klasse \lstinline{USB_Service.java} orientiert sich stark an der der Bibliothek beiliegenden Beispiel-Implementation (ebenfalls zu finden unter \url{https://github.com/felHR85/UsbSerial}) und ist an dieser Stelle gut dokumentiert. Dementsprechend soll an dieser Stelle nicht weiter darauf eingegangen, sondern sich lediglich auf die Integration in \lstinline{VBLSActivity.java} fokussiert werden. Einzig erwähnenswert an dieser Stelle ist, dass mittels der zu Beginn des Services definierten Variable \lstinline{BAUD_RATE} die für die Kommunikation zu verwendende Baud-Rate eingestellt werden kann. +\\ +\\ Anmerkung: Für Nutzer, die neu in der Android-Entwicklung sind, ist es grundsätzlich empfehlenswert, sich die offizielle Dokumentation zu Services unter \url{https://developer.android.com/guide/components/services.html} durchzulesen. \begin{lstlisting}[caption=Initialisierung des USB-Daten-Arrays] @@ -1140,7 +1165,7 @@ Zunächst wird ein Daten-Array initialisiert, in das die zu versendenden Daten g } \end{lstlisting} -Mittels der Service-Connnection sowie der Funktion \lstinline{startService} wird der Service aus der Activity heraus gestartet und an die Activity gebunden. Die Bindeanfrage wird dabei mittels des Intents \lstinline{bindingIntent} über dei Funktion \lstinline{bindService} kommuniziert \lstinline{startService} wird bei sowohl bei erstmaligem Erstellen der Applikation als auch, wenn die Anwendung aus gestopptem Zustand heraus fortgesetzt wird mittels \lstinline{onResume()} aufgerufen. Bei Pausieren (\lstinline{onPause()} wird der Service gestoppt und der zugehörige Broadcast-Receiver mittels \lstinline{unregisterReceiver(...)} entfernt. +Mittels der Service-Connnection sowie der Funktion \lstinline{startService} wird der Service aus der Activity heraus gestartet und an die Activity gebunden. Die Bindeanfrage wird dabei mittels des Intents \lstinline{bindingIntent} über die Funktion \lstinline{bindService} kommuniziert. \lstinline{startService} wird sowohl bei erstmaligem Erstellen der Applikation als auch, wenn die Anwendung aus gestopptem Zustand heraus fortgesetzt wird mittels \lstinline{onResume()} aufgerufen. Bei Pausieren (\lstinline{onPause()}) wird der Service gestoppt und der zugehörige Broadcast-Receiver mittels \lstinline{unregisterReceiver(...)} entfernt. \begin{lstlisting}[caption=Einrichtung des Broadcast-Receivers] private final BroadcastReceiver mUsbReceiver = new @@ -1193,7 +1218,7 @@ Mittels der Service-Connnection sowie der Funktion \lstinline{startService} wird } \end{lstlisting} -Um miteinander zu kommunizieren, nutzen Activities und Services die Broadcast-Funk"=tionalität. Dabei kannn jede Komponente sogennante Intents oder Messages über das Broad"=cast-System versenden. Andere Komponenten können Broadcast-Receiver (s. Kapitel \ref{introductionAndroid}) einrichten, um allen auf diese Art im System gesendeten Nachrichten zu lauschen und Aktionen für bestimmte Inhalte definieren. Mittels \lstinline{setFilters()} können die zu empfangenden Intents oder Messages festgelegt werden; die Komponente \lstinline{abboniert} sie. Anschließend wird der Receiver mittels \lstinline{registerReceiver(...)} registriert. Im konkreten Fall werden lediglich Nachrichten des Services empfangen. +Um miteinander zu kommunizieren, nutzen Activities und Services die Broadcast-Funk"=tionalität. Dabei kann jede Komponente sogennante Intents oder Messages über das Broad"=cast-System versenden. Andere Komponenten können Broadcast-Receiver (s.\ Kapitel \ref{introductionAndroid}) einrichten, um allen auf diese Art im System gesendeten Nachrichten zu lauschen und Aktionen für bestimmte Inhalte definieren. Mittels \lstinline{setFilters()} können die zu empfangenden Intents oder Messages festgelegt werden; die Komponente \lstinline{abboniert} sie. Anschließend wird der Receiver mittels \lstinline{registerReceiver(...)} registriert. Im konkreten Fall werden lediglich Nachrichten des Services empfangen. \begin{lstlisting}[caption=Einrichten und Weiterreichen des USB-Handlers] /* @@ -1239,12 +1264,12 @@ Um miteinander zu kommunizieren, nutzen Activities und Services die Broadcast-Fu usbService.setHandler(usbHandler); \end{lstlisting} -Eine weitere Möglichkeit der Kommunikation zwischen Activity und Service besteht neben dem Versenden von Intents über das Broadcast-System im Überliefern von Messages mittels Handlern. Wie bereits in Kapitel \ref{introductionAndroid} beschrieben, dienen Intents dazu, Anfragen zu übermitteln, während Messages reine Mitteilungen darstellen. Die Klasse \lstinline{usbHandler} dient zur Verarbeitung der zwischen beiden Komponenten versendeten Messages. In ihr werden verschiedene Aktionen für bestimmte Nachrichten wie beispielsweise das Ausgeben der vom Endgerät empfangenen Daten bei \lstinline{USB_Service.MESSAGE_FROM_SERIAL_PORT} (für die konkrete Anwendung uninteressant, da nur Daten versendet und nicht empfangen werden) definiert. Anschließend wird das in der Aktivity erzeugte und mittels \lstinline{WeakReference} gebundene Objekt per \lstinline{setHandler(...)} an den Service übergeben, wodurch es diesem ermöglicht wird, Messages über den Handler zu versenden. +Eine weitere Möglichkeit der Kommunikation zwischen Activity und Service besteht neben dem Versenden von Intents über das Broadcast-System im Überliefern von Messages mittels Handlern. Wie bereits in Kapitel \ref{introductionAndroid} beschrieben, besteht die Aufgabe von Intents darin, Anfragen zu übermitteln, während Messages reine Mitteilungen darstellen. Die Klasse \lstinline{usbHandler} dient zur Verarbeitung der zwischen beiden Komponenten versendeten Messages. In ihr werden verschiedene Aktionen für bestimmte Nachrichten wie bspw.\ das Ausgeben der vom Endgerät empfangenen Daten bei \lstinline{USB_Service.MESSAGE_FROM_SERIAL_PORT} (für die konkrete Anwendung uninteressant, da nur Daten versendet und nicht empfangen werden) definiert. Anschließend wird das in der Aktivity erzeugte und mittels \lstinline{WeakReference} gebundene Objekt per \lstinline{setHandler(...)} an den Service übergeben, wodurch es diesem ermöglicht wird, Messages über den Handler zu versenden. \section{PID.java} \label{pid} -Wie bereits in der Zielsetzung (vgl.\ Kapitel \ref{ziel}) definiert, soll die zu Demonstrationszwecken dienende Applikation zuverlässig einen Landeplatz zu lokalisieren und es dem UAV ermöglichen, sich über diesem zu zentrieren. Da es sich jedoch bei einem UAV im Normalfall um ein träges, nicht mechanisch geführtes System handelt, das weiterhin von Einflüssen umwelttechnischer oder mechanischer Art wie beispielsweise Windböen oder einer ungenauen Kalibrierung der Sensorik betroffen sein kann, ist es für eine sichere Positionierung über dem Mittelpunkt des detektierten Landeplatzes unerlässlich, eine Positionsregelung zu implementieren, um die Fluggeschwindigkeit zu regulieren und starke Überschwinger zu vermeiden. Dies geschieht mittels der Klasse \lstinline{PID.java} in Form eines klassischen PID-Reglers. +Wie bereits in der Zielsetzung (vgl.\ Kapitel \ref{ziel}) definiert, soll die zu Demonstrationszwecken dienende Applikation zuverlässig einen Landeplatz zu lokalisieren und es dem UAV ermöglichen, sich über diesem zu zentrieren. Da es sich jedoch bei einem UAV im Normalfall um ein träges, nicht mechanisch geführtes System handelt, das weiterhin von Einflüssen umwelttechnischer oder mechanischer Art wie bspw.\ Windböen oder einer ungenauen Kalibrierung der Sensorik betroffen sein kann, ist es für eine sichere Positionierung über einem detektierten Landeplatzes unerlässlich, eine Positionsregelung zu implementieren, um die Fluggeschwindigkeit zu regulieren und starke Überschwinger zu vermeiden. Dies geschieht mittels der Klasse \lstinline{PID.java} in Form eines klassischen PID-Reglers. \begin{lstlisting}[caption=Hilfsklasse für Koordinatentupel] // Immutable class to represent a coordinate tuple @@ -1267,7 +1292,7 @@ Wie bereits in der Zielsetzung (vgl.\ Kapitel \ref{ziel}) definiert, soll die zu } \end{lstlisting} -Da für die Realisierung des Reglers ein threadbasierter Ansatz gewählt wurde und im Bezug auf die Stellgrößen auf der Basis von Referenzen gearbeitet wird (s.u.), wird eine Klasse benötigt, deren Objekte es erlauben, ein Koordinatenpaar zu übergeben und auf diese Werte zuzugreifen. Diesen Zweck erfüllt \lstinline{Coordinates_Immutable}, da Java standardmäßig keine Tupel unterstützt. Die Klasse ist aus Gründen der Zugriffssicherheit nach dem Entwurfsmuster \glqq{}Immutable\grqq{} (einmalige schreibende Zuweisung der Werte, ansonsten lediglich lesender Zugriff) gestaltet. +Da für die Realisierung des Reglers ein threadbasierter Ansatz gewählt wurde und im Bezug auf die Stellgrößen auf der Basis von Referenzen gearbeitet wird (s.\,u.), wird eine Klasse benötigt, deren Objekte es erlauben, ein Koordinatenpaar zu übergeben und auf diese Werte zuzugreifen. Diesen Zweck erfüllt \lstinline{Coordinates_Immutable}, da Java standardmäßig keine Tupel unterstützt. Die Klasse ist aus Gründen der Zugriffssicherheit nach dem Entwurfsmuster \glqq{}Immutable\grqq{} (einmalige schreibende Zuweisung der Werte, ansonsten lediglich lesender Zugriff) gestaltet. \begin{lstlisting}[caption=Erläuterung der Parameter] // Constructor @@ -1296,10 +1321,9 @@ Da für die Realisierung des Reglers ein threadbasierter Ansatz gewählt wurde u \end{lstlisting} Wie bereits zu Beginn der Sektion angeführt, weist der implementierte Regler in seiner Grundform eine standardmäßige PID-Charakteristik auf. Folglich entsprechen die übergebenen Werte für \lstinline{Kp}, \lstinline{Ki} und \lstinline{Kd} den Koeffizienten für den Proportional-, Integral- und Differentialanteil, sowie \lstinline{set_point_x} und \lstinline{set_point_y} dem Arbeitspunkt. -Da sowohl der I-, als auch der D-Anteil eines PID-Reglers zeitabhängig sind, wurde zur Realisierung dieser Funktioalität ein threadbasierter Ansatz gewählt. Die Run-Methode des Threads führt dabei jeweils die Berechnung aus; anschließend schläft der Thread bis zu seinem nächsten Aufruf und gibt belegte Ressourcen frei (\lstinline{sleep(...)}). Mittels \lstinline{dt} kann dabei die Schrittweite bzw. das Zeitintervall, in dem der Regler aufgerufen wird, festgelegt werden (in Millisekunden). +Da sowohl der I-, als auch der D-Anteil eines PID-Reglers zeitabhängig sind, wurde zur Realisierung dieser Funktioalität ein threadbasierter Ansatz gewählt. Die Run-Methode des Threads führt dabei jeweils die Berechnung aus. Anschließend schläft der Thread bis zu seinem nächsten Aufruf und gibt belegte Ressourcen frei (\lstinline{sleep(...)}). Mittels \lstinline{dt} kann die Schrittweite bzw. das Zeitintervall, in dem der Regler aufgerufen wird, festgelegt werden (in Millisekunden). -Da nun jedoch sowohl schreibender (auf die Eingangsgrößen) als auch lesender (auf die Stellgrößen) Zugriff aus einem anderen Thread (dem Main-Thread) auf Elemente des Regler-Threads erfolgen soll, ist es notwendig, die betroffenen Objekte threadsicher zu implementieren. Ansonsten kann es zu Nebenläufigkeitsproblematiken kommen, z.\,B.\ erster Wert der Stellgröße wird ausgelesen -> Aktualisierung der Stellgröße von Seiten des Reglers -> zweiter Wert wird ausgelesen -> ausgelesene Werte korrelieren nicht miteinander. Zu diesem Zweck werden die betroffenen Elemente als threadsichere Referenzen, sogenannten \lstinline{AtomicRefe-} -\lstinline{rences}, auf Objekte der Klasse \lstinline{Coordinates_Immutable} implementiert. Somit erfolgt der Zugriff auf die Objekte selbst threadsicher und es wird immer auf beide betroffenen Werte ($x$- und $y$-Richtung) gleichhzeitig zugegriffen. +Da nun sowohl schreibender (auf die Eingangsgrößen) als auch lesender (auf die Stellgrößen) Zugriff aus einem anderen Thread (dem Main-Thread) auf Elemente des Regler-Threads erfolgen soll, ist es notwendig, die betroffenen Objekte threadsicher zu implementieren. Ansonsten kann es zu Nebenläufigkeitsproblematiken kommen, z.\,B.\ erster Wert der Stellgröße wird ausgelesen -> Aktualisierung der Stellgröße von Seiten des Reglers -> zweiter Wert wird ausgelesen -> ausgelesene Werte korrelieren nicht miteinander. Zu diesem Zweck werden die betroffenen Elemente als threadsichere Referenzen, sogenannten \lstinline{AtomicReferences}, auf Objekte der Klasse \lstinline{Coordinates_Immutable} implementiert. Somit erfolgt der Zugriff auf die Objekte selbst threadsicher und es wird immer auf beide betroffenen Werte ($x$- und $y$-Richtung) gleichzeitig zugegriffen. \begin{lstlisting}[caption=Lesender und schreibender Zugriff auf threadsichere Objekte] // Gets the actual actuating variable @@ -1323,10 +1347,10 @@ Da nun jedoch sowohl schreibender (auf die Eingangsgrößen) als auch lesender ( } \end{lstlisting} -Lesender Zugriff auf die durch threadsichere Referenzen gekapselten Elemente erfolgt, indem zunächst mittels \lstinline{get()} das Objekt selbst und anschließend dessen Inhalt zurückgegeben wird. Dabei ist auch an dieser Stelle darauf zu achten, dass um Nebenläufigkeitsproblematiken zu vermeiden, \lstinline{get()} genau einmal aufgerufen und anschließend mit einer Kopie der Objekte gearbeitet werden sollte. Eine flache Kopie (lediglich die Referenz) ist ausreichend, da bei einer Aktualisierung der Stellgrößen nicht die Werte der Inhalt des Objekts verändert wird(nicht möglich, da immutable), sondern ein komplett neues Objekt erzeugt wird (genau ein schreibender Aufruf und nicht zwei und damit erneut Anfälligkeit für Nebenläufigkeitsproblematiken). +Lesender Zugriff auf die durch threadsichere Referenzen gekapselten Elemente erfolgt, indem zunächst mittels \lstinline{get()} das Objekt selbst und anschließend dessen Inhalt zurückgegeben wird. Dabei ist auch an dieser Stelle darauf zu achten, dass um Nebenläufigkeitsproblematiken zu vermeiden, \lstinline{get()} genau einmal aufgerufen und anschließend mit einer Kopie der Objekte gearbeitet werden sollte. Eine flache Kopie (lediglich die Referenz) ist ausreichend, da bei einer Aktualisierung der Stellgrößen nicht die Werte der Inhalt des Objekts verändert werden (nicht möglich, da immutable), sondern ein komplett neues Objekt erzeugt wird (genau ein schreibender Aufruf und nicht zwei und damit erneut Anfälligkeit für Nebenläufigkeitsproblematiken). -Dieses Vorgehen kann man ebenfalls bei der Funktion \lstinline{set_values(...)} sehen, mittels der aus dem Main-Thread bei jedem verarbeitetem Bild die Eingangsgrößen geschrieben werden. Auch an dieser Stelle werden nicht die Werte verändert, sondern die \lstinline{AtomicRefe-} -\lstinline{rence} auf ein neues Objekt der Klasse \lstinline{Coordinates_Immutable} mit den neuen Eingangsgrößen gesetzt. Das \glqq{}alte\grqq{} Element wird dann nicht mehr verwendet und somit vom Garbage Collector der JVM freigegeben. +Dieses Vorgehen kann man ebenfalls bei der Funktion \lstinline{set_values(...)} sehen, mittels der aus dem Main-Thread bei jedem verarbeiteten Bild die Eingangsgrößen geschrieben werden. Auch an dieser Stelle werden nicht die Werte verändert, sondern die \lstinline{AtomicRefe-} +\lstinline{rence} auf ein neues Objekt der Klasse \lstinline{Coordinates_Immutable} mit den neuen Eingangsgrößen gesetzt. Das \glqq{}alte\grqq{} Element wird somit nicht länger verwendet und vom Garbage Collector der JVM freigegeben. \begin{lstlisting}[caption=Berechnung der Stellgrößen] // Thread to calculate the actuating variables for a given @@ -1409,7 +1433,7 @@ Durch das Hinzukommen der Kommunikation über die USB-Schnittstelle des Mobilger </application> \end{lstlisting} -Zusätzlich zu der eigentlichen Activity implementiert die Anwendung einen Service, um die USB-Schnittstelle handzuhaben (s. Kapitel \ref{usb}). Weiterhin wird in \lstinline{VBLSActivity.java} selbst ein Intent-Filter eingebettet, um zwischen Service und Activity kommunizieren zu können. Dies spiegelt sich in dieser Form auch in der in \lstinline{<application>} eingebetteten Struktur der Anwendung wieder. +Zusätzlich zu der eigentlichen Activity implementiert die Anwendung einen Service, um die USB-Schnittstelle handzuhaben (s.\ Kapitel \ref{usb}). Weiterhin wird in \lstinline{VBLSActivity.java} ein Intent-Filter eingebunden, um zwischen Service und Activity kommunizieren zu können. Dies spiegelt sich in dieser Form auch in der in \lstinline{<application>} eingebetteten Struktur der Anwendung wieder. \begin{lstlisting}[caption=Verwendete Features] <uses-feature android:name="android.hardware.usb.host" @@ -1420,15 +1444,15 @@ Zusätzlich zu der eigentlichen Activity implementiert die Anwendung einen Servi autofocus" android:required="true"/> \end{lstlisting} -Des weiteren muss der Liste der verwendeten Features die USB-Schnittstelle hinzugefügt werden. +Des Weiteren muss der Liste der verwendeten Features die USB-Schnittstelle hinzugefügt werden. \chapter{Versuchsaufbau und Tests} \section{Versuchsaufbau} \label{aufbau} -Dieses Projekt teilt sich mit seinem Schwesterprojekt, der Entwicklung eines echtzeitfähigen RC-Mischers auf Arduino-Basis \footnote{LeonardoMixerIO - \url{https://gitlab.cvh-server.de/lf.ps/vbls/tree/master/LeonardoMixerIO}}, einen gemeinsamen Versuchsaufbau. -Im Folgenden soll ein Überblick über die Anordnung der Komponenten, insbesondere des Android-Mobil"=telefones, gegeben werden. +Dieses Projekt teilt sich einen gemeinsamen Versuchsaufbau mit seinem Schwesterprojekt, der Entwicklung eines echtzeitfähigen RC-Mischers auf Arduino-Basis \footnote{LeonardoMixerIO - \url{https://gitlab.cvh-server.de/lf.ps/vbls/tree/master/LeonardoMixerIO}}. +Im Folgenden soll ein Überblick über die Anordnung der Komponenten gegeben werden. \\ \\ Der Versuchsaufbau besteht aus einem Quadrocopter in X-Anordung. @@ -1449,7 +1473,7 @@ Die Hauptdiagonale zwischen zwei Rotoren beträgt 415mm, der Rotordurchmesser be Die Masse des Aufbaus beträgt 375g. Zu dieser kommen weitere 98g für den verwendeten zwei-Zellen-LiPo vom Typ \glqq{}Gens ace 1800mAh-20C-7.4V-2S1P\grqq{}, sowie 142g -für das verwendete Mobiltelefon vom Typ \glqq{}HTC One S\grqq{}. Die Gesamtmasse +für das verwendete Mobiltelefon vom Typ \glqq{}HTC One S\grqq{} hinzu. Für die Gesamtmasse des flugbereiten Aufbaus ergibt sich folglich ein Gewicht von 515g. Die maximale Tragfähigkeit des Quadrocopters ist nicht bekannt, das Flugverhalten bei diesem Gewicht suggeriert jedoch eine Auslastung von etwa 70\%-80\%. @@ -1504,7 +1528,7 @@ Der konkrete Testablauf gestaltete sich derart, dass das UAV manuell in einer er Der gesamte Testprozess gestaltete sich iterativ, d.\,h.\ nach jedem Test wurden die Ergebnisse evaluiert, die Regel-Parameter angepasst und anschließend erneut getestet. \\ Wichtig: Für möglichst präzise Testergebnisse sollte von Anfang an darauf geachtet werden, möglichst alle störenden Umwelteinflüsse während den Tests zu eliminieren. So sollte z.\,B.\ als Testumgebung ein möglichst großer geschlossener Raum gewählt werden, um den Einfluss der durch das UAV entstehenden Luftverwirblungen zu reduzieren. Ebenfalls sollten Fenster nicht geöffnet werden, um Störungen durch Windböen vorzubeugen. -Weiterhin ist bei Flugbetrieb des UAVs auf die Einhaltung von Sicherheitsmaßnahmen (vgl.\ beispielsweise \cite[][]{quadrocopterSafety}) zu achten, um Verletzungen und Sachbeschädigungen zu vermeiden. Gerade zu diesem Zweck empfiehlt sich vor allem für ungeübte Piloten auch die Verwendung des Angle-Modes. +Weiterhin ist bei Flugbetrieb des UAVs auf die Einhaltung von Sicherheitsmaßnahmen (vgl.\ beispielsweise \cite[][]{quadrocopterSafety}) zu achten, um Verletzungen und Sachbeschädigungen zu vermeiden. Gerade zu diesem Zweck empfiehlt sich vor Allem für ungeübte Piloten auch die Verwendung des Angle-Modes. \section{Ergebnisse} \label{ergebnisse} @@ -1512,7 +1536,7 @@ Weiterhin ist bei Flugbetrieb des UAVs auf die Einhaltung von Sicherheitsmaßnah Während des iterativen Testverfahrens ließen sich diverse Faktoren feststellen, welche sich kompromittierend auf die Ergebnisse auswirkten: \begin{itemize} - \item{Eine statische Befestigung des Mobilgeräts unter dem UAV resultiert in einer Verschiebung des Erfassungsbereichs bei Roll- und Nickbewegungen. Dies hat zur Folge, dass der Kreis z.T. das Bild verlässt (vor allem, wenn er sich im Randbereich befindet oder gerade von außen in den Erfassungsbereich kommt und der Ausschlag des Steuerimpulses als Reaktion darauf hoch ist). \\ + \item{Eine statische Befestigung des Mobilgeräts unter dem UAV resultiert in einer Verschiebung des Erfassungsbereichs bei Roll- und Nickbewegungen. Dies hat zur Folge, dass der Kreis z.T. das Bild verlässt (vor Allem, wenn er sich im Randbereich befindet oder gerade von außen in den Erfassungsbereich kommt und der Ausschlag des Steuerimpulses als Reaktion darauf hoch ist). \\ Eine mögliche Lösung für dieses Problem bestünde in der Bestigung des Mobilgeräts mittels eines Gimbals (Schwenk-Neige-Vorrichtung) oder in der Einberechnung der aus dem Neigewinkel des UAVs resultierenden Verschiebung des Erfassungsbereichs (hierzu wäre einen Erweiterung der bestehende Sensorik um eine absolute Höhenmessung (z.\,B.\ per Ultraschall) notwendig; ein Gyroskop bringen sowohl das Mobilgerät als auch der Flugcontroller im Normalfall mit sich).} \item{Zuweilen kommt es zu Problemen bzgl.\ der Stromversorgung der Komponenten, was zur Folge hat, dass der Flugcontroller nicht korrekt initialisiert werden kann und es anschließend im Betrieb zu Fehlern bei der Kalibrierung der Sensorik oder dem Verarbeiten der Eingangsdaten des Mischers kommen kann (z.\,B.\ alternierender Wert für Throttle (Gas)). Dieses Fehlerbild begründet sich darin, dass das Mobilgerät bedingt durch den verwendeten USB-Treiber (vgl.\ Kapitel \ref{usb}) als Client und nicht als Host der USB-Verbindung agiert und daher versucht, sich über diese aufzuladen. \\ Behoben werden kann dies durch das Einhalten der richtigen Reihenfolge des Zuschalten der Stromversorgung für die einzelnen Elemente. Zunächst muss der Flugcontroller ohne angeschlossenes Mobilgerät initialisiert werden (per USB-Verbindung oder direkt über die mit dem Akku verbundenen BECs (Abk., engl. für \glqq{}Battery Eliminator Circuit\grqq{}) der ESCs (Abk., engl. für \glqq{}Electronic Speed Control\grqq{}, regelt die Geschwindigkeit der Motoren des UAVs)). Anschließend kann das Mobilgerät angeschlossen werden. Alternativ könnte diese Problematik behoben werden, indem die unterschiedlichen Funktionalitäten zusammengefasst würden oder der USB-Treiber derartig modifiziert würde, dass das Mobilgerät als Host der USB-Verbindung agiert.} @@ -1546,13 +1570,13 @@ Zusammenfassend lässt sich sagen, dass die definierten Zielstellungen in weites Hinsichtlich der Optimierung der autonomen Landeplatzlokalisierung auf Grundlage des im Rahmen des dokumentierten Projekts erstellten Frameworks zur Entwicklung von OpenCV gestützten Bildverarbeitungsapplikationen für Android-Plattformen sind im Verlauf der Arbeiten zusätzlich zu den bereits realisierten Funktionalitäten folgende Punkte aufgekommen: \begin{enumerate} \item{Grundsätzlich besteht weiterhin Potential hinsichtlich der Parametrierung des Reglers auf Seite der Applikation, um eine stabile Zentrierung über dem Landeplatz mit möglichst geringen Überschwingern zu realisieren bzw. zu optimieren. Sollten mechanische Änderungen an dem Versuchsaufbau vorgenommen werden, so ist eine Rekalibrierung der Parameter empfehlenswert um ein gutes Ergebnis zu erzielen. \\ - Durch geeignete Modifikationen kann der Anspruch an den Regler weiterhin reduziert werden (beispielsweise durch Verwendung eines Gimbals (s. Punkt drei) oder der Optimierung in den Randbereichen des Erfassungsgebiets (s. Punkt zwei)).} + Durch geeignete Modifikationen kann der Anspruch an den Regler weiterhin reduziert werden (beispielsweise durch Verwendung eines Gimbals (s.\ Punkt drei) oder der Optimierung in den Randbereichen des Erfassungsgebiets (s.\ Punkt zwei)).} \item{Wie bereits in Kapitel \ref{ergebnisse} angeführt, kann zur Optimierung der Erfassung des Landeplatzes im Randbereich des Bilds die bestehende Sensorik um eine absolute Höhenmessung (beispielsweise mittels Ultraschall) ergänzt werden. \\ Somit könnte in Kombination mit dem bereits auf Seiten der meisten Mobilgeräte und Flugcontroller existierenden Gyroskop aus dem gemessenen Neigungswinkel gegenüber der Ebene und der Höhe die Verschiebung des Erfassungsbereichs bei Neigung des UAVs als Reaktion auf Sprünge der Steuersignale (wenn das Ziel am Rande des Bilds erscheint) ermittelt und mit dem von der Bildverarbeitung ausgegebenen Wert verrechnet werden, um den Regler in diesen Randbereichen zu optimieren und die Störgröße der Neigung zu eliminieren.} \item{Die derzeitige mechanische Konstruktion des Testgeräts (dargestellt in Kapitel \ref{aufbau}) ist derzeit noch insofern suboptimal, dass das kapazitive Display des Mobilgeräts zuweilen durch den darüber liegenden Akku angesprochen und so beispielsweise die Applikation beendet wird. Weiterhin ist dementsprechend das Display an sich nur sehr begrenzt zugänglich, wodurch es erschwert wird, Statusmeldungen zu quittieren. Die Lösung der Befestigung des Geräts am Versuchsaufbau mittels Kabelbindern ist ebenfalls sicherheitstechnisch suboptimal. \\ Insofern wäre eine mechanische Umkonstruktion mit dem Fokus der Neupositionierung des Akkus und des Mobilgeräts, so dass der Bildschirm frei zugänglich ist (potentiell direkt in Kombination mit der Verwendung eines Gimbals zur Bildstabilisierung als Alternative zu zweiterem Punkt), denkbar.} \item{Derzeit existiert keine Möglichkeit, um den Test-Quadrokopter bei einem potentiellen Versagen des Flugcontrollers oder des RC-Mischers abzuschalten, außer am laufenden System die Stromversorgung zu unterbrechen. Da dies jedoch mit Sicherheits- und Verletzungsrisiken einhergeht, wäre es denkbar, einen drahtlosen Notaus als zusätzliche Sicherheitsinstanz zu implementieren, mittels dem das System \glqq{}remote\grqq{} (aus der Ferne) abgeschaltet werden kann. Wichtig wäre bzgl.\ der Umsetzung dieser Funktionalität insbesondere der Fokus auf die Echtzeitfähigkeit im Sinne von Rechtzeitigkeit und die Stabilität.} - \item{Um eine Interferenz der standardmäßigen Regler des Flugcontrollers und der vorgestellten Applikation zu vermeiden, könnten diese zusammengefasst werden, so dass beispielsweise die Steuersignale des Mobilgeräts diejenigen des Controllers während des autonomen Betriebs zu einem gewissen Grad überlagern. Somit könnte diese Störgröße eliminiert und eine einfachere Parametrierung des Reglers auf Applikations-Seite ermöglicht werden. Potentiell wäre es möglich, dies mit einer Fusion der verwendeten Hardware- und Software-Komponenten (s. folgender Punkt) zu verbinden.} + \item{Um eine Interferenz der standardmäßigen Regler des Flugcontrollers und der vorgestellten Applikation zu vermeiden, könnten diese zusammengefasst werden, so dass beispielsweise die Steuersignale des Mobilgeräts diejenigen des Controllers während des autonomen Betriebs zu einem gewissen Grad überlagern. Somit könnte diese Störgröße eliminiert und eine einfachere Parametrierung des Reglers auf Applikations-Seite ermöglicht werden. Potentiell wäre es möglich, dies mit einer Fusion der verwendeten Hardware- und Software-Komponenten (s.\ folgender Punkt) zu verbinden.} \item{Wie bereits zu Beginn in der Zielsetzung (vgl.\ Kapitel \ref{ziel}) dargestellt, lag der Fokus dieses Projektes darauf, möglichst einfach verwendbare und frei zugängliche Software zu entwickeln. Dies inkludiert bzw. induziert zwangsläufig einen modularen Aufbau des Systems, so dass potentielle Nutzer möglichst einfach auf ihren bestehenden Komponenten aufbauen können. \\ Zu Optimierungszwecken wäre es jedoch zielführender, die einzelnen Software- und Hardware-Module zusammenzufassen und auf einer einzigen Platine zu bündeln. Somit könnte das Gewicht und der Stromverbrauch deutlich reduziert und die Kommunikation sowie die mechanische Anbringung am UAV stark vereinfacht werden. Ebenfalls könnten teilweise aufgrunde des modularen Aufbaus redundante Code-Elemente eliminiert werden. Anbieten würde sich für diese Zwecke beispielsweise ein Einplattinencomputer wie der BeagleBone Black, wobei ein Kern rein für die Flugsteuerung und ein weiterer Kern für die restliche Software verwendet werden könnten, um die Echtzeitfähigkeit zu erhalten.} \end{enumerate} @@ -1569,7 +1593,7 @@ Was haben wir als Entwickler nun persönlich aus dem Projekt mitgenommen? Neben Weiterhin haben wir gelernt, dass eine stabile Stromversorgung maßgeblich für die Funktionalität der angeschlossenen Komponenten ist und Instabilitäten zu schwierig nachvollziehbaren Fehlerbildern führen können. \\ \\ -Im Hinblick auf die vermittelten Soft Skills konnten, bedingt durch die Durchführung des Projekts als Gruppenarbeit, die eignenen Kompetenzen in den Bereichen Planung, Teamarbeit und Kommunikation verbessert werden. Vor allem letztere beiden Aspekten wurden durch die kooperative Arbeit mit Versionskontrollsystemen wie dem über den campuseigenen Server zur Verfügung stehenden Gitlab unterstützt bzw. gefördert. +Im Hinblick auf die vermittelten Soft Skills konnten, bedingt durch die Durchführung des Projekts als Gruppenarbeit, die eignenen Kompetenzen in den Bereichen Planung, Teamarbeit und Kommunikation verbessert werden. Vor Allem letztere beiden Aspekten wurden durch die kooperative Arbeit mit Versionskontrollsystemen wie dem über den campuseigenen Server zur Verfügung stehenden Gitlab unterstützt bzw. gefördert. \\ \\ Der jedoch wahrscheinlich entscheidenste Aspekt, den wir im Verlauf dieser Projektarbeit lernen konnten, ist, wie man im Allgemeinen planungstechnisch an größere Projekte hertritt, diese sinnvoll aufteilt (\glqq{}Top-Down-Ansatz\grqq{} der Softwareentwicklung) und anschließend mit einem agilen Entwicklungsansatz bearbeit. @@ -1629,6 +1653,7 @@ Proprietär \& Kommerziell \\ \newpage \section{gitlab-Repository} +\label{repository} Der im Rahmen dieses Projektes entstandene Quellcode sowie die hier vorliegende Dokumentation können über den gitlab-Server des Campus Velbert-Heiligenhaus diff --git a/Visual-Based-Landing-System/doc/layout/BOmodern.sty b/Visual-Based-Landing-System/doc/layout/BOmodern.sty index 90895ec498260273a9f2031b84663f5e5964c76b..f58a01d8c922d65191c5c4f9e621ffd262a3a710 100644 --- a/Visual-Based-Landing-System/doc/layout/BOmodern.sty +++ b/Visual-Based-Landing-System/doc/layout/BOmodern.sty @@ -4,7 +4,7 @@ %% Page layout and dimensions \RequirePackage[a4paper,top=32mm,bottom=3cm,left=3cm,right=3cm,marginparwidth=1.75cm,headheight=12mm,footskip=12mm]{geometry} %% Language and font encodings -\RequirePackage[rm, light, sfdefault]{roboto} %%TODO: Needs to be implemented properly! +\RequirePackage[rm, light, sfdefault]{roboto} %%TODO: \RequirePackage[T1]{fontenc} %% Packages @@ -91,10 +91,10 @@ {0pt}{-12pt}{12pt} \titleformat{\section} - {\fontfamily{\sfdefault}\bfseries\fontsize{13}{15}\color{BO}}{\thesection}{1em}{#1} % without #1 the section title disappears, since [explicit]{titlesec} is used + {\fontfamily{\sfdefault}\bfseries\fontsize{13}{15}\color{BO}}{}{0em}{\thesection\hspace{1em}#1} % without #1 the section title disappears, since [explicit]{titlesec} is used \titleformat{\subsection} - {\fontfamily{\sfdefault}\bfseries\color{BO}}{\thesubsection}{1em}{#1} + {\fontfamily{\sfdefault}\fontseries{m}\selectfont\color{BO}}{}{0em}{\thesubsection\hspace{1em}#1} %% Custom titlepage (redefines \maketitle, might not be up to LaTeX standards!) \renewcommand{\maketitle}{