From d4646ead7da2729036f23d8b319119bc4b4abffc Mon Sep 17 00:00:00 2001 From: Malte Schmitz <schmitz@isp.uni-luebeck.de> Date: Wed, 26 Dec 2018 18:31:23 +0100 Subject: [PATCH] Add details on Brandon's Software --- _projects/Brandon.markdown | 28 +++++++++++++++++++++++++++- 1 file changed, 27 insertions(+), 1 deletion(-) diff --git a/_projects/Brandon.markdown b/_projects/Brandon.markdown index 68e75399..ca13e4ab 100644 --- a/_projects/Brandon.markdown +++ b/_projects/Brandon.markdown @@ -32,7 +32,33 @@ Brandon ist ein entleerter Feuerlöscher, der das jeweils nächste Objekt mithil ## Funktion ## Brandons Gehirn ist ein Raspberry Pi 3 an den eine Kinect angeschlossen ist. Über eine OpenCV-Schnittstelle erhält dieser ein Tiefenbild in Graustufen und berechnet die Position des dunkelsten Pixels (am nächsten). Aus der Position des Pixels kann eine Position für den Schrittmotor (horizontal) und die beiden Servomotoren (vertikal) berechnet werden. Der Schrittmotor bewegt über eine 3D-gedruckte Zahnradkranzkonstruktion den entleerten Feuerlöscher auf einem Kugellager. Die Servomotoren bewegen die Augenpartie mit den LED-Matrizen in vertikaler Richtung auf den Pixel hinzu. -Genaueres im [Git](https://git.chaotikum.org/B1aze). +## Software ## + +Die Software für Brandon ist in Python geschrieben. Wir verwenden [die Python-Wrapper von libfreenect](https://openkinect.org/wiki/Python_Wrapper), um das das Videobild und die Tiefeninformationen aus der Kinect V1 auszulesen. Die zugehörige [Beispiele](https://github.com/OpenKinect/libfreenect/tree/master/wrappers/python) lassen sich sehr einfach abwandeln. Wir dachten erst, wir bräuchten vergleichsweise anspruchsvolles [Objekt-Tracking](https://www.pyimagesearch.com/2015/09/14/ball-tracking-with-opencv/), damit Brandon Menschen aktiv beobachten und verfolgen kann. Wir haben dann aber schnell festgestellt, dass es vollkommen ausreicht, den nächsten Punkt aus dem Tiefenbild der Kinect als Zielkoordinate zu verwenden. In [OpenCV](https://opencv.org/) erledigt das ein Aufruf von [`cv2.minMaxLoc`](https://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#minmaxloc). + +```python +# Tiefenbild mit libfreenect laden und nach OpenCV konvertieren: +frame = frame_convert2.pretty_depth_cv(freenect.sync_get_depth()[0]) +frame = imutils.resize(frame, width=600) + +# nächsten Punkt finden +(minVal, maxVal, minLoc, maxLoc) = cv2.minMaxLoc(frame) +target = minLoc +``` + +Man könnte das Ergebnis durch [zusätzliche Vorverarbeitung](https://www.pyimagesearch.com/2014/09/29/finding-brightest-spot-image-using-python-opencv/) noch verbessern, aber das war erst mal gar nicht nötig. + +Der Schrittmotor zum Drehen des Feuerlöschers wird direkt über die [GPIOs des Raspberry Pi angesteuert](https://pypi.org/project/RPi.GPIO/). Dazu werden die entsprechenden Pins in einem eigenen [Thread](https://docs.python.org/2/library/thread.html) angesteuert: +1. `DISABLE` auf `False` setzen, um den Motor zu aktivieren. +2. `DIRECTION` entsprechend Richtung setzen. +3. Für jeden Schritt einen Puls auf `STEP` geben. Die Geschwindigkeit ergibt sich aus der Wartezeit zwischen den Pulsen. +4. Am Ende `DISABLE` wieder aktivieren, damit der Motor nicht unnötig blockiert, wenn Brandon sich nicht bewegt. + +Der Schrittmotor kennt seine aktuelle Position nicht. Wir können die Blickrichtung von Brandon zwar mitrechnen, das ist über die Zeit aber fehleranfällig, deswegen verwenden wir einen einfachen Taster als Endschalter und lassen Brandon regelmäßig gegen den Endschalter fahren, um die Position wieder zu synchronisieren. + +Zur Ansteuerung der Augen verwenden wir die Library [luma.led_matrix](https://pypi.org/project/luma.led_matrix/), die es erlaubt, die Pixelmatrix als [PIL](https://en.wikipedia.org/wiki/Python_Imaging_Library)-Leinwand zu verwenden. Wir laden einen Kreis als Pixelgrafik und zeichnen diese auf die Leinwand. Die Pupille wird nun an eine berechnete Stelle je nach gewünschter Blickrichtung von Brandon dazu gezeichnet. Unabhängig von der Blickrichtung blinzelt Brandon regelmäßig, in dem von unten und oben schwarze Balken über das Auge gezeichnet werden. + +[Der gesamte Code findet sich in unserem Git](https://git.chaotikum.org/B1aze/kinect-experiments/blob/master/b1aze.py). ## Material ## - Raspberry Pi 3 -- GitLab