Povviz

4. April 2009

Wow es ist schon wieder eine Weile her seit meinem letzten Blogeintrag — mehr als eine Woche!

Ja diese eine Woche war auch geprägt von der Arbeit an einem Tool (povviz) mit dem man solche Animationen

einfach mit Hilfe von Matlab Simulink und POV-Ray erstellen kann. Die Animation vom letzten Mal war einfach mit Hilfe eines Matlab Skripts (m-file) erstellt worden, und alle notwendigen Parameter für POV-Ray und die Pfade zu den Dateien und so weiter, waren natürlich hartkodiert im Skript. Dies war das Proof-of-Concept und nachdem dies relativ schnell und einfach zu guten Ergebnissen geführt hat, war dann die folgende Herausforderung, dies allgemein nutzbar zu machen und dafür habe ich eine GUI in Matlab erstellt.

Der Umbau des Skriptes, das POV-Ray aufruft, war schnell gemacht und im Prinzip war auch schnell eine GUI erstellt, mit der man die Pfade usw. einstellen kann. Die wirklich Arbeit war jedoch die einzelnen GUI Funktionalitäten zu programmieren, den User daran zu hindern Blödsinn einzugeben, die Einstellungen speicherbar zu machen, einzelne GUI Elemente verknüpfen usw…

Probleme

Was auch viel Kopfzerbrechen bereitete, war, dass das Tool auf Windows und Unix-Systemen gleich gut laufen sollte — hier war jedoch das Problem nicht auf Unix-Seite sondern auf Windows-Seite. Und das Betriebssystem hat nicht Schuld daran, verschiedene Arten Pfade zu speichern (\ statt / als Pfadtrenner z.Bsp.) ist nicht das Problem — Matlab bietet hier einfache Methoden an dies zu berücksichtigen.

DAS Problem unter Windows ist POV-Ray. Für Unix Systeme gibt es nur eine Kommandozeilenversion von POV-Ray und das ist gut, nachdem ich es aus einem Skript heraus aufrufe. Unter Windows kommt POV-Ray jedoch nur mit einer GUI daher und es lässt sich zwar auch von der Kommandozeile ausführen, aber die GUI öffnet sich dabei. Soweit kein Problem dachte ich mir — wird halt der nächste Renderauftrag direkt mit der bereits offenen Instanz ausgeführt. FALSCH! Ich habe es nicht fertig gebracht einen Renderauftrag in einer bereits offenen Instanz von POV-Ray ausführen zu lassen — es kam immer ein komischer Fehler, den man per User-Interaktion bestätigen musste. Also hab ich POV-Ray nach jedem Renderauftrag geschlossen — was für eine Ressourcenverschwendung und unglaublich nervig!

Die Lösung

Gottseidank habe ich dann MegaPov gefunden: ein Projekt das auf POV-Ray aufbaut und ein paar Patches eingebaut hat. Der für mich wichtigere Unterschied ist: MegaPov liefert auch einen reinen Kommandozeilen-Client für Windows aus!! (Warum POV-Ray das nicht macht ist mir schleiherhaft …)

Die Arbeit an povviz ist nun recht weit gediegen und es fehlen meiner Meinung nach nur noch kleinere Polituren… Was richtig Spass macht ist mit dem Tool zu Arbeiten: Ich habe das mal Beispielhaft mit einem Feder-Masse-Schwinger versucht. Also nicht eine vorhandene Simulation nehmen, wie bei dem Wagen Pendel Modell, sondern alles von Null weg an machen.

Erstellen einer Animation mit povviz:

Zuerst wird die Bewegungsgleichung aufgestellt und diese in einem Simulink-Modell implementiert. Keiner dieser beiden Schritte ist wirklich aufregend und zeitaufwendig. Man kann auch das Simulink Modell ganz normal simulieren und die Ergebnisse mit Scopes kontrollieren. Passt das Modell, erstellt man ein (einfaches) POV-Ray Modell von dem mechanischen Aufbau. Also in diesem Fall modelliert man eine Feder und die Masse daran. Auch hier kann man das Modell bereits rendern und schauen ob es ungefähr dem entspricht was man will.

Und dann kommt nun die Arbeit an der Animation. Und das ist erschreckend einfach:

  • In der POV-Ray Datei: Definition der Position der Masse, bzw. Länger der Feder, abhängig von einer Variable. Zum Beispiel: X_POV.
  • povvizSetup (GUI in Matlab für povviz) starten und Pfade zu Simulationsfiles Simulationsdauer, Framerate usw. einstellen, aber auch den Namen der Variable X_POV. Mit einem Knopfdruck den benötigten Block fürs Simulationsmodell in dieses einfügen. Block mit dem richtigen Ausgang verbinden.
  • Simulation aus povvizSetup heraus starten und durchlaufen lassen
  • Rendervorgang aus povvizSetup heraus starten und durchlaufen lassen
  • Gerenderte Bilder aus povvizSetup heraus mit mencoder zu einem Video zusammenfügen
  • Video ansehen (leider nicht aus povvizSetup heraus möglich, da Matlab keine komprimierten Videos abspielen kann…)

Und heraus kommt das Video, dass man bereits oben als Teaser sehen konnte!

Tja nachdem der Text doch ziemlich lang geworden ist, muss ich natürlich noch ein Video einfügen, für alle die so brav bis hierhin gelesen haben :-). Es ist dies eine Simulation eines Masse Feder Systems, dass auf einem um eine Achse frei schwingenden Pendel geführt ist.

Leave a Reply