3D Scanner
Um für einen zukünftigen
Roboter mit einem Entfernungsmesser für Hindernisse ausstatten zu
können, wurde ein Distanzsensor mittels zwei Servos drehbar
befestigt. Kern des Scanners ist
ein Sharp 2Y0A02 Sensor, der Entfernungen von 20cm bis 1,5 Meter
messen kann. Der Sensor hat einen analogen Ausgang, welcher
abhängig von der Entfernung zum nächstem Hindernis ist. Mit
den Servos lässt sich der Sensor in zwei Richtungen um jeweils
140° drehen. Werden sämtliche Servo Stellungen nacheinander
angefahren und der Sensorwert ausgelesen, so erhält man ein
komplettes 3D Bild der Umgebung. Der Nachteil dieser
Punkt-für-Punkt Methode ist allerdings seine niedrige
Geschwindigkeit.
Funktionsweise
Ein ATmega8 dient dazu die die Servos
anzusteuern, den Sensor auszulesen und Befehle durch die serielle
Schnittstelle Befehle entgegen zunehmen und die vorverarbeiteten
Sensorwerte zu senden. Jeder Servo kann in 256 verschiedene Positionen
gefahren werden, so dass sich ein 3D Bild mit maximal 65536 Bildpunkten
generieren lässt. Als Vorverarbeitung lässt sich der Sensor
Wert direkt in eine Entfernung in Millimeter umrechnen oder in x,y,z
Koordinaten abhängig von den aktuellen Servo Positionen umrechnen.
Zusätzlich zu dem Distanzsensor wurde ein Fototransistor auf den
Servos befestigt um die Helligkeit des abgetasteten Punktes ermitteln
zu können. Leider hat der Fototransistor hierfür einen zu
großen Öffnungswinkel, so dass dieser nur von begrenzten
Nutzen ist. Da die Servos eine gewisse Zeit benötigen um die
gewünschte Posititon zu erreichen, kann der Controller den
ungefähren Verbrauch der Servos messen und somit mit einer Messung
warten, bis sich der Sensor an der gewünschten Position befindet.
Optional lässt sich an dem Controller ein 16x2 Zeichen LCD und ein
Taster anschließen, um die gemessenen Werte direkt ablesen zu
können.
Da die
Ausgangsspannung nicht linear zur Entfernung ist, habe ich eine Tabelle
erstellt, die A/D Werte in Zentimeter umrechnet. Zusätzlich kann
Mikrocontroller den ungefähren Verbrauch der Servos messen und so
feststellen ob sie sich noch bewegen oder bereits die gewünschte
Position erreicht haben. Als letztes habe ich noch einen Fototransistor
neben dem Distanzsensor befestigt, um einen ungefähren
Helligkeitswert an der gemessenen Position zu erhalten, leider sind
diese Daten jedoch nur wenig brauchbar.
Der Sensor

Laut
Datenblatt kann der Sensor von 20cm bis 1,5 Meter
Messungen durchführen. Leider ist die Ausgangsspannung nicht
linear zur Entfernung. Daher wurde eine Tabelle erstellt, die die A/D
Werte in Zentimeter umrechnet. Hierfür wurde der Sensor
ungefähr senkrecht auf braune Pappe ausgerichtet und die durch den
10Bit A/D Wandler des Controllers gelieferten Werte bei jeder
Entfernung notiert. Es stellte sich heraus, dass der Sensor von 13cm
bis 160cm Entfernung brauchbare Werte liefert, wobei
die Genauigkeit bei 20cm Abstand ungefähr 0,5cm und bei 1,8
Metern
noch 4-8cm beträgt. Die X Achse der nebenstehenden Grafik
bezeichnet den Abstand in
Zentimetern. Die Y Achse zeigt den bei dem gegebenem Abstand gemessenen
10Bit A/D Wert bei 5V Referenzspannung an. Der grüne Graph zeigt die direkt gemessenen
Werte, für den roten Graph wurden die Werte geglättet. Der
rote
Graph wurde als Umrechnungstabelle in den Mikrocontroller programmiert.
Da die Ausgangsspannung bei Entfernungen unter 13cm wieder absinkt
besteht hier die Gefahr dass zwei verschiedene Entfernungen die
gleichen Sensorwerte liefern.
Java GUI
Um 3D Scans leicht durchzuführen
wurde eine plattformunabhängige GUI in Java geschrieben. Sie
ermöglicht es einen beliebigen Bildausschnitt zu Scannen, die
erstellten Scans zu laden und abzuspeichern, sowie in das PNG-Format zu
exportieren und die Punkte mit POV-Ray als 3D Szene rendern zu
lassen.
Bilder
Für eine größere Ansicht auf die Bilder klicken
|
|
Der endgültige Aufbau mit einem Gehäuse
|
Ein Scan von
mir
|
|

|

|
Ein Motiv
mit dem provisorischem Scanner
|
Die Rohdaten (seitenverkehrt, alte GUI)
|
Das
Resultat, gerendert mit POV-Ray. Jede Kugel hat einen Durchmesser von
einem Zentimeter.
|

|

|

|
Ein Motiv mit dem endgültigem Scanner
|
Die Rohdaten in der Java GUI
|
|

|

|
|
Software
Die Verwendung der Software und Schaltpläne erfolgt auf eigenes Risiko. Eine
Fehlerfreiheit ist nicht garantiert.
Fazit
Leider liefert der Fototransistor kein wirkliches graustufen Bild. Die
Auflösung von 1cm reicht nicht um detaillierte Strukturen zu
erkennen. Auch braucht ein Scan mit "hoher" Auflösung -bei
ungefähr 6 Punkten pro Sekunde- eine ganze Weile. So dauerte der
Scan für das zweite 3D-Bild auf dieser Seite rund 1,5Std. Wer sich
also selber einscannen möchte wird sehr viel Geduld benötigen
;-). In Anbetracht der Einfachheit des 3D Scanners bin ich mit den
Resultaten aber zufrieden.
Zur Startseite
zuletzt geändert: 07.03.2009