Skip to content
Snippets Groups Projects
Commit d4646ead authored by Malte Schmitz's avatar Malte Schmitz
Browse files

Add details on Brandon's Software

parent 9dff360c
No related branches found
No related tags found
No related merge requests found
Pipeline #
...@@ -32,7 +32,33 @@ Brandon ist ein entleerter Feuerlöscher, der das jeweils nächste Objekt mithil ...@@ -32,7 +32,33 @@ Brandon ist ein entleerter Feuerlöscher, der das jeweils nächste Objekt mithil
## Funktion ## ## 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. 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 ## ## Material ##
- Raspberry Pi 3 - Raspberry Pi 3
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment