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

verticale Linie über Plot laufen lassen

 

Studi01

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2009, 02:34     Titel: verticale Linie über Plot laufen lassen
  Antworten mit Zitat      
Hallo zusammen,
ich möchte folgendes machen:
Wir haben messdaten und ein video zu einer fahrt. das video und die messdaten sind auf den gleichen startzeitpunkt geschnitten und mit der selben frequenz aufgenommen. jetzt möchten wir das ganze synchron in einem figure ablaufen lassen. auf einer seite das video im figure, auf der anderen seite der graph (plot der messwerte) auf welchem eine verticale linie laufen soll die die aktuell position auf dem graphen anzeigt.
sprich der wert im plot der gerade mit der linie "markiert" ist gehört zum jeweiligen bild des videos.
Bsp: das video läuft seit 1sec, die verticale linie im graph ist auch bei Sekunde eins... usw.

figure, video darstellen etc ist kein problem.

Problem ist, eine linie über den graphen laufen zu lassen ohne dass die alte linie, vom vorherigen zeitpunkt, noch da ist. eine linie in einer schleife erzeugen und diese mittels eines zählers (z=z+1) zu verschieben, funktioniert klarer weise nicht da die alte linie nicht gelöscht wird. die linie soll also einfach versetzt werden um einen wert in x richtung. Das müsste irgendwie über set/get funktionieren, leider bekomm ich es aber nicht hin.


Wäre klasse wenn mir jemand eine lösung (code) schreiben könnte wie das klappt.

mfg,
jan


pi-daddy

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2009, 13:05     Titel:
  Antworten mit Zitat      
Der plot oder line Befehl gibt doch ein Handle zu der Linie zurück. Damit kannst du dann mit delete(Handle) die Linie löschen.

mfg
 
studi01

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2009, 14:17     Titel:
  Antworten mit Zitat      
Könntest du mir da ein kurzen code dazu schicken wie das programmiert aussieht.
leider kann ich bis jetzt noch nicht ganz mit den hadles umgehen. Bin da gerade erst dabei, dahinter zu kommen wie das funktioniert und was ich damit machen kann.
Bis jetz hab ich nur überall gesehen dass man mit den handls das figure initialisieren kann. sprich, größe, position etc.

aber damit ne linie reinzeichnen kann ich nicht weil mir der befehl mit seinen optionen nicht ganz klar ist...

ich denke prinzipiell werde ich den graphen plotten und dann mit dem handle die linie setzen (set) dann das ganze um eins verschieben und wieder neu setzten oder?

bräuchte da eine grundlage in form von code um weiter zu kommen und es zu durchschauen.

vielen dank schon einmal vorab für eure hilfe!
lg,
jan
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2009, 15:37     Titel:
  Antworten mit Zitat      
Das mit den Handles ist ganz einfach. Das ist quasi eine Hausnummer zu einem Objekt. Ein Objekt kann ein Fenster sein, eine Linie oder irgendwas beliebiges.

Jedes Objekt hat Eigenschaften. Bei einer Linie sind das zum Beispiel Start- und Endpunkt, Farbe, Strichstärke, Start- und Endpunkt usw..

Hat man eine Linie gezeichnet, dann muss diese nicht auf Ewigkeiten unverändert bleiben. Wenn man das Handle zu der Linie kennt, kann man jederzeit auf alle Eigenschaften der Linie zugreifen und sie verändern. Wenn man will kann man die Linie auch löschen.

Das Handle zu einem Objekt wird bei den meisten Befehlen, die etwas Erzeugen als Ergebnis zurückgeliefert. Bei einer Linie sieht das dann zum Beispiel so aus:
Code:

>> line_handle = line([1,2], [3,4])
line_handle =
   0.003173828125000
 

Die Zahl, die dort ausgegeben wird, ist sozusagen die Hausnummer. Praktischerweise haben wir sie in der Variable line_handle gespeichert - muss man sich also nicht weiter merken.

Um jetzt ein Objekt (die Linie) verändern zu können gibt es in Matlab zwei wichtige Befehle: set und get. Mit get(line_handle) kannst Du dir alle Eigenschaften der Linie angucken. Dort wirst Du Dinge wie LineWidth, XData und LineStyle entdecken. Wenn Dir einer der dort angezeigten Werte nicht gefällt, benutzt Du den set-Befehl um ihn zu ändern:
Code:

set(line_handle, 'LineWidth', 2); %Linienbreite auf 2px ändern
 

Möchte man ein Objekt löschen, benutzt man einfach den delete-Befehl
Code:

delete(line_handle)
 


So einfach ist das und funktioniert quasi mit fast allen Dingen in Matlab. Wenn man es einmal verstanden hat, macht Matlab plötzlich dreifach Spass Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2009, 15:38     Titel:
  Antworten mit Zitat      
