3D-Modellierung aus CSV-Dateien (Punktewolke) in Blender

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
ASELler
User
Beiträge: 3
Registriert: Sonntag 9. August 2015, 19:21

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
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Probier das mal:

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
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 einkommentierst

Code: Alles auswählen

p = p[:20,:200].copy()
dann siehst Du folgendes
Bild
Bild
Bild
wenn Du sie auskommentierst

Code: Alles auswählen

#p = p[:20,:200].copy()
dann siehst was ich mit dem nicht zusammenpassen meine:
Bild
Bild
Bild
a fool with a tool is still a fool, www.magben.de, YouTube
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

Ich habe etwas Wichtiges vergessen, die Laserscan-Dateien müssen sortiert verarbeitet werden (Zeile 17):

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
Jetzt siehtr es so aus:
Bild
Bild
Bild
Bild
a fool with a tool is still a fool, www.magben.de, YouTube
ASELler
User
Beiträge: 3
Registriert: Sonntag 9. August 2015, 19:21

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!
ASELler
User
Beiträge: 3
Registriert: Sonntag 9. August 2015, 19:21

@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?
Benutzeravatar
MagBen
User
Beiträge: 799
Registriert: Freitag 6. Juni 2014, 05:56
Wohnort: Bremen
Kontaktdaten:

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.
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.
a fool with a tool is still a fool, www.magben.de, YouTube
Antworten