WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Punktwolke zu Cluster/Grid - Verarbeitung Laserscannersignal

 

Jared
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 12.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2014, 00:01     Titel: Punktwolke zu Cluster/Grid - Verarbeitung Laserscannersignal
  Antworten mit Zitat      
Hallo!

Meine Frage bezieht sich auf die Verarbeitung von Laserscannerdaten:

Ein Laserscanner wird über eine Simulinkschnittstelle ausgelesen und liefert ein Signal mit Frames von je 1000 Distanzwerten.

Durch Einbezug weiterer geometrischer Informationen werden aus jedem Distanzscan Punktwolkenwerte in einem 3D-Koordinatensystem berechnet.

Jeder Frame liefert damit 1000 Punkte mit einer X, Y und Z Koordinate.

Diese Daten stehen in Simulink als Signal oder durch den Export mittels einer Matlab Lvl. 2 Fkt im Workspace zur Verfügung.

Derzeit werden die X, Y und Z Frames fortlaufend in 3 Arrays X, Y und Z geschrieben.

Gewünscht ist jetzt zur Datenreduktion eine Clusterung der Werte in ein definiertes Gitter (meshgrid) der XY Ebene mit gröberer Auflösung. Die Werte für Z sollen diesen Säulen direkt zugeordnet werden ohne interpoliert zu werden. Im Anschluss soll ein 3D-Array oder Struct entstehen, in dem alle Z-Werte eines XY Clusters zu finden sind.

Beispiel:
Ein Frame ergibt
X = (1x1000 double)
Y = (1x1000 double)
Z = (1x1000 double)

Folgende Funktion ordnet die Z-Werte einem XY Cluster zu:
Code:

Code:

% Clusterwerte für x und y festlegen
xCluster = ceil(x/100);
yCluster = ceil(y/100);

for m=min(xCluster):1:max(xCluster)
    for n=min(yCluster):1:max(yCluster)
        temp_z=z(xCluster==m & yCluster==n);
        % temp_z enthält alle Werte [Wert1, Wert2, Wert3, ... ]
        % des Cluster (m,n)
        % temp_z kann dann in ein Struct oder 3D Array geschrieben werden
    end
end
 


Dieses Verfahren funktioniert, ist aber, vermutlich aufgrund der Schleifen, viel zu langsam. Wünschenswert wäre eine Onlinedatenverarbeitung. (Die Frames werden mit etwa 20 Hz geliefert.)

vq = griddata(x,y,v,xq,yq); liefert z.B. eine Interpolation der Werte in ähnlichem Format. Eine Interpolation der Werte ist jedoch nicht gewünscht, sondern nur die Rohwerte in einem Array für jedes definierte Cluster.

Ich bin relativ neu in Matlab und bitte daher um Rücksicht. Rolling Eyes

Vielen Dank und viele Grüße
Jared
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 15.12.2014, 10:28     Titel:
  Antworten mit Zitat      
Hallo,

das klingt so, als könnte man da mit accumarray() oder histc() was machen.
Bitte stell dafür ein funktionierendes Beispiel zur Verfügung (mit konkreten Werten für x, y, z) und dem, was rauskommen soll.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jared
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 12.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2014, 12:35     Titel:
  Antworten mit Zitat      
Ein exemplarisches Beispiel der Methode für einen Frame (Framerate ca. 20 Hz):

Code:

% Jeder Frame liefert
x=randi([0001, 1000], 1, 1000);
y=randi([-8000, 8000], 1, 1000);
z=randi([0, 1000], 1, 1000);

% Clusterarray anlegen
Raster = zeros(10,160,1);

% Clustereinteilung vornehmen
xCluster = ceil(x/100);
yCluster = ceil((y+8000)/100);

% Alle z-Werte in Clusterarray schreiben
for m=min(xCluster):1:max(xCluster)
    for n=min(yCluster):1:max(yCluster)
        temp_z=z(xCluster==m & yCluster==n);
        if (~isnan(temp_z) & size(temp_z, 1)>0)
            laenge = sum(Raster(m,n,:)~=0);
            Raster(m,n,laenge+1:laenge+size(temp_z,2))=temp_z;
        end
    end
end
 


Diese Abfolge funktioniert, ist aber zu langsam (vermutlich aufgrund der Schleifen). Wünschenswert wäre eine "MATLAB-Lösung", die ohne Schleifen auskommt.

Ein Struct anstelle eines Arrays für die Cluster ist übersichtlicher, aber meiner Erfahrung nach auch umständlicher auszuwerten.

Sinn ist eine Grundlage für eine spätere statistische Auswertung der z-Werte je Cluster zu bekommen.

Zum Beispiel:
Code:

% Berechnung der Maxima der Cluster
[Raster_max,I] = max(Raster(:,:,:),[],3);
 


Vielen Dank!
Private Nachricht senden Benutzer-Profile anzeigen
 
Jared
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 12.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.12.2014, 15:47     Titel:
  Antworten mit Zitat      
@ Nras:

Ich habe jetzt den Teil der Zuordnung nochmal mit histc() gelößt. Trotz einer noch vorhandenen for-Schleife ist dies deutlich schneller:

Code:

% Alle z-Werte in Clusterarray schreiben
[N_x, BIN_x] = histc(xCluster, 1:1:10);
[N_y, BIN_y] = histc(yCluster, 1:1:160);
for ii=1:1000
    laenge = sum(Raster(BIN_x(ii),BIN_y(ii),:)~=0);
    Raster(BIN_x(ii), BIN_y(ii),laenge+1)=z(ii);
end
 


Gibt es außer der verwendeten for-Schleife noch eine effizientere Möglichkeit die Werte von z entsprechend BIN_x und BIN_y zuzuordnen?

Die Umsetzung mit accumarray() ist mir leider nicht gelungen...
Private Nachricht senden Benutzer-Profile anzeigen
 
Jared
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 12.12.14
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.01.2015, 12:17     Titel:
  Antworten mit Zitat      
Hallo,

leider noch nichts neues soweit. Über weitere Tipps würde ich mich sehr freuen!

Viele Grüße
Jared
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.