1. Home
  2. Dokumente
  3. Themen
  4. Die Multisensor-Bokeh-App

Die Multisensor-Bokeh-App

Um die verschiedenen Sensoren im Insektencounter gleichzeitig ansprechen zu können, haben wir eine interaktive Steuerung, basierend auf der Bibliothek Bokeh, in der Programmiersprache Python realisiert. Bokeh ermöglicht eine Implementierung von Dashboard-Anwendungen mit komplexen Grafiken, Diagrammen sowie Darstellung von Bilddaten, die in einem beliebigen Webbrowser angezeigt werden. Dadurch ist die Nutzung einer Bokeh-Anwendung unabhängig vom verwendeten Betriebssystem.

Ein weiterer Vorteil von Bokeh liegt in der ausschließlichen Verwendung von Python, womit keine weiteren Programmiersprachen wie beispielsweise JavaScript (JS) benötigt werden. Bokeh übernimmt die Erzeugung von JavaScript-Code und die Interaktion mit der bereitgestellten JavaScript-Bibliothek BokehJS automatisch, nach dem Motto der Entwickler: “We write the JavaScript, so you don’t have to”.

Mithilfe von interaktiven Steuerungselementen (Buttons und Schiebereglern) können die einzelnen Sensormodule bedient werden, wie z.B. das Auslösen einer Bildaufnahme durch das Raspberry-Pi-Kamera-Modul, die Einstellung von Schwellwerten für getriggerte Aufnahmen (s.u.) oder die Aktivierung der Beleuchtung im Inneren des Insektentunnels.

Grundlegende Funktionsweise

Wir verwenden einen Raspberry Pi, der mit Hilfe von Bokeh als Server betrieben wird. Wenn die vom Server bediente IP-Adresse in einem Webbrowser durch einen Nutzer aufgerufen wird, initialisiert Bokeh eine neue Session für diese Nutzeranfrage. Sobald eine neue Session gestartet wird, erzeugt der entsprechende Python-Code auf dem Bokeh-Server ein Bokeh-Dokument. Dieses Dokument enthält die Elemente der grafische Benutzeroberfläche der App und wird an den Browser des Clients weitergereicht und schließlich als interaktives HTML-Dokument dargestellt (siehe Abbildung 1).

Die Anwendung könnte somit von mehreren Nutzern gleichzeitig geöffnet werden. Da die Rechenleistung des Raspberry Pi begrenzt ist, treten aber bei mehreren gleichzeitig zugreifenden Nutzern Störungen und Verluste bei der Datenübertragung auf. Daher bekommt nur der Nutzer vollen Zugriff auf die Sensorsteuerung, der die erste Session gestartet hat.  Alle nachfolgenden Nutzer können die Bokeh-Anwendung ausschließlich zur Anzeige bereits vorgenommener Bildaufnahmen bzw. Wingbeat-Messungen nutzen.

Abbildung 1: Der Bokeh Server (links) generiert mit dem App-Code die entsprechenden Bokeh-Dokumente. Jede neue Verbindung durch einem Browser (rechts) resultiert in einem neuen Dokument, das vom Server ausschließlich für diese Session erzeugt wird. Quelle: https://docs.bokeh.org/en/2.3.3/.

Steuerung der Kamera

Das Raspberry-Pi-Kameramodul wird mit der Bibliothek Picamerax gesteuert. Diese erlaubt den Zugriff auf grundlegende Funktionen wie

  • Auflösung (Bildgröße in Pixel)
  • Bildwiederholungsrate (Frames per Second/fps für Videos)
  • Duration (Dauer des Videos)
  • Belichtungszeit
  • Gain (Verstärkung des analogen Signals des Kamerasensors vor der Wandlung in ein digitales Signal)

Die aktuelle Version der Multisensor-Bokeh-App kann man auf zwei Arten nutzen:

Zunächst können wir einen Videostream mit geringerer Auflösung starten (siehe Abb. 2/1). So können wir das Insekt im Bildbereich beobachten, um bei Bedarf ein Foto mit maximaler Auflösung aufzunehmen ( Abb. 2/2).

Alternativ können wir auch die Lichtschranke aktivieren (Abb. 2/3), die automatisch hochauflösende Aufnahmen auslöst, wenn ein Insekt die Lichtschranke durchkrabbelt. Die letzten vier Aufnahmen werden im Browser angezeigt (Abb. 2/4), um einen schnellen Vergleich der Messergebnisse zu ermöglichen. Schließlich können wir noch die RGB-Leuchtdioden einzeln aktivieren und steuern, um die Beleuchtung innerhalb des Bildbereichs an die gewünschten Verhältnisse anzupassen (Abb. 2/5).

Abbildung 2: Übersicht der Picamera Steuerung mit Bokeh-App: (1) Start/Stopp Button Videostream und Vorschau (2) Manuelle Auslösung einer Bildaufnahme (3) Button, um Lichtschranke zu aktivieren (getriggerte Aufnahme) (4) Vorschau der letzten vier Aufnahmen (5) Aktivierung der LEDs und Regelung der Farbwerte für Anpassung der Beleuchtung.

