3D Scanner

(<-- links kein Menü? Hier klicken)

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, wurde 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 wurde 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

Sensor Ausgangs LinieLaut Datenblatt kann der Sensor von 20cm bis 1,5 Meter Messungen durchführen. Allerdings 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
Ein erster provisorischer Aufbau mit der Universalbox1
Der endgültige Aufbau mit einem Gehäuse
Ein Scan von mir
Links: 3D Scanner, rechts: Ansteuerung Gehäuse mit LCD und Servos
Ich, gesehen durch den 3D Scanner
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.
Vorne der 3D Scanner, dahinter das Motiv
Rohdaten im Scanner Programm
Gerendertes 3D Bild der Szene
Ein Motiv mit dem endgültigem Scanner
Die Rohdaten in der Java GUI

Motiv: Fernsteuerung
Screenshot der Java GUI


Software

Die Verwendung der Software und Schaltpläne erfolgt auf eigenes Risiko. Eine Fehlerfreiheit ist nicht garantiert.
3dscanner_1-00.zip
Quellcode für den Mikrocontroller und die Java GUI. Version: 1.00
3dscanner1-schematic.png
Schaltplan des Scanners

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

Projekt aus dem Jahr: 2009
Beschreibung zuletzt geändert: 11.10.2012