C Suche guten Algorithmus für Lego-Roboter

D_Blade

pfff (¬_¬)ノ
ID: 316129
L
31 März 2008
7.412
382
Hallo,

ein vorweg: es handelt sich nicht wirklich um C, sondern um Not-eXactly-C (NXC)

Also ich habe einen Mind-Storm-Lego-Robo und benutze eben dafür nxc

Nun tüftele ich einem Problem:

Das Legobot soll einer gestrichelten Linie folgen können. Linien und Kurven kann er bereits folgen, aber ich möchte dass er auch sogar gestrichelten Kurven folgen kann.

Irgendeine Idee wie man da am besten vorgehen könnte?

Meine Vorstellung ist bisher, dass er nach dem Backtracking-Prinzip vorgeht, also er geht z.B. kurz vorwärts kleine Drehung nach links und rechts um mit den Lichtsensren nach der Linie zu suchen. Wenn nicht gefunden, dann 180° Drehung und den Weg zurück. Dann analoge Suche nur im Unterschied, dass er zuerst z.B. sich ein wenig nach links dreht und dann erst vorwärts und danach kleine Drehung links und rechts, usw.

Ich finde diese Art aber ziemlich umständlich. Gibt es da eine elegantere Lösung?
 
2 weitere Sensoren wirst du sicherlich nicht zur Verfügung haben?
Bin mir gerade nicht sicher wie viele im Standardpaket schon dabei sind.. ich meine aber nur einer war bei mir, oder?^^
 
Also ich habe 2 Tastsensoren, einen Lichtsensor, welcher halt irgendwie den Helligkeitswert ermittelt und so einen Ultraschall-Sensor.

Naja und dann halt noch diesen Soundsensor, aber schwarze Linien kann man nicht hören :ugly:

aber für Spielereien ist es schon irgendwie ganz lustig :LOL:
 
Wenn er bereits Linien folgen kann, kannst du das doch nutzen: Im Grunde is die Aufgabe dann ja nur noch, die Linie zu "finden". Wenn du ein Stück hast, kann man sich den weiteren Verlauf der Linie der "denken". D.h. du müsstest dem Roboter dann nur beibringen, auch bei Unterbrechung der Linie ihr weiter zu folgen und beim nächsten Teilstrich abgleichen, ob und wie weit er vom Weg abgekommen is.

Nur so als Anstoß. Kp, obs was hilft. Ich kenn den Lego-Roboter leider ned.
 
Also bisher kann er auch gestrichelte Linien recht gut folgen, selbst welche die in einem 90° Winkel abgehen. Er fährt immer ein wenig vorwärts und sucht die Linien ab. Wenn er nichts findet, fährt er eben zurück und versucht es aus einer anderen Richtung erneut.

Jedoch muss ich noch daran arbeiten, weil der gerne auch wieder eine 180° Kehrtwende macht.

Ich schätze mal, es gibt keinen anderen besseren Weg, oder?

Angeblich kann sich der Roboter den Weg, den er gefahren hat mit irgendeinem Befehl "merken", aber ich finde kein Tutorial mit diesen Befehl :-/
 
Das klappt aber auch nur, wenn die Linie geradeaus verläuft. Sobald das ganze eine Kurve ist, wird es schon schwieriger.
Schwieriger, ja, aber nicht unmöglich.

Jedoch muss ich noch daran arbeiten, weil der gerne auch wieder eine 180° Kehrtwende macht.
Musst du halt mitkartographieren. Wenn er nach einer Drehung durch schon bekanntes Terrain fährt, sollte er in Erwägung ziehen, dass er 180° gedreht hat.
Hast du keine Kontrolle, wieviel Grad er dreht?
 
Auch wenn ich überwiegend mit LeJOS arbeite, gibt es imo einen Befehl in NXC, der dir die Drehungsanzahl des Motors zurückgibt und einen, der ihn zurücksetzt.

Damit könntest du dir ausrechnen, ob er sich um 180° gedreht hat. Sobald er die Linie verliert zurücksetzen und wenn er mit Linie suchen fertig ist berechnen, wieviel er sich gedreht hat.
 
Schwieriger, ja, aber nicht unmöglich.

Musst du halt mitkartographieren. Wenn er nach einer Drehung durch schon bekanntes Terrain fährt, sollte er in Erwägung ziehen, dass er 180° gedreht hat.
Hast du keine Kontrolle, wieviel Grad er dreht?

Naja, bisher habe ich alle Drehungen experimentell ermittelt.

Auch wenn ich überwiegend mit LeJOS arbeite, gibt es imo einen Befehl in NXC, der dir die Drehungsanzahl des Motors zurückgibt und einen, der ihn zurücksetzt.

Damit könntest du dir ausrechnen, ob er sich um 180° gedreht hat. Sobald er die Linie verliert zurücksetzen und wenn er mit Linie suchen fertig ist berechnen, wieviel er sich gedreht hat.

Nicht wirklich. Für die einzelnen Motoren, ja. Aber nicht für das Gesamt-Fahrzeug an sich. Ich könnte natürlich über komplizierte physikalische Formeln versuchen das Verhältnis zwischen Rotorendrehung und Winkeldrehung herzustellen, aber naja.. bin doch ein wenig zu faul für :-?