Steuerung des Wingbeat-Sensors

Der Wingbeat-Sensor wird über eine USB-Soundkarte mit dem Raspberry Pi verbunden. Mithilfe der Bibliothek Pyaudio werden die Sensordaten als Audiostream ausgelesen. Dabei wird der Datenstrom in kleine Datenpakete (Chunks) zerlegt und vom Python Code verarbeitet. Wenn die in einem Chunk enthaltenen Messwerte einen kritischen Schwellwert (Threshold) überschreiten, wird die Datei automatisch abgespeichert (getriggerte Aufnahme).

Sobald wir den Start-Button klicken, wird das aktuelle Chunk-Signal in einem Liniengraphen angezeigt (Abb. 3/1). Durch Anpassung des Gain-Schiebereglers (Abb. 3/4) wird das Signal um den angezeigten Wert vervielfacht, um auch schwache Signale sichtbar zu machen. Dabei sollte ein Wert gewählt werden, der das Rauschen des Wingbeat-Signals deutlich erkennbar macht.

In einem zweiten Schritt wird der Schwellwert mit dem entsprechenden Schieberegler (Abb. 3/5) manuell so angepasst, dass die zugehörige rote Schwellwertlinie etwas über dem Rauschen des Sensors liegt, siehe Abbildung 4. Durchfliegt ein Insekt den Wingbeat-Sensor, übersteigen einige Messwerte innerhalb eines Chunk-Signals den vorgegebenen Schwellwert und eine automatisierte Messung wird vorgenommen.

Das dabei dargestellte, getriggerte Signal (Abb. 3/3) setzt sich aus insgesamt sechs einzelnen Chunk-Signalen zusammen: Einem Chunk vor dem auslösenden Ereignis und fünf nachfolgenden Chunks.

Soll dieses Signal gespeichert werden, kann der Nutzer einen Dateinamen sowie einen Speicherort angeben (Abb. 3/2). Ansonsten kann ein fehlerhaftes Signal direkt wieder gelöscht werden (Abb. 3/2), um eine neue Messung vorzunehmen.Während des Speichervorgangs ist der Audiostream unterbrochen. Für eine neue Messung muss er anschließend neu gestartet werden (Abb. 3/1).  

Abbildung 3: Übersicht der Steuerung des Wingbeat-Sensors mit Bokeh: (1) Start/Stopp Button Wingbeat-Audiostreams und Vorschau des aktuellen Chunk-Signals (2) Eingabefelder für Dateiname bzw. Speicherort auf Raspberry Pi SD-Karte, Speicher-bzw. Lösch-Button sowie Anzeige für mögliche Übersteuerung des Sensors (3) Vorschau des getriggerten und gespeicherten Wingbeat-Signals und des daraus berechneten Leistungsdichtespektrums (engl.: Power-Spectral-Density PSD) (4) Schieberegler der Signalverstärkung für die Anzeige in Bokeh (5) Schieberegler für Schwellwert, bei dessen Überschreitung ein getriggertes Signal angezeigt wird.
Abbildung 4: In einem ersten Schritt wird die Verstärkung des Signals durch Anpassung des Gain-Schiebereglers vom Wert (1) zum Wert (2) erhöht, um das Rauschen deutlich sichtbar zu machen. Anschließend wird der Threshold vom Wert (3) auf den Wert (4) reduziert, womit ein mögliches Messsignal, das die maximale Signalstärke des Rauschens übersteigt, mit einer höheren Wahrscheinlichkeit automatisiert detektiert und gespeichert werden kann.

Speicherort der Daten

Aktuell werden sämtliche Daten auf der SD-Karte des Raspberry Pi gespeichert. Steht der Insektencounter autonom im Freiland (ohne Strom und Internet), würden die Daten ebenso auf SD gespeichert werden.  

Zu einem späteren Zeitpunkt ist geplant, sämtliche Daten automatisiert in eine Cloud hochzuladen, sobald der Raspberry Pi eine Verbindung ins Internet aufbauen kann. Alternativ sollen Daten von der SD-Karte auch manuell in die Cloud hochgeladen werden können.


Link zur offiziellen Bokeh Dokumentation: https://docs.bokeh.org/en/2.3.3/

Link zur Multisensor Bokeh-App ReadTheDocs: https://multisensors-bokeh.readthedocs.io/en/latest/

Link zum Multisensor Bokeh-App Repository: https://gitlab.com/kinsecta/bokeh_dashboards/Multisensors_Bokeh

Link zur Raspberry Pi Dokumentation: https://www.raspberrypi.org/documentation/

Link zur Pyaudio Dokumentation: https://people.csail.mit.edu/hubert/pyaudio/docs/

Link zur Picamerax Dokumentation: https://pypi.org/project/picamerax/

Autor: Martin Tschaikner