Verfasst am: 23.09.2011, 08:29
Titel: Eine Gerade im Plot oder aus Daten ermitteln/erkennen
Hallo,
bin auf ein (für einige hier wahrscheinlich kleines Problem) gestoßen;-)
ich lasse mir Messdaten im plot (x,y) darstellen, als Beispiel ein Viereck welches mit einem Sensor eingemessen wurde.
Da die Daten etwas Schwanken filtere ich sie mittels filtfilt bereits beim einlesen in MatLab. Leider unterliegen diese Daten danach immer noch einer Schwankung.
Jetzt habe ich Aufgabenstellung erhalten aus den Daten bzw. den Plot jeweils immer die Gerade zu erkennen und durch eine Ideale Gerade zu ersetzen.
Ist es möglich dies aus dem Plot oder aus den Daten zu erkennen?
Stehe auf dem Schlauch....
Die Messpunkte bestehen aus (x,y), bzw. die reinen Messdaten aus (winkel,R)
diese habe ich dann immer in x,y gerechent um sie im kartesischen System darzustellen
_________________
Verfasst am: 23.09.2011, 08:55
Titel: Re: Eine Gerade im Plot oder aus Daten ermitteln/erkennen
Hallo phantomas_81,
Einen Fit würde ich auf die ungefilterten Daten anwenden, es sei denn, ich habe sehr gute physikalische Gründe für einen Filter. Z.B. ein 50Hz-Rauschen durch die Netzfrequenz zu entfernen ist valide, dafür sollte die Bandbreite des Filters aber auch unbedingt physikalisch motiviert sein.
Eine Gerade kann man sehr gut mit POLYFIT in die Daten legen, solange keine mehrfachen Datenwerte auftreten. Das "Basic fitting" Menü ist eine sehr schnelle Art, das durchzuführen.
Wie kann ich das denn so einpflegen das es mein "Programm" selbstständig erkennt ob eine Gerade vorliegt oder nicht?
Das Programm soll die Daten einlesen und erkennen ob es Geraden in einer Kontur gibt oder nicht, diese wenn vorhanden durch ideale Geraden ersetzen?
MEin Problem liegt darin dieses zu erkennen
_________________
Dafür gibt es keine eindeutige Definition. Man kann ein Polynom vom Grad 3 fitten und schauen of die Steigung und Krümmung unter einer gewissen Grenze liegt. Mann kann testen, ob das per FFT bestimmte Frequenz-Spektrum dem erwarteten Rauschen entspricht. Man kann den RMS-Unterschied zwischen dem Signal und einem gefilterten Signal bestimmen.
Selbst mit dem Auge lassen sich Geraden manchmal schnell erkennen, aber man kann auch ganz falsch liegen.
Ob eine Linie "gerade" ist, kann also an der Skalierung liegen. das gleiche gilt für einen "Knick": Obwohl man das im Normalfall so leicht visuell zu erkennen glaubt, ist es informationstechnisch nicht definierbar. Es hängt z.B. davon ab, ob man die Messdaten in Meter oder Nanometer speichert.
Wie ist "gerade" also in Deinem Problem physikalisch definiert?
in meinem Fall ist Gerade die Oberfläche eines glatten Werkstücks.
Der Sensor allerdings, mit dem das Werkstück gemessen wird, liefert schwankende Werte(Messgenauigkeit, Std-Abweichung etc.). Wenn ich also die Kontur dieses Werkstückes messe, erhalte ich zwar die Kontur aber nicht exakt. Dort wo das Werkstück gerade ist, bekomme ich zwar annähernd eine Gerade aber durch größerem skalieren sehe ich ntürlcih Schwankungen. Ich möchte also die Schwankungen die dort eigentlich nicht sind eleminieren und mit einer Idealen Geraden ersetzen
_________________
Dann brauchst Du einfach den Mittelwert aus Deiner Messung? Oder ein POLYFIT mit einer Geraden? Ist die ganze Messung durch eine Gerade zu fitten, oder musst Du auch den Abschnitt bestimmen, in denen die messung gerade sein soll?
Hallo, ja den Abschnitt muss ich auch bestimmen.
Da ich als Beispiel ein Quadrat einmesse, die Seiten des quadrats sollen dann durch eine ideale Gerade ersetzt werden. Die Ecken sollen natürlich nicht ersetzt werden.
Bisher habe ich es soweit das ich mir Richtungsvektoren berechne, zwischen den einzelnen Messpunkten. Hieraus erhalte ich zu jeder Seite des quadrats schon mal die Richtung der Messpunkte. das klappt auch soweit ganz gut.
Jetzt möchte ich die Messreihe durchsuchen und überprüfen wo die richtung identisch ist. dann den ersten und den letzten punkt ermittelten und hier durch eine gerade zeichnen. bzw die Messpunkte durch die neuen ersetzen. Das durchsuchen der Messpunkte möchte ich natürlich mit einer gewissen toleranz machen, sonst erhalte ich ja nicht wirklich viel gleiche winkel aufgrund der schwankungen;-)
_________________
Ps: mal was anders ich habe anscheinend aus versehen eine funktion gelöscht erhalte immer beim starten des Programms sowie beim skalieren des fensters folgenden Fehler:
Das GUI hatte wohl mal eine ResizeFcn, also eine Funktion, die beim Ändern der Größe die Positionen der einzelenn Elemente anpassen kann.
Es ist nicht klar, wieso diese Funktion nun verschwunden ist.
zurück zu meinem eigentlichen Problem.
stehe auf dem Schlauch wie ich mir die anfnags und endwerte iner Gerade bestimme.
Aus meiner Kontur kann ich mir die Bereiche wo eine Gerade liegen soll bestimmen. diese Positionen lasse ich mir in eine Variable speichern
stehen die positionen wo keine keine Gerade berechnet werden soll. Dazwischen möchte ich die geraden zeichnen lassen. Meine Messdaten sind wiederum in X und Y gespeichert.
Hast du eie Idee?
_________________
Du hast viele Zahlen gepostet, allerdings in einem unübersichtlichen Format, das man auch nicht per Copy&Paste in Matlab einfügen kann.
Was bedeuten diese Zahlen?
Was genau steht in "ind"? Postionen oder Indizes, einschließlich oder ausschließlich?
Vielleicht hilft Dir dies weiter:
Code:
y = rand(1,100);
ini = 30;
fin = 70;
poly = polyfit(ini:fin, y(ini:fin), 1);
y_2 = polyval(poly, [ini, fin]);
Also in geradenpos stehen Positionen also indizes aus denen dann einen gerade gezeichnet werden soll. Allerdings dort wo Nullen stehen nicht, dies sind kurven in der Kontur.die erste gerade wäre dann also von geradepos1 bis 89. die nächste wäre dann ab 95 bis 271. usw.
Es fällt mir schwer diese anfangs und endposition automatisch zu ermitteln. Möchte aus den zwei Punkten die ich aus Pos1 und Pos2 erhalte mir die gerade errechnen odr zeichnen lassen
in Ind stehen die Positionen an denen keine Gerde gezeichnet werden soll
_________________
in Ind stehen die Positionen an denen keine Gerde gezeichnet werden soll
Die Bedeutung dieses Satzes ist für Dich bestimmt ganz offensichtlich und klar. Ich habe aber keine Ahnung, was das genau heißt. Sind das "Positionen" im Raum, oder Indices bezüglich eines anderen Vektors. Wenn ind z.B. den Wert [13,17] hat, soll dann von 13 bit 17 keine Gerade gezeichnet werden, oder von 14 bis 16?
Da man durch das Lesen der ungefähren Beschreibung im Forum solche Details nicht erraten kann, wäre es am besten, Du implementierst die Lösung so gut Du kannst und stellst dann zu konkret auftretenden Problemen eine Frage zusammen mit dem relevanten Code-Abschnitt.
Ich habe es geschafft!!
hier meine code
das Array geradenpos beinhaltet indizes Messpunkten die innerhalb einer Grenze auf einer Geraden liegen,Messpunkte die nicht auf einer Geraden liegen stehen jeweils mit einer NUll in geradenpos, die hieraus ermittelten Punkte werden dann immer zu einer geraden zusammengefasst, jeweils aus dem ersten und letzten Messpunkt. Die Messpunkte liegen in Xfilt und Yfilt.
Code:
%_____________________Geradenpositionen in Kontur ermitteln_______________________
for n=1:length(winkel)-1 ifabs(winkel(n+1)-winkel(n))<6% Winkelgroeße als Kriterium für eine Gerade
geradenpos(n)=n;
end %if end %for
%________________________________________________________
%_____________________Geraden in Kontur berechnen_________________________
startindex=0;
geradenverdacht=0;
for n=1:length(geradenpos)
%Wenn Winkel<5 Grad (geradenpos>1), startindex setzen und geradenverdacht =true if geradenpos(n)~=0 && geradenverdacht==0;
startindex=geradenpos(n);
geradenverdacht=1;
end %if
%Wenn geradenpos(n)==0 und geradenverdacht= true dann endindex setzen und geradenverdacht auf false if geradenpos(n)==0 && geradenverdacht ==1
endindex=geradenpos(n-1);
geradenverdacht=0;
%Berechnung der Geraden
p1(1,1)=Xfilt(startindex);
p1(1,2)=Yfilt(startindex);
p2(1,1)=Xfilt(endindex);
p2(1,2)=Yfilt(endindex);
if p1(1,1)<p2(1,1)
aufloesung=((p2(1,1)-p1(1,1))/(endindex-startindex));
xi=p1(1,1):aufloesung:(p2(1,1));
else
aufloesung=((p1(1,1)-p2(1,1))/(endindex-startindex));
xi=p2(1,1):aufloesung:(p1(1,1));
end %if
%Wenn geradenverdacht und geradenpos am Ende dann letzter index in
%geradenpos als endindex
if n==length(geradenpos) && geradenverdacht==1
iflength(geradenpos)<length(Xfilt)
endindex=length(Xfilt);
else
endindex=length(geradenpos);
end %if
geradenverdacht=0;
%Berechnung der Geraden
p1(1,1)=Xfilt(startindex);
p1(1,2)=Yfilt(startindex);
p2(1,1)=Xfilt(endindex);
p2(1,2)=Yfilt(endindex);
if p1(1,1)<p2(1,1)
aufloesung=((p2(1,1)-p1(1,1))/(endindex-startindex));
xi=p1(1,1):aufloesung:(p2(1,1));
else
aufloesung=((p1(1,1)-p2(1,1))/(endindex-startindex));
xi=p2(1,1):aufloesung:(p1(1,1));
end %if
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
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.