Das mit den Handles ist ganz einfach. Das ist quasi eine Hausnummer zu einem Objekt. Ein Objekt kann ein Fenster sein, eine Linie oder irgendwas beliebiges.

Jedes Objekt hat Eigenschaften. Bei einer Linie sind das zum Beispiel Start- und Endpunkt, Farbe, Strichstärke, Start- und Endpunkt usw..

Hat man eine Linie gezeichnet, dann muss diese nicht auf Ewigkeiten unverändert bleiben. Wenn man das Handle zu der Linie kennt, kann man jederzeit auf alle Eigenschaften der Linie zugreifen und sie verändern. Wenn man will kann man die Linie auch löschen.

Das Handle zu einem Objekt wird bei den meisten Befehlen, die etwas Erzeugen als Ergebnis zurückgeliefert. Bei einer Linie sieht das dann zum Beispiel so aus:
Code:

>> line_handle = line([1,2], [3,4])
line_handle =
   0.003173828125000
 

Die Zahl, die dort ausgegeben wird, ist sozusagen die Hausnummer. Praktischerweise haben wir sie in der Variable line_handle gespeichert - muss man sich also nicht weiter merken.

Um jetzt ein Objekt (die Linie) verändern zu können gibt es in Matlab zwei wichtige Befehle: set und get. Mit get(line_handle) kannst Du dir alle Eigenschaften der Linie angucken. Dort wirst Du Dinge wie LineWidth, XData und LineStyle entdecken. Wenn Dir einer der dort angezeigten Werte nicht gefällt, benutzt Du den set-Befehl um ihn zu ändern:
Code:

set(line_handle, 'LineWidth', 2); %Linienbreite auf 2px ändern
 

Möchte man ein Objekt löschen, benutzt man einfach den delete-Befehl
Code:

delete(line_handle)
 


So einfach ist das und funktioniert quasi mit fast allen Dingen in Matlab. Wenn man es einmal verstanden hat, macht Matlab plötzlich dreifach Spass Wink
Private Nachricht senden Benutzer-Profile anzeigen
 
Studi01

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2009, 15:53     Titel:
  Antworten mit Zitat      
Danke Epfi,

das klingt genau nach dem was ich zum verstehen benötige Smile

ich plotte meinen graphen und geb eine verticale linie in den plot rein.
dann schreib ich eine schleife in der ich mit set die position der linie um eins weiter rücke. wird die alte linie dann nicht automatisch beim nächsten durchgang zewcks dem verschieben gelöscht oder muss ich die linie erst löschen und dann neu setzen?

Wie sieht das ganze aus wenn ich den linien fortschritt mit 50hz also 0,02s pause zwischen den einzelnen werten ablaufen lassen will. da gibt es glaube ich die timer funktion. wie würde ich da das grundgerüst aufbauen?
ersetzt mir der timer dann quasi die schleifen funktion um meinen set und delete befehl herum? sprich statt

Code

for
set..
delete...
end

% mit timer
timer...
set...
delete...
end

klappt das in etwas so?

vielen dank für deine hilfe. kann leider erst in ein paar stunden weiter programmieren und probieren.

lg,
jan
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2009, 16:06     Titel:
  Antworten mit Zitat      
Zitat:
dann schreib ich eine schleife in der ich mit set die position der linie um eins weiter rücke. wird die alte linie dann nicht automatisch beim nächsten durchgang zewcks dem verschieben gelöscht oder muss ich die linie erst löschen und dann neu setzen?


Wenn Du die Linie nur mit neuen Werten für XData und YData versiehst gibt es keine alte Linie. Die Linie (das Handle) bleibt immer bestehen, es ändern sich nur ein paar Eigenschaften. Löschen musst Du also nichts.

Zitat:
ersetzt mir der timer dann quasi die schleifen funktion um meinen set und delete befehl herum? sprich statt

Bin mit Timern nicht wirklich fit. Die einfachste (frickel-) Lösung wäre eine Schleife mit pause(0.02) drin. Mit der Synchronität wird das dann aber eher ein Glücksspiel. Wenn Du einen Timer hast, der alle 0.02s aufgerufen wird, dann ändert der nur XData und YData deiner Linie. Löschen oder erzeugen musst Du dort gar nichts.
Private Nachricht senden Benutzer-Profile anzeigen
 
Studi01

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2009, 20:32     Titel:
  Antworten mit Zitat      
Hervorragend. Es funktioniert eingentlich sehr gut. der Code sieht wie folgt aus

Code:

y=[-25:0.5:25];
 t=1;
 linehandle=line(1,y);
 set(linehandle,'LineWidth',20);
     for t=1:zeilen
           
                     
            set(linehandle, 'xData', t);
            drawnow
           
                     
            t=t+1;
                     
                     
  end
 


