Projekt 08: NXT 3D Laser Scanner: Unterschied zwischen den Versionen
Keine Bearbeitungszusammenfassung |
|||
Zeile 95: | Zeile 95: | ||
Beim Finden der Laserlinie wird dann die Form des Objektes erkannt, dann wird alles herausgefiltert außer der Laserlinie. | Beim Finden der Laserlinie wird dann die Form des Objektes erkannt, dann wird alles herausgefiltert außer der Laserlinie. | ||
[[Datei: Buddah scan 2.jpg| | [[Datei: Buddah scan 2.jpg|100px|thumb|left|Finden der Laserlinie.]]<br/><br/><br/><br/><br/><br/><br/><br/><br/> | ||
Sollten in der Laserlinie Löcher sein werden diese Automatisch ausgefüllt.Im nächsten Schritt wird dann das Bild gezeichnet und die Laserlinie berechnet. Dann werden die x-Positionen von den einzelnen Bildern und der Laserlinie zum realen Radius des Objektes konvertiert.Nun wird noch zu den Oberflächenkoordinaten des Objektes konvertiert. Der letzte Schritt ist dann das Anzeigen des Ergebnisses in 3D. | Sollten in der Laserlinie Löcher sein werden diese Automatisch ausgefüllt.Im nächsten Schritt wird dann das Bild gezeichnet und die Laserlinie berechnet. Dann werden die x-Positionen von den einzelnen Bildern und der Laserlinie zum realen Radius des Objektes konvertiert.Nun wird noch zu den Oberflächenkoordinaten des Objektes konvertiert. Der letzte Schritt ist dann das Anzeigen des Ergebnisses in 3D. | ||
[[Datei: Buddah scan 3.jpg|200px|thumb|right|Das fertige 3D-Modell.]]<br/><br/><br/><br/><br/><br/><br/><br/><br/> | [[Datei: Buddah scan 3.jpg|200px|thumb|right|Das fertige 3D-Modell.]]<br/><br/><br/><br/><br/><br/><br/><br/><br/> | ||
= Programmcode von Matlab = | = Programmcode von Matlab = |
Version vom 24. Januar 2014, 17:01 Uhr
Einführung
In diesem Artikel wird der Aufbau und die Programmierung eines Lego NXT 3D Laser Scanners erklärt. Das Projekt wurde von Christoph Dörner und Michael Deitel, an der HSHL im WS 2013/2014 im Zeitraum vom 23.September 2013 bis 13.Januar 2014, im Rahmen des Elektrotechnischen Fachpraktikums erarbeitet.
Aufgabenstellung
Das Ziel des Elektrotechnischen Fachpraktikums war es unter anderem die im Laufe des Studiums erlangten Erkenntnisse zum Erstellen eines eigenen mechatronischen Systems anzuwenden und zu erweitern. Als Projekt haben wir uns den Bau und die Programmierung eines 3D-Laserscanners ausgesucht welches wir mit Hilfe von Lego NXT Mindstorms und Matlab umsetzten.
Die drei folgenden Komponenten sind die wesentlichen Bestandteile unseres Aufbaus. Zu einem gibt es einen Laser und eine Webcam, mit dieser soll das Objekt aufgenommen werden. Des Weiteren gibt es den NXT-Block und einen NXT-Motor. Auf dem Block ist das Programm gespeichert welches den Motor ansteuert und das zu Scannende Objekt dreht. Auch soll die entsprechende Software aus der Aufnahme vom Objekt ein 3D-Modell am PC erzeugen, welches dann auch von allen Seiten betrachtet werden kann.
Projektplanung
Von der Themen Auswahl bis hin zur Vorstellung umfasst das Projekt rund vier Monate. Angefangen haben wir mit der Recherche und Vorbereitung in der wir uns ähnliche Projekte, die sich mit 3D-Laserscans befassen, angesehen haben. Dieser Schritt war sehr wichtig um unseren nächsten Schritt und zwar die Erarbeitung eines Konzepts angehen zu können. Da es mehrere Möglichkeiten gibt mit einem Laser und einer Kamera einen 3D-Scan durchzuführen, haben wir mehrere Konzepte entwickelt und uns dann für das benutzerfreundlichste festgelegt, welches dann auch einfacher für andere zum Nachvollziehen und selber machen ist. Einige der von uns als interessant befundenen Konzepte sind unter folgenden Links zu finden:
http://www.philohome.com/scan3dlaser/scan3dlaser.htm
http://www.david-3d.com/?section=Downloads
http://www.youtube.com/watch?v=C_wdYqCvL_4
Um unser Konzept zu realisieren haben wir ermittelt welche Materialien schon vorhanden sind und uns von der Hochschule zur Verfügung gestellt werden können und was wir anschaffen müssen.
Hierbei war es wichtig das Budget von 20€ nicht zu überschreiten.
Als wir unser Konzept festgelegt hatten, haben wir uns eine BOM (Bill of Material) erstellt und diese mit den für uns zur Verfügung stehenden Materialien abgeglichen.
Dies sind die Folgenden Materialien die wir benötigten um unser Konzept realisieren zu können:
• Lego NXT Mindstorms Baukasten
• PC mit Matlab
• Webcam (Logitec)
• Punktlaser, 650nm, 5mW, laser class 3R, 2.7-3.3, nominal 3V DC, 7x14mm
• Linien-Linse 90°
Zu unserem Glück waren alle Materialien schon vorhanden weshalb die Kosten für uns bei 0€ lagen. Da wir nun nicht auf eine Lieferzeit angewiesen waren, hatten wir etwas Zeit um unser Konzept zusammenzubauen und zu Optimieren. Auf das endgültige Konzept, so wie die Umsetzung der Hard- und Software gehen wir dann in den entsprechenden Kapiteln noch ein. Später als wir unsere Hardware und Software zusammengeführt haben traten noch einige Probleme auf welche wir in der abschließenden Test- und Optimierungsphase ausmerzten. Zu weiteren Optimierungen zu denen wir nicht mehr gekommen sind möchten wir nochmal in dem Kapitel Ausblick daraufhinweisen. Parallel zum Projekt haben wir unsere aufgetretenen Probleme und Fortschritte dokumentiert, um einen nahezu reibungslosen und termingerechten Ablauf des Projekts zu gewährleisten.
Konzept
Am Anfang des Projekts knüpften wir an dem Konzept an, das Elisabeth Imming und Julia Müller ein Jahr vor uns verfolgten. Diese ließen sich durch einen Aufbau von einem 3D Laser Scanner auf philohome.com inspirieren, der speziell für die Software „David 3D-Scanner“ entworfen worden war. Also wurde ein Aufbau entworfen, der diesem ähnelte, wie in folgender Abbildung zu sehen:
Auf der linken Seite sieht man den NXT über dem ein Aufbau aufgebracht ist, der zum einen den Akku festhält und des Weiteren vielmehr dafür da ist, dass der Legostein auf der rechten Seite von einem Linienlaser langsam von unten nach oben abgescannt wird. Der Laser ist horizontal ausgerichtet. Der Legostein an sich kann durch den darunterliegenden Motor gedreht werden. Das hier passierende wird von der schwarzen Kamera im Bild dokumentiert. Wir versuchten nun diesen Aufbau in Matlab zu unserem Nutzen zum Leben zu erwecken. Dazu setzten wir uns auf der Seite „http://www.vision.caltech.edu/bouguetj/index.html“ mit der Matlab Calibration Toolbox auseinander um mit dieser das Objekt lokalisieren zu können. Bei dieser Recherche sahen wir allerdings genau auf der selben Seite einen anderen Ansatz, der ohne ein Kalibrierungsschema arbeitet. Dies ist auf der Seite unter „3D photography on your desk“ zu finden, das von Jean-Yves Bouguet etwas veranschaulicht wird. Hier beleuchtet man einen Gegenstand mit einer hellen Lampe und hält zwischen dieser und dem Objekt einen Stift, der einen Schatten wirft, an dem man die Position des Objekt bestimmen kann. Wir hatten nun einen Linienscanner, eine Kamera und einen NXT. Es schien kein Objekt außer die Kamera für diesen Aufbau zu passen. Durch unsere vorherige Recherchen viel uns aber ein, dass wir den Rotanteil aus dem RGB-Bild herausnehmen können und somit genau den Schatten haben, den der Stift werfen würde. Dazu muss bei unserem Aufbau allerdings idealerweise das Aufnahmezimmer komplett dunkel sein. Also entwurfen wir einen recht simplen Aufbau der in der Kürze unserer verbleibenden Zeit seinen Nutzen tat:
Hier sieht man nun auf der rechten Seite den NXT, der den Motor auf der linken Seite ansteuert. Dieser Motor dreht das zu scannende Objekt um 360 Grad, damit es von jeder Seite betrachtet wurde. Der Laser wirft bei diesem Aufbau einen vertikalen Strahl auf das Objekt, der bei völliger Dunkelheit von der Kamera aufgezeichnet wird und nachher in der Software mit dem momentanen Winkel des Motors und dem Winkel des Lasers zur Kamera verrechnet wird.
Umsetzung der Hardware
Die Hardware besteht aus einem Rahmen an dem der NXT-Block hängt und an dem auch die anderen Komponenten befestigt sind. Neben dem NXT-Block, auf dem die Programmierung für den NXT-Motor ist der das zu scannende Objekt dreht, befindet sich in dem Rahmen die Webcam welche das Objekt abfilmt. Neben der Kamera auf dem Rahmen befindet sich der Laser welche ein Punktlaser der Laserklasse 3R ist, der mit 3V Gleichstrom angesteuert wird. Dieser erzeugt mit einer Wellenlänge von 650nm einen roten Laserpunkt und hat eine Optische Leistung von 5mW. Den Strom bekommt er von einem 3V Batterie-pack welches man über einen Schalter an und aus schalten kann. Da wir für unser Konzept ein Linien-Laser benötigen würde unser Laser mit einer 90° Linse modifiziert umso aus dem Punkt eine Linie zu erzeugen. Eine Logitech 5MP C310 Webcam dient zur Filmaufnahme. Damit die Filmdatei ausgewertet werden kann, muss die Kamera gerade auf das zu scannende Objekt stehen und der Laser muss in einem bestimmten Winkel zur Kamera eine Linie auf das Objekt projizieren. Zuletzt haben wir ein Stück Filz auf die Lego Fläche, für das zu scannende Objekt, geklebt damit es beim Drehen nicht verrutscht oder gar runter fällt.
Umsetzung der Software
Die Software in Matlab besteht aus mehreren Abschnitten. Der erste Abschnitt besteht darin eine Verbindung zum NXT herzustellen. Danach wird der NXT-Motor angesteuert welcher das zu scannende Objekt dreht. Während der Befehl an den Motor gesendet wird, schickt die Software gleichzeitig einen Befehl ab, der die Webcam aktiviert, sodass genau zum Zeitpunkt der Rotation ein Film aufgenommen wird der genau dann startet, wenn das Objekt anfängt zu rotieren und aufhört wenn das Objekt eine volle Umdrehung vom Motor gedreht wurde.
Hier war es wichtig mit Pausen, Rotationsgeschwindigkeit und Aufnahmezeit den genauen Zeitpunkt festzulegen, um nur eine vollständige 360° Drehung des Objekts zu erlangen. Anschließend wird der Kamerawinkel zur Webcam festgelegt. Die Laserlinie wird Manuell über einen Schalter zu Beginn eingeschaltet. Da wir kein vordefiniertes Bild zur Kalibrierung nutzen, haben wir festgelegt, dass jeweils immer das erste Bild der Aufnahme zur Kalibrierung genutzt wird. Kalibrierung heißt in diesem Fall, dass man das Bild noch drehen kann nach der Aufnahme, falls die Kamera nicht gerade stand. Der nächste Schritt war es dann die Farbe der Laserlinie zu bestimmen, da wir diese später herausfiltern um die Struktur unseres Objektes zu erkennen. Jetzt nachdem wir alle für uns relevanten Parameter bestimmt haben, rufen wir den Film vom Objekt auf und filtern die Laserlinie heraus. Dann lassen wir uns unser Kalibrierungsbild anzeigen welches das erste Bild der Filmaufnahme ist. Bis hier her funktioniert das Programm automatisch und im nächsten Schritt muss dann das erste Mal vom Benutzer selbst Hand angelegt werden. Denn in dem aufgerufenen Bild soll der Benutzer eine vertikale Linie ziehen um das Bild zu begradigen. Dann wird wieder vom Benutzer manuell die Rotationsaxe des Objektes bestimmt (blauer Strich) und die uns interessierende Region auf dem Bild markiert (roter Kasten).
Danach wird auf das Ergebnis automatisch noch ein Filter zum Glätten aufgelegt und in dem Ergebnis wird dann die Laserlinie lokalisiert und ausgelesen. Beim Finden der Laserlinie wird dann die Form des Objektes erkannt, dann wird alles herausgefiltert außer der Laserlinie.
Sollten in der Laserlinie Löcher sein werden diese Automatisch ausgefüllt.Im nächsten Schritt wird dann das Bild gezeichnet und die Laserlinie berechnet. Dann werden die x-Positionen von den einzelnen Bildern und der Laserlinie zum realen Radius des Objektes konvertiert.Nun wird noch zu den Oberflächenkoordinaten des Objektes konvertiert. Der letzte Schritt ist dann das Anzeigen des Ergebnisses in 3D.
Programmcode von Matlab
Ausblick
Unsere Ergebnisse die wir in diesem Projekt erzielt haben sind Nahe an der vollständigen Bearbeitung der Projektaufgabe. Die Einstellungen in Matlab müssen noch etwas verfeinert werden, damit es zu einer besseren 3D-Abbildung kommt und es muss noch das Exportieren in Solid Works am Ende stehen, damit man mit seinem nun gewonnenen 3D-Objekt auch sinnvoll arbeiten kann, denn es auf Papier auszudrucken hat einen geringen nutzen, denn schließlich ist es dann wieder 3D. Mit diesem Projekt könnte man also, wenn man es noch etwas weiterführt, beispielsweise Bauteile einscannen lassen, die man dann später in SolidWorks einbaut und nun sehen kann ob sie in die zuvor entworfene Konstruktion hineinpassen oder man könnte wenn man vom Lego Modell weggeht und einen größeren Aufbau erstellt größere Objekte einscannen, die man dann am PC animieren kann, so dass man es auch für Trickfilme oder Computerspiele benutzen kann. Des Weiteren könnte man noch am Aufbau verbessern, dass die Kamera und der Laser immer auf mittlerer Höhe des Objekts ist, so dass möglichst wenig Information verloren geht. Aber die obere und untere Seite des Objekts werden wohl bei diesem Aufbau immer vernachlässigt.
Fazit
Es war ein hochinteressantes Projekt in dem wir viel über die Videoverarbeitung in Matlab gelernt haben. Am Anfang des Projekts waren wir hoch motiviert und sind gespannt in das Thema eingetaucht. Diese Motivation drohte aber zu kippen, weil wir eine sehr lange Zeit brauchten bis wir gescheite Ergebnisse bekommen haben und uns Probleme bei der Hardware Beschaffung einiges an Zeit gekostet haben, die wir gerne an anderer Stelle investiert hätten. Nach längerer Recherche und nach längerem ausprobieren verschiedener Toolboxen, stieg unsere Motivation aber wieder als wir nicht nur unser binäres Bild auf dem Bildschirm sahen sondern auch ein 3D-Modell, das ungefähr wie das gescannte Projekt aussah. Da unser Zeitplan nun aber auf 40 Stunden Arbeitszeit ausgelegt war konnten wir nur noch einige Feinabstimmungen machen, die allerdings ausreichten um am Ende noch ein genaueres 3D-Objekt zu erschaffen. Leider konnten wir uns deshalb dann nicht mehr mit dem Exportieren in Solid Works auseinandersetzen. Daraus haben wir gelernt, dass wir zum einen mehr Reservezeit in unserer Projektplanung investieren sollten und zum anderen die Zeit mehr über die Bearbeitungszeit verteilen sollten. Des Weiteren haben wir viele Kenntnisse über Matlab und das Videotool „Image Acquistion“ mitgenommen und konnten uns Wissen über die 2-D in 3-D-Konvertierung aneignen.