User Stories

Bewohner: Ich kann ein Foto meines aktuellen Kühlschrankinhalts auf dem Handy abrufen, wenn ich beim Einkaufen nicht mehr sicher bin, was ich noch zu Hause habe.

Hauswirtschaftskraft: Ich kann ein Foto des Kühlschrankinhalts abrufen und so die Einkäufe planen, ohne vorher zum Klienten zu müssen. Ich kann anhand von Fotos nachsehen, wann was aus dem Kühlschrank genommen wurde, und so Aufschluss über die Ernährungsgewohnheiten des Klienten erhalten.

Computer, Kamera und Stromversorgung

Für diese Aufgabe reicht ein Raspberry Pi Zero. Als Kamera empfiehlt sich die Zero Cam mit 120° Blickwinkel, um möglichst viel vom Kühlschrank in den Blick zu kriegen. Da die Kosten gering sind, kann dies auch mehrfach verbaut werden, z. B. zwei mal in die Tür, um den Hauptraum aufzunehmen, und einmal oben in den Hauptraum, um die Inhalte der Tür aufzunehmen. Die Stromversorgung wird während der Entwicklungs- und Testphase über Power Banks gewährleistet. Bewährt sich der Kühlschrank mit diesen Kameras, so kann über einen Anschluss an die Stromversorgung des Kühlschranks nachgedacht werden, wobei zu prüfen ist, was das für die Brandsicherheit und für den Versicherungsschutz im Schadensfalls bedeuten würde.

Sensoren

Grundsätzlich gibt es viele Möglichkeiten, das Öffnen des Kühlschranks zu erfassen. Hier die bisherigen Erfahrungen:

Bewegungssensor

Den Versuch mit dem analogen PIR-Sensor HC-SR501 war noch nicht erfolgreich (meldet immer Bewegung; Ursache unbekannt).

Helligkeitssensor

Mit dem digitalen Helligkeitssensor BH1750 sind die Erfahrungen gut. Verkabelung: (hier noch Bild/Skizze einfügen). I2C muss als Interface aktiviert sein (Raspi-Config). Test, dass der Sensor angesprochen werden kann:

i2cdetect -y 1
sollte etwas in dieser Art ausgeben:
    0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f

00:          -- -- -- -- -- -- -- -- -- -- -- -- -- 
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
20: -- -- -- 23 -- -- -- -- -- -- -- -- -- -- -- -- 
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- 
70: -- -- -- -- -- -- -- -- 
Falls der Sensor einen Wackelkontakt hat, kann man ihn mit einem Gummiband in der Position fixieren, in der er Kontakt hat.

Da es bei geschlossenem Kühlschrank zappenduster ist (höchstens bis auf das Leuchten einer kleinen LED am Raspi), kann anhand der Helligkeit zuverlässig festgestellt werden, ob der Kühlschrank offen ist. Herumprobieren muss man allerdings damit, wann man Fotos aufnimmt, um ein Bild zu kriegen, das weder verwackelt ist noch die Hand des Bewohners mit aufnimmt und so einen Teil des Regals verbirgt. Das wäre vielleicht mit einem Bewegungs- oder Abstandssensor genauer möglich.

Abstandssensor

Der Abstandssensor hat den Vorteil, dass man auch den (ungefähren) Öffnungswinkel der Kühlschranktür ermitteln kann. Konkret verwenden wir diesen Sensor: https://www.pololu.com/product/3416 angesteuert mit einer modifizierten Version von https://github.com/ned14/VL53L3CX_rasppi. Die Modifikation war vor allem deswegen nötig, weil das Beispiel-Skript vom Hersteller Probleme macht, falls man es im falschen Moment stoppt und dann wieder startet.

Der Sensor liefert drei Werte:

  • D: Der Abstand in mm.
  • ambient: Ein grober Helligkeitswert, ähnlich wie der Helligkeitssensor oben.
  • signal: Die reflektierte Signalstärke.

Messkurve (Achtung, sehr grob geschätzte Winkel!):

kalibrationskurve

Nachdem die Kurve leider nicht linear ist, ist die Auswertung der Messdaten etwas komplizierter und fehleranfällig, vor allem im Bereich um die 20°. Hier kann man nur mit der Helligkeit zwischen links und rechts dem Tiefpunkt unterscheiden. Aber die Helligkeit hängt stark von der Umgebung ab, das heißt die kann man nicht vorkalibrieren. Aktuell wird versucht beim Öffnen dynamisch ein Wert zu ermitteln, was so mittelmäßig klappt (Es hängt davon ab, wie schnell man die Tür öffnet). Im wirklich wichtigen Bereich von 20-90° funktioniert die Erkennung aber ganz gut.

Kamera

Die Kameras werden mit dem 'neuen' libcamera Stack angesteuert (nicht dem alten raspi-vid etc.). Die größte Schwierigkeit liegt darin, den besten Zeitpunkt für ein Foto zu erwischen. Weil Einzelbildaufnahmen zu ungenau getimed werden können, wird ab dem Öffnen ein Video aufgezeichnet. Sobald die Zür zu gemacht wird, wird anhand einer Score das beste Frame ermittelt und aus dem Video extrahiert. Weil die Pi Zeros sehr leistungsschwach für Video- und Bildverarbeitung sind, dauert das ggf. ein paar Sekunden. Die Score wird aus dem Winkel, der Winkelgeschwindigkeit (als Ableitung des Winkels über die Zeit), und dem Zeitpunkt relativ zum Schließen der Tür berechnet.

Bilderkennung

Mit einfacher Bilderkennung wäre es möglich, bestimmte Objekte automatisch im Kühlschrank zu erkennnen (und zählen) zu können. Das könnte zum Beispiel in Form einer Liste in einer (Web)App erscheinen.

Nach ein wenig experimentieren hat sich bisher gezeigt, als wäre "klassische" Bilderkennung unter Berücksichtigung der Rechenleistung des Raspi Zero noch am besten, um Objekte zu lokalisieren und zu zählen. Beispiel:

mit Konturerkennung basierend auf Saturation & Value mit einem neuronalen Netz
out-0 cam1-1b-detect
out-2 carrots-192-detect-2
Laufzeit <1ms am Laptop Laufzeit 41ms am Laptop

Die Erkennung selbst funktioniert aber mit neuronalen Netzen bereits ganz gut.