Leider läuft das ganze sehr langsam. Die Messwerte sind in Echtzeit ca 20Sekunden und der Strich in Matlab braucht ca das doppelte. Liegt das evtl. an meiner art die Linie zu erstellen mit y=[-25:0.5:25]; Gibts da eleganteres?

Zudem, wie kann ich einen Timer für die synchronisation einbauen?
Prinzipiell hab ich das mit der hilfe so verstanden dass ich einen timer erstelle dem ich zuweise welche function er aufrufen soll.

Das würde also für meinen Anwendungfall heißen, ich kreiere den timer (dafür bräuchte ich eine kurze erklärung welche eigenschaften was steuern, die englische hilfe ist da nicht optimal zu verstehen) verpacke meine code den ich gepostet hab in eine function die dann im definierten intervall aufgerufen wird. die for schleife kann ich dann löschen da die function über den timer x-mal aufgerufen wird, je nach definition des timers.

Hab ich das richtig verstanden?

Jetzt bräucht ich nur mehr ein paar erklärunge /codes wie das zusammenspiel zwischen timer und function klappt. Mit callback etc hab ich noch nichts gemacht bis jetzt, denke das wird darüber irgendwie laufen.

Wäre super dankbar wenn wir das auch noch so klasse hinbekommen.
lg,
jan
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2009, 21:27     Titel:
  Antworten mit Zitat      
Studi01 hat Folgendes geschrieben:
Leider läuft das ganze sehr langsam.

Willkommen bei Matlab Wink Matlab ist schnell im rechnen und fürchterlich langsam bei der Ausgabe. Egal ob Text oder Grafik.

Zitat:
Liegt das evtl. an meiner art die Linie zu erstellen mit y=[-25:0.5:25]; Gibts da eleganteres?

Ja, zwei Punkte reichen. Deine Linie besteht aus 100 Segmenten bzw. 101 Einzelpunkten (weil xdata nicht die gleiche Länge wie ydata hat). y=[-25, 25] und x = [t, t] tut es auch. So, wie Du die Linie erzeugt hast, waren das 101 nicht verbundene Einzelpunkte. Was schneller ist, kann man sich an 101 Fingern abzählen Wink


Zitat:
[Timerzeug] Hab ich das richtig verstanden?

Ja, richtig verstanden.

Zitat:
Jetzt bräucht ich nur mehr ein paar erklärunge /codes wie das zusammenspiel zwischen timer und function klappt.

Alles ganz easy.

Erstmal mit
Code:
timerhandle = timer;
einen Timer erstellen. Dann mal mit
Code:
get(timerhandle)
gucken, was man da so einstellen kann. Interessant erscheinen da die Eigenschaften ExecutionMode, Period und TimerFcn. Der Rest dürfte erstmal uninteressant sein. ExecutionMode sollte laut Hilfe auf 'fixedRate' gestellt werden, Period ist deine Aktualisierungsrate.

Bei TimerFcn wird die Callbackfunktion angegeben. Da wird es jetzt ein bisschen knifflig, weil Du deine Zeit ja nicht länger in der Funktion hochzählen kannst - alle Variablen werden nach dem Aufruf der Funktion mitsamt ihren Werten gelöscht. Aber Matlab ist so freundlich und spendiert jedem Objekt eine Eigenschaft namens UserData. Dort speicherst Du nachher nach jedem Funktionsaufruf den aktuellen Wert der Zeit rein und beim nächsten Aufruf holst Du den Wert wieder raus und erhöhst ihn um deine Schrittweite.

Die Callbackfunktion legst Du am besten in einem leeren m-file an. In die erste Zeile schreibst Du function draw_vertical_line(obj, event) und speicherst die Datei dann erstmal als draw_vertical_line.m ab. Funktions- und Dateiname sollten identisch sein. Jetzt kannst Du beim Timer diese Funktion als TimerFcn vorgeben: set(timerhandle, TimerFcn, @draw_vertical_line).

Beim Aufruf der Timerfunktion wird von Matlab automatisch der Handle des aufrufenden Timers mitgegeben. Der steht in obj. Damit kannst Du deinen aktuellen Zeitwert in der 'UserData'-Eigenschaft auslesen und schreiben.

Wenn alles fertig ist, kannst du mit start(timerhandle) und stop(timerhandle) den Timer starten und anhalten.

Eine Garantie, dass der jetzt mit deinem Video synchron läuft gibt es aber trotzdem nicht - wenn der Rechner zu langsam ist, dann wird er durch einen Timer auch nicht schneller. Eventuell kannst Du ja das Video langsamer laufen lassen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Studi01

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2009, 22:27     Titel:
  Antworten mit Zitat      
