raumkurvenplotter

MotionPlot - Ein interaktiver Raumkurvenplotter

Florian Walter, Ivaylo Ivanov, Wolffhardt Schwabe, Daniel Viladrich Herrmannsdoerfer

Die Mathematik versteht unter Kurven parametrisierbare Linien. Sie werden meist mit zweidimensionalen Funktionsgraphen assoziiert. Diese bilden jedoch nur den Spezialfall ab, dass eine Dimension der Parametrisierung dem Eingabeparameter selbst entspricht. Wenn der Verlauf des Eingabeparameters vom Verlauf der Linie entkoppelt wird, kann jeder Dimension eine beliebige eigene Funktion zugeordnet werden, welche den Verlauf der Kurve innerhalb dieser Dimension spezifiziert. Zudem lässt sich das Konzept auf beliebig viele Dimensionen ausweiten, wobei ab drei Dimensionen von Raumkurven gesprochen wird. Auf diese Weise können nahezu beliebige Linienfiguren erzeugt werden. Viele solcher Figuren wirken ästhetisch ansprechend und laden zur Auseinandersetzung mit den zugrundeliegenden analytischen und geometrischen Zusammenhängen ein. Allerdings lassen sich dreidimensionale Figuren auf einem zweidimensionalen Bildschirm als Projektion nur unvollständig darstellen. Wir möchten die Darstellung näher an die räumliche Intuition bringen, indem der Darstellungswinkel der Kurve per kinematischer Eingabe an die eigene Handbewegung gekoppelt wird. So kann diese im eigenen Tempo aus allen Winkeln frei erkundet werden.


Beispiel: Lissajous-Figuren

Lissajous-Figuren entstehen aus der orthogonalen Überlagerung zweier Sinusse mit ganzzahligem Frequenzverhältnis. Das Prinzip funktioniert für beliebig viele Dimensionen. Das ganzzahlige Frequenzverhältnis sorgt für eine periodische Synchronisierung der Periodenanfänge der Einzelfunktionen, wodurch eine geschlossene Kurve entsteht. Durch Veränderung der Amplituden, Frequenzen und Phasenverschiebungen der Sinusse können sehr unterschiedliche Figuren entstehen.

Auf einem Raspberry Pi kann durch das Modifizieren einer dedizierten Pythonfunktion in unserem Plotprogramm eine Kurve spezifiziert werden. Dies kann per dedizierter Tastatur und Bildschirm oder remote per Laptop erfolgen. Statt des Raspberry Pi hätte grundsätzlich auch direkt ein Laptop verwendet werden können. Der Raspberry Pi macht das Setup aber etwas mobiler, weil eine Modifikation der Kurvenspezifikation auch via Weboberfläche per Smartphone erfolgen könnte (aus Zeitgründen nicht umgesetzt). Die Kurve wird dann als Projektion auf die xy-Ebene auf einem Röhrenfernseher dargestellt.

Die Kurve steht zunächst still. Mit einer handgroßen Kugel kann die Perspektive beliebig rotiert werden. Die Kugel ist transparent und muss zunächst auf dem Tisch so fixiert werden, dass der darin befindliche Arduino mit dem USB-Anschluss parallel entlang des Lots der Bildschirmmitte des Fernsehers zeigt, damit die Drehrichtungen des Plots später den Handbewegungen entsprechen. Anschließend wird der Arduino per Switch an der Kugel angeschalten. Der Arduino benötigt dann einige Sekunden, um sich mit dem Raspberry Pi zu verbinden und sein Gyrometer automatisch zu kalibrieren. Danach signalisiert eine LED, dass die Kugel mit der Hand aufgenommen werden kann. Die Darstellung der Kurve ist an die Drehbewegungen der Hand gekoppelt und wird synchron rotiert.

Für die Visualisierung haben wir einen alten Röhrenfernseher umgebaut. Normalerweise fährt der Elektronenstrahl der Kathodenröhre mit einer sehr hohen Geschwindigkeit den Bildschirm periodisch zeilenweise ab, um die einzelnen Punkte des Fernsehbilds darzustellen. Aber in unserem System ist die Steuerung der horizontalen und vertikalen Auslenkung des Elektronenstrahls direkt an die Funktionswerte der Kurvenprojektion gekoppelt. Die Bewegung des Elektronenstrahls ist also mit dem Verlauf der dargestellten Kurve identisch. Leider ist dieses Phänomen nicht unmittelbar von außen zu beobachten. Trotzdem denken wir, dass dieser Zusammenhang dem System einen zusätzlichen Reiz verleiht und unterstützend auf das Verständnis des Kurvenverlaufs wirken kann. Außerdem halten wir dies für eine gute Möglichkeit, nebenbei noch ein paar Kenntnisse über Analogtechnik zu vermitteln.

Übersicht


Kugel

