Versuche zu einem selbstgebauten Laserscanner

Was ist ein Laserscanner?

Die Profis unter den Roboter-Bauern verlassen sich meist auf Laserscanner der Firma SICK. Ihre Funktion in einfachen Worten (ohne daß ich mir die Prinzipien oder die Geräte genauer angeschaut hätte, dazu sind sie einfach zu teuer...):

Die Umgebung wird mittels eines schwenkenden oder zu einem Teppich aufgeweiteten Laserstrahl abgescannt, meist über 180°. Eine Kamera oder mitschwenkende CCD-Zeile erfaßt über Triangulation die Entfernung, in der der Laserstrahl auf Hindernisse trifft. Schließlich wird wohl ein Entfernungsprofil in einem polaren Koordinatensystem erstellt. Das machen die Dinger alles alleine, in einem kompakten, aber dennoch für Hobbyroboter etwas zu großen und schweren Gehäuse von vielleicht 15x15x15cm. Über eine Schnittstelle kann dieses Profil ausgegeben werden, oder vielleicht auch eine kurze Alarmmeldung, wenn allgemein etwas erfasst wird. Wie gesagt, nur ganz grob erklärt und ohne mich auf irgendwelche Werte festlegen zu lassen. Jeder kann selbst bei SICK vorbeisurfen.

Selbstbau?

So etwas will ich auch, nur kleiner, leichter und viel günstiger. Dafür mit einigen Abstrichen. Ungefähr so:

Laser-Linien-Modul, dessen Strahl intern über eine Zylinderlinse aufgeweitet wird (ELV Elektronik, ca. 35€)

CMOS-Schwarzweiß-Kamera (in meinem Fall von Pollin für ca. 20€, es geht aber auch billiger, z.B. Conrad für ca. 12€)

Microcontroller, der das alles verarbeitet und auf einfachem Niveau Videograbbing und Bildverarbeitung betreibt. Das steht noch in den Sternen.

Beide Bauteile begrenzen gleichermaßen den erfassbaren Bereich auf ca. 90°. Es gibt zwar auch Weitwinkel-Objektive für die Kameramodule, die ca. 135° erfassen, aber Laser mit so einem weiten Fächer gibt es nicht "von der Stange". Außerdem wird die Laserleistung auf einen längeren Strich verteilt, was die Leuchtkraft reduziert.

Versuche

In einem Thread in www.roboternetz.de (Foren -> Roboter-Foren -> Sensoren -> "Sick"-ähnlicher Laserscanner im Selbstbau?) startete ich eine Diskussion. Darin war auch viel von Farbfilterung die Rede. In meinen ersten Versuchen war zu sehen, daß mit ganz einfachen Mitteln (rot angemalte Folie, und 3mm dickes rotes Plexiglas) kaum eine wirkungsvolle Filterung zustandekam. Zumindest nicht, wenn man das Bild einfach auf dem Fernsehbildschirm betrachtete.

Ich wollte deshalb ziemlich bald den Effekt ausprobieren, ein Bild mit Laserstrich und eines ohne aufzunehmen und beide voneinander abzuziehen.

Erster Versuch mit Webcam:

Abends, mit relativ heller Raumbeleuchtung. Der Laser beleuchtet PINOs Füße.

Dasselbe ohne Laser. Man sieht außerdem ganz leicht andere Schatten, weil ich mich zwischen den beiden Aufnahmen natürlich bewegt hatte.

Differenzbild. Kaum was zu sehen, aber anscheinend wirklich nur die Laserreflektionen.

Video-Grabber

Danach wurde ein Video-Grabber mit USB-Anschluss besorgt, Neuware auf ebay für ca. 26€. Außerdem habe ich die CMOS-Kamera und den Laser gemeinsam auf einen Träger geschraubt und verdrahtet.

 

 

Die Ergebnisse damit:

Bei Tageslicht, und in meiner Wohnung ist es relativ hell. Der Laserstrahl ist sichtbar an der Wand hinten links bis Mitte und am Stuhlbein rechts vorne. Am Roboter-Untergestell rechts hinten kann man ihn bestenfalls erahnen.

Hier gleich die Differenz, ohne weitere Helligkeitsanpassung und Kontrastverstärkung. Das Bild rechts daneben wurde dann in Kontrast und Helligkeit optimiert.

