Ich habe mir einen Roomba angeschafft. Es gibt einen Haufen Staubsauger-Roboter von vielen Herstellern, ich habe mich aber wegen dem Bastelfaktor für diese Modellreihe entschieden. Gebastelt habe ich leider bisher noch nichts, dafür wurde ich jetzt schon öfter gefragt: “putzt der denn wirklich überall?” Und ich habe darauf bisher mit der Antwort aus iRobots Marketing-Material geantwortet. Dieses besagt, dass natürlich im Rahmen der Möglichkeiten an allen Stellen mehrfach geputzt wird.
Seinem Staubsauger bei der Arbeit zusehen macht zwar eine Weile auch mal Spaß, aber das Ziel ist es ja, Zeit zu sparen. Deswegen habe ich die Beobachtung automatisiert. Das hat zwar länger gedauert als den Vorgang einmal komplett zu beobachten, dafür habe ich nun aber belastbare Dokumentation. Wie ihr etwas ähnliches mit Hausmitteln (PC, Webcam, Open Source Software) nachbauen könnt, erfahrt ihr im Folgenden.
Meine Hardware bestand aus einem Raspberry-Pi und einer Handelsüblichen Webcam. Jeder andere Computer oder jedes Notebook würde ebenfalls funktionieren. Die Webcam war an einem Stativ befestigt
Alle Programme gibt es für Windows, Linux und MacOS und sie sind kostenlos. Zum Einsatz kamen ffmpeg/avconv und ImageMagick.
Bilder aufnehmen
Ein Roomba ist zwar einigermaßen flink, aber dennoch braucht man keine 25 Bilder pro Sekunde, um seine Bewegungen aufzuzeichnen. Mir ging es ja mehr darum, ob eine Fläche gleichmäßig und einigermaßen vollständig abgedeckt ist. Ich Ich stelle ffmpeg daher auf eine Framerate von einem Bild pro Sekunde und speichere einzelne Bilder, kein Video.
# linux ffmpeg -f video4linux2 -r 1 -i /dev/video0 -q:v 1 "image-%05d.jpg" # windows ffmpeg -f dshow -i video="Integrated Camera" -r 1 -q:v 1 "image-%05d.jpg"
Das Kommando besteht aus relativ wenigen, einfachen Teilen:
-f wählt das “Format” wir wählen video4linux2 oder dshow aus, je nach Platform
-i bestimmt den input filename. In unserem Fall ist das kein Dateiname, sondern die Webcam. Unter Linux gibt man das entsprechende device an, unter Windows den Namen des Geräts.
-r bestimmt die Framerate. 1 bedeutet 1 Bild pro Sekunde. 25 würde 25 Bilder Pro Sekunde bedeuten.
-q:… bestimmt die Qualität eines Streams. Hier wähle ich den Video-Stream q:v und setzte die Qualtät auf 1.
Es folgt der Ziel-Dateiname image-%05d.jpg was so viel heißt, wie: Das erste Bild heißt image-00000.jpg und danach wird hoch gezählt”.
Weitere Infos im ffmpeg-Wiki über dshow-capture (Windows)
Bilder verarbeiten
Im ersten Schritt geht es mir nicht um eine künstlerische Darstellung, sondern nur um eine möglichst schnelle Antwort auf die Eingangsfrage. Am einfachsten erscheint es mir, die Bilder kurz manuell anzuschauen. Dazu erstelle ich aus den Standbildern ein Video:
ffmpeg -framerate 30 -start_number 177 -i "image-%05d.jpg" -c:v libx264 out.mp4
Wir weisen ffmpeg an, ein Video mit 30 Bildern pro Sekunde zu erstellen, und zwar aus den Bildern, die “image-%05d.jpg” heißen – auch hier wieder eine fortlaufende Liste. Wir möchten das Video mit libx264 konvertieren und als out.mp4 speichern. Eine Besonderheit ist die -start_number – ich habe einige Bilder übersprungen, da am Anfang etwas vorlauf war, den ich nicht im Video haben wollte.
Das resultierende Video ist eine Kurzfassung von 28 Minuten Roomba-Arbeit:
Wir Menschen sind relativ schlecht darin, zeitliche Informationen zusammenzufassen. Hand aufs Herz: War der kleine wirklich überall? Keine Ahnung. Genau.
Ein Bild sagt mehr als 2.058 frames
ImageMagick wird oft verwendet, um Miniaturen aus Bildern zu erzeugen. Es kann aber einen ganzen Haufen andere Dinge. Es kann zum Beispiel eine Reihe Bilder nach verschiedenen Kriterien miteinander verrechnen. Wenn ihr Photoshop kennt, kommen euch einige Dinge sicher von den “Blend Modes” bekannt vor. Ich habe alle verfügbaren Modi mit einer kleinen Anzahl Bilder durchprobiert, und mich dann für “Max” entschieden. Der Roomba hat einen Chromring und eine grüne Leuchte, die gut zu erkennen sind.
Das Endergebnis sieht dann so aus:
convert "image-*" -evaluate-sequence max max.png
convert ist eines der Programme, das ImageMagick bereitstellt.
“image-*” lädt alle Bilder, die mit image- beginnen.
-evaluate-sequence max wendet “max” als algorithmus (von allen Bildern jeweils die hellste Stelle nehmen) auf alle Bilder an.
max.png ist der Dateiname, unter dem ich das Bild nachher speichere.
Fazit
Die Antwort ist offensichtlich: Es gibt hier und dort kleine Lücken, aber insgesamt kommt das Ding überall mal vorbei. Vor allem, wenn man bedenkt, dass der Roomba nach einem festen Plan – zum Beispiel täglich – auf Staubfang geht, sind diese Lücken kein Problem.
Für die Interpretation des Bildes müssen wir im Kopf behalten, dass wir stur ein Bild pro Sekunde auswerten. Man kann also auch erkennen, wo langsamer und wo schneller gearbeitet wird. Um komplizierte Kanten (Der Sitzsack und Hocker oben links im Bild, oder am Couchtisch vorne rechts) tastet sich der Roomba langsam herum.
Nachtrag
Hier noch eine Nachtaufnahme. Beim nächsten Anlauf werde ich allerdings für ein klein Wenig mehr Beleuchtung sorgen. Die Bilder wurden massiv nachbearbeitet mit folgenden Kommandos:
# gamma correction (will only work in bash-like shells find imagedirectory -type f -exec "convert {} -level 0%,100%,2.5 gamma-{}" \; convert "gamma-imagedirectory/*.jpg" -evaluate-sequence max max-gamma-abend.png