Die Plastikkugel stammt aus einem Bastelladen und besteht aus zwei zusammengesteckten Hälften. Darin ist ein batteriebetriebener Arduino Nano 33 IoT fixiert. Dieser besitzt ein eingebautes Gyrometer, welches zur Erfassung der Rotationsbewegungen verwendet wird. Das Gyrometer weist einen Messbias auf, welcher von den Messdaten abgezogen werden muss, da ansonsten auch bei Stillstand eine Rotation signalisiert würde. Der Bias ergibt sich aus dem Durchschnitt sämtlicher Messwerte, welche innerhalb der ersten Sekunde nach dem Einschalten des Arduino und dem Verbinden mit dem Raspberry Pi anfallen. Während dieser Zeit darf das Gerät (d.h. die Kugel) nicht bewegt werden. Zusätzlich muss das Messrauschen berücksichtigt werden. Hierzu werden jeweils 5 Messpunkte zusammengefasst, deren Durchschnitt dann als aktuelle Winkelgeschwindigkeit weitergereicht wird. Das Gyrometer kann mit maximal rund 100 Hz messen. Daraus resultiert eine Sendefrequenz von 20 Hz, mit welcher der Arduino den Raspberry Pi via MQTT über WLAN mit Messdaten beliefert.


Raspberry Pi

Auf dem Raspberry Pi laufen ein Broker und ein Subscriber zur Entgegennahme der Messdaten via MQTT. Aus der aktuellen Winkelgeschwindigkeit wird die Winkeldifferenz zum letzten Datenpunkt bestimmt. Diese wird entsprechend ihren Anteilen entlang der einzelnen Dimensionen per Rotationsmatrix auf die Raumkurve angewendet. Anschließend wird die zweidimensionale Projektion auf die xy-Ebene gebildet, um eine bildschirmgerechte Darstellung zu erhalten. Die Funktionswerte werden mit python-sounddevice als analoges Audiosignal mit 44.1 kHz ausgegeben. Aufgrund der limitierten Rechenleistung des Raspberry Pi ist die tatsächliche Abtastrate der Funktionswerte deutlich geringer, was sich in der Visualisierung jedoch nicht bemerkbar macht.


Röhrenfernseher

Disclaimer: Ein Röhrenfernseher läuft mit Hochspannung und kann auch im ausgeschalteten Zustand noch lebensgefährliche Ladungen enthalten. Informiert euch gut, bevor ihr einen Röhrenfernseher einfach so öffnet!

Um den Elektronenstrahl direkt steuern zu können, musste der Fernseher modifiziert werden. Dazu wurde das Gehäuse des Fernsehers geöffnet und im Inneren die Kabelverbindung zwischen der Platine und den Steuerspulen getrennt, um zwei isolierte Kupferkabel von den Spulen nach Außen zu führen. Die an den Spulen angelegte Spannung kontrolliert die horizontale bzw. vertikale Ablenkung des Elektronenstrahls, welcher beim Auftreffen auf dem Bildschirm Licht produziert. Die Spulen sind mit dem Ausgang eines Audio-Verstärkers verbunden, wobei je ein Kanal des Stereosignals eine Spule steuert. Der Verstärker wird benötigt, um die Größe der Kurvendarstellung zu skalieren, da die Ausgabeleistung des Raspberry Pi sonst die Reichweite des Elektronenstrahls auf einen sehr kleinen Bereich des Bildschirms limitiert, wodurch die Kurve im Extremfall nur als Punkt in der Bildschirmmitte erscheint.

crtv_open_mod.jpeg ml_crtv_connection.jpeg ml_audioopamp.jpeg

Ein ungelöstes Problem ist die Kalibration des Audiosignals für den Fernseher. Da die elektrischen Bauteileigenschaften der Steuerspulen individuell variieren, müssen Amplitude und Phasenverschiebung des Steuersignals entsprechend angepasst werden. Dies ließe sich softwareseitig einfach umsetzen. Allerdings müssten dazu zunächst die erforderlichen Werte bestimmt werden. Wir haben versucht, diese mit Testbildern zu ermitteln. Aufgrund diverser Nichtlinearitäten seitens des Audio-Verstärkers und der Spulen selbst, hat sich das aber als deutlich schwieriger herausgestellt, als wir zunächst vermutet hatten, und war im zeitlichen Rahmen des Projekts nicht mehr realisierbar. Der Fernseher zeigt daher leider ein stark verzerrtes Bild an.

Darüber hinaus wäre es wünschenswert, die Kurve über ein grafisches Webinterface konfigurieren zu können. Außerdem könnte die Größenskalierung der Kurvendarstellung durch entsprechende Lautstärkeregelung durch den Raspberry Pi softwareseitig automatisiert werden.

  • raumkurvenplotter.txt
  • Zuletzt geändert: 2022/04/18 16:49
  • von wschwabe