Brandon

Prinzip

“B1 Schwer entflammbar”

Auf geht es zum Chaos Communication Congress. Doch Moment: Dieses Jahr werden beim 35C3 einige Aufbauten und Projekte nicht mehr realisierbar sein. Die Frage ist “Ist das B1?”.

Brandon B1aze ist der Brandschutzbeaftragte des MOIN-Clusters auf dem 35C3 und beobachtet alles, dass möglicherweise nicht B1 ist!

Er überprüft auf dem C3 ob B1 und das 1A!

Brandon ist ein entleerter Feuerlöscher, der das jeweils nächste Objekt mithilfe seiner Motoren verfolgt und anblickt und dabei die “Drohkulisse” des gelöscht werdens versprüht!

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.

Software

Die Software für Brandon ist in Python geschrieben. Wir verwenden die Python-Wrapper von libfreenect, um das das Videobild und die Tiefeninformationen aus der Kinect V1 auszulesen. Die zugehörige Beispiele lassen sich sehr einfach abwandeln. Wir dachten erst, wir bräuchten vergleichsweise anspruchsvolles Objekt-Tracking, 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 erledigt das ein Aufruf von cv2.minMaxLoc.

# 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 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. Dazu werden die entsprechenden Pins in einem eigenen Thread 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, die es erlaubt, die Pixelmatrix als PIL-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.

Material

Schaltplan

Gallerie