R2-Bier2: Unterschied zwischen den Versionen
Pwiese (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
Pwiese (Diskussion | Beiträge) Keine Bearbeitungszusammenfassung |
||
Zeile 34: | Zeile 34: | ||
} |
} |
||
</pre> |
</pre> |
||
Es werden hierbei zuerst die einzelnen Pins im Präprozessor definiert um im gesamten Quelltext einfacher auf diese zugreifen zu können. In der Funktion setUpPins() wird dann als erstes die Funktion <code>wiringPiSetup()</code> aufgerufen. Laut der WiringPi-Dokumentation muss diese Funktion einmalig bei Programmstart aufgerufen werden um WiringPi zu initialisieren. Nachfolgend werden dann die Modi der einzelnen Pins festgelegt. Dies erfolgt durch die Funktion <code>pinMode(Pin,Mode)</code>. Die Funktion erwartet als Argumente die Pinnummer des zu initialisierenden Pins und der Modus in dem der Pin initialisiert werden soll. Verfügbare Modi sind ''INPUT'' und ''OUTPUT'' und die Pinnummerierung muss, wie in Abbildung 1 dargestellt, nach dem WiringPi-Schema erfolgen. Abschließend werden noch die initialen Zustände der Output-Pins gesetzt. Dies erfolgt durch den Aufruf der Funktion <code>digitalWrite(Pin,Zustand)</code>, welche als Argumente die Pinnummer und den Zustand erwartet. Gültige Zustände sind hierbei ''HIGH'' und ''LOW''. Der Aufruf dieser Funktion ist wichtig, da man sonst beim Starten des Programms nicht genau sagen kann, welchen Zustand die Pins aktuell haben. |
|||
===Abgrunderkennung=== |
|||
Die Abgrundserkennung erfolgt über drei Ultraschallsensoren. Der erste dieser Sensoren ist dabei mittig an der Front des Roboters angebracht. Die anderen beiden Sensoren sind jeweils um ±45 ◦ versetzt vom ersten Sensor angebracht. Dadurch soll die Tischkante rechtzeitig und zuverlässig bei allen Fahrtrichtungen erkannt werden. |
|||
Die Funktionsweise eines Ultraschallsensors ist relativ simpel. Der Sensor sendet ein bestimmtes Ultraschallsignal aus, welches vom zu erfassenden Objekt reflektiert wird. Diese Reflexion wird vom Ultraschallsensor empfangen. Aus der Zeit die zwischen Aussendung und Empfang des Signals vergangen ist kann anschließend die Entfernung zwischen Sensor und Objekt berechnet werden. Die gesuchte Entfernung wird mit d bezeichnet, die vergangene Zeit wird mit t bezeichnet und die Schallgeschwindigkeit wird mit 34300 cm/s angenommen. Dadurch ergibt sich für den Berechnung des Abstands zwischen Objekt und Ultraschallsensor folgende Formel: |
|||
===Gesichtserkennung=== |
Version vom 9. Februar 2017, 16:58 Uhr
Motivation
Das Projekt R2-Bier2 ist im Modul Eingebettete Systeme am Campus Velbert/Heiligenhaus entstanden. Ziel des Projekts war die Programmierung eines Servierroboters, welcher Gesichter erkennen und auf diese zufahren soll, bis eine Tischkante erkannt wird. Dadurch wird an das erkannte Gesicht eine Ware beliebiger Art -- im Idealfall Bier -- geliefert. Als Grundlage wird dafür eine Roboterplattform, welche im Rahmen des Projekts \textit{Hochschulsonde} im Modul \textit{Vertiefung Systemtechnik} im Wintersemester 2012/13 entstanden ist, verwendet. Die bereitgestellte Software des Projekts Hochschulsonde steht unter der GNU-GPL und erledigt vollständig die Motorsteuerung. Die Software läuft auf einem AVR-Mikrocontroller AtMega2560, welcher sich auf einem ITEADUINO MEGA 2560 Board (im Folgenden als Arduino bezeichnet) befindet. Die Gesichts- und Abgrunderkennung wird mithilfe eines Raspberry Pi 3 (im Folgenden als Raspberry bezeichnet) ausgeführt.
Konzept
Das Konzept des R2-Bier2 ist relativ einfach gehalten. Der Raspberry fungiert als Hauptrechner. Dabei gibt der Raspberry über seine GPIO-Pins Befehle an den Arduino und veranlasst den Roboter so zur Bewegung. Dabei gibt der Raspberry zuerst den Befehl, dass sich der Roboter langsam im Kreis drehen soll und aktiviert gleichzeitig die Gesichtserkennung. Sobald diese ein Gesicht erkannt hat, gibt der Raspberry den Befehl zum Stoppen der Drehung. Dadurch steht der Roboter so ausgerichtet, dass er durch eine einfache Vorwärtsbewegung direkt auf das erkannte Gesicht zufahren kann. Nun fährt der Roboter solange geradeaus, bis die Abgrundserkennung die Tischkannte erkannt hat. Ist dies geschehen verweilt der Roboter, an seiner Position, bis der Nutzer die Ware entsprechend abgeladen hat und über einen Taster den Befehl gibt, dass der Roboter zurück fahren soll. Ist dies geschehen, fährt der Roboter auf seine Ausgangsposition zurück. Die genaue Realisierung der Nutzung der GPIO-Pins, der Abstandserkennung, der Gesichtserkennung und der Kommunikation mit dem Arduino werden in den folgenden Abschnitten erläutert.
Programmierung
Ansteuerung der GPIO-Pins mittels WiringPi
Für dieses Projekt ist die Ansteuerung der GPIO-Pins des Raspberrys eines der wichtigsten Fähigkeiten des Programms, da ohne die GPIO-Pins weder die Kommunikation mit dem Arduino, noch die Abgrundserkennung funktionieren würden. Für die einfache Realisierung der GPIO Ansteuerung wurde auf die frei verfügbare Bibliothek WiringPi zurückgegriffen. WiringPi steht unter der GNU LGPLv3. Die Benutzung von WiringPi ähnelt absichtlich der GPIO Ansteuerung der Arduino IDE. WiringPi wird über GIT gepflegt. Dadurch kann der Quellcode einfach aus dem GIT geklont und compiliert werden. Für eine genaue Anleitung zur Installation von WiringPi sei auf [Dro16] verwiesen. Für die Nutzung von WiringPi muss die Bibliothek, wie jede andere genutzte Bibliothek auch, im Präprozessor definiert werden. Dafür muss im Präprozessor folgende Zeile eingefügt werden:
#include <wiringPi.h>
Ist dies geschehen, kann im weiteren Programm auf die Funktionen der Bibliothek zurück gegriffen werden. Bei der Verwendung von GPIO-Pins muss zuerst der Modus der Pins definiert werden. Im hier dokumentierten Programm erfolgt das über die Methode setUpPins()
. Diese ist wie folgt aufgebaut:
#include <wiringPi.h> #define TRIGGER 9 #define ECHO 7 #define STARTER 8 void setUpPins(){ wiringPiSetup(); pinMode(TRIGGER,OUTPUT); pinMode(ECHO,INPUT); pinMode(STARTER,OUTPUT); digitalWrite(TRIGGER,LOW); digitalWrite(STARTER,LOW); }
Es werden hierbei zuerst die einzelnen Pins im Präprozessor definiert um im gesamten Quelltext einfacher auf diese zugreifen zu können. In der Funktion setUpPins() wird dann als erstes die Funktion wiringPiSetup()
aufgerufen. Laut der WiringPi-Dokumentation muss diese Funktion einmalig bei Programmstart aufgerufen werden um WiringPi zu initialisieren. Nachfolgend werden dann die Modi der einzelnen Pins festgelegt. Dies erfolgt durch die Funktion pinMode(Pin,Mode)
. Die Funktion erwartet als Argumente die Pinnummer des zu initialisierenden Pins und der Modus in dem der Pin initialisiert werden soll. Verfügbare Modi sind INPUT und OUTPUT und die Pinnummerierung muss, wie in Abbildung 1 dargestellt, nach dem WiringPi-Schema erfolgen. Abschließend werden noch die initialen Zustände der Output-Pins gesetzt. Dies erfolgt durch den Aufruf der Funktion digitalWrite(Pin,Zustand)
, welche als Argumente die Pinnummer und den Zustand erwartet. Gültige Zustände sind hierbei HIGH und LOW. Der Aufruf dieser Funktion ist wichtig, da man sonst beim Starten des Programms nicht genau sagen kann, welchen Zustand die Pins aktuell haben.
Abgrunderkennung
Die Abgrundserkennung erfolgt über drei Ultraschallsensoren. Der erste dieser Sensoren ist dabei mittig an der Front des Roboters angebracht. Die anderen beiden Sensoren sind jeweils um ±45 ◦ versetzt vom ersten Sensor angebracht. Dadurch soll die Tischkante rechtzeitig und zuverlässig bei allen Fahrtrichtungen erkannt werden.
Die Funktionsweise eines Ultraschallsensors ist relativ simpel. Der Sensor sendet ein bestimmtes Ultraschallsignal aus, welches vom zu erfassenden Objekt reflektiert wird. Diese Reflexion wird vom Ultraschallsensor empfangen. Aus der Zeit die zwischen Aussendung und Empfang des Signals vergangen ist kann anschließend die Entfernung zwischen Sensor und Objekt berechnet werden. Die gesuchte Entfernung wird mit d bezeichnet, die vergangene Zeit wird mit t bezeichnet und die Schallgeschwindigkeit wird mit 34300 cm/s angenommen. Dadurch ergibt sich für den Berechnung des Abstands zwischen Objekt und Ultraschallsensor folgende Formel: