![]() |
---|
Hallo, mein Problem sind zwei LEGO Mindstorms Motoren die ich ansteuern muss, um mein Fahrzeug in Bewegung zu setzen. Jedem der Motoren kann man eine seperate Geschwindigkeit übergeben. Das schwierige daran ist, dass die Motoren nicht synchron laufen, da die Geschwindigkeitsangabe nicht automatisch zur gewünschten Drehzahl führt. Geschwindigkeit Allgemein: bis Vollgas vorwärts Vollgas rückwärts Beispiel: für Motor A für Motor Nun, da die Motoren unterschiedlich Arbeiten wird das Fahrzeug nach links oder rechts ausschlagen. Die in LEGO Mindstorms vorhandenen Methoden zur Lösung dieses Problems kann ich nicht verwenden, weil wir ein anderes Betriebssystem und eine andere Programmiersprache einsetzen. Das Einzige was ich auslesen kann ist wie oft sich ein Motor bis jetzt gedreht hat. Nach einem Meter Weg hat Motor . den Wert und Motor den Wert . Zusammengefasst: Eingabe: Geschwindigkeit von bis (die jedoch ungenau ist) Ausgabe: Bisherige Umdrehungen des Motors Überlegungen: Bis jetzt wird halt einfach die Differenz gebildet, und der langsamere oder schnellere Motor angepasst. Leider kommt dabei ein Zick-Zack-Phänomen zum Vorschein, was nicht sehr schön aussieht. Mit Zick-Zack meine ich, dass ein Motor stoppt, startet, stoppt und wieder startet. Die Anpassung der zwei Motoren sollte aber flüssig passieren. Doch leider weiß ich nicht, wonach ich suchen sollte, noch daran erinnern, als wir ein ähnliches Problem mit einem Tempomat besprochen haben, der eine konstante Geschwindigkeit halten sollte. Nur das da Integrale vorkamen, aber auch nicht mehr. :-) Wenn jemand also eine Idee hat, oder schon etwas ähnliches gemacht hat, kann er ja Tipps geben wonach ich suchen könnte. MfG Serg Für alle, die mir helfen möchten (automatisch von OnlineMathe generiert): "Ich möchte die Lösung in Zusammenarbeit mit anderen erstellen." |
![]() |
![]() |
Hallo, ohne mehr Hintergrund, ist es schwierig, was als Tipp zu geben. Ich nutze ebenso ein anderes Betriebssystem (ich nutze überhaupt erst mal eins, kein Windows), ebenso benutze ich nicht die Programmierumgebung, die nur unter Mac und Win läuft. Mfg Michael |
![]() |
Hi Interessantes Problem. Erinnert mich an Regelungstechnik. Hab direkt mal ein paar Fragen: Lässt sich die Geschwindigkeit auch regeln oder startest du den Motor mit der festgelegten Geschwindigkeit? Also könnte man sagen: Motor Nach Umdrehungen Motor Nach Umdrehungen Erhöhung der Geschwindigkeit von motor bis nach ein paar Metern eben ein synchroner Lauf erreicht ist. Oder anders: Ist dein Problem mit dem Zick-Zack ein programmiertechnisches oder ein "Hardwaretechnische" an dem du nicht ändern kannst? (Motor muss für neue Geschwindigkeit stillstehen) Musst du das ganze einmal synchronisieren, muss die Anpassung ständig erfolgen oder nach jedem Neustart des Systems. Bzw kann man sagen, dass der Zusammenhang Geschwindigkeit Umdrehung fest ist oder immer wieder neu festgelegt/ausgemessen werden muss? Brauchst du eine Formel bzw kannst du sowas eingeben/nutzen oder wie stellst du dir eine Lösung vor? Ich denk mal ein bischen drüber nach. Grüße |
![]() |
@michaL Wir benutzen nxtOSEK (~Echzeitbetriebssystem aus dem Automobilbereich) für das LEGO-Fahrzeug. Unter http//lejos-osek.sourceforge.net/ecrobot_c_api.htm#CAPI ist die C-API beschrieben. Als Programmiersprache kommt Ada zum Einsatz. Wie man sieht, ist die API sehr klein und übersichtlich, denn man kann nur die Geschwindigkeit in Prozent angeben, sowie die bisherigen Motorumdrehungen in Grad lesen oder setzen. Im deutschen Mindstorms-Forum hab ich folgendes gefunden. # gleich schnell drehende Motore werdet Ihr NIE finden! # Gibt's denn bei eurem NXT-G etwa keinen Synchronisier-Block? Shocked # # Schockschwerenot. # # Dann müsst Ihr den selber schreiben: # Code: # A und auf vorwärts, # wenn A schneller dreht als dann A auf float, # wenn schneller dreht als dann auf float Ob das hilft, kann ich leider erst nächsten Donnerstag ausprobieren, soll aber immer noch nicht genau sein. Das Fahrzeug soll noch viel mehr als nur rumfahren, und geradeaus fahren ist einfach unverzichtbar für die anderen Aufgaben. Ich werde mal schauen, wie lang das Fahrzeug ohne Abweichung fahren muss. Das Problem könnte man auch einfach mit ein wenig C-Code simulieren. @MBler07 # Lässt sich die Geschwindigkeit auch regeln oder startest du den Motor mit der # festgelegten Geschwindigkeit? Ich kann dem Motor jede beliebige Geschwindigkeit von bis Prozent übergeben. war jetzt einfach ein Beispiel. Bevor der Roboter etwas greift soll er vorher natürlich langsamer fahren und bei längeren Strecken ohne Hindernisse wieder Gas geben. # Also könnte man sagen: # Motor → Nach Umdrehungen # Motor → Nach Umdrehungen Ja, jeder Motor schafft eine bestimmte Anzahl an Umdrehungen in einer bestimmten Zeit. Die Lösung sollte sich aber an belibiege Motoren anpassen. Wähle ich größere Reifen oder belade ich das Fahrzeug mit mehr Gewicht, dann wird eben eine andere Strecke zurückgelegt, was wieder unbrauchbar ist. :-) # Oder anders: Ist dein Problem mit dem Zick-Zack ein programmiertechnisches oder ein # "Hardwaretechnische" an dem du nicht ändern kannst? (Motor muss für neue # Geschwindigkeit stillstehen) Der Motor muss nicht stillstehen. # Musst du das ganze einmal synchronisieren, muss die Anpassung ständig erfolgen oder # nach jedem Neustart des Systems. Bzw kann man sagen, dass der Zusammenhang # Geschwindigkeit <→ Umdrehung fest ist oder immer wieder neu festgelegt/ausgemessen # werden muss? 1. Die Anpassung soll ständig erfolgen, ich denke mal alle ms (im Moment sind es ms). 2. Der Zusammenhang Geschwindigkeit → Umdrehung ist Fest, aber hängt halt leider vom benutzten Motor ab, Annahmen die wir nicht verwenden dürfen (können). Ob der Zusammenhang von Geschwindigkeit → Umdrehung linear ansteigt, das muss ich nochmal ausmessen. Ob also bei: Umdrehungen Umdrehungen Das werde ich prüfen müssen. # Brauchst du eine Formel bzw kannst du sowas eingeben/nutzen oder wie stellst du dir # eine Lösung vor? Aus meiner Sicht ist das Problem mathematischer Natur. Im angehängten Bild sieht man, wie die zwei Motoren nach einer bestimmten Zeit auseinanderlaufen. Und das sollte halt mit einer Formel verhindert werden. Vielleicht mach ich mir auch zu viele Gedanken und es ist simpler als ich denke. :-) Sobald ich halt eine Formel, eine Vorgehensweise oder einen Tipp habe, dann kann ich es einprogrammieren, das ist dann kein Problem. Nochmal Zusammengefasst: Ich kriege halt zwei Werte auf die ich mich verlassen kann, und das ist die bisherige Motorumdrehung in Grad. Diese Zahlen sind verwertbar und sollten einander angepasst werden. Als Eingabewert habe ich zwei Prozentwerte für die Geschwindigkeit des Motors. Diese sind leider völlig willkürlich in ihrer Auswirkung. Ausgabe: Bisherige Motorumdrehungen in Grad Eingabe: Geschwindigkeit des Motors in Prozent bis Mein Problem ist es nun, mit den willkürlichen Prozentangaben die verwendbaren Umdrehungszahlen anzupassen. Oder: Wie kann ich realisieren, dass die Funktionswerte der beiden Motoren (im Bild als Linien sichtbar) sich immer weich anpassen, und das Ganze mit Geschwindigkeitsangaben, dessen Wirkung ich erst im nächsten Messzyklus beobachten kann, zu steuern. Ich weiß nicht, ob man da ohne Konstanten überhaupt zu einer Lösung kommt. Man kann halt alle 50ms die Umdrehungszahlen lesen: Motor Motor Nun wird Motor A beschleunigt und verlangsamt. Bildet man aber einfach eine Differenz, dann könnte es beim Beschleunigen und Bremsen dazu führen, dass das Fahrzeug schief stehenbleibt, deswegen sollen sich die zwei Linien auf dem Graphen langsam "smooth" annähern. So, ich hoffe das war bishen verständlicher. :-) Danke Serg |
![]() |
Ok Also mit dem Programmiertechnischen Zeug kenn ich mich nicht wirklich aus. Ich könnte aber mal versuchen eine Regelung mathematisch zu formulieren. Solltest du einen Regelungstechniker kennen, kannst du auch den mal fragen. Ich als Maschinenebauer kenn da nur die grundlegensten Grundlagen. Prinzipiell wäre mein Ansatz dann der, an einem Motor die Geschwindigkeit einzustellen und den anderen vom Computer steuern zu lassen. Im Endeffekt wäre es dann so, dass du die an Motor 1 einstellst, dessen Drehwinkel gemessen wird und der Computer daraus dann die Geschwindigkeit für den zweiten Motor berechnet. Dieser liefert dann wieder einen Drewinkel, der mit dem ersten verglichen wird. Aus der sich ergebenden Differenz würde der Computer dann Motor zwei entweder beschleunigen oder bremsen. Dazu stellen sich dann direkt wieder einige Fragen: Ist das von der Geschwindigkeit der Anlage her machbar? Also schafft sie schnell genug die Daten auszulesen, zu verarbeiten, zurückzuspielen und umzusetzen? Gibt es einen ungefähren Zusammenhang zwischen Geschwindigkeit und Drehzahl? Also . bei gibts IMMER Umdrehungen. Probleme gibts bei sowas vermutlich nur bei starken Geschwindigkeitsänderungen. Dafür müsste die Geschwindigkeit dann von beiden manuell regelbar sein. Die Feineinstellung der Formel wäre dann die Reaktion des Computers, also wie stark er die Geschwindigkeit in Abhängigkeit der Drehzahl erhöht. . Differenz: 5° Geschwindigkeiterhöhung um . Das müsste halt durch Versuche festgestellt werden. Edit: Wie löst eigentlich Lego dieses Problem? |
![]() |
Hi, wenn Du einfach nur versuchst, ein Fahrzeug über mehrere Räder zu beschleunigen, dann würde ich Dir eher ein Differentialgetriebe empfehlen. Gibt's auch für LEGO. Hatte das als Kind. LG, Fabian |
![]() |
# Ok Also mit dem Programmiertechnischen Zeug kenn ich mich nicht wirklich aus. Ich # könnte aber mal versuchen eine Regelung mathematisch zu formulieren. Solltest du # einen Regelungstechniker kennen, kannst du auch den mal fragen. Ich als # Maschinenebauer kenn da nur die grundlegensten Grundlagen. Die Diplomanten hatten früher mal ein Pflichtfach, da wurde sowas behandelt, die Bachelors haben sowas nicht mehr. Ich werd mal rumfragen. # Prinzipiell wäre mein Ansatz dann der, an einem Motor die Geschwindigkeit # einzustellen und den anderen vom Computer steuern zu lassen. # Im Endeffekt wäre es dann so, dass du die an Motor 1 einstellst, dessen # Drehwinkel gemessen wird und der Computer daraus dann die Geschwindigkeit für den # zweiten Motor berechnet. Dieser liefert dann wieder einen Drewinkel, der mit dem # ersten verglichen wird. Aus der sich ergebenden Differenz würde der Computer dann # Motor zwei entweder beschleunigen oder bremsen. So hatten wir es uns auch vorgestellt, aber welchen Motor wählt man. Wenn ich . volle Leistung bei einem Motor wähle, dann weiß ich ja nicht, ob der andere Motor auf die gleicher Drezahl (bei kommt. Oder man sagt, ist der Maximalwert, sonst muss man ja eine Mischung aus beschleunigen und bremsen finden. Das Programm wird übrigens auf den LEGO-Brick de.wikipedia.org/wiki/Datei:Lego_nxt_men%C3%BC.jpg) geladen, und muss nicht permanent mit dem PC verbunden sein. # Dazu stellen sich dann direkt wieder einige Fragen: # Ist das von der Geschwindigkeit der Anlage her machbar? Also schafft sie schnell # genug die Daten auszulesen, zu verarbeiten, zurückzuspielen und umzusetzen? # Gibt es einen ungefähren Zusammenhang zwischen Geschwindigkeit und Drehzahl? Also # . bei gibts IMMER 110±10% Umdrehungen. # Probleme gibts bei sowas vermutlich nur bei starken Geschwindigkeitsänderungen. # Dafür müsste die Geschwindigkeit dann von beiden manuell regelbar sein. Ich zweifle nicht, das Ada und OSEK dafür bestens geeignet ist, müssen sie ja, wenn sie in Geräten (Autos, Satelliten) mit harten Echzeitanforderungen laufen. Aber ob der LEGO-Brick da mitspielt, das ist eine gute Frage. Vorallem da später ja noch andere Sensoren hinzukommen. Aber LEGO hat das Problem ja gelöst, also muss es gehen. Ja, es gibt einen Ungefähren Zusammenhang. Mit Abnahme des Akkuladezustands sinkt zwar die Motorleistung, aber ich denke wird sind da immer noch im Bereich. Und starke Geschwindigkeitsänderungen werden halt einfach vermieden werden müssen. # Dafür müsste die Geschwindigkeit dann von beiden manuell regelbar sein. Ist sie ja. # Die Feineinstellung der Formel wäre dann die Reaktion des Computers, also wie stark # er die Geschwindigkeit in Abhängigkeit der Drehzahl erhöht. . Differenz: 5° → # Geschwindigkeiterhöhung um . Das müsste halt durch Versuche festgestellt # werden. Da ich jetzt mit anderen Aufgaben überschüttet wurde, bleibt für die Versuche wohl eine Woche lang keine Zeit. OnlineMathe wollte nach nur einem Tag inaktivität schon die Frage schließen. # Edit: Wie löst eigentlich Lego dieses Problem? http//www.nxt-in-der-schule.de/lego-mindstorms-education-nxt-system/nxt-software/nxt-education-software Da sieht man, dass die Programme mit einer grafischen Beschreibungssprache erstellt werden. Den Code dafür gibt es wohl nirgends. http//bricxcc.sourceforge.net/nbc/ Die Funktion OnFwdReg erledigt das gleiche. Hier gibt es Code für die Funktion OnFwdReg, aber das ist so ein Undokumentiertes-Hieroglyphen-C-Defines-Assembler-Dings, das wir wohl zu viel Zeit investieren müsste. Selber machen ist da einfacher. Serg |
![]() |
@qzmufu: Das Fahrzeug muss sich auf der Stelle drehen können. 45°, 90° usw... . Deswegen sind wohl, meinen bescheidenen mechanischen Kenntnissen zufolge, pro Reifen ein Motor notwendig. Zunächst wollte wir beide Reifen mit einem Motor steuern lassen, dann würden aber viel viel größere Probleme auf uns zukommen. Ich werde mich dann mal über das Differentialgetriebe informieren. Hier mal ein Beispiel, was eingesetzt wird: http://www.youtube.com/watch?v=E9CzwGGduBs&feature=player_embedded Serg |
![]() |
Prinzipiell kann man mit einem Motor auch mehrere Drehrichtungen gleichzeitig realisieren. Man braucht eben das entsrpechende Getriebe. Die sind allerdings nicht ganz billig (ja nach Budget). Und in eurem Fall vermnutlich sogar eine Sonderanfertigung. "So hatten wir es uns auch vorgestellt, aber welchen Motor wählt man. Wenn ich . volle Leistung bei einem Motor wähle, dann weiß ich ja nicht, ob der andere Motor auf die gleicher Drezahl (bei kommt. Oder man sagt, ist der Maximalwert, sonst muss man ja eine Mischung aus beschleunigen und bremsen finden." Guter Einwand/Lösung. Wie groß die Abweichungen sind, musst du dann rausfinden. Evtl gehts ja auch mit oder einer vorherigen Anpassung . auskuppeln und hochdrehen lassen oder einfach kurz mal Vollgas fahren). "# Dafür müsste die Geschwindigkeit dann von beiden manuell regelbar sein. Ist sie ja." Ich meinte das bezogen auf meinen Programmvorschlag. Eigentlich sollte der eine Motor ja nur vom Computer geregelt werden. Es muss also eine "übergeordnete" manuelle Steuerung eingebaut werden bzw. die automatische Regelung abschaltbar sein. "Da sieht man, dass die Programme mit einer grafischen Beschreibungssprache erstellt werden. Den Code dafür gibt es wohl nirgends." Schonmal angefragt? Ich hab mir mal eine Formel überlegt und frag morgen meinen Regelungstechnikdozenten, was er davon hält. |
![]() |
Mein oben bereits erwähntes Lego-Auto hatte auch ein Schaltgetriebe. So etwas sollte eigentlich genügen um zwei Räder mit einem Motor in unterschiedliche Richtungen bewegen zu können. Die Geschwindigkeit der Reifen könnte man dabei zwar nur diskret festlegen - aber ansonsten... |
![]() |
Stimmt. Wir sind ja bei Lego. Also kann man sich das selbst aufbauen. Vlt. gibts da Anleitungen im Internet. Je nach Aufgabenstellung ist die Getriebelösung vermutlich sogar die bessere. Vorrausgesetzt, man schafft es ein solches zu bauen. |
![]() |
Danke nochmal für die Geduld. "Ich meinte das bezogen auf meinen Programmvorschlag. Eigentlich sollte der eine Motor ja nur vom Computer geregelt werden. Es muss also eine "übergeordnete" manuelle Steuerung eingebaut werden bzw. die automatische Regelung abschaltbar sein." Kann man als Test-Modus einbauen. Aber später muss er halt seine Aufgabe selbstständig lösen. "Da sieht man, dass die Programme mit einer grafischen Beschreibungssprache erstellt werden. Den Code dafür gibt es wohl nirgends." >>Schonmal angefragt?<< Nein. Weiß halt nicht, ob man sowas rausrückt. Aber ich könnte ja fragen, wie man es bei LEGO überhaupt gelöst hat. Zum Schaltgetriebe. Ja, das könnte wohl gehen. Ich suche mal nach Anleitungen und gucke ob wir überhaupt genug Bauteile zur Verfügung haben. So: Heute folgendes festgestellt: nxt_motor_get_count(U32 Die Gradzahl die der Motor liefert entspricht den Grad aus der Realität. Also bei 360° macht der Motor genau eine Umdrehung. Das ist wie vermutet (gottseidank) sehr genau. # Dann müsst Ihr den selber schreiben: # Code: # A und auf vorwärts, # wenn A schneller dreht als dann A auf float, # wenn schneller dreht als dann auf float Diese Vorgehensweise hat sich heute als unzufrieden rausgestellt. Aber morgen noch einmal probieren, evtl. haben wir kleine Fehler gemacht. Ansonsten gucke ich mir mal das Getriebe an, und sonst wird halt durch Regeltechnik geregelt. Die anderen Teams standen eigentlich vor dem gleichen Problem, aber die müssen sich halt nicht auf der Stelle drehen können. Da reicht dann ein Motor für zwei Reifen aus. Aber wer weiß, vielleicht ändert sich was, und schon hat man mehr Köpfe die darüber nachdenken. MfG Serg |
![]() |
Zum Anfragen: Die Software ist doch speziell für Ausbildungszwecke gemacht und gedacht. Und selbst wenn sie den Quellcode nicht rausrücken, sagt man dir vlt was zur prinzipiellen Lösung. Das bischen Zeit sollte drin sein. Zur Regelung: Laut meinem Prof kann mna das über einen einfachen P-Regler (P=Proportional) machen. Formelmäßig sieht das so aus: Motor 1 bestimmt die Geschwindigkeit. Motor 2 wird angepasst Geschwindigkeit Motor Umdrehungen Motor Geschwindigkeit Motor Umdrehungen Motor EIngangssignal in den Rechner: Ausgangssignal Rechner: Das Problem ist dein . Wie ich schon sagte, musst du dieses experimentell bestimmen. Es gibt an, um welchen Wert die Geschwindigkeit steigt oder sinkt, wenn sich die Umdrehungsdifferenz ändert. Beispiel: mit Die GEschwindigkeit des zweiten Motors wird also um erhöht. Ob sich das überhaupt programmiertechnisch umsetzen lässt, und wenn ja wie, musst du entscheiden. |
![]() |
# Dann müsst Ihr den selber schreiben: # Code: # A und auf vorwärts, # wenn A schneller dreht als dann A auf float, # wenn schneller dreht als dann auf float Diese Lösung ist komplett ungeeignet. Kann man vergessen. Die Lösung mit dem Differentialgetriebe ist auch ungeeignet. Jedenfalls hab ich es gebaut, aber auf der Stelle drehen ging nicht. Deine Formel ist gut. Also rechnerisch ist alles paletti. Aber leider kommt es nach kurzer Zeit wieder zum Zick-Zack. Das Problem ist, das ein Motor stehen bleibt, die Differenz von beiden zu groß wird, dann gibt er wie verrückt Gas und bleibt dann stehen. Das passiert dadurch, das die Differenz der Umdrehungen von beiden Motoren zu groß wird, und die Formel dann zu große Werte liefert. Aber wir regeln alles mal pro Sekunde, also dürfte die Differenz nie zu groß werden. Ich schreib mal ein Programm, um das ganze zu simulieren. Heute ist was ausgefallen, und man kann wieder probieren. MfG Serg |
![]() |
So, der Simulator ist fertig. Wenn man das Auto günstig hinstellt, dann fährt es auch schön gerade. Und manchmal fährt es wieder in Kurven. Auf Anfrage hat man uns einen PID-Regler empfohlen, also eine Erweiterung von deiner Formel. Die drei Screenshots zeigen, wie das Auto sich manchmal verhält. Jetzt kann man die Formel direkt im Simulator testen, ohne das Auto zu haben. Den Code stell ich mal nächste Woche frei. Schönes Wochenende Serg |
Diese Frage wurde automatisch geschlossen, da der Fragesteller kein Interesse mehr an der Frage gezeigt hat.
|