Visual Basic

Ich habe gar nicht erst versucht, mich weiter mit den Funktionen irgendwelcher Bildbearbeitungsprogramme auseinanderzusetzen, denn nach der ersten Antwort auf einen weiteren Thread in www.RoboterNetz.de war klar, dass es mit VisualBasic schöner geht. Vielen Dank an den Roboternetz-User UlrichC, deine Source-Sammlung hat mir prima geholfen!

Ohne viel Umstände konnte mittels weniger Windows-API-Funktionen ein Standbild aus dem Grabber in eine PictureBox gezaubert werden. Das schafft jeder. Die Farbwerte habe ich dann mit der Point-Methode aus zwei PictureBoxes ausgelesen, subtrahiert und mit der PSet-Methode in eine dritte PictureBox eingesetzt. Das dauert geschätzte 2-5 Sekunden, aber mir macht das nichts zum Ausprobieren. Eine vierte Picture-Box zeigt mit der Line-Methode ein Profil einer vertikalen Linie im Differenzbild an. Die Linie kann hin- und hergeschoben werden. Das wiederum geht erstaunlich schnell, wenn man auf dem SmallChange-Knopf des Sliders draufbleibt, läuft die Linie langsam durchs Bild und das Profil wabert in Echtzeit mit. Genug der Worte, das sollte ich an geeigneter Stelle besser erklären und mit Code untermauern. Hier drei Bilder mit Ergebnissen:

Das ist das beste Bild. Im Zimmer war es relativ dunkel. Deshalb stellt sich die CMOS-Kamera automatisch empfindlicher ein und wird von der Laserlinie ganz ordentlich ausgesteuert. Die vertikale Linie, deren Profil angezeigt wird, muß man sich am linken Rand des Sliderknopfs vorstellen, sie kreuzt also die kurze waagrechte rote Linie im Bild. Man sieht sogar die Reflexion der Reflexion, den hellen Schimmer auf dem Teppich vor dem Klötzchen. Auch im Profil sieht man das durch den breiten Peak. Und die Aussteuerung ist doch gut über die Hälfte, während das Dunkelbildrauschen bei unter 10% ist. Naja, so Schätzwerte.

Das folgende Bild ist mit hellem Raumlich aufgenommen. Nun ist die Kamera weniger empfindlich, der Laser fällt im Umgebungslicht nicht mehr so auf. Dafür wird das Dunkelbild rauschärmer. Eigentlich ist das Verhältnis Peak zu Umgebungsrauschen wieder ganz gut. Allerdings nur für das hell reflektierende Klötzchen in der Mitte, bei den anderen Reflektionen z.B. an der Teppichleiste sähe es schon schlechter aus...

Zuletzt ein Versuch mit der billigen roten 3mm-Plexiglasscheibe vor der Kamera. Das ganze wird keinen Deut besser. Eher wird alles ein bißchen dunkler, das Umgebungsrauschen wieder mehr, aber der Laser dadurch nicht heller. Einfache Filterung ist für mich erstmal gestorben. Vielleicht besorge ich irgendwann wirklich einen engen, auf den Laser passenden Bandpaß-Rotfilter, damit kann es wieder anders aussehen.

Ausblick

Das VisualBasic-Programm wird weiter automatisiert, ich werde den Laser irgendwie über die serielle Schnittstelle schalten (vielleicht sogar direkt über eine Handshake-Leitung, oder über eine C-Control, oder über einen IOWarrior mit USB). Dann kann ich mir das Knöpferldrücken und das Zuhalten des Lasers mit dem Finger sparen. Das Erfassen von Bild und Dunkelbild müßte auch schön schnell hintereinander gehen, sie werden ja nur in zwei PictureBoxes gestopft.

Dann kann man langsam an die eigentliche geometrische Aufgabe denken, nämlich aus dem Ort der Reflexionen im Bild ein Entfernungsprofil zu errechen. Da denke ich an das Aufnehmen eines Kennfeldes, einer zweidimensionalen Tabelle sozusagen. So könnte man sich aufwendige Rechnerei sparen und hat die Abbildungsfehler der Kamera auch gleich erschlagen.