Kreis durch Tangentensteigungen definieren

Neue Frage »

dux Auf diesen Beitrag antworten »
Kreis durch Tangentensteigungen definieren
Hallo an Alle!

Ich stehe vor einem ziemlich komplizertem Problem, aber ich werde es so kurz und einfach wie möglich beschreiben!
Ich habe mir aus Lego einen Plotter gebaut und bin gerade dabei, ihn zu programmieren! Einfache Sachen wie gerade Linien sind perfekt, aber nun stehe ich vor Kurven (ich möchte genau gesagt einen Kreis zeichnen)!
Das Problem dabei ist, dass ich die Motoren, die das ganze Teil in x- und y-Richtung bewegen nur durch Geschwindigkeit steuern kann!
Dazu habe ich mir überlegt, dass ich die Geschwindigkeiten durch die Steigung der Tangente des Kreises festlege und zu jedem Zeitpunkt ändere, sodass die Steigung immer größer/kleiner wird und dadurch ein Kreis entsteht!
Dadurch ergibt sich wieder ein kleines Problem, weil die Steigung irgendwann unendlich ist und der Motor sich aber nicht unendlich schnell drehen kann. Dazu habe ich mir überlegt, dass ich den Kreis in 8 Abschnitte Teile und je nach dem, wie der Kreis gekrümmt ist ein Motor konstant schnell läuft und der andere seine Geschwindigkeit ändert. Also quasi wie eine Funktion y(x)!
Durch viel herumdenken bin ich dazu gekommen, dass die Steigung einer Tangente im Allgemeinen (durch ableiten) ist (ich gehe davon aus, dass der Mittelpunkt im Koordinatenursprung ist) und ich kann mir aus der Kreisgleichung das y herausrechnen (). Somit habe ich die Steigung (Geschwindigkeit des einen Motors) in Abhängigkeit der Position/des zurückgelegten Wegs des anderen Motors (dessen Geschwindigkeit konstant ist): also .

Leider zeichnet mein Plotter keinen Teil eines Kreises, sondern immer nur Hyperbel ähnliche Kurven.
Ich habe keine Ahnung, wo der Fehler liegt.

Ich hoffe, meine Beschreibung ist verständlich und ihr könnt was damit anfangen und mir helfen!
Für Fragen stehe ich bereit und ich werde versuchen alles so gut wie möglich zu erklären, hauptsache ich komme zu meinem Kreis!
Ich bedanke mich schon im Vorhinein für Unterstützung!

lg
Huggy Auf diesen Beitrag antworten »
RE: Kreis durch Tangentensteigungen definieren
Für dein Problem emphiehlt es sich, die folgende Parameterdarstellung des Kreises zu benutzen:





Den Parameter t kannst du als Zeit interpretieren. Die erforderliche Geschwindigkeit der Motoren in x- und y-Richtung ergibt sich durch Ableiten nach t:





Den Wert von bestimmst du über die maximale Geschwindigkeit der Motoren:



Das führt zu:



dux Auf diesen Beitrag antworten »
RE: Kreis durch Tangentensteigungen definieren
Danke für den verdammt guten Vorschlag!
Sobald ich die Möglichkeit habe, werde ich das probieren und wieder posten!

lg
dux Auf diesen Beitrag antworten »
RE: Kreis durch Tangentensteigungen definieren
Sooo, ich habs doch schon jetzt testen können!
Leider gibts aber keinen 100%igen Erfolg.

Ich muss jetzt leider ein bisschen aufs Programm selbst eingehen, ich hoffe das macht nichts!
Das Programm läuft eine Schleife durch und bei jedem Durchlauf wird die Geschwindigkeit der Motoren verändert!
Leider kann ich immer nur Viertelkreise zeichnen, weil ich die Drehrichtung der Motoren inzwischen ändern muss.
Ich habe die Variablen so festgelegt, dass die Zeit t (aus den Formeln von Huggy) von 0 bis Pi/2 läuft (also bei jedem Durchlauf erhöht wird und nur ein Virtelkreis gezeichnet wird), die maximale Geschwindigkeit v=100 ist und der Radius r=10 ist.
code:
1:
2:
Motor.X.setSpeed(abs(-v*sin(v*t/r)));
Motor.Y.setSpeed(abs(v*cos(v*t/r)));
Wenn man sich das im Koordinatensystem vorstellt wird der Kreisbogen im 2.Quadranten gezeichnet, also X läuft rückwärts und Y vorwärts.

Wenn ich das Programm so ausführe, dann entsteht nur ein kurzer leicht gekrümmter Bogen.

Kann mir dabei irgendjemand helfen? Ich bin mir nicht sicher, wie weit t wirklich laufen soll.

