Liebe Community,
im Rahmen meines Studiums für einen Studienarbeit, habe ich die Aufgabe ein 3D-Modell aus einer Punktewolke zu erstellen.
Versuchsaufbau:
Ein Laserscanner, der auf einer Plattform festgeschraubt ist und schrittweisse (1-Grad-Schritt um die Z-Achse)macht.
Es soll für den Anfang ein Karton vor einer Wand zum Beispiel eingescannt werden. Es werden mit anderen Worte die x- und y-Werte in den CSV-Daten gespeichert von dem dazugehörigem Grad.
Hardware ist ein Laser von Hokuyo UTM 30 LX. Dieser wird auf dem folgendem "Stativ" befestigt, um unterschidliche Neigungen zu bekommen und aus einem 2D-Scann ein 3D-Scann genieren zu können. Die Dabei aufgenommen CSV-Daten könnt ihr in der ZIP-Datei sehen.
Dieser Karton soll dann mit den CSV Daten in Blender als 3D Modell angezeigt werden.
Es gibt schon ein ähnliches Thema dazu,nur ich benötige hierbei von derPunktewolke eine Flächendarstellung.
Im Klartext soll deabgescannte Karton vor der Wand auch im 3d-Modell wiedererkennbar sein.
Nach Möglichkeit soll das Einlesen automatisiert sein und evtl. auch noch golbal anwendbar für natürlich zuküntfige Messungen.
Kann mir hier einer von euch mir bitte helfen? Meine Kenntinisse in Blender beschränken sich sehr auf das notwendigste. Ich habe mit Blander leider keine Erfahrung bis dato.
Daten und Bilder findet ihr hier unter folgender Adresse in einem anderen Forum (blendpolis.de)
https://www.blendpolis.de/viewtopic.php?f=16&t=52020
3D-Modellierung aus CSV-Dateien (Punktewolke) in Blender
Probier das mal:In Zeile 23 Skaliere ich auf 1/100, weil die Default-Einstellung der Kamera mit Objekten von ein paar hundert Einheiten Durchmesser nicht zurechtkommt.
Die Laserscans passen nicht alle richtig zusammen, wenn Du Zeile 24 einkommentierstdann siehst Du folgendes
wenn Du sie auskommentierstdann siehst was ich mit dem nicht zusammenpassen meine:
Code: Alles auswählen
import os
import numpy as np
import bpy
import bmesh
def read_laserdata_file(filename):
angle_str, x, y, z = open(filename).readlines()
p = np.array([[float(xi) for xi in x.split(";")[1:] ],
[float(yi) for yi in y.split(";")[1:] ],
[float(zi) for zi in z.split(";")[1:] ],
]).T
return p
laserdatafiles = os.listdir("Laserdata")
p = []
for laserdatafile in laserdatafiles:
p.append(read_laserdata_file(os.path.join("Laserdata", laserdatafile)))
p = np.array(p)
print( p.shape)
p /= 100
#p = p[:20,:200].copy()
n = p.shape[0]
m = p.shape[1]
faces = []
for i in range(n-1):
for j in range(m-1):
faces.append([i*m+j, i*m+j+1, (i+1)*m+j+1, (i+1)*m+j])
p.shape = -1,3
data = bpy.data.meshes.new("laserdata")
data.from_pydata( p, [], faces)
objData = bpy.data.objects.new("laserdata", data)
objData.location = bpy.context.scene.cursor_location
bpy.context.scene.objects.link( objData)
bpy.context.scene.objects.active = objData
Die Laserscans passen nicht alle richtig zusammen, wenn Du Zeile 24 einkommentierst
Code: Alles auswählen
p = p[:20,:200].copy()
wenn Du sie auskommentierst
Code: Alles auswählen
#p = p[:20,:200].copy()
Ich habe etwas Wichtiges vergessen, die Laserscan-Dateien müssen sortiert verarbeitet werden (Zeile 17):Jetzt siehtr es so aus:
Code: Alles auswählen
import os
import numpy as np
import bpy
import bmesh
def read_laserdata_file(filename):
angle_str, x, y, z = open(filename).readlines()
p = np.array([[float(xi) for xi in x.split(";")[1:] ],
[float(yi) for yi in y.split(";")[1:] ],
[float(zi) for zi in z.split(";")[1:] ],
]).T
return p
laserdatafiles = os.listdir("Laserdata")
print(laserdatafiles)
laserdatafiles.sort()
print(laserdatafiles)
p = []
for laserdatafile in laserdatafiles:
p.append(read_laserdata_file(os.path.join("Laserdata", laserdatafile)))
p = np.array(p)
print( p.shape)
p /= 100
#p = p[:20,:200].copy()
n = p.shape[0]
m = p.shape[1]
faces = []
for i in range(n-1):
for j in range(m-1):
faces.append([i*m+j, i*m+j+1, (i+1)*m+j+1, (i+1)*m+j])
p.shape = -1,3
data = bpy.data.meshes.new("laserdata")
data.from_pydata( p, [], faces)
objData = bpy.data.objects.new("laserdata", data)
objData.location = bpy.context.scene.cursor_location
bpy.context.scene.objects.link( objData)
bpy.context.scene.objects.active = objData
Ich habe es soweit hinbekommen.
Habe jetzt noch anschliessend eine Frage:
Wie kann ich den dargestellten Zylinder hohl darstellen, damit es ein Raum wird.
Was ich damit meine, bitte in diesem Forum nachlesen, da ich keine andere Möglichkeit habe, Daten hochzuladen. Danke!
https://www.blendpolis.de/viewtopic.php ... 42#p528542
Das Thema habe ich hier auch erstellt und neue Daten und Bilder hnzugefügt.
Danke für Eure unterstützung im Voraus!
Habe jetzt noch anschliessend eine Frage:
Wie kann ich den dargestellten Zylinder hohl darstellen, damit es ein Raum wird.
Was ich damit meine, bitte in diesem Forum nachlesen, da ich keine andere Möglichkeit habe, Daten hochzuladen. Danke!
https://www.blendpolis.de/viewtopic.php ... 42#p528542
Das Thema habe ich hier auch erstellt und neue Daten und Bilder hnzugefügt.
Danke für Eure unterstützung im Voraus!
@MagBen:
Vielen Dank für deine Unterstützung vorab!
Kannst du mir evtl. nochmals behilflch sein?
Habe das Problem nun endlich in den Griff bekommen mit den Daten. Es lag an der JAVA-Programmierung Es lag an der JAVA-Programmierung und deren Vorbereitung. .
Die Daten sind nun als reine Punkte vorhanden. Ich habe zwar in der CSV-Dateien einen wachsenden Winkel, der aber für die Darstellung nicht relevant ist für mich.
Ich habe nun endlich reine x-, y- und z-Punkte in der Datei.
Frage:
Was müsste ich abändern im Python-Code, damit auch ein rechtwinkliger Raum darstellt werden kann? Im Grunde wird solch einer eigentlich einscannt und kein Zylinder.
Ist der Bezug evtl. im Script verkehrt?
Vielen Dank für deine Unterstützung vorab!
Kannst du mir evtl. nochmals behilflch sein?
Habe das Problem nun endlich in den Griff bekommen mit den Daten. Es lag an der JAVA-Programmierung Es lag an der JAVA-Programmierung und deren Vorbereitung. .
Die Daten sind nun als reine Punkte vorhanden. Ich habe zwar in der CSV-Dateien einen wachsenden Winkel, der aber für die Darstellung nicht relevant ist für mich.
Ich habe nun endlich reine x-, y- und z-Punkte in der Datei.
Frage:
Was müsste ich abändern im Python-Code, damit auch ein rechtwinkliger Raum darstellt werden kann? Im Grunde wird solch einer eigentlich einscannt und kein Zylinder.
Ist der Bezug evtl. im Script verkehrt?
In einer PN hast Du mir geschrieben, dass die Zeile mit dem Namen "Z" ein Winkel ist, der erst noch umgerechnet werden muss, das könnte solche Effekte verursachen.. Wenn die Ansteuerung des Laserscanners selbst entwickelt ist, dann würde ich den Fehler eher beim Rausschreiben der Daten suchen, als beim Einlesen und Darstellen.ASELler hat geschrieben:Was müsste ich abändern im Python-Code, damit auch ein rechtwinkliger Raum darstellt werden kann? Im Grunde wird solch einer eigentlich einscannt und kein Zylinder.