Kurzbeschreibung

In diesem Projekt geht es um das Tracking von einem bzw.  mehreren Objekten ( 4 Turtlebots ). Es wird ein Spielfeld mithilfe einer Raspberry Pi Camera aufgenommen, und da befinden sich die Turtlebots. Das Ziel ist also, die Position jedes Turtlebots zu bestimmen. Wir nutzen hierzu die Programmiersprache Python.




Dokumentation

Ausführliche Beschreibung der Arbeit. Hard- und Software Dokumentation. Bedienungsanleitung. Links. Fotos. usw.

1- Raspberry Pi - OpenCv:

  • Wir fangen erstmal mit der Bedienung der Raspberry Pi 3 an. Die Camera sieht nach dem Aufbau folgendermaßen aus:

  • Enable Camera : 
  • Picamera installieren ( virtualenv und virtualenvwrapper)
  • OpenCv Source code herunterladen 
  • Numpy auf Raspberry pi installieren
  • OpenCv compilieren und installieren
  • Testen

Alle Schritte stehen in Detail unter folgendem Link : 

https://www.pyimagesearch.com/2017/09/04/raspbian-stretch-install-opencv-3-python-on-your-raspberry-pi/

Um zu testen, ob unsere Raspberry Pi Camera richtig funktioniert haben wir folgende 2 Python Codes entwickelt:

  1. Das Erste Code nimmt einfach ein Foto auf :

So sieht das Ergebnis nach der Durchführung des Codes aus : 

2. Das zweite Code dient dazu, ein Live Video aufzunehmen : 

So sieht das Ergebnis nach der Durchführung des Codes aus : 

2- Aruco Markers : 

Zur Detektion jedes Turtlebots wird einen eindeutigen Aruco Marker benutzt. Dazu wurden wie folgt 4 Markers erzeugt: 

Dann habe ich die 4 Markers gedruckt : 

Danach Wird die Detektion erstmal auf dem oberen Bild probiert. Da werden die IDs den Robotern erkannt und bestimmt und zwar durch diesen Code : 

Wenn wir auf 'run' drucken, wird folgendes angezeigt : 

  • Die Ecken jedes Aruco Markers werden bestimmt und auch den Namen jedes Roboters 
  • Die Marker werden durch einen grünen Rechteck gekennzeichnet 

Am Ende, habe ich das Algorithmus auf dem Raspberry Pi Rechner verwendet und so sieht das Ergebnis aus ( Aruco markers werden live detektiert) :

3- Endergebnis im Spielfeld : 

Wir haben unten im C++- Raum einen großen Spielfeld, dass schon auf dem Boden gezeichnet wurde. Dazu haben wir die Raspberry Pi Camera ganz Oben gesteckt und das Spielfeld wird perfekt aufgenommen:


  • Dort wollen wir ein Koordinatensystem anlegen. Der Ursprung ist der Mittelpunkt des Bildes. Unser Ziel hier ist : 
    1. Position jedes Turtlebots durch Koordinaten des oberen linken Eck des jeweiligen Aruco Markers bestimmen.
    2. Orientierung jedes Turtlebots durch Bestimmen des Rotationswinkels des jeweiligen Aruco Markers bestimmen.


  • Um auf Das Raspberry Pi da oben zuzugreifen, muss man sich im Terminal einloggen(bzw. XQuartz im Mac OS) und das Programmiersoftware Thonny aufrufen. Man muss folgendes eintippen:

ssh -X pi@linda.clients.eikon.tum.de

Passwort

thonny

Achtung : es ist dabei sehr wichtig, dass das Raspberry Pi und das Computer beide im gleichen WLAN eingeloggt sind !

  • Ich habe dann mein obiges TestVideo Code so geändert, dass  unsere Ziele 1. und 2. erreicht werden können : 
    1. Eine Funktion für die Koordinaten :
    2. Eine Funktion für den Winkel.

3. Ein paar Änderungen in der For- Schleife habe ich auch vorgenommen, um das Ergebnis gleichzeitig während der Aufnahme anzuzeigen .

  • Das Endergebnis sieht wie folgt aus  :




4- MQTT : 

  • Wir möchten die turtlebots "tracken", indem eine Nachricht für jeden Turtlebot veröffentlicht wird. In dieser Nachricht wird die Position und den Rotationswinkel für jeden Roboter angezeigt. 

Hierzu verwenden wir ein MQTT Broker. Um die Verbindung herzustellen verwenden wir das App "MQTTLens".  

Zunächst geben wir die Daten von unseren Broker ein : 


  • Dann muss ein Code entwickelt werden, wo wir an dem Broker zugreifen können : 
  1. Clientklasse aus der MQTT-Bibliothek importieren.
  2.  Adress, Port, Username und Password bestimmen ( Die oben gezeigten Daten ).
  3. Die Callback Funktion on_connect angeben, die aufgerufen wird, wenn der Broker auf die Verbindungsanforderung antwortet.
  4. Die Callback Funktion on_message angeben, die für jede Nachricht aufgerufen wird.
  5. Da der Verbindungsaufbau eine Weile dauern kann, führen wir eine Schleife aus, bis die zuvor deklarierte Connected_Variable auf True gesetzt ist.
  6. Nach dem Abonnieren des Topics führen wir eine Endlosschleife mit einer kleinen Verzögerung in jeder Iteration durch, da die Nachrichten von einer Rückruffunktion verarbeitet werden.
  7. Wir führen diese Schleife mit einem Try-Except-Block aus, bei dem der Exceptionsblock einen Tastatur-Interrupt einfängt. So können wir die Schleife beenden, indem wir das Befehl Ctrl +C an die Python-Shell senden : 

  8.  Wir testen das Code in PyCharm !

Achtung: Dieses erste Code, wird nur ausgeführt, um den Publisher zu testen. Deshalb hat es noch nichts mit unseren Turtlebots zu tun. Es wird Dabei nur ein Input-message verlangt, und das Input message selbst wird dann in MQTTLens veröffentlicht.

Das Ergebnis sieht dann so aus :


  • Am Ende müssen wir nur noch dieses Code an unseren Raspberry-Pi Programm anpassen. Dabei wird die Nachricht zur Position und Winkel jedes Turtlebots !

Dazu wandeln wir unsere Try-Schleife wie folgt um : 

Das Programm funktioniert wie folgt : 

  1. Spielfeld und Roboter werden aufgenommen und Ecken der Aruco_markers werden in Python angezeigt.
  2. Im Python Shell wird 'Precise ROBOT: ' angezeigt. Der Benutzer soll dann den Namen des gewünschten Roboters angeben ( ROBOT 1, ROBOT 2, ROBOT 3 oder ROBOT 4).
  3. Die Position und der Rotationswinkel des jeweiligen Roboters werden als Nachrichts im MQTTLens angezeigt : 


Abschlusspräsentation


  • Keine Stichwörter