lg
Huggy Auf diesen Beitrag antworten »
RE: Kreis durch Tangentensteigungen definieren
Für einen Viertelkreis muss



von 0 bis laufen, also t von 0 bis . Außerdem müssen , r und t in zueinander konsistenten Einheiten angegeben werden, z. B. in mm/s, r in mm und t in s.

Edit: Die Winkelfunktionen sind im Bogenmaß zu berechnen.
dux Auf diesen Beitrag antworten »
RE: Kreis durch Tangentensteigungen definieren
Ich hätte es mir nicht gedacht, aber es funktioniert!
Zwar kein 100% perfekter Kreis (aber 95%), weil Lego nicht die Genauigkeit bringt, aber von der Berechnung her ist es so wie ich es mir erwünscht habe!

Vielen vielen Dank an Huggy! Echt super!
Trotzdem verstehe ich noch nicht, warum meine Idee nicht funktioniert hat...

lg
 
 
Huggy Auf diesen Beitrag antworten »
RE: Kreis durch Tangentensteigungen definieren
Dein Weg ist prinzipiell auch gangbar. Man müsste sich näher ansehen, wie du das umgesetzt hast. Aber der Weg über die Parameterstellung erscheint mir einfacher.

Möglicherweise lässt sich die Genauigkeit noch verbessern. Da die Motoren ihre Geschwindigkeit nicht stetig ändern können, besteht jede Kurve aus kleinen Geradenstücken. Da kann man auch gleich diese Geradenstücke programmieren. Beim Kreis würde das bedeuten, man programmiert ein n-Eck mit genügend großem n. Die Eckpunkte bekommt man wieder aus der Parameterdarstellung, indem man durch den Winkel ersietzt.

Ob das wirklich besser wird, muss man ausprobieren. Man sollte dann zunächst mal n-Ecke mit kleinem n zeichnen, um zu sehen, wie gut der Endpunkt mit dem Anfangspunkt übereinstimmt.
dux Auf diesen Beitrag antworten »
RE: Kreis durch Tangentensteigungen definieren
Danke für den Tipp, ich werds ausprobieren!
Falls ich Probleme bei den Berechnungen habe, werde ich mich melden!

lg
tigerbine Auf diesen Beitrag antworten »
Leserbrief
Zitat:
Ich habe mir aus Lego einen Plotter gebaut


Aus den Steinen? Kann man da mal ein Bild sehen? Ups
dux Auf diesen Beitrag antworten »
RE: Leserbrief
Ich habe den Plotter aus allem zusammengebaut, was ich so gefunden habe!
Aber hauptsächlich Lego Technics vom Mindstorm Set. Programmiert wird der NXT mit Java (leJOS).

Wenn ich zu Hause bin und kurz Zeit habe, werde ich Dir ein Bild reinstellen!

lg
tigerbine Auf diesen Beitrag antworten »
RE: Leserbrief
Super. Da freu ich mich drauf. Tanzen
dux Auf diesen Beitrag antworten »
RE: Leserbrief
Hab jetzt ein paar Fotos:

1
2
3
4
5

Ich hoffe, man kann sich was vorstellen! Das Teil wird mit 3 Motoren angetrieben und vom NXT gesteuert. 2 Motoren bewegen den Stift in X- und Y-Richtung und der 3. Motor bewegt den Stift auf und ab. Zusätzlich sind noch 2 Touchsensoren dabei, die für die Ausrichtung sorgen. Der NXT ist wie gesagt in Java programmiert.
Die große Arbeit am Plotter ist natürlich nicht das Bauen, sondern das Programmieren. Man muss genau testen, wie weit sich der Stift bewegt wenn man den Motor mit verschiedenen Geschwindigkeiten und verschieden lange drehen lässt. Das kann schon einmal eine Weile dauern.

Mein Plotter kann jetzt perfekte gerade Linien in alle Richtungen und mit ziemlich guter Genauigkeit.
Mit diesen Grundfunktionen kann er mittlerweile das ganze Alphabet schreiben. Jetzt kommt noch dazu, dass er Kreise zeichnen kann. Ich bin jetzt dabei, ihn mit dem PC kommunizieren zu lassen. Dann kann ich nämlich via Bluetooth senden, was er machen soll.
Also im Großen und Ganzen kann ich zufrieden mit dem Plotter sein. Big Laugh

lg
tigerbine Auf diesen Beitrag antworten »
RE: Leserbrief
Was soll ich sagen.... Respekt Find ich echt klasse!
Neue Frage »
Antworten »



Verwandte Themen

Die Beliebtesten »
Die Größten »
Die Neuesten »