Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
drohne [2017/07/09 22:33] – student | drohne [2023/07/03 10:15] (aktuell) – Externe Bearbeitung 127.0.0.1 | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
+ | ====== Projektbeschreibung ====== | ||
+ | |||
+ | Die Drohne soll aus der Luft Fotos machen und diese an die Bodenstation schicken. | ||
+ | |||
+ | Während des Fluges soll die Kommunikation zwischen Bediener und Drohne möglich sein. | ||
+ | |||
+ | Anschließend soll es sicher auf dem Boden landen. | ||
+ | |||
+ | ===== Verwendete Bauteile ===== | ||
+ | |||
+ | Raspberry Pi 3 {{ : | ||
+ | | ||
+ | Pixy-Cam | ||
+ | |||
+ | Pi-Kamera | ||
+ | |||
+ | W-Lan Stick | ||
+ | |||
+ | Leuchtbirne | ||
+ | |||
+ | Drohne mit Flight-Controller | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | |||
+ | ===== WLAN ===== | ||
+ | |||
+ | Für das W-LAN benötigen wir zuvor einige kleine Einstellungen. Wir ändern unter / | ||
+ | sudo nano / | ||
+ | |||
+ | Und verweisen auf / | ||
+ | |||
+ | |||
+ | |||
+ | ===== Pi zu Putty ===== | ||
+ | |||
+ | Verbindung zum Monitor ist möglich über Putty. Zuvor muss das Programm Putty installiert sein. Einfacher und schneller geht die Verbindung per HDMI-Kabel zum Monitor. Unter Umständen ist die serielle Schnittstelle des Raspberry-Pi nicht aktiv. Hierzu muss man die folgenden Anweisungen befolgen, um die Schnittstelle zu aktivieren. | ||
+ | raspi-config | ||
+ | Advance Options -> Serial -> Ja --> „Enable“ | ||
+ | | ||
+ | Anschließend kann man via startx die grafische Benutzeroberfläche starten. Danach kann man manuell das W-Lan anschalten. | ||
+ | |||
+ | |||
+ | ===== Pixy-Cam - PixyMon 2.0.9 ===== | ||
+ | |||
+ | |||
+ | |||
+ | ==== Pixy-Cam ==== | ||
+ | |||
+ | - 50 Bilder pro Sekunde | ||
+ | |||
+ | - Für alle Bibliotheken: | ||
+ | |||
+ | - Programmiersprachen: | ||
+ | |||
+ | - Schnittstellen: | ||
+ | |||
+ | - Blickwinkel: | ||
+ | |||
+ | - Kosten: ca. 105 € | ||
+ | |||
+ | |||
+ | |||
+ | ==== PixyMon 2.0.9 ==== | ||
+ | |||
+ | |||
+ | |||
+ | | ||
+ | |||
+ | |||
+ | |||
+ | Fokus einstellen | ||
+ | |||
+ | |||
+ | Um die Kamera etwas schärfer zu stellen dreht man die Linse so weit auf, bis das Programm ein schärferes Bild zeigt. Die Auflösung der Kamera ist ziemlich gering, weswegen das Bild etwas verpixelt ist. | ||
+ | |||
+ | |||
+ | |||
+ | Farbsignatur anlernen | ||
+ | |||
+ | |||
+ | Die Kamera Pixy-Cam kann sich bis zu 7 Farbsignaturen merken. Zuerst positioniert man das Objekt vor der Kamera. Dann klickt man in der Menüleiste auf Action-> | ||
+ | |||
+ | |||
+ | |||
+ | Anlernen ohne PixyMon | ||
+ | |||
+ | |||
+ | Es gibt die Möglichkeit Objekte ohne PixyMon anzulernen. Dazu drückt man den weißen Taster auf der Kamera solange, bis die LED rot leuchtet. Dann hält man das Objekt vor die Kamera und kann anhand der LED Farbe, die erkannte Farbe sehen. Anschließend betätigt man nochmal den Taster und die Signatur wird gespeichert. Leider, funktioniert diese Methode nur beschränkt, | ||
+ | |||
+ | |||
+ | ===== Skizze ===== | ||
+ | |||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | |||
+ | ===== Apache Server Installation ===== | ||
+ | |||
+ | |||
+ | Der Apache Server wird für die Anwendung eines Webservers benötigt. Mit den folgenden Codes laden wir den beliebtesten Webserver und die Serversprache PHP auf unseren Raspberry-Pi: | ||
+ | |||
+ | sudo apt-get install apache 2 php5 | ||
+ | sudo / | ||
+ | / | ||
+ | cd /var/www | ||
+ | sudo nano index.html | ||
+ | | ||
+ | Anschließend meldet man sich mit einer ssh-Verbindung und der zuvor ermittelten IP-Adresse auf dem Raspberry-Pi an. | ||
+ | |||
+ | |||
+ | ===== Webseite erstellen ===== | ||
+ | |||
+ | Zur Gestaltung der Website wird eine CSS-Datei angelegt. | ||
+ | In der CSS-Datei legen wir zunächst die Hintergrundfarbe auf grau fest und setzen den Außenrandabstand auf 0. Durch den Befehl Front Family wird die Schriftart der Webseite festgelegt. Wir haben uns hier für Georgia entschieden. Da es sich aber um keine Standardschriftart handelt, haben wir Arial als zweite Schriftart gewählt. Diese wird erst benutzt, wenn die ersten beim Nutzer der Webseite nicht verfügbar ist. | ||
+ | |||
+ | |||
+ | |||
+ | Webseitengröße bestimmen | ||
+ | |||
+ | |||
+ | Nun bestimmten wir den äußeren Abstand und die Breite der Webseite. Der Container ist auf eine Breite mit 900 Pixel eingestellt. Durch margin-left und margin-right wird der automatische Abstand nach links und rechts festgelegt. Dadurch kann die Webseite sich optimal auf die verschiedenen Endgeräte anpassen. Padding ist für einen erzwungenen Leerraum zwischen dem Inhalt eines Elements und seinem eigenen Elementrand. Hier setzen wir ihn auf 0. Nach oben ist ein Abstand von 15 Pixel festgelegt. Den Container haben wir mit deinen Rahmen versehen (border-radius). | ||
+ | Overflow: | ||
+ | |||
+ | |||
+ | |||
+ | Header | ||
+ | |||
+ | |||
+ | Im Bereich Header kümmern wir uns um die Gestaltung des Kopfes. Als erstes legen wir die Höhe des Kopfes mit 150 Pixel fest. Am Rand fügen wir danach das Logo der Hochschule Niederrhein ein. | ||
+ | |||
+ | |||
+ | |||
+ | Navigationszeile | ||
+ | |||
+ | |||
+ | Hier wird die Höhe der Navigationszeile festgesetzt mit 30 Pixel. | ||
+ | Als nächsten legen wir die Farbe der Schrift in der Navigationszeile fest (color: | ||
+ | In der Navigationszeile sollen die Elemente hintereinanderstehen. Dies lässt sich am einfachsten durch eine Liste gestalten. Allerdings sollen keine Aufzählungszeichen oder Nummerierungen an den Elementen vorhanden sein. Dies erreichen wir durch list-style-type auf None zu setzen. | ||
+ | Die Elemente sollen an den Links am Rand der Navigationszeile starten, was wir durch den Befehl float: left erreichen. Mit margin legen wir erneute die Außenabstände in der folgenden Reihenfolge fest: oben, rechts, unten, links. | ||
+ | In diesen Abschnitt legen wir fest, dass in der Navigationszeile die Links unterstrichen werden, sobald wir den Mauszeiger auf die dort hinterlegten Links bewegen. Dadurch wird für den Nutzer besser ersichtlich, | ||
+ | |||
+ | |||
+ | |||
+ | Fußzeile | ||
+ | |||
+ | |||
+ | In der Fußzeile möchten wir, dass der Text mittig zu lesen ist (text-align: | ||
+ | Außerdem soll ein Strich die Fußzeile von den Rest der Seite abtrennen (border-top: | ||
+ | Den Leerraum legen wir mit 2 Pixeln fest. | ||
+ | |||
+ | ===== HTML-PHP-Seite ===== | ||
+ | |||
+ | |||
+ | Zunächst müssen wir den Kopf unserer Webseite gestalten. Dafür legen wir als erstes den Titel mit Drohne Livestream fest. | ||
+ | Durch den ersten Meta Befehl erreichen wir, dass sich die Seite einmal pro Sekunde aktualisiert. | ||
+ | Unter Google kann mein unsere Webseite durch den Suchbegriff „Drohne eHealth“ finden. Dies haben wir durch description content bestimmt. | ||
+ | Zum Schluss verlinken wir unsere Webseite mit den nötigen Stylesheet und fügen javascript als Sprache ein. | ||
+ | |||
+ | |||
+ | ===== Kommunikation zwischen Drohne und Webseite ===== | ||
+ | |||
+ | |||
+ | Die Kommunikation zwischen der Drohne und der Webseite wird über ein Python-Programm geregelt. Bei der Kommunikation geht es darum, ob die Pixy-Cam aus der Luft ein Objekt (Farbe) erkennt. Wenn die Pixy-Cam ein Objekt erfasst hat, wird die Pi-Kamera ein Foto machen, und dieses auf der Webseite darstellen. Solange soll die Drohne im „Hold-Modus“ in der Luft stehen. Ist auf dem Foto ein Objekt dargestellt, | ||
+ | Damit dies gelingt, wird ein Ordner auf dem Raspberry-Pi erstellt, worauf die Webseite zugreift und der Raspberry-Pi via einem Python-Programm ebenfalls ständig abfragen in diesem Ordner durchführt. | ||
+ | |||
+ | Start-Button | ||
+ | |||
+ | |||
+ | In diesem Ordner schreibt die Webseite über das PHP-Script eine Datei mit dem Inhalt 1, wenn auf Start geklickt wird. Das Python-Programm schaut in diese Datei rein und erkennt die 1. Die 1 stellt eine Anweisung für den Flightcontroller dar, die Suche zu starten. Der Flightcontroller geht über in den Modus „Auto“. In diesem Modus fliegt die Drohne und scannt die Gegend über die Pixy-Cam ab. | ||
+ | |||
+ | Stopp-Button | ||
+ | |||
+ | |||
+ | Wenn auf der Webseite der Stopp-Button geklickt wird, schreibt das PHP-Script in die Datei eine 0. Sobald der Raspberry-Pi durch die Abfrage des Python-Programms entdeckt, gibt er die Anweisung an den Flightcontroller, | ||
+ | |||
+ | Pixy-Cam erkennt ein Objekt | ||
+ | |||
+ | |||
+ | Sobald die Drohne ein Objekt erkennt, schreibt das Python-Programm in die Datei eine 1 und ändert den Flugmodus auf „Attitude Hold“. Wir sehen das Bild auf der Webseite und können über Start und Stopp die Drohne weiter fliegen lassen oder zurückkommen lassen. | ||
+ | |||
+ | Pixy-Cam erkennt kein Objekt | ||
+ | |||
+ | |||
+ | Findet die Drohne kein Objekt, schreibt das Python-Programm in die Datei eine 0. Solange in der Datei eine 0 steht, fliegt die Drohne weiter und wir können die Suche über Stopp anhalten. | ||
+ | | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | ===== Komplette Dokumentation in Word ===== | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | |||
+ | ===== Python-Quellcode ===== | ||
+ | |||
+ | Das Python-Programm wird durch den folgenden Befehl im Editor aufgerufen: | ||
+ | |||
+ | sudo python get_blocksNewNew.py | ||
+ | |||
+ | <file python get_blocksNewNew.py> | ||
+ | |||
+ | from __future__ import print_function | ||
+ | from pixy import * | ||
+ | from ctypes import * | ||
+ | import RPi.GPIO as GPIO | ||
+ | import time | ||
+ | |||
+ | from dronekit import connect, VehicleMode, | ||
+ | import os | ||
+ | import os.path | ||
+ | |||
+ | status = 0 | ||
+ | |||
+ | class Blocks (Structure): | ||
+ | _fields_ = [ (" | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | | ||
+ | |||
+ | #def search(): | ||
+ | # | ||
+ | # | ||
+ | |||
+ | #def stop(): | ||
+ | # | ||
+ | |||
+ | # | ||
+ | |||
+ | connection_string = '/ | ||
+ | |||
+ | if not connection_string: | ||
+ | import dronekit_sitl | ||
+ | sitl = dronekit_sitl.start_default() | ||
+ | connection_string = sitl.connection_string() | ||
+ | |||
+ | |||
+ | # Connect to the Vehicle | ||
+ | print(' | ||
+ | vehicle = connect(connection_string, | ||
+ | |||
+ | GPIO.setmode(GPIO.BOARD) | ||
+ | GPIO.setup(40, | ||
+ | |||
+ | pixy_init() | ||
+ | |||
+ | blocks = BlockArray(100) | ||
+ | frame = 0 | ||
+ | |||
+ | GPIO.output(40, | ||
+ | time.sleep(5) | ||
+ | GPIO.output(40, | ||
+ | |||
+ | # Wait for blocks # | ||
+ | while 1: | ||
+ | |||
+ | if (os.path.exists("/ | ||
+ | #search() | ||
+ | status = 1 | ||
+ | elif (not os.path.exists("/ | ||
+ | #stop() | ||
+ | status | ||
+ | |||
+ | count = pixy_get_blocks(100, | ||
+ | |||
+ | | ||
+ | if count > 0: | ||
+ | #print (" | ||
+ | GPIO.output(40, | ||
+ | file = open('/ | ||
+ | try: | ||
+ | os.remove('/ | ||
+ | except: | ||
+ | pass | ||
+ | |||
+ | else: | ||
+ | #print (" | ||
+ | GPIO.output(40, | ||
+ | try: | ||
+ | os.remove('/ | ||
+ | except: | ||
+ | KeyboardInterrupt | ||
+ | time.sleep(1) | ||
+ | |||
+ | </ | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===== Quellen ===== | ||
+ | |||
+ | |||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | Quellen für die HTML und CSS Seite | ||
+ | |||
+ | |||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | Quellen für PHP | ||
+ | |||
+ | |||
+ | Unterlagen aus dem ersten Semester: Script zum Raspberry-Pi Teil 2 | ||
+ | https:// | ||
+ | http:// | ||
+ | http:// | ||
+ | https:// | ||
+ | https:// | ||
+ | |||
+ | |||