hab versuch di linie aus zwei punkten zu erzeugen jedoch bekomme ich die fehlermeldung:
Warning: line XData length (1) and YData length (2) must be equal.

Code:

y=[-25,25];
t=1;
%t2=t+1;
x=[t,t];
%x=[t,t2];
linehandle1=line(x,y);
 


Hab ein wenig rumprobiert jedoch ändert sich an xData lenght nichts. hab auch versuch einfach fix zwei werte einzugeben, ohne erfolg. Bei lenght geht es doch nur darum dass ich jeweils einen startwert und endwert für die x-richtung, sowie y-richtung definieren. also x=[xstart, xend] und y=[ystart, yend] richtig? da verstehe ich nicht ganz weshalb das probleme gibt bei zwei punkten?

Am Timer bastel ich derweilen noch Smile

alternativ wäre noch die idee mit avifile ein video von dem plot zu machen und dass kann ich dann mit hilfe der abspielfrequenz synchron zum video laufen lassen. gute idee?
 
Studi01

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 10.01.2009, 23:41     Titel:
  Antworten mit Zitat      
weiß nicht genau warum, aber jetzt klappt es. hab mal matlab neugestartet und dann gings...

werde dann mal mit dem timer weiter spielen Smile

danke derweilen nocheinmal für die sehr gute hilfe.
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2009, 12:03     Titel:
  Antworten mit Zitat      
Studi01 hat Folgendes geschrieben:
weiß nicht genau warum, aber jetzt klappt es. hab mal matlab neugestartet und dann gings...


Dann schreib mal ein clear all in die erste Zeile deines Skripts - empfiehlt sich meistens sowieso grundsätzlich. In Funktionen natürlich nicht, sonst löscht man sich die übergebenen Parameter weg...
Private Nachricht senden Benutzer-Profile anzeigen
 
Studi01

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2009, 13:01     Titel:
  Antworten mit Zitat      
Also Timer funktioniert, bestens. top beschreibung! Die übergabe über userdata geht auch sehr gut.
jedoch weiß ich noch nicht genau wie ich die übergabe der linehandle hinbekommen.

ich plotte im Hauptfile den graphen und rufe dann die timerfunction auf in der dann der balken weiter geschoben wird. Das passiert durch erhöhen des linehandles um eins wie esja bereits schon im hauptfile geklappt hat.

da ich das erhöhen der linehandle allerdings jetzt im draw_vertical_line file mache, kann ich die linehandle aus dem hauptprogramm nicht mehr einfach mit set ansprechen. da bräuchte ich auch wieder eine übergabe/zugriff ähnlich dem Userdata.
Es müsste also nach jedem aufruf des timer der xdata wert neu zurück geben werden ans hauptprogramm damit der balken dort verändert wird. gefühlsmäßig würde ich sagen klappt das aber vom programm ablauf wahrscheinlich so eh nicht.

besser wäre es wohl wenn ich aus dem draw_.. file direkt auf den plott zugreifen kann. dann ziehe ich den befehl für den balken komplett ins draw file und müsste dann irgendwie den plot/figure des hauptfiles ansprechen können um darin die linie zu erstellen und zu bewegen.

der plot im hauptfile wird mit
Code:

angesprochen.

Im draw file sieht der code so aus
Code:

function draw_vertical_line(obj, event)

t=obj.UserData;
          x=[t,t];        
          set(UserData.linehandle, 'xData', x);
          drawnow
         
          set(UserData.linehandle1,'xData',x);
          drawnow
           
          t=t+1

         obj.UserData=t;
 


Wie man im code sieht habe ich versuch über userdata den linehandle aus dem hauptfile anzusprechen. erfolglos bis jetzt.


was tun sprach zeus?!

lg.
jan
 
Epfi
Forum-Meister

Forum-Meister



Beiträge: 1.134
Anmeldedatum: 08.01.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2009, 13:06     Titel:
  Antworten mit Zitat      
Hi!

Es gibt die Möglichkeit, eine Callback-Funktion mit Argumenten aufzurufen. Da könntest Du Plot- und Linehandle und auch sonst alles Mögliche, was Du brauchst übergeben. Such mal in der Dokumentation (also nicht help) nach "creating callback functions program scheduling". Dort wird das sogar mit Beispiel beschrieben, wie man das geht.
Private Nachricht senden Benutzer-Profile anzeigen
 
Studi01

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 11.01.2009, 13:28     Titel:
  Antworten mit Zitat      
ich habs jetzt mal in der help gefunden. was du genau mit doku meinst weiß ich nicht ganz genau.

soweit ich das verstanden habe, ruf ich den timer in der hauptfunktion auf und schreib den code statt der callback-datei rein. somit bin ich im gleichen file und müsste die linehandle direkt ansprechen könne. das meintest du oder?

lg,
jan
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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 - 2024 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.